L’uso prevede uno script bash per fornire la password al comando SSH

Per coloro che vogliono rispondere che dovrei usare le chiavi SSH, si prega di astenersi

Sto cercando di usare aspettarsi in uno script bash per fornire la password SSH. Fornire la password funziona ma non vado a finire nella sessione SSH come dovrei, torna indietro a bash.

La mia sceneggiatura:

#!/bin/bash read -s PWD /usr/bin/expect <<EOD spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com' expect "password" send "$PWD\n" EOD echo "you're out" 

L’output del mio script:

 spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com [email protected]$myhost.example.com's password: you're out 

Mi piacerebbe avere la mia sessione SSH e solo quando esco per tornare al mio script bash. Il motivo per cui sto usando bash prima di me è perché ho usato un menu per scegliere a quale unità collegarmi.

Grazie

Il mix di bash e l’aspettativa non sono un buon modo per ottenere l’effetto desiderato. Proverei a usare solo Expect:

 #!/usr/bin/expect eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com #use correct prompt set prompt ":|#|\\\$" interact -o -nobuffer -re $prompt return send "my_password\r" interact -o -nobuffer -re $prompt return send "my_command1\r" interact -o -nobuffer -re $prompt return send "my_command2\r" interact 

La soluzione di esempio per bash potrebbe essere:

 #!/bin/bash /usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com; interact }' 

Questo attenderà per entrare e poi tornare (per un momento) sessione intertriggers.

Il modo più semplice è usare sshpass . Questo è disponibile nei repository Ubuntu / Debian e non devi occuparti di integrare le aspettative con bash.

Un esempio:

 sshpass -p ssh  sshpass -ptest1324 ssh [email protected] ls -l /tmp 

Il comando sopra può essere facilmente integrato con uno script bash.

Nota: leggere la sezione Considerazioni sulla sicurezza in man sshpass per una piena comprensione delle implicazioni sulla sicurezza.

Aggiungi il comando ‘interact’ expect subito prima del tuo EOD:

 #!/bin/bash read -s PWD /usr/bin/expect < 

Questo dovrebbe consentire l'interazione con la macchina remota fino al logout. Quindi tornerai in bash.

Dopo aver cercato una risposta alla domanda per mesi, ho finalmente trovato la soluzione migliore: scrivere una semplice sceneggiatura.

 #!/usr/bin/expect set timeout 20 set cmd [lrange $argv 1 end] set password [lindex $argv 0] eval spawn $cmd expect "assword:" send "$password\r"; interact 

Metti su /usr/bin/exp , quindi puoi usare:

  • exp ssh
  • exp scp

Fatto!

Usa lo strumento di aiuto fd0ssh (da hxtools, non da pmt), funziona senza doversi aspettare un particolare prompt dal programma ssh.

Assicurati anche di usare

 send -- "$PWD\r" 

invece, poiché le password che iniziano con un trattino (-) falliranno diversamente.

Quanto sopra non interpreterà una stringa che inizia con un trattino come opzione per il comando send.

Un semplice script di previsione

Remotelogin.exp

  #!/usr/bin/expect set user [lindex $argv 1] set ip [lindex $argv 0] set password [lindex $argv 2] spawn ssh [email protected]$ip expect "password" send "$password\r" interact 

Esempio:

  ./Remotelogin.exp    

Un altro modo in cui ho trovato utile utilizzare un piccolo script di aspettativa da uno script di bash è il seguente.

 ... bash-script start bash-commands ... expect - < 

Funziona perché ...If the string "-" is supplied as a filename, standard input is read instead...