sshpass
这些是从文件或作为参数读取密码的标准命令。
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
expect
如果不可用,是否可以在 shell 中编写相同的程序/脚本?
Public/private
key 不是这种情况下的选项。
如果有可用的代码可以提供与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
这sleep
是必要的,因为ssh
在读取密码之前会耗尽 tty 的输入缓冲区(并丢弃已写入的内容)。如果远程服务器是有时如果响应速度慢,使用“足够大”的超时可能不切实际。
sshpass
等通过在将密码写入 pty 的主端之前expect
等待ssh
写入提示来处理该问题。... password:
从标准 shell 执行此操作既不简单,也不是很健壮。这是使用命名管道的拼凑:
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
可能不是内置的 shell。对于 ssh 的任何非交互式使用,使用公钥认证。
答案2
刚刚发现了令人惊叹的 bash 脚本,它在纯 bash 上实现了 sshpass: