Sie können SSH-Verbindungen innerhalb einer Cron-Sitzung herstellen. Sie müssen eine Authentifizierung mit öffentlichem Schlüssel einrichten, um einen kennwortlosen Zugriff zu erhalten. Damit dies funktioniert, müssen Sie PubkeyAuthentication yes
in jedem Remote-Server haben sshd_config
.
Sie können ein privates / öffentliches Schlüsselpaar mit oder ohne Passphrase erstellen. Wenn Sie eine Passphrase verwenden (empfohlen), müssen Sie auch ssh-agent starten. Ohne Passphrase müssen Sie den Parameter nur -i your_identity_file
zur ssh
Befehlszeile hinzufügen . ssh
wird $HOME/.ssh/id_rsa
als Standard verwendet.
Ich habe Ihr Beispiel mithilfe eines Schlüsselpaars mit einer Passphrase repliziert. So habe ich es gemacht.
1) Erstellt das Schlüsselpaar mit Passphrase. Der private Schlüssel wurde als gespeichert, der ~/.ssh/id_rsa_test
standardmäßig die richtigen Berechtigungen haben sollte. Wir können eine leere Passphrase eingeben, wenn wir keine verwenden.
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) Der öffentliche Schlüssel wurde an die Server gesendet und für alle gleich ausgeführt. Denken Sie daran, dass sie PubkeyAuthentication
aktiviert sein müssen.
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) Führen Sie ssh-agent als Dienst mit aus -s
. Dies wird es nicht töten, wenn Sie sich abmelden. Die Ausgabe ist ein gültiges Shell-Skript, das die Umgebung so einstellt, dass der SSH-Client weiß, wie er sich mit ihm verbindet. Wir speichern das in einer Datei (nur die erste Zeile wird wirklich benötigt).
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) Das Obige wurde in unsere aktuelle Umgebung geladen, damit wir ssh-add
unseren privaten Schlüssel hinzufügen können ssh-agent
. die Passphrase von oben.
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) Verifiziert, dass es hinzugefügt wurde.
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) Das Skript, das ich verwendet habe, ist leicht modifiziert als deins. Beachten Sie, dass ich den Befehl ssh nicht in Klammern gesetzt und keine Backticks verwendet habe. Dies $()
ist eine bessere Alternative für die Befehlssubstitution (dies ist bash
kompatibel, Sie haben nicht erwähnt, welche Shell Sie verwenden). Ich habe genau den gleichen ssh-Befehl wie Ihren verwendet.
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) Mein Crontab (beachte, dass mein sh
tatsächlich ist bash
)
john@coffee:~$ crontab -l
# m h dom mon dow command
*/1 * * * * sh /home/john/foo.sh
8) Die Ausgabe
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
Das einzige Problem bei der Verwendung einer Passphrase besteht darin, dass Sie sie mindestens einmal manuell eingeben müssen. Daher funktioniert das oben Genannte nach einem Neustart nicht automatisch.