如何启动两个进程?那么第一个完成时第二个完成吗?

如何启动两个进程?那么第一个完成时第二个完成吗?

我正在运行一个带有 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(因此我们可以无参数使用waitas in command & wait

process1 & wait $( process2 &> /dev/null )

从逻辑上讲,process1必须等待完成process2才能解释变量。waitprocess2


编辑:这也可以嵌套:

sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) )

sleep持续 4 秒。

相关内容