2017-07-28 2 views
0

Ich habe ein Python 3-Skript, das die Eingabe vom Benutzer akzeptiert, wird diese Eingabe in einen Subprozess geleitet, wo eine Shell erzeugt wurde. Ursprünglich wollte ich diesen Code mit einem Socket verbinden, um mein eigenes, nicht seriöses Remote-Administrations-Tool erstellen zu können, aber das ist für mein Level derzeit zu schwer. Code:Wie Python Subprozess stdout ohne Kommunikation zu lesen

import subprocess 

p1 = subprocess.Popen(["/bin/sh"], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, encoding = "utf-8") 

command = input("Command: ") 

p1.stdin.write(command) 

p1.stdout.read() 

Problem: Es wird nichts ausgedruckt. Ich habe endlose Stunden online aus einem Grund gesucht, über mehrere Tage, aber alle scheinen nicht zu arbeiten, und/oder beraten mit communicate() was ist etwas, was ich nicht tun möchte. Wenn ich vorausschaue, ob ich dies mit einem Socket implementieren kann, kann ich den Prozess nicht nach jedem Befehl schließen lassen. Ich habe auch versucht, überall zu flushes, bevor schreiben, zwischen den gelesen, nach die gelesen, so ziemlich überall, was Sie sich vorstellen können. Es sollte einfach genug sein, ohne dass ich tief in das io-Modul oder die Regeln der Pufferung schauen muss (zu spät jetzt). Ich habe seit Tagen mit diesem kämpfen.

+0

Willkommen bei Stack Overflow! Wenn Sie Code-Blöcke veröffentlichen, fügen Sie am Anfang jeder Zeile vier Leerzeichen hinzu, um sie als Code-Snippet anzuzeigen. Weitere Informationen zum Formatieren von Posts finden Sie in der Hilfe [Hilfe zum Bearbeiten] (// stackoverflow.com/editing-help). –

Antwort

0

Sie haben ein paar Probleme, ich werde versuchen, den Weg zu zeichnen, ich hoffe, ich irre dich nicht.

Vor allem, Haftungsausschluss: Ausführen von Benutzereingaben ist inhärent unsicher. Wenn das kein Problem ist, lassen Sie uns Ihr Problem weiterverfolgen.

würde ich tun

p1 = subprocess.Popen(["/bin/sh"], stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, bufsize=1) 

Mit einer Line-gepufferte PIPE ist eine gute Idee, in diesem Szenario beginnen.

Dann denken Sie daran, dass Sie nach dem Befehl drücken eingeben müssen, so:

command = input("Command: ") + "\n" 

Die Schreib korrekt sind,

p1.stdin.write(command) 

Aber das ist die Lese sehr gefährlich und Sie werden triviale werden festgefahren. Da die stdout offen ist (ohne EOF oder ähnliches), sollten Sie konservativ lesen, und trotzdem werden Sie Probleme damit haben.

Eine erste Idee wäre, Zeilen zu lesen:

p1.stdout.readline() 

Aber, wenn Sie nicht wissen, wie viele Zeilen, die Sie lesen können ... dann ist das ein Problem. In der Tat, dieses spezifische Problem has already been asked. Wenn Sie experimentieren möchten, öffnen Sie einfach einen Interactive Python Interpreter, senden Sie einen "ls\n" Befehl und führen Sie readline() aus. Es wird funktionieren, bis Sie die letzte Zeile lesen, und dann ... es wird ewig warten. Das ist schlechtes Benehmen. Sie müssen das also lösen.

Verwandte Themen