Anda dapat membuat koneksi ssh dalam sesi cron. Yang Anda butuhkan adalah mengatur otentikasi kunci publik untuk memiliki akses tanpa kata sandi. Agar ini berfungsi, Anda harus memiliki PubkeyAuthentication yes
di setiap server jauh sshd_config
.
Anda dapat membuat pasangan kunci pribadi / publik dengan atau tanpa frasa sandi. Jika Anda menggunakan kata sandi (recommented), Anda juga harus memulai ssh-agent. Tanpa frasa sandi, Anda hanya perlu menambahkan parameter -i your_identity_file
ke ssh
baris perintah. ssh
akan digunakan $HOME/.ssh/id_rsa
sebagai default.
Saya meniru contoh Anda dengan menggunakan pasangan kunci dengan frasa sandi. Begini cara saya melakukannya.
1) Membuat pasangan kunci dengan frasa sandi. Menyimpan kunci pribadi sebagai ~/.ssh/id_rsa_test
, yang seharusnya memiliki izin yang benar secara default. Kita dapat memasukkan frasa sandi kosong karena tidak menggunakan frasa.
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) Mengirim kunci publik ke server, melakukan hal yang sama untuk semuanya. Ingat mereka harus PubkeyAuthentication
diaktifkan.
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) Jalankan ssh-agent sebagai layanan dengan -s
. Ini tidak akan membunuhnya jika Anda keluar. Keluarannya adalah skrip shell yang valid, mengatur lingkungan sehingga klien ssh akan tahu cara menghubungkannya. Kami menyimpannya ke file (hanya baris pertama yang benar-benar diperlukan).
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) Memuat di atas ke lingkungan kita saat ini sehingga kita dapat menggunakan ssh-add
untuk menambahkan kunci pribadi kita ssh-agent
. frasa sandi dari atas.
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) Terverifikasi itu ditambahkan.
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) Skrip yang saya gunakan, sedikit dimodifikasi dari milik Anda. Perhatikan bahwa saya tidak menyertakan perintah ssh di dalam tanda kurung dan tidak menggunakan backtick $()
, yang merupakan alternatif yang lebih baik untuk substitusi perintah (ini bash
kompatibel, Anda tidak menyebutkan shell yang Anda gunakan). Saya menggunakan perintah ssh yang sama persis dengan milik Anda.
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) crontab saya (perhatikan bahwa saya sh
sebenarnya bash
)
john@coffee:~$ crontab -l
# m h dom mon dow command
*/1 * * * * sh /home/john/foo.sh
8) Output
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
Satu-satunya masalah dengan menggunakan kata sandi adalah bahwa Anda harus memasukkannya secara manual setidaknya satu kali. Jadi, hal di atas tidak akan bekerja secara otomatis setelah reboot.