2017-06-14 3 views
0

Ich versuche, ein logstash Befehl von python2.7 mit Vars in der Conf Namen aufzurufen, die vollständige Shell-Befehl ich laufen versuche ist:Python eine Variable in logstash kochend

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

und hier ist mein Python-Code:

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) 

ich habe Probleme beim Einfügen des Listennamen Variable wie früher im Code erstellt, und ich bin auch Probleme, logstash aufgerufen wird. Sollte ich die Shell/den Subprozess dafür verwenden oder gibt es einen besseren Weg?

Antwort

0

Es gibt eine Reihe von Problemen mit Ihrem Code oben. Die Hauptprobleme sind wahrscheinlich, dass Ihre listname eine Zeichenfolge sein sollte (wenn test keine Zeichenfolge bereits enthält) und dass die Syntax für Ihren zweiten Popen Aufruf falsch ist (jedes Argument sollte ein eigener Listeneintrag sein).

Auch wenn Sie den zweiten Prozess benötigen, um sudo zu verwenden, gibt es einige zusätzliche Probleme, je nachdem, ob Sie ein Kennwort hinzufügen müssen oder nicht.

So je nachdem, wie diese Probleme zu umgehen, kann Ihr Code wie eine der folgenden Alternativen aussehen:

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() 

Hoffentlich wird Ihnen helfen, eine passende Lösung zu finden. Wenn nicht, bitte spezifizieren Sie Ihre Probleme weiter.

+0

Danke, dass funktioniert wirklich gut :) Verwenden von Alt 2 funktioniert, aber der zweite Prozess endet nicht, sollte ich .communicate verwenden, um dies zu beenden? Ich habe versucht: output = second.communicate() [0] ohne Erfolg. –

+0

Was meinst du mit "hört nicht auf"? Wird es als '' in Ihrer Prozessliste angezeigt (tut 'ps')? In diesem Fall ist es beendet und kann mit 'del second' entfernt werden (und Sie möchten wahrscheinlich auch' del first' machen). Wenn ein Prozess dereferenziert wird, wird Python sicherstellen, dass es Müll gesammelt wird. Wenn der Prozess noch läuft, denke ich, dass es auf mehr Eingabe wartet? – JohanL