2012-09-20 79 views
8

Quiero usar expect para ejecutar un comando simple cat /tmp/id_rsa.pub sobre ssh.use expect to spawn comando con argumentos que contienen espacios

En una cáscara, que puede ejecutar este wo problema, (con poner manualmente la contraseña)

ssh [email protected] 'cat /tmp/id_rsa.pub' 

quiero para automatizar esto con expect. Mi escritura es expect,

#!/usr/bin/expect 
eval spawn ssh [email protected] 'cat /tmp/id_rsa.pub' 
expect "password:" 
send "123456" 
expect eof 

Se lanza el error bash: cat /tmp/id_rsa.pub: no such file or directory. me parece muy extraño. ¿Cuál podría ser la posible causa?

Editar: después de algunas pruebas, me parece que esto es común, no solo en el caso de cat. Si el argumento para generar el comando es con espacio (incluso si está en las comillas), tendrá un problema. Por ejemplo, la sustitución de cat /tmp/id_rsa.pub con otros comandos con espacios, como

eval spawn ssh [email protected] 'which java' 

se queja con bash: which java: command not found. Pero si va a cambiar eso con pwd, como

eval spawn ssh [email protected] 'pwd' 

que funcione bien.

+3

¿Ha intentado eliminar las comillas simples alrededor de 'argumento de comando'? Parece que la raíz del problema es que está tratando de interpretar toda la cadena entrecomillada como el nombre de un comando, en lugar de dividirla en comando y argumentos ... – twalberg

+0

@twalberg que está funcionando. También intenté comillas dobles, wo/problema también. Solo por curiosidad, ¿puedes explicar un poco qué hay de especial en las comillas simples? – Richard

+0

Tendría que desenterrar los documentos 'expect' para ver lo que dice, no lo sé por la parte superior de mi cabeza. Sugerí que basándome en la sintaxis del mensaje de error en particular que recibía ... – twalberg

Respuesta

0

Supongo que no necesita eval allí. Eliminar y verificar.

Consulte esto expect examples link para ver ejemplos detallados sobre "cómo usar expect?" .

Espero que esto ayude.

+0

Lo he intentado sin '' eval'', pero sin éxito. – Richard

3

Las comillas simples (') no tienen un significado especial para esperar, a diferencia de sh y otras conchas compatibles.
Esto significa que su DECLARACIÓN

spawn ssh [email protected] 'cat /tmp/id_rsa.pub' 

se analiza en las siguientes palabras:

El uso en SH es a grupo a un solo argumento. En Tcl puede usar comillas dobles (") o llaves ({}). Dentro de comillas dobles, las variables Tcl serán sustituidas, mientras que el contenido dentro de {} se pasa sin ninguna sustitución .

tl; dr El Esperar/Tcl equivalente de de ' son {} sh.

A \ antes de que se sustituya una nueva línea.

2

Como dijo Johannes, el uso de ' no funciona.
Tuve un problema similar, pero quería ejecutar más comandos y aún así obtener un shell de inicio de sesión. Me las arreglé para que funcione con ":

expect -c " 
    set timeout 5; 
    spawn ssh -XY [email protected]$host -t \"cat /etc/motd; bash -l\" 
    expect { 
     -re \"^Warning.*\" {exp_continue} 
     -re \"^.*sword: \" {send \"${PASSWORDS[$user]}\r\"; interact} 
    } 
" 
Cuestiones relacionadas