2017-06-14 66 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