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
기다려 이 문제를 처리합니다 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 스크립트를 발견했습니다.