Memiliki masalah yang sangat aneh. Saya telah membuat skrip bash kecil yang menjalankan perintah pada host jarak jauh melalui ssh (menggunakan otentikasi kunci publik).
Ketika saya menjalankan skrip ini secara manual dari baris perintah berfungsi dengan baik, tetapi ketika ditempatkan di /etc/cron.hourly gagal dengan Permission denied, please try again.
kesalahan.
- Saya secara eksplisit mengatur kunci dalam skrip menggunakan
ssh -i /root/.ssh/id_rsa user@remote "command"
; - skrip berjalan sebagai root (saya menambahkan
echo `id` > /tmp/whoami.log
untuk memeriksa ulang); dan - kunci ssh tidak dilindungi kata sandi ...
Sistem ini adalah server Ubuntu 12.04, saya tidak memiliki banyak akses di sisi jarak jauh untuk memecahkan masalah, tetapi seperti yang saya katakan, menjalankan ssh secara manual atau skrip bash yang sama dari perintah-perintah berfungsi.
Adakah yang tahu mengapa ini terjadi atau bagaimana cara memperbaikinya ??
memperbarui
bergantian keluar aku salah, dan kunci ssh itu dilindungi password (dengan pembebanan keychain ssh-agent), maka mengapa gagal dari naskah tetapi tidak ketika berjalan dari sesi bash. Menambahkan . ~/.keychain/$HOSTNAME-sh
ke skrip saya menyelesaikan masalah (terima kasih kepada @grawity yang menunjuk saya ke arah yang benar dan memberikan jawaban yang komprehensif).
SSH_AUTH_SOCK
danKRB5CCNAME
lingkungan.SSH_AUTH_SOCK
hubungannya (walaupun saya senang mencoba apa pun). Saya mengakses file kunci secara langsung, dan file kunci tidak dilindungi kata sandi. Sedangkan untukKRB5CCNAME
pencarian cepat menunjukkan ini ada hubungannya dengan Kerberos. Sekali lagi - jangan melihat hubungan dengan masalah ini, tapi mungkin saya kehilangan sesuatu di sini ...-v
opsi kessh
perintah itu ...ssh -i
perintah dalam kedua kasus ... Saya akan mencoba membuka variabel-variabel dalam skrip dan melihat. Saran bagus untuk ditambahkan-v
- Saya akan menambahkannya juga.Jawaban:
Perintah dan pekerjaan cron interaktif berjalan di lingkungan yang berbeda - khususnya, sesi interaktif mungkin memiliki agen SSH berjalan, atau penyimpanan TGT Kerberos. Karena cara
ssh
memesan metode otentikasi, Anda tidak dapat memastikan bahwa kunci Anda digunakan hanya karena Anda menambahkan-i
opsi.Jika agen SSH berjalan,
ssh
klien selalu mencoba kunci agen sebelum menggunakan kunci yang ditentukan secara eksplisit.Jika jaringan menggunakan Kerberos dan TGT Kerberos hadir, OpenSSH akan menggunakannya sebelum mencoba otentikasi kunci publik.
Saya tidak tahu apa-apa tentang lingkungan Anda, tetapi kedua kemungkinan ini mudah diperiksa:
Tambahkan
unset SSH_AUTH_SOCK
danunset KRB5CCNAME
sebelumssh
perintah, lalu jalankan skrip yang dimodifikasi secara manual.Ini akan mencegah skrip melihat agen atau tiket Kerberos, dan hanya akan menggunakan kunci yang ditentukan secara eksplisit.
Tambahkan
-v
opsi kessh
. Ini akan menampilkan lebih detail tentang bagaimana otentikasi terjadi.Anda juga dapat menambahkan
-oIdentitiesOnly=yes
kessh
perintah; ini akan memaksanya untuk menggunakan kunci yang ditentukan .Ini umumnya tidak disarankan, karena agen biasanya terkait erat dengan sesi login interaktif Anda. Secara khusus, ini hanya dimulai ketika Anda masuk, dan terbunuh ketika Anda keluar - dan itu membutuhkan kata sandi Anda untuk benar-benar membuka kunci kunci SSH (dengan asumsi mereka dilindungi kata sandi).
Anda menyebutkan "Keychain" - apakah ini program OS X, atau skrip Linux? (Saya tidak tahu banyak tentang arsitektur Mac OS X, tetapi AFAIK membuatnya lebih sulit untuk mengakses ssh-agent pengguna dari cronjob ...)
sumber
Solusi lain untuk masalah ini adalah mengatur cron ke ssh ke kotak lokal untuk menjalankan perintah ssh alih-alih menjalankan file atau perintah dengan jalur absolut lokalnya. Ini cache KRB5CCNAME dan bekerja di mana / path / command tidak.
sumber
Anda dapat menggunakan ssh-cron untuk mengatur koneksi SSH terjadwal untuk mengamankan server tanpa mengekspos kunci SSH Anda, tetapi menggunakan agen SSH.
sumber
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'"
sumber
cron
; jadi ini sepertinya tidak memberikan jawaban.