2016-11-11 72 views
-1

我是python和Linux的新手。我試圖從python執行bash命令,該命令給localhost一個命令。通過subprocess.call給本地主機提供命令

Initally我試圖使用os.system

os.system('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost xxxxx') 

我已經成功地使用叫幾個使用os.system命令。但是這個具有文件路徑的特定命令不會執行。所以我試圖用subprocess.call

subprocess.call('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost xxxxx') 

但拋出以下錯誤。

File "/usr/lib/python2.7/subprocess.py", line 523, in call 
return Popen(*popenargs, **kwargs).wait() 
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

我也曾嘗試以下

command = 'echo "(primitive-load \"/opt/doc/test.scm\")"|nc localhost xxxxx;' 
process = os.popen(command) 

任何其他方式來實現這一目標?

回答

0

挖後豆蔻位中subprocess.call,如果args傳遞給subprocess.call是str類型,像echo xxxx」,它會試圖找到在文件系統中的可執行的二進制echo xxxx,造成IO錯誤。

subprocess.call也收到一個列表爲args

所以,你可以這樣做:

import subprocess 
import shlex 
subprocess.call(shlex.split('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost xxxxx')) 

您也可以通過shell=True到原來的通話,如:

subprocess.call('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost 1111', shell=True) 

這可能導致安全issues

根據評論,它應該是這樣的:

echo = subprocess.Popen('echo "(primitive-load \"/opt/doc/test.txt\")"', shell=True) 
nc = subprocess.call('nc localhost 1111', shell=True, stdin=echo.stdout) 
nc.wait() 
+0

感謝您的回覆。我的目標是將此加載命令提供給服務器。但是這個shlex.split會給服務器(原始的-load /opt/doc/test.txt)| nc localhost xxxx。 (和nc命令一起)!! – vishnu

+0

@vishnu你可能需要[PIPE](https://docs.python.org/2/library/subprocess.html#subprocess.PIPE) –

0

嘗試,也許下面的它可以在您的情況幫:

import os 

command = 'echo "test"' 
process = os.popen(command) 
output = str(process.read()) 

print output 

希望這有助於不要忘記給予好評

+0

感謝您的回覆。 '回聲'測試''作品!!但是文件路徑不起作用。剛試過。 – vishnu

+0

然後用貓代替回聲 –

0

這解決了我的問題。

loadData='echo "(primitive-load \\"/opt/doc/body.txt\\")" |nc localhost xxxxxx' 
subprocess.call(loadData,shell=True)