l'utilisation s'attendre à commande spawn avec des arguments contenant des espaces
Je veux utiliser expect
pour exécuter une commande simple cat /tmp/id_rsa.pub
sur ssh.
Dans un shell, je peux exécuter cette wo problème, (avec mettre manuellement le mot de passe)
ssh root@localhost 'cat /tmp/id_rsa.pub'
Je veux automatiser cela avec expect
. Mon expect
script est,
#!/usr/bin/expect
eval spawn ssh root@localhost 'cat /tmp/id_rsa.pub'
expect "password:"
send "123456"
expect eof
Il déclenche une erreur bash: cat /tmp/id_rsa.pub: no such file or directory
. il semble très étrange pour moi. Ce qui pourrait être la cause possible?
Edit: après quelques tests, je trouve que c'est commun, non seulement dans le cas de cat
. Si l'argument de a engendré de commande est avec de l'espace (même si c'est dans les guillemets), il aura problème. Par exemple, le remplacement cat /tmp/id_rsa.pub
avec d'autres commandes avec des espaces, comme
eval spawn ssh root@localhost 'which java'
il se plaint avec bash: which java: command not found
. Mais si vous remplacez qu'avec pwd
, comme
eval spawn ssh root@localhost 'pwd'
il fonctionne bien.
que de travail. J'ai aussi essayé les guillemets doubles, wo/ type de problème. Juste par curiosité, u peut expliquer un peu ce qui est spécial au sujet de guillemets simples?
Je dois creuser la
expect
docs pour voir ce qu'il dit - je ne sais pas du haut de ma tête. J'ai suggéré que, sur la base de la syntaxe de message d'erreur particulier, vous avez été...OriginalL'auteur Richard | 2012-09-20
Vous devez vous connecter pour publier un commentaire.
Guillemets simples (
'
) n'ont aucune signification particulière à Attendre, à la différence des poissons et autres commandes compatibles.Cela signifie que votre tresorerie
est analysée dans les mots suivants:
spawn
ssh
root@localhost
'cat
- pas jusqu'à ce que l'apostrophe./tmp/id_rsa.pub'
L'utilisation dans les poissons est de regrouper à un seul argument. En Tcl, vous pouvez soit utiliser les guillemets doubles (
"
) ou des accolades ({}
). À l'intérieur de guillemets doubles, les variables Tcl sera substitué, alors que le contenu à l'intérieur de{}
est passé sans substitution1.tl;dr Le fait de s'Attendre/Tcl équivalent de sh est
'
sont{}
.1 Un
\
avant un retour à la ligne sera toujours substitued.OriginalL'auteur Johannes Kuhn
Que Johannes dit, l'utilisation
'
ne fonctionne pas.J'ai eu un problème similaire, mais je voulais exécuter plusieurs commandes et toujours obtenir un shell de connexion. J'ai réussi à le faire fonctionner avec
"
:OriginalL'auteur genesys87
Je suppose que vous n'avez pas besoin
eval
. Retirez-le et vérifiez.Cochez cette s'attendre à des exemples de lien pour des exemples détaillés sur "comment utiliser
expect
?" .Espère que cette aide.
eval
, mais sans succès.OriginalL'auteur mtk