ssh se bloquea cuando el comando se invoca directamente, pero sale limpiamente cuando se ejecuta interactivo

StackOverflow https://stackoverflow.com/questions/33475

  •  09-06-2019
  •  | 
  •  

Pregunta

Necesito iniciar un servidor en la máquina remota y recuperar el número de puerto en el que se encuentra el proceso del servidor.Cuando se invoca, el servidor escuchará en un puerto aleatorio y generará el número de puerto en stderr.

Quiero automatizar el proceso de iniciar sesión en la máquina remota, iniciar el proceso y recuperar el número de puerto.Escribí un script en Python llamado "invokejob.py" que vive en la máquina remota para actuar como un contenedor que invoca el trabajo y luego devuelve el número de puerto, tiene este aspecto:

import re, subprocess
executable = ... # Name of executable
regex = ... # Regex to extract the port number from the output
p = subprocess.Popen(executable,
    bufsize=1, # line buffered
    stderr=subprocess.PIPE
    )
s = p.stderr.readline()
port = re.match(regex).groups()[0]
print port

Si inicio sesión de forma interactiva, este script funciona:

$ ssh remotehost.example.com
Last login: Thu Aug 28 17:31:18 2008 from localhost
$ ./invokejob.py
63409
$ exit
logout
Connection to remotehost.example.com closed.

(Nota:cierre de sesión exitoso, no se colgó).

Sin embargo, si intento invocarlo desde la línea de comandos, simplemente se cuelga:

$ ssh remotehost.example.com invokejob.py

¿Alguien sabe por qué se bloquea en el segundo caso y qué puedo hacer para evitarlo?

Tenga en cuenta que necesito recuperar la salida del programa, por lo que no puedo simplemente usar el indicador ssh "-f" o redirigir la salida estándar.

¿Fue útil?

Solución

s = p.stderr.readline()

Sospecho que es la línea anterior.Cuando invocas un comando directamente a través de ssh, no obtienes tu pty completo (asumiendo Linux) y, por lo tanto, no hay stderr para leer.

Cuando inicia sesión de forma interactiva, stdin, stdout y stderr se configuran automáticamente y, por lo tanto, su secuencia de comandos funciona.

Otros consejos

@BenCollins

Creo que tienes razón acerca de que stderr es un problema.Estoy bastante seguro de que está bloqueando la llamada readline().

Al final, me di por vencido y decidí usar el módulo pxssh de esperar para automatizar mi interacción con una sesión ssh.

@MishaM

Desafortunadamente, el truco del punto y coma no funciona aquí:se bloquea al ejecutar mi programa.

¿Qué pasa si haces lo siguiente?

ssh <remote host> '<your command> ;<your regexp using awk or something>'

Por ejemplo

ssh <remote host> '<your program>; ps aux | awk \'/root/ {print $2}\''

Esto se conectará, ejecutará y luego imprimirá cada PSID para cualquier usuario raíz o cualquier proceso con raíz en su descripción.

He utilizado este método para ejecutar todo tipo de comandos en máquinas remotas.El problema es encerrar los comandos que desea ejecutar entre comillas simples (') y separar cada comando con un punto y coma (;).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top