2016-08-15 3 views
1

Dans mon script python, j'ai besoin d'exécuter une commande sur SSH qui prend également un heredoc comme argument. La commande appelle un script interactif qui peut également être appelé comme suit:Utiliser un document ici avec pxssh (pexpect)

dbscontrol << EOI 
HELP 
QUIT 
EOI 

Je trouve également this Q&A qui décrit comment le faire en utilisant subprocess mais je aime vraiment pexpect.pxssh commodité. Exemple de code serait grandement appréciée

Répondre

1

Je n'ai pas de solution pratique pour tester ma réponse à votre question, mais j'ai une suggestion qui devrait fonctionner et, sinon, vous pouvez au moins vous rapprocher.

Tenir compte de cette commande:

$ ssh oak 'ftp << EOF 
lpwd 
quit 
EOF' 
Local directory: /home/jklowden 
$ 

Qu'est-ce qui se passe? La chaîne entre guillemets est passée en argument unique à ssh, où elle est "exécutée" sur la télécommande. Alors que ssh n'est pas explicite sur ce que cela signifie, exactement, nous savons ce que execv (2) fait: si execve (2) ne parvient pas à exécuter ses arguments passés, la fonction execv appellera /bin/sh avec les mêmes arguments (dans ce cas, notre chaîne citée). Le shell évalue ensuite la chaîne citée en tant qu'arguments séparés, détecte la redirection HereDoc et s'exécute par défaut.

En utilisant cette information, et en prenant un coup d'œil à la documentation pexpect.pxssh, il semble que vous voulez:

s = pxssh.pxssh() 
... 
s.sendline('ftp << EOF\nlpwd\nquit\nEOF') 

Si cela ne fonctionne pas, quelque chose munging vos données. Cinq minutes avec strace (1) vous dira ce qui lui est arrivé, et vous pouvez commencer à pointer du doigt. ;-)

HTH.

+0

Fait sens. J'ai finalement fini par utiliser 'subprocess.Popen' mais avec à peu près la même syntaxe. Merci et profitez de la générosité (bientôt) – Bostone