Estoy escribiendo una GUI que usa comandos SSH. Traté de usar el módulo de subproceso para llamar a ssh y establecer la variable de entorno SSH_ASKPASS para que mi aplicación pueda mostrar una ventana que solicita la contraseña de SSH. Sin embargo, no puedo hacer que ssh lea la contraseña usando el comando SSH_ASKPASS dado: siempre lo solicita en la ventana del terminal, independientemente de cómo configuro las variables de entorno DISPLAY, SSH_ASKPASS, TERM o cómo canalizo la entrada/salida estándar. ¿Cómo puedo asegurarme de que ssh está separado del TTY actual y usar el programa dado para leer la contraseña?Cómo llamar a ssh por módulo de subproceso para que use la variable SSH_ASKPASS
Mi código de prueba fue:
#!/usr/bin/env python
import os
import subprocess
env = dict(os.environ)
env['DISPLAY'] = ':9999' # Fake value (trying in OS X and Windows)
del env['TERM']
env['SSH_ASKPASS'] = '/opt/local/libexec/git-core/git-gui--askpass'
p = subprocess.Popen(['ssh', '-T', '-v', '[email protected]'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env
)
p.communicate()
SSH siempre te preguntará en el subproceso que lo llamó, entonces lo que tienes que hacer es decirle a 'Popen()' que envíe la contraseña usando 'p.stdin.write() 'o simplemente simplifique toda la maldita cosa y use algo para la interacción SSH que ya ha sido escrito para usted, como Paramiko. – jathanism
Gracias por la respuesta. Intenté enviar la contraseña usando p.stdin.write() y p.communicate(), buth ssh todavía usaba el TTY real para leer la contraseña ... Y otro problema es que no es fácil de detectar cuando SSH solicita una contraseña (puede hacerlo con diferentes cadenas, que pueden aparecer más adelante en la sesión SSH, etc.) – gyim
Al ver que está dispuesto a 'escribir' la contraseña usted mismo para el proceso SSH, he actualizado mi respuesta con la opción de usar 'pexcpet', que funcionará para eso. – abyx