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

관련 정보