Utiliser un sous-processus pour envoyer un mot de passe
Je suis d'essayer d'utiliser le python sous-processus module pour la connexion à un site ftp sécurisé et prenez ensuite un fichier. Cependant, je reçois accroché sur juste essayer d'envoyer le mot de passe quand il est requis. J'ai donc le code suivant:
from subprocess import Popen, PIPE
proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate('password')
Cela s'arrête toujours à l'invite de mot de passe. Si j'entre le mot de passe manuellement, il se dirige ensuite vers le site ftp, puis saisit le mot de passe sur la ligne de commande. J'ai vu des gens suggèrent d'utiliser pexpect mais pour faire une histoire courte j'ai besoin d'une bibliothèque standard de la solution. Est-il de toute façon avec les sous-processus et/ou de tout autre stdlib? Que suis-je oublier?
source d'informationauteur The Jug
Vous devez vous connecter pour publier un commentaire.
Vous devriez peut-être utiliser un attendre-comme la bibliothèque à la place?
Par exemple Pexpect (exemple). Il y a d'autres, similaires, les bibliothèques python.
Essayer
Qui devrait fonctionner.
Ce que vous décrivez ressemble
stdin=None
où le processus fils hérite de la stdin de la société mère (votre programme en Python).Essayer avec entrée=‘mot de passe’ en communiquer, qui a fonctionné pour moi.
Je recommande la suppression de la sous-processus de l'approche et à l'aide de la paramiko forfait pour l'accès sftp.
Utilisation
Paramiko
pour SFTP. Pour le reste, cela fonctionne:Ce même problème en proie à moi pour une semaine. J'ai dû présenter un mot de passe à partir de la saisie de l'utilisateur par le biais de sous-processus en toute sécurité parce que j'essayais d'éviter d'introduire une vulnérabilité d'injection de commandes. Voici comment j'ai résolu le problème avec un peu d'aide d'un collègue.
L' .d'attente(timeout=int) a été l'élément le plus important, car il permet à l'utilisateur d'entrée d'alimentation à l'entrée standard. Sinon, le délai d'attente par défaut est de 0 et laisse à l'utilisateur le temps d'entrer dans l'entrée, ce qui mène à une personne ou à une chaîne vide. M'a pris une ÉTERNITÉ pour le comprendre.
Pour répéter des cas d'utilisation où vous savez que vous aurez à faire plusieurs fois, vous pouvez remplacer la fonction popen et l'utiliser comme une méthode privée qui m'a été dit par le même programmeur est la meilleure pratique si vous prévoyez de quelqu'un d'autre sera intéressé à maintenir le code un peu plus tard et vous ne voulez pas salir avec elle.
Il est important d'enlever stdout=sous-processus.PIPE si l'utilisateur va être invité pour la saisie. Sinon, le processus semble se bloquer pendant 60 secondes, et l'utilisateur n'a pas à obtenir une invite, et ils ne se rendent compte qu'ils sont censés donner un mot de passe. La sortie standard (stdout) va naturellement aller à la fenêtre de shell et de permettre à l'utilisateur de passer d'entrée pour popen().
Aussi, juste pour expliquer pourquoi vous revenez proc_h.poll() == os.EX_OK, c'est qu'elle retourne 0 si la commande a réussi. C'est juste c-style de meilleur-pratique pour quand vous voulez un système de retour des codes d'erreur dans le cas où la fonction échoue, tout en tenant compte du fait que retourner la valeur 0 sera traitée comme un "faux" par l'interprète.