2012-09-20 7 views
8

Desidero utilizzare expect per eseguire un semplice comando cat /tmp/id_rsa.pub su ssh.uso prevede di generare comando con argomenti contenenti spazi

In un guscio, posso eseguire questo wo problema, (con messo manualmente la password)

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

voglio automatizzare questo con expect. Il mio script expect è,

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

Getta errore bash: cat /tmp/id_rsa.pub: no such file or directory. mi sembra molto strano Quale potrebbe essere la possibile causa?

Modifica: dopo alcuni test, ho trovato questo è comune, non solo nel caso di cat. Se il comando argomento di spawn è con spazio (anche se è tra virgolette), avrà un problema. Ad esempio, sostituendo cat /tmp/id_rsa.pub con altri comandi con spazi, come

eval spawn ssh [email protected] 'which java' 

si lamenta con bash: which java: command not found. Ma in caso di sostituzione che, con pwd, come

eval spawn ssh [email protected] 'pwd' 

funzionare bene.

+3

Hai provato a rimuovere le virgolette singole attorno a 'argomento di comando'? Sembra che la radice del problema è che sta cercando di interpretare l'intera stringa citato come il nome di un comando, invece di dividere in comando e gli argomenti ... – twalberg

+0

@twalberg che sta lavorando. Ho anche provato le doppie virgolette, wo/problem pure. Solo per curiosità, puoi spiegare un po 'cosa c'è di speciale nelle virgolette singole? – Richard

+0

Devo scavare i documenti 'expect' per vedere cosa dice - non so in cima alla mia testa. L'ho suggerito sulla base della sintassi del particolare messaggio di errore che stavi ricevendo ... – twalberg

risposta

0

Immagino che non sia necessario eval lì. Rimuovilo e controlla.

Controllare questo expect examples link per esempi dettagliati su "come utilizzare expect?" .

Spero che questo aiuti.

+0

Ho provato senza '' eval'', ma senza successo. – Richard

3

Le virgolette singole (') non hanno alcun significato speciale per Aspettarsi, a differenza di sh e di altre shell compatibili.
Questo significa che il vostro statment

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

viene analizzato nelle seguenti parole:

  • spawn
  • ssh
  • [email protected]
  • 'cat - non fino a quando l'altro singolo preventivo.
  • /tmp/id_rsa.pub'

L'utilizzo delle cu è al gruppo ad un singolo argomento. In Tcl è possibile utilizzare virgolette doppie (") o parentesi graffe ({}). All'interno delle virgolette doppie, le variabili Tcl saranno sostituite, mentre il contenuto all'interno di {} viene passato senza alcuna sostituzione .

tl; dr Il Expect/Tcl equivalente di ' sono {} sh.

A \ prima di una nuova riga sarà ancora sostituita.

2

Come detto Johannes, utilizzando ' non funziona.
Ho avuto un problema simile, ma ho voluto eseguire più comandi e poi ancora ottenere una shell di login. Sono riuscito a farlo funzionare 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} 
    } 
"