我正在Go中编写一个程序,需要将ssh
作为子进程调用,但是一旦建立连接,就将其用于其他事情。我想弄清楚如何检查连接是否已正确设置。问题是我不能等待退出代码,因为命令在成功连接之前不会退出,但是如果我不等待,那么我可能会分叉进程并做其他事情但是然后子进程会遇到错误并死掉。我需要的是一种方法,知道在某一点之后,连接已成功建立。例如,一个选项是让ssh建立连接,然后在建立连接之后,分叉拥有连接的进程并使主进程返回成功代码。但是,我无法弄清楚ssh
是否允许这种行为。
答案 0 :(得分:0)
想出来。特别是,我正在使用“ControlMaster”连接多路复用,有一个ssh进程充当主进程,它保持实际的ssh连接打开,并允许其他连接将多路复用流复制到连接上。
首先,做:
ssh -o ControlMaster=yes -o ControlPath=/path/to/socket -o ControlPersist=yes \
user@hostname true
这里的重要部分是ControlPersist=yes
告诉ssh即使在主连接流关闭后仍继续在后台运行。在远程服务器上执行true
会导致它连接,尝试执行命令并返回。一旦发生这种情况,如果成功,ssh将返回成功的退出代码。
然后您可以使用非主ssh进程进行连接:
ssh -o ControlMaster=no -o ControlPath=/path/to/socket user@hostname ...