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.

Avez-vous essayé de supprimer les guillemets simples autour de "commande " argument"? Il semble que la racine du problème est qu'il est tentant d'interpréter l'ensemble de la chaîne de caractères entre guillemets comme le nom d'une commande, plutôt que de le diviser en commande et les arguments...
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