2010-05-12 24 views
6

Quindi volevo automatizzare i miei accessi SSH. L'host con cui sto non consente l'autenticazione della chiave su questo server, quindi ho dovuto essere più fantasioso.Accesso SSH con expect (1). Come uscire aspettare e rimanere in SSH?

Non so molto di script di shell, ma alcune ricerche mi hanno mostrato il comando 'expect' e alcuni script che lo utilizzano esattamente per questo scopo. Ho creato uno script e l'ho eseguito, ha funzionato perfettamente per accedere.

#!/usr/bin/env expect -f 

set password "my_password" 

match_max 1000 

spawn ssh -p 2222 "my_username"@11.22.11.22 

expect "*?assword:*" 
send -- "$password\r" 
send -- "\r" 

expect eof 

Inizialmente, funziona come dovrebbe.

Last login: Wed May 12 21:07:52 on ttys002 
esther:~ user$ expect expect-test.exp 
spawn ssh -p 2222 [email protected] 
[email protected]'s password: 
Last login: Wed May 12 15:44:43 2010 from 20.10.20.10 


-jailshell-3.2$ 

Ma è qui che finisce il successo.

I comandi non funzionano, ma premere invio fa solo una nuova riga. I tasti freccia e altri tasti non alfanumerici producono simboli come '^ [[C', '^ [[A', '^ [OQ' ecc. [1]

Nessun altro prompt viene visualizzato tranne i due inizialmente creati dallo script expect. Eventuali comandi ignorati verranno eseguiti dalla shell locale una volta che si aspettano scadenze. Un esempio:

-jailshell-3.2$ whoami 
ls 
pwd 
hostname 

(... il tempo passa, si aspettano volte su ...)

esther:~ user$ whoami 
user 

esther:~ ciaran$ ls 
Books  Documents Movies  Public  
Code  Downloads Music  Sites  
Desktop  Library  Pictures expect-test.exp 

esther:~ ciaran$ pwd 
/Users/ciaran 

esther:~ ciaran$ hostname 
esther.local 

Come ho detto, non ho esperienza shell scripting, ma penso che è causato a causa Mi aspetto ancora "dentro", ma non "dentro" di SSH. C'è un modo per terminare l'aspettativa una volta che ho effettuato l'accesso, e devo consegnarmi la sessione SSH?

Ho provato comandi come "chiudi" e "esci", dopo "invia -" \ r "". Sì, fanno quello che voglio e si aspettano che muoiano, ma vendicapo prende la sessione SSH con essa, lasciandomi indietro dove ho iniziato. Quello di cui ho veramente bisogno è di aspettarmi di fare il suo lavoro e di terminare, lasciando la sessione SSH nelle mie mani come se l'avessi fatto manualmente.

Tutto l'aiuto è apprezzato, grazie. [1] So che c'è un nome per questo, ma non so cosa sia. E questa è una di quelle cose spaventose che non possono essere consultate, perché i caratteri di punteggiatura sono ignorati. Come una domanda a parte, qual è la storia qui?

risposta

2

Ho usato uno script simile per l'autologin.

Ho usato "interagisci" e ho rimosso "expect eof". In questo modo, posso recuperare lo schermo in modo da poter inserire i comandi a mano.

expect "?assword: " 
send -- "$password\r" 
expect "$" 
interact 
0

mettendo tutto insieme, si accede e si lascia sulla riga di comando esattamente come se digitato manualmente

#!/usr/bin/expect -f 
set ip "127.001.001.001" 
set password "xxyykkx" 
spawn ssh $ip -l root 
expect "?assword:" 
send "$password\r" 
interact