Linux shell/bash 代码中的 sshpass 替代方案

Linux shell/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如果不可用,是否可以在 shell 中编写相同的程序/脚本?

Public/privatekey 不是这种情况下的选项。

如果有可用的代码可以提供与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:

相关内容