2011-09-30 4 views
2

J'essaye d'exécuter plusieurs commandes sur un ordinateur distant après avoir fait ssh sur cet ordinateur et ensuite exécuté des commandes sur son terminal.Comment envoyer plusieurs entrées au shell distant en utilisant subprocess.Popen

Je souhaite utiliser un sous-processus pour ce travail. Donc, je l'ai écrit la commande suivante: -

import subprocess 
process = subprocess.Popen(['ssh', '[email protected]'], shell=False, stdin=subprocess.PIPE) 

Maintenant, je reçois le terminal de machine distante et je passe la commande suivante qui est exécuté sur cette machine: -

print process.communicate('python test.py /home/rahul/vPath-dissector') 

Mais quand je fais appel à nouveau la dernière commande appelée, elle donne une erreur: -

print process.communicate('python temp.py /home/rahul/vPath-dissector') 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/subprocess.py", line 690, in communicate 
    self.stdin.write(input) 
    ValueError: I/O operation on closed file 

Alors, quelle commande puis-je utiliser pour envoyer des commandes multiples sans fermer le fichier ???

+0

Avez-vous essayé 'process.stdin.write ('python temp.py/home/rahul/vPath-dissector')' au lieu d'utiliser 'communicate'? – agf

+0

Salut, alors comment vais-je obtenir la sortie de la commande ci-dessus ?? Je suis incapable d'obtenir sa sortie .... – Rahul

+0

'process.stdout.readlines()'? – agf

Répondre

0

Je ne sais pas si cela est utile pour vous puisque vous avez demandé pour subprocess.Popen explicitement - encore, vous pouvez simplement exécuter votre commande à distance de la coque à l'aide

ssh [email protected] python test.py /home/rahul/vPath-dissector 

et bien sûr de python avec

os.system("ssh [email protected] python test.py /home/rahul/vPath-dissector") 

Vous pouvez également capturer la sortie de cette commande.

Désolé si je manquais votre point, mais ...

+0

Sa question portait sur l'envoi de plusieurs commandes à un seul processus SSH. – agf

+0

sûr, mais peut-être que Rahul peut atteindre son objectif avec plusieurs connexions ssh - ou voyez-vous un problème avec l'utilisation de ssh-calls séparés? – thias

+0

Salut, je veux utiliser explicitement sous-processus ici .... os.system n'est pas la manière efficace de faire les appels système comme même écrit sur le site Web de python. Même ils suggèrent d'utiliser un sous-processus plutôt que os.system. – Rahul

0

Quand j'ai eu il y a quelques années le même problème je me suis retrouvé à l'aide de ce recipe du livre de recettes Python. Apparemment, il est maintenant également disponible à partir Pypi, mais je ne sais pas si c'est exactement le même code ou non.

+0

Ne me ressemble pas le même code. Le module pip ne fonctionne pas du tout (il renvoie toujours '(None, None)' malgré le passage de 'PIPE' dans' stdin', 'stdout', et' stderr'.) Aller voir si l'autre module fonctionne mieux. – ArtOfWarfare

+0

Non, vous avez raison. Je pensais avoir ajouté un commentaire pour le signaler, mais si je le faisais, ce n'était pas là. –

+0

Cette recette est-elle toujours votre meilleure suggestion, 3 ans plus tard?Je vais probablement donner un coup de feu demain (j'ai lu votre message juste avant de rentrer à la maison pour la journée et j'ai rapidement essayé le module sur pip et j'ai trouvé que ça ne marchait pas.) J'y retournerais avec pexpect 'sauf qu'il semble être Unix seulement, et je voudrais une solution multi-plateforme. – ArtOfWarfare

2

En essayant de trouver la réponse au même problème j'ai fini par utiliser pexpect au lieu du sous-processus.

import pexpect 

ssh = pexpect.spawn('ssh [email protected]') 

prompts = [">", "#", "\$", "}", '%', pexpect.TIMEOUT] 
ssh.sendline('echo Hello') 
ssh.expect(prompts) 
print ssh.before 

Pour ssh spécifique, il y a même pxssh.

Questions connexes