2016-06-29 4 views
1

Ich möchte das Unterprozessmodul verwenden, um einige über ssh erzeugte Prozesse zu steuern.Ausgabe des Unterprozesses unterdrücken

Durch die Suche und Prüfung fand ich, dass dies funktioniert:

import subprocess 
import os 
import time 

node = '[email protected]' 
my_cmd = ['sleep','1000'] 
devnull = open(os.devnull, 'wb') 
cmd = ['ssh', '-t', '-t', node] + my_cmd 
p = subprocess.Popen(cmd, stderr=devnull, stdout=devnull) 


while True: 
    time.sleep(1) 
    print 'Normal output' 

Die -t Option -t Ich stelle mir erlaubt, nur den Befehl ssh anstelle des Remote-Prozess zu beenden. Aber das verwirrt auch meine Programmausgabe, da Zeilenumbrüche nicht mehr effektiv sind, was es zu einer langen und schwer zu lesenden Zeichenfolge macht.

Wie kann ich machen, dass ssh die Formatierung des Python-Programms nicht beeinflusst?

Beispielausgabe:

guest:~$ python2 test.py 
Normal output 
      Normal output 
          Normal output 
             Normal output 
                Normal output 
                   Normal output 
                       Normal output 
(First ctrl-c) 
Normal output 
Normal output 
Normal output 
(Second ctrl-c) 
^CTraceback (most recent call last): 
    File "test.py", line 13, in <module> 
    time.sleep(1) 
KeyboardInterrupt 
+1

Können Sie eine Beispielausgabe bereitstellen? Es ist unklar, was du damit meinst "scrambling". – SuperBiasedMan

+0

stackoverflow wird alles ausrichten. Der Ausgang wird nach dem Zeilenwechsel nicht auf den Anfang des Terminals ausgerichtet. Die Nachrichten werden jedoch korrekt gedruckt. –

+0

auch wenn ich ctrl-c und gehe zurück zu meinem Terminal, durch Drücken der Enter-Zeile wird nicht in der neuen Zeile, sondern neben meiner vorherigen Zeile gedruckt. Etwas mit der Option -t -t in ssh zu tun. –

Antwort

2

Ok, ist der Ausgang jetzt klar. Ich weiß nicht genau warum, aber der Befehl ssh -t -t setzt das lokale Terminal in den Rohmodus. Es macht trotzdem Sinn, weil es Ihnen ermöglicht, direkt auf der Fernbedienung curses-Programme (wie vi) zu verwenden, und in diesem Fall sollte keine Konvertierung vorgenommen werden, nicht einmal die einfache \n ->\r\n, die eine einfache neue ermöglicht Zeile, um den Cursor auf die erste Spalte zu setzen. Aber ich konnte keinen Hinweis darauf in der ssh-Dokumentation finden.

It (-t -t) können Ihnen den Remote-Prozess töten, weil der Raw-Modus die Strg + C lassen, um die Fernbedienung gesendet werden, anstatt von den lokalen tty Treiber verarbeitet zu werden.

IMHO, ist dies Design Geruch, weil Sie nur eine Nebenwirkung der pty Zuordnung verwenden, um eine Strg + C auf die Fernbedienung, um zu passieren und Sie leiden für eine andere Nebenwirkung, die der Raw-Modus auf lokales System ist . Sie sollten lieber die Standardeingabe (stdinput = subprocess.PIPE) verarbeiten und explizit eine chr(3) senden, wenn Sie ein Sonderzeichen auf der lokalen Tastatur eingeben oder einen Signalhandler für SIG-INT installieren, der das tut.

Als Workaround können Sie einfach etwas wie os.system("stty opost -igncr") (oder besser dessen Subprozess-Äquivalent) nach dem Starten des Remote-Befehls verwenden, um das lokale Terminal in einem akzeptablen Modus zurückzusetzen.

+0

Vielen Dank für Ihre Antwort. Die ctrl-c war ein Beispiel, ich werde den Prozess über das Subprozess-Modul (p.kill() oder p.terminate()) beenden oder beenden, so dass es mir nicht wichtig ist, Signale an den Subprozess weiterzuleiten. stdin = subprocess.PIPE hat es geschafft. –

+0

Wenn er dem Remote-System kein tty zuweist, hat das Senden von Strg-C keinen besonderen Effekt. Der TTY-Treiber konvertiert das Zeichen in das INTR-Signal. – Kenster