
이는 sshpass
파일에서 또는 인수로 비밀번호를 읽는 표준 명령입니다.
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
사용할 수 없는 경우 쉘에 동일한 프로그램/스크립트를 작성할 수 있습니까 expect
?
Public/private
이 경우 키는 옵션이 아닙니다.
거기에 있는 것과 동일한 기능을 제공하는 사용 가능한 코드가 있으면 sshpass
알려주십시오.
코드는 간단할수록 좋습니다.
답변1
임의의 시간 초과 조정에 대처할 수 있다면 아주 간단하게 기대할 수 있습니다 script(1)
. 물론 매우 까다롭습니다.
{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'
또는 BSD의 구문을 사용합니다 script(1)
.
{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD
비밀번호를 읽기 전에 tty의 입력 버퍼를 비우고 이미 기록된 내용을 모두 삭제하기 때문에 이 작업이 sleep
필요합니다 . ssh
원격 서버인 경우때때로응답 속도가 느리기 때문에 "충분히 큰" 시간 초과를 사용하는 것은 실용적이지 않을 수 있습니다.
sshpass
등 은 pty의 마스터 끝에 비밀번호를 쓰기 전에 프롬프트 작성을 expect
기다리면서 이를 처리합니다 . 표준 쉘에서 이를 수행하는 것은 간단하지도, 그다지 강력하지도 않습니다. 다음은 명명된 파이프를 사용하는 kludge입니다.ssh
... password:
passwdcmd(){
t=$(mktemp -u); mkfifo "$t" || return
script /dev/null -qc "$2" <>"$t" | { dd count=1 2>/dev/null; echo "$1" >"$t"; rm "$t"; cat; }
}
passwdcmd PASSWD 'ssh user@host CMD'
물론 이는 매우 안전하지 않습니다. 특히 echo
쉘이 내장되어 있지 않을 수 있기 때문입니다. SSH를 비대화식으로 사용하는 경우,공개 키 인증 사용.
답변2
순수 bash에서 sshpass를 구현하는 놀라운 bash 스크립트를 발견했습니다.