Je peux mettre avec succès des fichiers sur les machines scolaires. Le problème se produit lorsque j'essaie d'utiliser Exec_Command ("Handin mes fichiers '), puis lisez la sortie pour déterminer l'action suivante. P> donc j'ai p> Des idées? p> mise à jour: p> Le problème est d'interagir avec la commande à la main pendant l'exécution. Après avoir exécuté la commande, la main peut ou peut ne pas toujours fonctionner. Si c'est la première fois que cela le soumett de réussite, Blah Bla et finit l'exécution. Tout est bien. Mais si je suis à nouveau soumettre, je dois autoriser un écrasement (stdin.write ('y')) pour chaque fichier. P> TL / DR: strong> p> < P> Comment vérifier si A Exec_Command () est toujours en cours d'exécution, en attente d'entrée et de lecture () de stdout en conséquence? p> p>
5 Réponses :
Le problème peut être que la commande à distance attend l'entrée (il s'attend à ce que vous écrivez quelque chose à Stdin, ne sachant pas que vous n'allez pas si vous le dites). Essayez stdin.channel.shutdown_write () code> (je crois
stdin.close () code> par lui-même ne fera pas le truc: cela ne fera que causer une affleurance) p>
C'est ce que je devais faire une lecture en lecture pour vérifier. Si vous faites une fois plusieurs fois, il vous demande si vous souhaitez écraser [Y / N] pour chaque fichier, si c'est la première fois que cela ne nécessite pas d'entrée supplémentaire. Comment vérifier la sortie pendant EXEC_COMMAND?
Les STDOUT.READLINES () lisent réellement la sortie des commandes SSH, qui ne "lisent" pas l'entrée du script et l'envoyant à la commande SSH. Pour ce faire, vous avez besoin de stdin.write ().
Je suis au courant de cela, vous comprenez mal. J'ai mis à jour mon post original, peut-être que cela effacera les choses
@macregor Avez-vous trouvé une solution à votre problème? Je cherche quelque chose exactement que vous aviez besoin ici.
Je ne vois rien de mal avec le code Snippit ci-dessus. Le programme ci-dessous est un script complet qui se connecte à un hôte et exécute la commande LS pour afficher les fichiers. Je viens de l'essayer et ça marche pour moi. Peut-être essayer cela et voir si cela fonctionne pour vous. Si cela ne fonctionne pas, je soupçonne un problème spécifique à votre serveur SSH, commande que vous exécutez ou paramiko. Si cela fonctionne pour vous, il suffit d'apporter des modifications à cela pour vous déplacer vers votre fonctionnalité existante et de voir où il se casse. Si cela fonctionne pour vous ma prochaine suggestion serait de Essayez de remplacer le 'LS /' avec la commande réelle des personnes qui tentent d'exécuter. Il est possible que la commande est suspendue à l'attente de l'entrée de l'utilisateur, etc. p> p>
Ouais im raccordé bien, les commandes de base fonctionnent bien. J'essaie d'utiliser la lecture en lecture pour déterminer quoi entrer ensuite lors de l'exécution de la commande
C'est presque certainement votre commande à la main alors. Il attend un comportement interactif. Regardez cet exemple qui utilise 'sudo dmesg' dans le lien et doit donc répondre à une invite de mot de passe: Jessenoller.com/2009/02/05/...
Ok, j'ai besoin de le faire de manière dynamique. Existe-t-il un moyen de lire STDOUT lors de l'exécution de la commande pour vérifier combien de fois j'ai besoin d'écrire 'y'
Je pense au lieu d'exécuter EXEC_COMMAND, vous devrez faire ce que la réponse acceptée à cette question recommande: Stackoverflow.com/Questtions/373639/...
La commande ls / code> fonctionne bien. Mais pas de sortie si j'appelle
./.out code>. (Je m'attends à quelque chose comme
'Hello World' Code> String), quelle pourrait être la raison?
Essayez 'Hello World \ N' de forcer le tampon d'écriture de l'expéditeur
Pour contourner cela et obtenez la sortie de ifconfig, vous pouvez essayer d'utiliser l'option get_pty = true i>
par exemple: p>
C'est un vieux fil mais j'ai également vu cette question aussi. Ceci est dû à un bogue dans Paramiko qu'il ne peut pas traiter le gros stdout de la commande distante, il est donc suspendu. p>
ref: https://github.com/paramiko/paramiko/issues/515 a> p>
solution possible: https://gist.github.com/matjohn2/2c1cc4988e17112A34F310667E0FF6E7E << / p>
D'accord alors j'ai été récemment coincé avec ce problème aussi. Vérification des documents et un peu plus de recherche Permettez-moi d'une réponse acceptable que je puisse utiliser pour envoyer des entrées et de vérifier la sortie pour des scripts simples qui pourraient nécessiter une entrée utilisateur
au lieu d'essayer d'utiliser http://docs.paramiko.org/en/stable/api/channel.html#paramiko.channel.channel.recv_ready p> < P> Ci-dessous est juste le code de la chaudière pour voir une commande de base sudo exécutée p> maintenant, vous pouvez l'utiliser pour que vous puissiez l'inclue sur tous les chèques que vous souhaitez. Il pourrait y avoir un meilleur moyen de mettre en œuvre cela avec Invoke_Shell, mais cela fonctionne à mon objectif. P> P> .read () code > ou
.readline () code> qui attend que le programme soit fini.
Demandez-les demander à un octet comme
.read (1) code> ou
.readline (1) code> jusqu'à
stdout.channel.recv_ready () code> retourne code> renvoie < code> vrai code> qui dit s'il y a quelque chose dans
stdout à lire
Il serait peut-être préférable d'utiliser
stdout.channel.recv (9999) code> au lieu de
réaline (1) code> car il vous permet de demander 9999 octets au lieu de 1 avec lecture / readline Et vous ne serez pas impassible si vous demandez plus d'octets que ce qui existe. p>
SOUT code> doit être modifié en
stdout code> c'est la typo
Avez-vous une solution pour TL / DR? Aussi comment puis-je connaître le texte avant d'attendre la saisie par exemple. @ mot de passe ...