Vous pouvez établir des connexions ssh dans une session cron. Ce dont vous avez besoin est de configurer une authentification par clé publique pour avoir un accès sans mot de passe. Pour que cela fonctionne, vous devez avoir PubkeyAuthentication yes
dans chaque serveur distant sshd_config
.
Vous pouvez créer une paire de clés privée / publique avec ou sans phrase secrète. Si vous utilisez une phrase secrète (recommentée), vous devez également démarrer ssh-agent. Sans phrase secrète, il vous suffit d'ajouter le paramètre -i your_identity_file
à la ssh
ligne de commande. ssh
utilisera $HOME/.ssh/id_rsa
par défaut.
J'ai reproduit votre exemple en utilisant une paire de clés avec une phrase secrète. Voici comment je l'ai fait.
1) Création de la paire de clés avec phrase secrète. Enregistré la clé privée sous ~/.ssh/id_rsa_test
, qui devrait avoir les autorisations correctes par défaut. Nous pouvons saisir une phrase secrète vide pour ne pas en utiliser une.
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) Envoyé la clé publique aux serveurs, fait de même pour chacun d'eux. N'oubliez pas qu'ils doivent avoir PubkeyAuthentication
activé.
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) Exécutez ssh-agent en tant que service avec -s
. Cela ne le tuera pas si vous vous déconnectez. Sa sortie est un script shell valide, définissant l'environnement pour que le client ssh sache comment s'y connecter. Nous l'enregistrons dans un fichier (seule la première ligne est vraiment nécessaire).
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) Chargé ce qui précède dans notre environnement actuel afin que nous puissions utiliser ssh-add
pour ajouter notre clé privée à ssh-agent
. la phrase secrète d'en haut.
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) Vérifié, il est ajouté.
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) Le script que j'ai utilisé, légèrement modifié que le vôtre. Notez que je n'ai pas mis la commande ssh entre parenthèses et que je n'utilise pas plutôt des astuces $()
, ce qui est une meilleure alternative pour la substitution de commandes (c'est bash
compatible, vous n'avez pas mentionné le shell que vous utilisez). J'ai utilisé exactement la même commande ssh que la vôtre.
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) Mon crontab (notez que mon sh
est en fait bash
)
john@coffee:~$ crontab -l
# m h dom mon dow command
*/1 * * * * sh /home/john/foo.sh
8) La sortie
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
Le seul problème avec l'utilisation d'une phrase secrète est que vous devez la saisir manuellement au moins une fois. Ainsi, ce qui précède ne fonctionnera pas automatiquement après un redémarrage.