2011-02-11 63 views
0

我需要具備的功能基本上可以模擬用戶創建一個用ssh進行端口刷新的功能。所以,基本上這應該是這樣的: - 執行ssh -f -N -L 10000:gateway:11000 localhost - 如果有從該命令的輸出,顯示給用戶和泵用戶的輸入作爲迴應 - 完成 下面的代碼,幾乎做到了什麼我需要:python subprocess.Popen和ssh在後臺進行端口轉發

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命令,就應該用叉子叉連接。有沒有辦法中斷溝通(),當它完成或有更優雅的解決方案?

預先感謝您的任何意見/建議/意見。

+0

您是否嘗試過讓`ssh`子從你的進程繼承`stdin`和`stdout`(只是不指定`標準輸入=`或` stdout =`,iirc)和*不*調用`溝通`? – zwol 2011-02-12 00:09:21

回答

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()