È possibile effettuare connessioni ssh all'interno di una sessione cron. Ciò di cui hai bisogno è configurare un'autenticazione con chiave pubblica per avere accesso senza password. Affinché ciò funzioni, è necessario disporre PubkeyAuthentication yes
di ciascun server remoto sshd_config
.
È possibile creare una coppia di chiavi privata / pubblica con o senza passphrase. Se usi una passphrase (raccomandata) devi anche avviare ssh-agent. Senza una passphrase, è sufficiente aggiungere il parametro -i your_identity_file
alla ssh
riga di comando. ssh
userà $HOME/.ssh/id_rsa
come predefinito.
Ho replicato il tuo esempio usando una coppia di chiavi con una passphrase. Ecco come l'ho fatto.
1) Creata la coppia di chiavi con passphrase. Salvata la chiave privata come ~/.ssh/id_rsa_test
, che dovrebbe avere le autorizzazioni corrette per impostazione predefinita. Possiamo inserire una passphrase vuota per non usarne una.
john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]
2) Ha inviato la chiave pubblica ai server, ha fatto lo stesso per tutti. Ricorda che devono essere PubkeyAuthentication
abilitati.
john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password:
Now try logging into the machine, with "ssh 'server1'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
3) Eseguire ssh-agent come servizio con -s
. Questo non lo ucciderà se ti disconnetti. Il suo output è uno script shell valido, che imposta l'ambiente in modo che il client ssh sappia come connettersi ad esso. Lo salviamo in un file (è davvero necessaria solo la prima riga).
john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf
john@coffee:~$ cat ssh-agent.cf
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;
4) Ho caricato quanto sopra nel nostro ambiente attuale in modo che possiamo usare ssh-add
per aggiungere la nostra chiave privata a ssh-agent
. la passphrase dall'alto.
john@coffee:~$ source ssh-agent.cf
john@coffee:~$ ssh-add .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test:
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)
5) Verificato che è stato aggiunto.
john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)
6) Lo script che ho usato, leggermente modificato rispetto al tuo. Nota che non ho racchiuso il comando ssh tra parentesi e non ho usato piuttosto i backtick $()
, che è un'alternativa migliore per la sostituzione dei comandi (questo è bash
compatibile, non hai menzionato quale shell stai usando). Ho usato esattamente lo stesso comando ssh del tuo.
john@coffee:~$ cat foo.sh
#!/bin/bash
source /home/john/ssh-agent.cf
for server in server1 server2; do
usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
date=$(ssh -o ConnectTimeout=60 $server date)
echo "$server - $date - $usr" >> /home/john/foo.log
done
7) Il mio crontab (nota che il mio sh
è in realtà bash
)
john@coffee:~$ crontab -l
# m h dom mon dow command
*/1 * * * * sh /home/john/foo.sh
8) L'uscita
john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john
L'unico problema con l'utilizzo di una passphrase è che è necessario immetterlo manualmente almeno una volta. Quindi, quanto sopra non funzionerà automaticamente dopo un riavvio.