2012-11-08 11 views
6

Mi rendo conto che questa domanda è stata posta alcune volte ma non sono riuscito a trovare una risposta pertinente ovunque nella mia ricerca.Bash Script a SSH in una macchina senza richiesta di password e senza utilizzare le chiavi

Sto lavorando in un ambiente di sviluppo in cui la sicurezza non è un problema e chiunque potrebbe solo indovinare la password se il pensiero per pochi secondi.

Quello che sto cercando di fare è semplice. Ho creato una funzione alias nel mio file .bashrc locale e vorrei che questa funzione si connettesse automaticamente a una macchina con una password predefinita.

mio attuale implementazione simile a questa:

function s() { 
ssh [email protected]$1 
} 

quando l'eseguo ottengo qualcosa di simile:

~]s 122 

ssh [email protected] 

[email protected]'s password: 

Utilizzando Bash, e non utilizzando chiavi RSA vorrei ottenere questo utilizzare la password predefinita 'password'.

Ho provato quanto segue dove IP e Utente sono già stati impostati.

Do=$(expect -c " 
spawn ssh [email protected]${IP[0]}.${IP[1]}.${IP[2]}.${IP[3]} 
expect \"yes/no\" 
send \"yes\r\" 
expect \"assword\" send \"password\"") 
echo $Do 
$Do 

dà l'errore follwing:

Connecting and logging into server using expect 
usage: send [args] string 
    while executing 
"send" 
    invoked from within 
"expect "assword" send "password"" 
[email protected]'s password: 
bash: spawn: command not found... 

Utilizzando il seguente comando sono in grado di collegare una macchina. Se rimuovo l'interazione, esegue semplicemente il comando uptime e chiude la connessione. Con il comando interattivo non riesco a vedere cosa sto scrivendo o effettivamente interagisco con la macchina. Qualche idea?

Do=$(expect -c "spawn ssh [email protected]${IP[0]}.${IP[1]}.${IP[2]}.${IP[3]}; set timeout 4; expect \"assword\"; send \"password\n\"; expect \"test\"; send \"uptime\n\"; interact;");echo $Do; 
+0

fa il comando uova impostare l'ambiente? In caso contrario, il percorso non verrà impostato e non saprà dove cercare "ssh". Prova a inserire il percorso completo dell'eseguibile. – Jay

+0

Ti chiedi solo, qual è la tua avversione per le chiavi RSA? La prima cosa che faccio sempre quando si imposta un nuovo sistema è autorizzare una chiave RSA. – mpontillo

+0

Non volevo lavorare con le chiavi RSA perché sto lavorando con molti server diversi che hanno una durata molto limitata e questo script verrà utilizzato da molte persone. L'idea è di risparmiare tempo non dovendo digitare la stessa password ogni volta. Se devo digitare la password ogni volta che visito per la prima volta una nuova macchina su ssh-copy-id, le chiavi su di essa vanificano lo scopo. – SuperTetelman

risposta

7

È possibile farlo con lo strumento expect: http://expect.sourceforge.net/

E 'ampiamente disponibili, in modo a seconda del sistema, l'equivalente di sudo apt-get install expect o yum install expect sarà installarlo.

Ecco un esempio di uno script expect con ssh. In questo modo si accede e si dà il controllo del prompt interattivo:

#!/usr/bin/expect 

set login "root" 
set addr "127.0.0.1" 
set pw "password" 

spawn ssh [email protected]$addr 
expect "[email protected]$addr\'s password:" 
send "$pw\r" 
expect "#" 
send "cd /developer\r" 
interact 

Ecco un esempio di come utilizzare expect come parte di uno script bash. Questo accede con ssh, cd su/var, esegue uno script, quindi esce dalla sessione ssh.

#!/bin/bash 
... 

login_via_ssh_and_do_stuff() { 

    # build the expect script in bash 

    expect_sh=$(expect -c " 
    spawn ssh [email protected] 
    expect \"password:\" 
    send \"password\r\" 
    expect \"#\" 
    send \"cd /var\r\" 
    expect \"#\" 
    send \"chmod +x my_script.sh\r\" 
    expect \"#\" 
    send \"./my_script.sh\r\" 
    expect \"#\" 
    send \"exit\r\" 
    ") 

    # run the expect script 
    echo "$expect_sh" 
} 

Puoi lasciare questi frammenti in uno script sul sistema locale, e poi basta alias per gli script.

Inoltre: so che hai detto che la sicurezza non è un problema, ma mi piacerebbe solo notare, ancora una volta, che il modo "corretto" per ssh senza usare una password è usare una coppia chiave-ssh =)

+0

@Kevin: negativo: http://www.pantz.org/software/expect/expect_examples_and_tips.html –

+1

Ho usato sia \ n che \ r per prevedere gli script. Si raccomanda l'uno sull'altro? – SuperTetelman

4

Utilizzare sshpass che è disponibile in repository di pacchetti su Linux-es principali.

Per esempio, quando la password è in password.txt di file:

sshpass -fpassword.txt ssh [email protected] 

sshpass runs ssh in a dedicated tty , fooling it into thinking it is getting the password from an interactive user.

Problemi correlati