2011-09-30 48 views
2

我想在遠程計算機上執行ssh到該計算機,然後在其終端上運行命令後運行多個命令。如何發送多個輸入到遠程shell使用子進程.Popen

我想爲這項工作使用子過程。所以我寫了下面的命令: -

import subprocess 
process = subprocess.Popen(['ssh', '[email protected]'], shell=False, stdin=subprocess.PIPE) 

現在,我得到遠程計算機的終端和我通過它獲取該計算機上執行以下命令: -

print process.communicate('python test.py /home/rahul/vPath-dissector') 

但是,當我再打電話給最後叫命令,它給出了一個錯誤: -

print process.communicate('python temp.py /home/rahul/vPath-dissector') 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/subprocess.py", line 690, in communicate 
    self.stdin.write(input) 
    ValueError: I/O operation on closed file 

所以我可以用什麼命令發送多個命令而不關閉文件???

+0

你試過'process.stdin.write('python temp.py/home/rahul/vPath-dissector')'而不是使用'communic'嗎? – agf

+0

嗨,那麼我將如何獲得上述命令的輸出?我無法得到它的輸出.... – Rahul

+0

'process.stdout.readlines()'? – agf

回答

0

不知道,因爲你明確的要求subprocess.Popen 這是否是對您有用 - 不過,你可以簡單地使用

ssh [email protected] python test.py /home/rahul/vPath-dissector 

和蟒蛇課程的外殼採用

執行你的遠程命令
os.system("ssh [email protected] python test.py /home/rahul/vPath-dissector") 

您也可以捕獲此命令的輸出。

很抱歉,如果我錯過了你的觀點,但...

+0

他的問題是關於發送多個命令到單個ssh進程。 – agf

+0

肯定,但也許Rahul可以通過多個ssh連接完成他的目標 - 或者您是否發現使用單獨的ssh-calls有任何問題? – thias

+0

嗨,我想明確地在這裏使用子進程.... os.system不是執行系統調用的有效方式,甚至寫在python的網站上。即使他們建議使用子進程而不是os.system。 – Rahul

0

當我類似的問題幾年前,我結束了使用此recipe從Python食譜了。顯然它現在也可以從Pypi獲得,但我不知道它是否完全一樣的代碼。

+0

對我來說看起來不像是相同的代碼。儘管我已經將'PIPE'傳遞給'stdin','stdout'和'stderr',pip模塊根本不起作用(它總是返回'(None,None)')。看看其他模塊效果更好。 – ArtOfWarfare

+0

不,你說得對。我想我已經添加了一條評論來指出它,但如果我做了它,它就不在這裏。 –

+0

3年後,這個祕訣還是最好的建議嗎?我可能會明天首先要做的事情(我在回家之前閱讀你的文章,然後在pip上快速嘗試模塊,發現它不起作用)。我會用'pexpect '除了它似乎只是Unix,我想要一個跨平臺的解決方案。 – ArtOfWarfare

2

試圖找到同樣問題的答案我最終使用pexpect而不是子進程。

import pexpect 

ssh = pexpect.spawn('ssh [email protected]') 

prompts = [">", "#", "\$", "}", '%', pexpect.TIMEOUT] 
ssh.sendline('echo Hello') 
ssh.expect(prompts) 
print ssh.before 

對於ssh,甚至有pxssh