Baru saja ditingkatkan dari Snow Leopard ke Lion, dan pekerjaan cron saya yang menggunakan ssh telah berhenti bekerja. Tampaknya ssh-agent tidak lagi berfungsi seperti yang diharapkan.
Berikut ini adalah versi singkat dari skrip dipanggil-dari-cron saya yang bekerja sangat baik di bawah Snow Leopard:
#!/bin/bash
whoami # just to verify I'm running as myself, not root
ssh-agent # just to see what it outputs
eval `ssh-agent`
ssh -vvv REMOTESERVER ls
Saat dijalankan dari prompt perintah, skrip ini berfungsi seperti yang diharapkan.
Ketika dijalankan dari cron, itu tidak bekerja. Output ssh-agent terlihat normal:
SSH_AUTH_SOCK=/tmp/ssh-QRxPUMRxbu/agent.17147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17148; export SSH_AGENT_PID;
echo Agent pid 17148;
Agent pid 17150
Tetapi ssh -vvv
output menunjukkan bahwa gagal tepat ketika kunci pribadi harus dibaca:
debug1: Server accepts key: pkalg ssh-dss blen 818
debug2: input_userauth_pk_ok: fp ...
debug3: sign_and_send_pubkey: DSA ...
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: Device not configured
debug2: no passphrase given, try next key
Dengan kata lain, itu mengharapkan saya untuk mengetikkan frasa sandi ~/.ssh/id_dsa
, yang tentu saja tidak berfungsi dalam pekerjaan cron.
Ini semua bekerja di Snow Leopard.
Perhatikan bahwa saya punya pengaturan Keychain Access sehingga ssh
, ssh-agent
, dan ssh-add
diperbolehkan untuk membaca passphrase saya untuk saya .ssh/id_dsa
berkas - sebagai hasilnya saya bisa SSH dari prompt terminal tanpa harus memasukkan kata sandi saya.
Apakah masalah ini yang perlu saya jalankan ssh-add
di beberapa titik dalam proses login saya? Menjalankannya dari bash prompt standar tidak membantu pekerjaan cron (walaupun, anehnya, itu meminta saya untuk frasa sandi saya ... yang saya pikir tidak perlu b / c dari konfigurasi Akses Keychain).
CATATAN 1 - sebelum mengarahkan saya - Saya sadar ada pertanyaan serupa di sini (
Mac OS X Lion dan sshpass ) tetapi ini secara khusus tentang program sshpass
yang tidak saya gunakan (walaupun saya percaya pertanyaan itu akan dijawab oleh yang satu ini juga ).
CATATAN 2 - Saya menyadari bahwa kunci SSH tanpa frasa sandi akan menyelesaikan masalah saya; namun saya lebih suka untuk tidak menempuh rute ini.
Jawaban:
Bagi siapa pun yang berakhir di halaman ini, saya menyadari saya harus memposting jawabannya:
Menggunakan launchd bukannya cron memang memperbaiki masalah otorisasi. Pengguna Anda meluncurkan pekerjaan (yang dijalankan hanya ketika Anda masuk) dengan benar menggunakan informasi agen SSH yang dibuka melalui gantungan kunci Anda sebagai bagian dari login (sebagai bagian dari manajemen kunci standar OS X, tidak ada perangkat lunak lain yang diperlukan).
Untuk meminimalkan interaksi saya dengan launchd, saya membuat satu pekerjaan launchd yang memanggil skrip bash. Dengan cara ini saya cukup mengedit skrip tanpa berurusan dengan launchd.
Inilah file launchd:
Saya menyimpan file ke
~/Library/LaunchAgents/com.mycron.hourly.plist
, dan kemudian memuatnya dengan:Setelah dimuat, itu akan berjalan segera dan sekali lagi setiap 60 menit.
Jika Anda mengikuti prosedur yang sama, Anda ingin mengubah string `ProgramArguments 'dengan jalur yang benar ke skrip Anda.
sumber
Menambahkan kode berikut ke skrip bash shell Anda akan memperbaiki masalahnya:
Ganti
your_user
dengan nama pengguna Anda sendiri.Kode ini menetapkan nilai yang benar untuk
SSH_AUTH_SOCK
yang menginformasikanssh
atauscp
tentang bagaimana berkomunikasi denganssh-agent
ketika skrip shell dimulaicron
.sumber
zsh: no matches found: /tmp/launch-*/Listeners
Saya berharap keamanan yang ditingkatkan seperti kotak pasir dan perubahan untuk memindahkan lebih jauh ke 64 bit menyebabkan kesedihan yang tak terduga.
Itu bukan jawaban, per se, tetapi launchd mendapatkan semua cinta dari apel hari ini.
Ini tidak memperbaiki masalah cron, tetapi lebih stabil serta lebih banyak orang dapat membantu.
sumber
Bagi siapa pun yang menemukan ini sekarang, mencoba membuat ini bekerja di El Capitan, dan masih enggan mengubah pekerjaan cron satu baris Anda menjadi skrip launchd, jawaban Werner Antweiler masih berfungsi tetapi jalurnya berubah. Di bawah ini bekerja untuk saya:
CATATAN : ingatlah untuk mengganti pengguna_Anda dengan nama pengguna Anda!
Itu tidak akan membiarkan saya mengirimkan ini sebagai komentar pada jawabannya karena saya tidak memiliki reputasi tetapi saya tidak ingin meninggalkannya tanpa memperbarui ini karena pasti membantu saya akhirnya mengaturnya.
Sunting: 30 Maret 2016
Setelah menguji ini sebentar, saya perlu menambahkan bahwa ini hanya berfungsi setelah agen telah digunakan setidaknya satu kali selama login itu. Memulai koneksi ssh atau menjalankan ssh-agent secara manual sudah cukup untuk melakukannya. Skrip startup juga dapat digunakan jika Anda ingin menjalankannya secara otomatis. Saya membuat startup.sh yang baru saja menjalankan ssh-agent dan kemudian menggunakan Script Editor untuk menyimpan .app dengan yang berikut ini dan menambahkan aplikasi yang dihasilkan ke item login saya:
sumber
ls /private/tmp/com.apple.launchd.*/Listeners
. Anda tidak perlu melakukan apa pun kecuali login ke mac.