Comment appeler ssh par sous-processus module afin qu'il utilise SSH_ASKPASS variable

Je suis en train d'écrire une interface graphique qui utilise le protocole SSH commandes. J'ai essayé d'utiliser le sous-processus module d'appel ssh et définir la SSH_ASKPASS variable d'environnement afin que ma demande peut apparaître une fenêtre vous demandant de saisir le mot de passe SSH. Cependant je ne peux pas faire de ssh lire le mot de passe en utilisant le SSH_ASKPASS de commande: il invite toujours dans la fenêtre de terminal, quelle que soit la façon dont je régler l'AFFICHAGE, SSH_ASKPASS, TERME des variables d'environnement ou comment je le tuyau de l'entrée/sortie standard. Comment puis-je m'assurer que le ssh est détaché de l'actuel ATS et utiliser le programme donné à lire le mot de passe?

Mon code de test est:

#!/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 vous demandera toujours dans le sous-processus qui l'a appelée, donc ce que vous devez faire est de dire Popen() à envoyer le mot de passe en utilisant p.stdin.write() ou tout simplement de simplifier la fichue chose et quelque chose de l'utilisation de SSH interaction qui a déjà été écrit pour vous comme Paramiko.
Merci pour la réponse. J'ai essayé d'envoyer le mot de passe à l'aide de p.stdin.write() et p.communiquer(), buth ssh utilise une réelle ATS pour lire le mot de passe... Et l'autre problème est qu'il est pas facile à détecter quand SSH demande de mot de passe (il peut le faire avec différentes chaînes, qui peuvent apparaître plus tard dans la session SSH, etc.)
Voyant que vous êtes prêt pour 'écrire' le mot de passe vous-même à des processus SSH, j'ai mis à jour ma réponse avec la possibilité d'utiliser pexcpet, qui va travailler pour cela.

OriginalL'auteur gyim | 2009-11-24