2017-06-14 68 views
0

我試圖從python2.7調用logstash命令在conf名瓦爾,我試圖運行完整的shell命令是:Python的管道可變進logstash

cat test.txt | sudo /usr/share/logstash/bin/logstash -f test.conf 

,這裏是我的Python代碼:

listname = test 
b = '/tmp/%s.txt' % (listname) 
c = '/tmp/%s.conf' % (listname) 
first = subprocess.Popen(['/bin/echo', b], stdout=subprocess.PIPE) 
Second = subprocess.Popen(['/usr/share/logstash/bin/logstash -f', c], stdin=first.stdout) 

我在插入listname變量時遇到了問題,就像在代碼中創建的那樣,我也在調用logstash時遇到問題。我應該使用shell/subprocess來做到這一點,還是有更好的方法?

回答

0

上面的代碼存在許多問題。主要問題可能是您的listname應該是一個字符串(如果test不包含字符串),並且您的第二個Popen調用的語法是錯誤的(每個參數應該是它自己的列表條目)。

另外,如果您需要使用第二個進程sudo,則還有一些額外的問題,具體取決於您是否需要添加密碼。

因此,取決於如何處理這些問題,你的代碼可能看起來像下面的選項之一:

from subprocess import Popen, PIPE 

listname = 'test' 
b = '/tmp/{}.txt'.format(listname) 
c = '/tmp/{}.conf'.format(listname) 

first = Popen(['/bin/cat', b], stdout=PIPE) 

# Alt 1, No sudo 
second = Popen(['/usr/share/logstash/bin/logstash', '-f', c], stdin=first.stdout) 

# Alt 2, sudo with no password 
second = Popen(['sudo', '/usr/share/logstash/bin/logstash', '-f', c], stdin=first.stdout) 

# Alt 3, add sudo password (most complex) 

# Alt 3.1, store password in file (bad) 
sudo_password = "clear_text_password" 

#Alt 3.2, ask user for password: 
from getpass import getpass, getuser 
sudo_password = getpass("[sudo] password for {}: ".format(getuser())) 

# Since we need to add password at stdin, we cannot directly pipe output from "first" 
# instead we set stdin to PIPE, and write sudo password, followed by output from "first" 
# sudo -kSp '' ensures that password is read from stdin without prompt being displayed 
second = Popen(['sudo', '-kSp', '', '/usr/share/logstash/bin/logstash', '-f', c], stdin=PIPE) 

second.stdin.write(sudo_password + '\n') # write password 

# followed by output from "first". 
for line in first.stdout: 
    second.stdin.write(line) 

second.stdin.close() 

希望這將有助於你找到一個合適的解決方案。如果沒有,請進一步說明您的問題。

+0

謝謝,作品真的很好:) 使用Alt 2的作品,但第二個過程並沒有結束,我應該使用.communicate來結束這個?我試過: output = second.communicate()[0] 無濟於事。 –

+0

「不結束」是什麼意思?它在過程列表中顯示爲''(執行'ps')?在這種情況下,它已經結束,可以通過'del second'來刪除(你也可能想做'del first')。如果一個進程被取消引用,python將確保它被垃圾回收。如果該過程仍在運行,我想它正在等待更多輸入? – JohanL