2016-02-05 73 views
0

我在Go上写了一个程序,需要调用ssh作为子进程,但是一旦连接建立起来,就用它来做其他事情。我试图找出如何检查连接是否已正确设置。问题在于我不能等待退出代码,因为直到连接成功,命令才会退出,但如果我不等待,那么可能会分叉进程并执行其他操作,但之后子进程会遇到错误并死亡。我需要的是一种方式来知道,在某个点后,连接已成功建立。例如,一个选项是让ssh建立连接,然后在建立连接之后,fork拥有连接的进程并使主进程返回一个成功代码。但是,我不知道ssh是否允许这种行为。产生SSH连接但检查状态?

+0

是否有不使用的[SSH软件包(https://godoc.org/golang.org/x/一个原因加密/ SSH)? – user3591723

+0

是的 - 这是一个面向用户的工具,它需要能够读取正常的全局和本地ssh配置,获取命令行标志等。对于我来说,调用ssh二进制文件更加容易。 – joshlf

+0

奇怪的是,当你遇到这样一个基本问题时,它会更容易。看起来很容易,只要给你的程序自己的配置/标志,它适合于它的作用,并且不依赖于你的程序可以访问的ssh二进制文件以及适当的版本。 – user3591723

回答

0

想通了。特别是,我使用“ControlMaster”连接复用技术,让一个ssh进程充当主设备,使实际的ssh连接保持打开状态,并允许其他连接将流复用到连接上。

首先,这样做:

ssh -o ControlMaster=yes -o ControlPath=/path/to/socket -o ControlPersist=yes \ 
    [email protected] true 

最重要的这里的部分是ControlPersist=yes告诉ssh来继续在主连接流已关闭后在后台运行。在远程服务器上执行true使其连接,尝试执行命令并返回。一旦发生这种情况,如果成功,ssh将返回一个成功退出代码。

然后可以连接使用非主SSH进程:

ssh -o ControlMaster=no -o ControlPath=/path/to/socket [email protected] ...