sshpass 与 ssh -J 跳转主机

sshpass 与 ssh -J 跳转主机

我有一个脚本,其中包含几个使用跳转主机的 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")<- 所以这是不利的。

注意:当我使用此方法时,sshpassJUMP_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

相关内容