在工作中,我们有许多服务器,我们只能从我们的跳箱服务器。
有时候我需要在这些服务器上执行命令。例如,如果我想df -H
在服务器-1,我运行这个命令:
ssh jumper@jumpbox 'ssh admin@server-1 ''dh -H'''
我们的jumpbox
拥有通过 SSH 进入 的密钥server-1
,并且我的本地工作站拥有通过 SSH 进入 的密钥jumpbox
。
为了简化这个过程,我编写了一个脚本,jumpbox.sh
如下所示:
#!/usr/bin/env bash
ssh jumper@jumpbox @
然后我可以简单地运行
jumpbox.sh ssh admin@server-1 dh -H
为了实现相同的目标。有没有办法通过配置我的环境(例如通过编辑~/.ssh/config
)而不是使用这个自定义脚本来实现这一点?
我已经发现A 很少文章以及一些 问题在 StackOverflow 上讨论了如何使用ProxyCommand
来实现这一点,但我似乎无法让它发挥作用。
首先,手册上是这么说的ProxyCommand
:
指定用于连接服务器的命令。命令字符串延伸到行尾,并使用用户的shell执行。
如果我没错的话,这意味着如果我有以下配置:
Host server-1
ProxyCommand ssh jumper@jumpbox nc %h %p
然后在我的 shell 上执行
ssh server-1 dh -H
然后dh -H
将被忽略。因此,看起来ProxyCommand
有助于打开新的交互式 SSH 会话,但不能运行一次性命令。这是正确的吗?
我也不太明白nc
这里的作用是什么?
总而言之,我的问题是:
有没有办法使用等配置我的环境~/.ssh/config
,以便当我运行时ssh admin@server-1 dh -H
,命令通过服务器运行jumpbox
?
答案1
是的...您可以通过 ProxyCommand 实现。从您的工作站,尝试运行“ssh admin@server-1 dh -H”..它将通过 exec ssh -q nc server-1 22 执行...因此 Proxycommnad 有助于连接客户端服务器,一旦连接,客户端 shell 将执行您从工作站发出的命令。
所以..你的〜/ .ssh / config应该有以下条目
主机服务器* ProxyCommand ssh -q jumper@jumpbox nc %h %p StrictHostKeyChecking=no