如何在SSH命令中嵌套执行另一个SSH命令实现多层服务器操作
关于SSH多层跳转执行命令的实现说明
可以实现该功能,你提供的示例存在两处语法问题,修正后即可正常运行:
- 单引号嵌套错误:Shell会将内层的单引号识别为外层单引号的结束标记,导致命令解析失败
sudo su -用法错误:直接执行sudo su -会启动交互式登录shell,后续命令不会在切换后的用户环境中执行
正确实现方式
1. 无需切换第一跳服务器用户,直接执行第二层SSH
采用外层双引号、内层单引号的方式避免嵌套冲突:
ssh <user1>@<第一跳服务器IP> "ssh <user2>@<第二跳服务器IP> 'echo \"Hi\"'"
如果需要免交互运行,可以添加-o BatchMode=yes参数避免密码、密钥确认等交互提示:
ssh -o BatchMode=yes <user1>@<第一跳服务器IP> "ssh -o BatchMode=yes <user2>@<第二跳服务器IP> 'echo Hi'"
2. 需要先切换第一跳服务器用户再执行第二层SSH
给sudo su -添加-c参数传入要执行的命令:
ssh <user1>@<第一跳服务器IP> "sudo su - <切换目标用户名> -c \"ssh <user2>@<第二跳服务器IP> 'echo Hi'\""
更简便的多层跳转方案
如果你的SSH版本支持(OpenSSH 7.3及以上),可以直接使用ProxyJump参数实现多层跳转,不需要手动嵌套SSH命令,语法更简洁:
ssh -J <user1>@<第一跳服务器IP> <user2>@<第二跳服务器IP> "echo Hi"
注意事项
- 为了避免多次输入密码,建议提前配置本地到第一跳服务器、第一跳服务器到第二跳服务器的SSH密钥免密登录
- 脚本中使用时建议添加
-n参数防止SSH读取标准输入导致后续命令异常
内容的提问来源于stack exchange,提问作者Bianca
相关产品推荐
相关产品推荐

