Linux 쉘/bash 코드의 sshpass 대안

Linux 쉘/bash 코드의 sshpass 대안

이는 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 스크립트를 발견했습니다.

관련 정보