Sto scrivendo una GUI che utilizza i comandi SSH. Ho provato a utilizzare il modulo subprocess per chiamare ssh e impostare la variabile di ambiente SSH_ASKPASS in modo che la mia applicazione possa apparire in una finestra per chiedere la password SSH. Tuttavia non riesco a fare ssh a leggere la password usando il comando SSH_ASKPASS dato: lo richiede sempre nella finestra del terminale, indipendentemente da come imposto le variabili d'ambiente DISPLAY, SSH_ASKPASS, TERM o il modo in cui canalizzo l'input/output standard. Come posso assicurarmi che ssh sia staccato dal TTY corrente e usi il programma dato per leggere la password?Come chiamare ssh dal modulo di sottoprocesso in modo che utilizzi la variabile SSH_ASKPASS
Il mio codice di prova era:
#!/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 ti chiederà sempre nel sottoprocesso che lo ha chiamato, quindi quello che devi fare è dire 'Popen()' per inviare la password usando 'p.stdin.scrivi() 'o semplicemente semplifica l'intera dannata cosa e usa qualcosa per l'interazione SSH che è già stata scritta per te come Paramiko. – jathanism
Grazie per la risposta. Ho provato a inviare la password usando p.stdin.write() e p.communicate(), ma ssh usa ancora il TTY effettivo per leggere la password ... E un altro problema è che non è facile da rilevare quando SSH chiede la password (può farlo con stringhe diverse, che possono apparire in seguito nella sessione SSH, ecc.) – gyim
Visto che sei disposto a "scrivere" la password tu stesso per il processo SSH, ho aggiornato la mia risposta con l'opzione da usare 'pexcpet', che funzionerà per quello. – abyx