bash: gagal menggunakan scp in cron, tetapi berjalan dengan sukses ketika dijalankan dari command line

8

Saya mencoba menggunakan scp dalam skrip bash yang dijalankan oleh cron (saya menjalankan ini di Ubuntu 10.0.4 LTS).

Script berfungsi dengan baik (yaitu mentransfer dan menyalin file1 dan file2 ke / dari server jauh, ketika saya menjalankannya dari baris perintah. Namun, ketika saya menjalankan skrip sebagai tugas cron, gagal.

Begini tampilannya skrip:

#!/bin/bash

cd /home/oompah/scripts/tests/
scp -P 12345 file1 oompah@someserver.com:~/uploads

if scp -P 12345 oompah@someserver.com:/path/to/file2.dat local.dat >&/dev/null ; then 
    echo "INFO: transfer OK" ; 
else 
    echo "ERROR: transfer failed" ; 
fi

Pesan kesalahan yang saya dapatkan (dialihkan ke file log) ketika saya menjalankannya sebagai tugas cron adalah:

ERROR: transfer failed

Pesan kesalahan yang saya dapatkan ke kotak surat saya adalah:

Permission denied (publickey).
lost connection

Mengapa terjadi, dan bagaimana saya memperbaikinya?

[Sunting]

Saya memodifikasi perintah 1 scp dengan perintah -i (seperti yang disarankan oleh M Jenkins), saya juga menambahkan -v untuk pesan debug. Ini adalah log pesan debug penuh. Semoga, ini dapat menjelaskan apa yang sedang terjadi:

Executing: program /usr/bin/ssh host 12.34.56.78, user oompah, command scp -v -t ~/uploads
OpenSSH_5.3p1 Debian-3ubuntu6, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 12.34.56.78 [12.34.56.78] port 12345.
debug1: Connection established.
debug1: identity file /home/oompah/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3p1 Debian-3ubuntu3
debug1: match: OpenSSH_5.3p1 Debian-3ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '[12.34.56.78]:12345' is known and matches the RSA host key.
debug1: Found key in /home/oompah/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/oompah/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: No more authentication methods to try.
Permission denied (publickey).
lost connection
Permission denied (publickey).
oompahloompah
sumber
3
Output apa yang Anda dapatkan jika Anda tidak mengarahkan stdout dan stderr ke / dev / null?
bmk
@ bbm: tanpa pengalihan stdout, saya mendapatkan pesan berikut: Izin ditolak (publickey). koneksi hilang Izin ditolak (publickey).
oompahloompah
Saran: Jangan pernah membuang stderr dalam skrip seperti ini. Ini lebih berguna daripada memiliki pesan "KESALAHAN" tunggal.
user1686
1
mungkinkah itu a.) Anda menggunakan agen ketika menjalankan perintah secara interaktif, b.) Anda menjalankannya sebagai pengguna yang berbeda tanpa pasangan kunci sendiri (atau folder rumah) atau c.) yang berwenang_kunci pada target membatasi sumber dari koneksi ...?
0xC0000022L

Jawaban:

7

Tebakanku:

Anda memiliki keypair SSH yang dilindungi kata sandi, yang secara otomatis dimuat oleh GNOME Keyring saat Anda login. Namun, crontidak memiliki akses ke keyring, dan sshtidak dapat meminta kata sandi juga (karena kurangnya tty).

Mengutip sshlog yang Anda tambahkan:

debug1: Menawarkan kunci publik : /home/oompah/.ssh/id_rsa
debug1: Server menerima kunci: pkalg ssh-rsa blen 277
debug1: PEM_ read_PrivateKey gagal
debug1: baca PEM kunci pribadi selesai: ketik
debug1: read_passphrase: tidak dapat membuka / dev / tty : Tidak ada perangkat atau alamat tersebut

pengguna1686
sumber
@grawity: Terima kasih atas informasinya. Bagaimana cara saya memperbaiki masalah?
oompahloompah
@ oompah: Hapus kata sandi dari keypair Anda. (Jika mau, Anda dapat membuat yang kedua murni untuk penggunaan otomatis, dan memberikannya scp -i.)
user1686
@grawity: Terima kasih atas umpan baliknya. Saya tidak nyaman menghapus kata sandi dari Keypair saya (saya tidak akan tahu bagaimana cara melakukannya). Anda menyebutkan membuat "yang kedua" - mungkin yang Anda maksud adalah keypair kedua - tetapi yang ini tanpa kata sandi - jadi saya dapat menggunakannya untuk login otomatis. BTW, maksud Anda PASSPHRASE saat Anda mengucapkan kata sandi?
oompahloompah
@ oompah: Jika mesin CentOS Anda aman secara fisik, tidak apa-apa. Saran keypair kedua mungkin hanya akan berguna jika Anda memiliki keypair utama pada banyak sistem. (OpenSSH menyebutnya "frasa sandi", tetapi tidak banyak orang yang benar-benar menggunakan seluruh frasa untuk kunci mereka.)
user1686
Saya akhirnya berhasil, setelah banyak bermain-main dengan gantungan kunci dll. Pada akhirnya, saya setuju dengan Anda untuk membuat keypair tanpa kata sandi untuk cron dan meneruskannya ke scp di skrip shell. Seharusnya tidak sesulit ini ... SMH
oompahloompah
3

Kedengarannya seperti scp tidak mengambil pasangan kunci publik / pribadi Anda dari direktori ~ / .ssh Anda.

Coba tambahkan

HOME=/home/oompah

ke bagian atas file crontab Anda (seharusnya sudah diatur itu pula secara otomatis)

Anda juga dapat mencoba menambahkan

echo "DEBUG: My home dir is $HOME"

ke skrip Anda untuk memastikan itu mendapatkan nilai yang tepat.

Opsi lain adalah menentukan parameter -i untuk scp untuk memaksa pasangan kunci tertentu untuk digunakan:

scp -i /home/oompah/.ssh/id_rsa ...

sebagai contoh.

Majenko
sumber
Saya mencoba saran Anda (menggunakan opsi -i). Silakan lihat pertanyaan saya yang diperbarui
oompahloompah
3

Seperti apa pengguna yang menjalankan cron? Sepertinya pengguna tidak memiliki akses ke kunci publik Anda.

quanticle
sumber
0

Meskipun bukan masalah dalam kasus ini, cron mengartikan tanda-persen ( %) sebagai karakter-baris baru, sehingga harus diloloskan ( \%) atau Anda akan berakhir dengan setengah perintah bertanya-tanya mengapa cron tidak melakukan apa-apa (meskipun ia akan mengeluh di syslog).

Ini dapat menyebabkan masalah jika Anda bekerja dengan /bin/datecrontab Anda.

Michael Trojanek
sumber