script programa otro interprete ejecutar desde compilar como archivo python terminal subprocess tty stty

programa - Terminal en mal estado(sin mostrar nuevas líneas) después de ejecutar el script de Python



ejecutar script python en windows (1)

Tuve el mismo problema en un script de Perl. Para resolver el problema tuve que guardar la configuración actual del terminal local (para restaurarlo al final del script) y anteponer "stty -raw" antes de ejecutar el comando remoto.

Entonces en Perl:

#Guarde la configuración actual del terminal (puedes agregar el PID en el nombre del archivo)

`stty -g> ~ / tmp / .currentTtySettings`;

#Ejecute el comando remoto anteponiendo "stty -raw"

my @ out = `ssh -t -q [email protected]" stty -raw; grep root / etc / shadow "`;

# Restablecer la configuración del terminal

`stty /` cat ~ / tmp / .currentTtySettings / ``;

Espero que te ayude!

Otros enlaces muy útiles:

-Detallada explicación de ssh y tty (-t opción) https://unix.stackexchange.com/questions/151916/why-is-this-binary-file-being-changed

-Algunos Perl y ssh inspiración http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod

-Cómo evitar "-t" para sudo https://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo- sin contraseña

Tengo un script de Python que utilizo para ejecutar comandos en paralelo en varios hosts utilizando el módulo de subproceso de Python. Envuelve SSH, y básicamente hace una llamada como esta:

output = subprocess.Popen(["/bin/env", env, "/usr/bin/ssh", "-t", "%s@%s" % (user, host), "--", command], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

El comando efectivo se ejecuta así:

/bin/env TERM=$TERM:password /usr/bin/ssh -t "%s@%s" % (user, host), "--", command

Funciona bien, excepto que recibo un error intermitente cuando mi terminal se arruina (pierde nuevas líneas) después de ejecutar el script. Un "reinicio" desde la línea de comando lo corrige, pero no estoy seguro de cómo está sucediendo esto, exactamente. Noté que a veces hay un "/ r / n" al final del primer ítem en la salida de la tupla, y otras veces no está allí. Consulte lo siguiente, específicamente " Permiso denegado / r / n" :

**** Okay output **** [user@/home/user]# ./command.py hosts.lists "grep root /etc/shadow" Running command "grep root /etc/shadow" on hosts in file "hosts.test" (''grep: /etc/shadow: Permission denied/r/n'', ''Connection to server1.example.com closed./r/n'') (''grep: /etc/shadow: Permission denied/r/n'', ''Connection to server2.example.com closed./r/n'') [user@/home/user]# **** Output causes terminal to not display newlines **** [user@/home/user]# ./command.py hosts.list "grep root /etc/shadow" (''grep: /etc/shadow: Permission denied/r/n'', ''Connection to server1.example.com closed./r/n'') (''grep: /etc/shadow: Permission denied/n'', ''Connection to server2.example.com closed./r/n'') [user@/home/user]# [user@/home/user]# [user@/home/user]

El segundo resultado ha sido ligeramente modificado, pero muestra la "/ r" que falta y cómo se "agita" mi mensaje después de ejecutar el script.

Creo que esto está relacionado con el uso de la opción "-t" en mi comando de subproceso. De alguna manera estoy perdiendo el / r. Si elimino la opción "-t", este problema desaparece, pero a corto plazo, lo necesito para pasar a través de variables ambientales para usar en la máquina remota (estoy usando la variable TERM para pasar la contraseña del usuario sudo propósitos, porque no puedo suponer que AcceptEnv permite el paso de variables arbitrarias en el servidor sshd remoto; lo hago para evitar pasar la contraseña en la línea de comandos, que aparecerá en la lista de procesos en la máquina remota).

¿Me pregunto si alguien sabe cómo evitar esto, sin quitar la opción "-t"?

ACTUALIZACIÓN: Parece que mi configuración tty se altera después de ejecutar el subproceso. Comando Popen (...). Comunicar () dentro de mi secuencia de comandos, independientemente de si realmente imprimo la salida en la pantalla o no. Encuentro eso realmente extraño. Aquí están las diferencias antes / después en mi configuración de tty (de stty -a):

-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt

Me pregunto cómo evitar que la comunicación () altere la configuración de mi terminal. ¿Es posible, o es esto un error?