【发布时间】:2020-01-08 14:56:02
【问题描述】:
我需要使用python在后台执行命令ssh -NTf -R 5000:localhost:22 server@ip。由于选项-f,我知道命令本身在后台运行。
我已经使用 python subprocess 包来做到这一点。
cm="ssh -NTf -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 5000:localhost:22 servermc@122.174.345.9"
try:
out=sp.check_output(cm,stderr=sp.STDOUT,shell=True)
except Exception as e:
print "ddddd",e.output
但是发生的情况是该进程仍处于前台。当我们运行上面的python代码时,执行在check_output命令处暂停,我需要按ctrl+c退出python代码。
我还尝试了 Popen 和 poll() 函数。使用这些功能,我可以实现所需的功能,但问题是如果发生任何错误(例如端口未空闲或 IP 地址错误),我无法获取状态。
我需要做的是我想使用 python 在后台运行 ssh 反向隧道,并且我需要从服务器端获取它是否运行成功的状态?
我只能访问服务器,上面的脚本将在客户端内运行。因此我可以通过服务器访问客户端。如果客户端运行此脚本,状态将被发送到云端,以便我可以验证状态并从服务器连接到客户端。
【问题讨论】:
-
为什么不能使用
Popen和poll获得状态?这将是正常的方法。 -
如果轮询表明进程仍在运行以获取任何错误消息,您还可以使用
communicate超时。 -
如果使用
communicate,也会出现同样的问题。它将在通信时暂停。 -
这就是为什么我对
communicate说with a timeout。给它一个 2 秒的超时,期望如果一切正常,那么你会得到超时异常。如果您没有收到异常,则可能出现问题。 -
我们如何给超时通信功能?