我有一个脚本,其中包含几个使用跳转主机的 ssh 命令。我想每次都输入跳转和目标服务器密码,并尝试使用sshpass
可悲的“嵌套”sshpass
似乎没有成功。
sshpass -p "JumpPass" sshpass -p "ServerPass" ssh -J user@jump admin@server
我们可以“嵌套”许多密码吗sshpass
?或者是否有特定的选项来提供不同的密码?
答案1
sshpass 可用于传入两个密码。必须使用两个不同的密码源(-e
和-d
),两个 sshpass 调用中的每一个都使用其中一个源。
env SSHPASS="JUMP_PASSWORD" \
sshpass -d 123 ssh \
-o ProxyCommand="sshpass -e ssh -W %h:%p JUMP_USER@JUMP_HOST" \
TARGET_USER@TARGET_HOST \
123<<<TARGET_PASSWORD
在上面的代码示例中,跳转主机将使用提供给 sshpass ( ) 的 JUMP_PASSWORD -e
,目标主机将使用提供给 sshpass ( ) 的 TARGET_PASSWORD -d
。
人们还可以使用 sshpass ( ) 提供密码-p
,但这是不安全的,因为密码将显示在进程列表 (ps) 中。上面的示例使用 sshpass,这样在系统进程列表输出中就看不到密码。
环境变量密码源 (sshpass -e) 必须与跳转主机的 ProxyCommand 一起使用。环境变量由 sshpass 在“-o ProxyCommand”调用中读取,但如果使用文件描述符源 (sshpass -d),则必须在 ProxyCommand 引用值中提供密码,因此可以在进程列表输出中看到。 (例如-o ProxyCommand="sshpass -d 124 ssh -W %h:%p JUMP_USER@JUMP_HOST 124<<<JUMP_PASSWORD"
)<- 所以这是不利的。
注意:当我使用此方法时,sshpass
JUMP_HOST 上未安装。
更新 该解决方案也可以与 rsync 一起使用
env SSHPASS="JUMP_PASSWORD" \
rsync -v -a \
-e "sshpass -d 123 ssh \
-o ProxyCommand=\"sshpass -e ssh -W %h:%p USER@JUMP_HOST\" USER@TARGET_HOST" \
:/remote/directory/ /local/directory/ \
123<<<TARGET_PASSWORD
请参阅我在超级用户上的回答:https://superuser.com/questions/1646074/why-rsync-with-jump-host-and-sshpass-not-working/1689136#1689136
答案2
我通常会使用 muru 提到的 ProxyCommand。
另外为什么不使用密钥而不是密码进行身份验证? {当我开始使用linux时,我总是使用密码,但是一旦使用了密钥,你就不会再回去了}
我可以将其放在我的 ssh 配置文件下,然后直接使用 ssh 连接到服务器ssh server
:
Host server
ControlMaster auto
ProxyCommand ssh -W %h:%p -i your_key_for_Jump user@jump
IdentityFile your_key_for_server_if_not_idrsa
User ssh_user_for_server