python subprocess.Popen和ssh端口在后台转发

时间:2011-02-11 23:56:39

标签: python ssh subprocess popen fork

我需要具有基本上模拟用户使用ssh创建端口转发的功能。所以,基本上应该这样工作:   - 执行ssh -f -N -L 10000:gateway:11000 localhost   - 如果该命令有输出,则向用户显示并将用户的输入作为响应   - 完成 我在下面提出的代码几乎可以满足我的需求:

    ssh_proc = Popen(['ssh', '-f', '-N', '-L', '10000:gateway:11000', 'localhost'], stdin=PIPE, stdout=PIPE)
stdoutdata, stderrdata = ssh_proc.communicate()

但问题是它永远不会结束。我看到命令已执行并且已创建转发隧道但是仍然卡住了()。我可以通过Ctrl + C突破它并得到这个:

    ^CTraceback (most recent call last):
  File "sshman.py", line 278, in <module>
    add(args.remote_host, args.remote_port, args.local_port, args.local_host)
  File "sshman.py", line 125, in add
    stdoutdata, stderrdata = ssh_proc.communicate()
  File "/usr/lib64/python2.7/subprocess.py", line 740, in communicate
    return self._communicate(input)
  File "/usr/lib64/python2.7/subprocess.py", line 1256, in _communicate
    stdout, stderr = self._communicate_with_poll(input)
  File "/usr/lib64/python2.7/subprocess.py", line 1310, in _communicate_with_poll
    ready = poller.poll()
KeyboardInterrupt

由于我使用-f和ssh命令,它应该分叉连接。有没有办法在完成后中断communication()或是否有更优雅的解决方案?

提前感谢您提出建议/意见/建议。

1 个答案:

答案 0 :(得分:5)

我想解决方案非常简单

ssh_proc = Popen(['ssh', '-f', '-N', '-L', '10000:gateway:11000', 'localhost'], stdin=PIPE, stdout=PIPE)
stat = ssh_proc.poll()
while stat == None:
    stat = ssh_proc.poll()