ssh pexpect pas en mesure de gérer les options de commande
Question
am en utilisant ssh pexpect d'écrire un script pour la compilation, l'apparence d'automatisation ssh comme celui-ci,
enter code here
child = ssh_expect('root', server2, cmd)
child.expect(pexpect.EOF)
print child.before
où cmd est la suivante:
cmd = "./configure CFLAGS=\"-g -O0 -DDEBUG\""
le problème se produit est qu'il dit,
configure: error: unrecognized option: -O0
considérant que, exécutez la même commande en utilisant commands.getoutput il exécute correctement.
Question quel est le problème que ce genre d'erreur est généré et obtenir comment puis-je celui éradiquer les champs?
Merci d'avance:)
La solution
La raison pour laquelle il travaille si vous faites commands.getoutput
est que toutes les commandes là-bas sont exécutés si une coquille, qui analysera votre commandline et comprendre que ce qui est entre les guillemets doubles après CFLAGS fait partie du même paramètre.
Lorsque vous utilisez cmds par pexpect, sans coquille est impliqué. En outre, il n'y a pas de coquille impliquée de l'autre côté de la connexion ssh lorsque vous fournissez des commandes sur la ligne de commande ssh, donc il n'y a rien qui parse CFLAGS en un seul paramètre. Par conséquent, au lieu du script configure obtenir un paramètre (CFLAGS = \ "- g -O0 -DDEBUG \"), il obtient trois paramètres ( 'CFLAGS = -g', '-O0', '-DDEBUG')
Si possible, évitez d'envoyer des commandes où les paramètres sont séparés par des espaces. Il semble pexpect peut prendre une liste d'arguments à la place. Exemple de code de travail:
#/usr/bin/env python
import pexpect
def ssh_expect(user, hostname, cmd):
child = pexpect.spawn("ssh", ["%s@%s" % (user, hostname)] + cmd, timeout=3600)
return child
child = ssh_expect("root", "server.example.com", ["./configure", "CFLAGS=\"-g -O0 -DDEBUG\""])
child.expect(pexpect.EOF)
print child.before