Tidak dapat ssh ke mesin jarak jauh menggunakan skrip shell di Crontab

11

Di bawah ini adalah skrip yang saya coba jalankan, yang berjalan tanpa masalah

for i in `seq 200 2100`
do
  usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`) 
  echo $usr
done

Tapi begitu saya menambahkannya ke crontab, itu tidak memberi saya pengguna.

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh

Tolong berikan pemikiran Anda .....

mungkin cron iblis sedang berjalan, jadi kita perlu memasukkan beberapa binari ...?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Izin ditolak (publickey, gssapi-keyex, gssapi-with-mic, kata sandi). Izin ditolak (publickey, gssapi-keyex, gssapi-with-mic, kata sandi). Izin ditolak (publickey, gssapi-keyex, gssapi-with-mic, kata sandi).
Apa intenarmu dengan ini? Apa yang ingin Anda capai. Asal tahu saja, kami tidak dapat membantu aktivitas jahat apa pun jika itu adalah kehebatan Anda
Timothy Frew

Jawaban:

14

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 yesdi 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_fileke sshbaris perintah. sshakan digunakan $HOME/.ssh/id_rsasebagai 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 PubkeyAuthenticationdiaktifkan.

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-adduntuk 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 bashkompatibel, 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 shsebenarnya 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.

forcefsck
sumber
Hebat - terima kasih. Saya dapat hidup dengan tidak ada restart otomatis setelah reboot untuk saat ini, setidaknya.
Peter Mounce
Gunakan ssh-cron untuk mengatur koneksi SSH terjadwal ke server aman tanpa mengekspos kunci SSH Anda, tetapi menggunakan agen SSH. unix.stackexchange.com/questions/8903/...
Luchostein
4

Siapa yang mengetik kata sandi? Pekerjaan cron tidak bisa didapatkan di ssh-agent Anda, jadi kunci publik tidak akan berfungsi.

Anda perlu menyediakan sshfile kunci secara eksplisit (lihat -iopsi), karena tidak dapat meminta agen; dan kunci itu harus memiliki frasa sandi kosong.

geekosaurus
sumber
Sudah mencoba dengan memasukkan nama pengguna dan kata sandi juga - ssh -t -t -o ConnectTimeout = 60 user @ machine $ 1 finger | ekor -1 | awk '{print $ 1}' </ home / user / passwd ---- maksud saya direktori home ada di NFS, jadi mount ke everymachine
Jika ssh punya arti, gunakan /dev/ttyuntuk membaca kata sandi alih-alih stdin; itu tidak akan bekerja dari cron.
geekosaur
Mencoba memberikan opsi -i tetapi tidak berhasil! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts mesin $ 1 jari | ekor -1 | awk '{print $ 1}' ------ PERINGATAN: FILE KUNCI PRIVATE YANG TIDAK DILINDUNGI! Izin 0640 untuk '/home/user/.ssh/known_hosts' terlalu terbuka. Disarankan bahwa file kunci pribadi Anda TIDAK dapat diakses oleh orang lain. Kunci pribadi ini akan diabaikan. izin buruk: abaikan kunci:
Mengapa itu mengeluh known_hosts? Tapi ya, Anda harus berhati-hati terhadap izin - file kunci pribadi harus mode 0600 atau bahkan 0400, milik Anda. Jika Anda memerlukan beberapa pengguna lain untuk dapat menggunakannya juga, Anda harus melihat ke dalam POSIX ACL atau yang serupa.
geekosaur
Kalau dipikir-pikir, saya melihat GSSAPI ditawarkan di sana sehingga kemungkinan lain adalah untuk mendapatkan keytab dan menggunakannya untuk kinitdi dalam pekerjaan cron. Yang mengatakan, keytab juga membutuhkan perawatan yang sama dalam perizinan; tetapi sshsetidaknya tidak akan mengeluh tentang mereka.
geekosaur
1

Daripada menyimpan file sementara seperti yang dilakukan forcefsck, saya lebih suka menggunakan finduntuk mencari agen aktif.

Pada topik skrip yang membutuhkan ssh-agent, saya menggunakan:

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

Ia mencari ssh-agentsoket dan mengembalikan yang pertama. Ini dibatasi hanya untuk pengguna saat ini, oleh karena itu Anda tidak akan sengaja mencoba menggunakan pengguna lain dan mendapatkan izin ditolak kesalahan. Anda juga harus sudah masuk dengan aktif ssh-agent. (Ubuntu memulai agen ketika GUI mulai).

Jika Anda meletakkan ini di skrip lain, Anda harus menyebutnya dengan sourceatau .karena itu perlu mengatur SSH_AUTH_SOCKvariabel.

reaver277
sumber
0

Gunakan ssh-cron untuk mengatur koneksi SSH terjadwal ke server aman tanpa mengekspos kunci SSH Anda, tetapi menggunakan agen SSH.

Luchostein
sumber
0

Anda dapat menjalankan skrip atau perintah di crontab seperti:

0 * * * * bash -c -l "/home/user/sshscript.sh"

atau

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
pawan
sumber