我正在运行一个带有 ssh 命令的脚本到跳转主机后面的服务器。每次我想在安全网络中的服务器上运行命令时,我需要 ssh 进入跳转主机(堡垒)服务器并运行nc
,然后使用我想要通过 netcat 通道运行的实际命令 ssh 进入。然后我需要停止原来的nc
.
我想要一个“智能与号”,它可以让我同时运行两个进程,然后nc
在我的小猪支持的进程完成时关闭 ssh 进程。
这就是我目前正在做的事情。
ssh -g -L 23:localhost:22 -f -N user@jumphost &
ssh user2@localhost -P 23 "ssh user@destination server \"ls -al\""
kill -0 $!
问题在于它不是原子的。如果脚本中有错误,那么它就不会完成,并且我nc
最后不会终止原始进程。
我的问题是:如何启动两个进程?那么第一个完成时第二个完成吗?
答案1
这不是回答你的问题,而是这个答案苏正在解决你的问题,我想:
ProxyCommand
在你的应用中使用~/.ssh/config
应该为你做一切:
Host server
HostName server.tld
User {server user}
Host proxy
ProxyCommand ssh server -W %h:%p
User {proxy user}
然后您只需使用以下命令即可访问您的服务器ssh server
答案2
如果我正确地解释你的命令,那不是和这个一样吗?
ssh -t user@jumphost ssh user@destination ...
您-L
所做的似乎只是将端口转发到跳转主机的 SSH 服务器 - 但您已经连接到该服务器,那么为什么还要额外的隧道呢?
在这种情况下,jumphost 也将是第二个连接的 SSH 客户端。如果您不能信任跳转主机是客户端(即,如果您希望跳转主机只能看到加密的数据),您就必须-L 23:destination:22
而不是localhost
,不是吗?
答案3
解决方法使用wait
:
您wait
可以使用 PID 来等待:wait $PID
,但我们将简单地使用参数来运行第二个命令。请注意,所有输出都必须被忽略,因为它们不会作为参数传递给命令wait
(因此我们可以无参数使用wait
as in command & wait
)
process1 & wait $( process2 &> /dev/null )
从逻辑上讲,process1
必须等待完成process2
才能解释变量。wait
process2
编辑:这也可以嵌套:
sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) )
将sleep
持续 4 秒。