2017-01-13 38 views
0

我要執行多個shell命令此起彼伏。這些命令是通過套接字從遠程設備接收的。我需要做的是創建一個可遠程訪問的shell。與subprocess.Popen我能夠執行命令並獲得輸出。但是,如果我想執行cd MyDIR然後ls -l。如果我將它作爲2行代碼執行,我會得到父目錄的文件列表,而不是目錄cd。使用cd MyDIR && ls -l給出了所需的結果。如果我使用通信方法,我沒有得到任何結果,並且stdin被關閉。有人可以幫我一段代碼嗎?的Python - 執行多個shell命令此起彼伏

編輯

這裏給出Interacting with bash from python不解決我的問題,我想保持殼層活性儘可能長的時間,並儘可能所需要的解決方案。試穿的網頁上的解決方案提供了一條消息,IO operation on closed file.

+0

可能重複://計算器。 COM /問題/ 9673730 /交互與 - 慶典 - 從 - 蟒蛇) –

+0

@PatrickHaugh是的,它看起來像一個重複的,但我想解決的封閉file'錯誤的'IO操作。我想保持溝通的活躍。 –

+0

看起來像它可以做得更容易,如果你會用bash聽。只需'nc -k -l 4444 | bash'。 – Raz

回答

0

該代碼有助於

from subprocess import Popen, PIPE 
from time import sleep 
from fcntl import fcntl, F_GETFL, F_SETFL 
from os import O_NONBLOCK, read 

# run the shell as a subprocess: 
p = Popen(['python', 'shell.py'], 
     stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = False) 
# set the O_NONBLOCK flag of p.stdout file descriptor: 
flags = fcntl(p.stdout, F_GETFL) # get current p.stdout flags 
fcntl(p.stdout, F_SETFL, flags | O_NONBLOCK) 
# issue command: 
p.stdin.write('command\n') 
# let the shell output the result: 
sleep(0.1) 
# get the output 
while True: 
    try: 
     print read(p.stdout.fileno(), 1024), 
    except OSError: 
     # the os throws an exception if there is no data 
     print '[No more data]' 
     break 

這裏是源[來自蟒bash的相互作用](HTTP的http://eyalarubas.com/python-subproc-nonblock.html