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()
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
Vous devez vous connecter pour publier un commentaire.
SSH utilise le SSH_ASKPASS variable seulement si le processus est vraiment détaché de l'ATS (stdin redirection et de la définition des variables d'environnement n'est pas assez). Pour détacher un processus à partir de la console, il devrait fourche et l'appel de l'os.setsid(). Donc, la première solution que j'ai trouvé est:
Il est également un moyen élégant pour ce faire, utilisez le sous-processus module: dans le preexec_fn argument, nous pouvons passer d'une fonction Python qui est appelé dans le processus secondaire avant l'exécution de la commande externe. Donc la solution de la question est d'une ligne supplémentaire:
OriginalL'auteur gyim
Votre problème, c'est que SSH détecte votre téléphone et parle à elle directement (comme c'est clairement indiqué dans l'homme-page). Vous pouvez essayer et lancez ssh sans terminal - la page de man suggère qu'il pourrait être nécessaire de rediriger
stdin
à/dev/null
pour ssh à penser qu'il n'a pas de borne.Vous pouvez également utiliser pexcept pour cela, il est connu pour travailler avec SSH - exemple l'utilisation de la.
La Droit Chemin (TM) pour faire ce que vous essayez de faire est soit:
J'ai aussi essayé de fermer l'entrée standard stdin immédiatement après l'appel de Popen pour s'assurer que le code émule le /dev/null comportement. Sans succès 🙁
+1 pour ICP, il est beaucoup plus facile à manipuler par programmation
Je suis d'accord que l'ICP serait beaucoup plus simple, mais: 1. Je ne peut pas forcer tous les utilisateurs à l'utilisation de la clé publique d'authentification basée sur, 2. Si la clé privée est protégée par mot de passe j'ai encore besoin d'un peu dialogue de mot de soutien... (et non, il n'est pas sûr que chaque utilisateur a déjà ajouté la clé ssh-agent avant de commencer mon programme...)
Ensuite, utilisez
pexpect
OriginalL'auteur abyx
Si vous voulez une façon rapide et sale de le faire pour votre propre usage personnel, vous pouvez activer sans mot de passe de connexion entre ces deux machines en faisant ceci dans votre terminal:
Ensuite, vous pouvez obtenir ssh commandes à passer à travers (sous-processus ne semble pas accepter les commandes ssh directement) par la création d'un script (n'oubliez pas de marquer exécutable, par exemple
chmod 755 my_script.sh
) avec les choses que vous voulez, tels que:et de l'appeler à partir de votre programme:
De production, de l'utilisation d'applications qui doivent être déployés sur les machines des autres, j'irais avec abyx l'approche de l'aide de SSH bibliothèque. Beaucoup plus simple que de jouer avec certaines variables d'environnement.
OriginalL'auteur metakermit