2009-12-13 19 views
43

Sto cercando di creare una connessione ssh e di fare alcune cose sul server remoto all'interno dello script.Come ssh da uno script bash?

Tuttavia il terminale richiede una password, quindi apre la connessione nella finestra del terminale anziché lo script. I comandi non vengono eseguiti finché non esco dalla connessione.

Come posso eseguire ssh da uno script bash?

risposta

53
  1. Se si desidera che la richiesta di password scompaia, utilizzare l'autenticazione basata su chiave (described here).

  2. Per eseguire comandi da remoto tramite SSH si deve dare loro come argomento a ssh, come la seguente:

root @ host: ~ # ssh root @ www 'ps -ef | apache di grep | grep -v grep | wc -l'

+4

Cosa succede se ho più linee (solo per il codice chiarezza), come posso passare che a ssh? – blong

+9

Utilizzare un punto e virgola come separatore comandi. 'cd/var/www; cp foo bar; ' – halfdan

+0

Sistemato il collegamento interrotto. – halfdan

2

Quello che devi fare è scambiare le chiavi SSH per l'utente in cui lo script viene eseguito. Date un'occhiata a this tutorial

Dopo averlo fatto, gli script verranno eseguiti senza la necessità di immettere una password. Ma, per sicurezza, non vuoi farlo per gli utenti root!

14

Se si desidera continuare ad utilizzare le password e non usare lo scambio di chiavi allora si può raggiungere questo obiettivo con 'aspettano' in questo modo:

#!/usr/bin/expect -f 
spawn ssh [email protected] 
expect "password:" 
sleep 1 
send "<your password>\r" 
command1 
command2 
commandN 
3

Non c'è ancora un altro modo per farlo utilizzando Connessioni condivise, ovvero: qualcuno avvia la connessione, utilizzando una password, e ogni connessione successiva si multiplex sullo stesso canale, annullando la necessità di una nuova autenticazione. (E il suo più veloce troppo)

# ~/.ssh/config 
ControlMaster auto 
ControlPath ~/.ssh/pool/%[email protected]%h 

poi basta effettuare il log in, e finché si è connessi, lo script bash sarà in grado di aprire connessioni ssh.

È quindi possibile fermare lo script di lavorare quando qualcuno non ha già aperto il canale:

ssh ... -o KbdInteractiveAuthentication=no ....