Saya sering membuat cadangan ke drive lokal yang ingin saya sinkronkan setiap hari ke server jarak jauh.
Server target dikonfigurasikan hanya untuk akses kunci SSH (tanpa kata sandi). Karena kunci SSH utama saya untuk server itu dilindungi frasa sandi, saya telah membuat kunci SSH kedua (tidak dilindungi frasa sandi) + pengguna yang akan digunakan untuk cadangan tanpa pengawasan - dengan cara ini saya tidak harus hadir untuk memasukkan frasa sandi saya ketika cron berjalan .
Saya menggunakan cron dan rsync, dan semua perintah bekerja secara individual, tetapi gagal saat digabungkan.
Terjauh yang saya miliki saat pemecahan masalah sedang berjalan
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
yang mengembalikan kesalahan
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
Adakah tips tentang cara memecahkan masalah ini lebih lanjut?
Inilah yang saya coba sejauh ini dan saya kehabisan ide:
- Cron jelas berjalan
ps aux | grep cron
Tidak ada yang aneh di / var / log / syslog
Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)
SSH di Terminal ke server jauh saat pengguna cadangan bekerja
ssh [email protected]
- Menjalankan perintah di Terminal berfungsi dengan baik
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Menentukan jalur secara manual ke cadangan-pengguna tidak berpengaruh
rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Mengganti perintah yang tidak berfungsi dengan perintah tes sederhana berfungsi
echo "Hello world" > ~/Desktop/test.txt
Berteriak / bersumpah pada komputer tidak berpengaruh (tapi membuatku merasa lebih baik sementara).
Edit 1:
Ini file crontab saya dan script yang dipanggilnya.
...
# m h dom mon dow command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
dan
#!/bin/bash
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Edit 2:
Hanya untuk memperjelas, /var/log/auth.log
pada server target berisi baris Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root
Ini membingungkan karena saya tidak lagi menjalankan cron setiap menit secara lokal, tetapi entri baru masih muncul setiap menit di log server. File crontab untuk semua pengguna (termasuk root) di server kosong & tidak melakukan apa-apa.
Juga, 'cadangan-saja' pengguna dibuat hanya di server dan dengan hak terbatas, dengan kunci SSH khusus yang disalin ke mesin desktop saya. Saya berasumsi ini adalah cara untuk pergi karena semuanya bekerja ketika menjalankan perintah secara manual.
File crontab yang diposting di atas adalah untuk saya, pengguna 'tom' di mesin desktop saya. Maksud saya adalah meminta skrip panggilan yang harus masuk ke server sebagai 'cadangan saja' pengguna. Saya baru saja mencoba menjalankan skrip cadangan (alih-alih perintah di dalamnya) dan berhasil tersambung & berfungsi. Saya menjalankannya di desktop saya sebagai pengguna 'tom', pengguna yang sama yang menciptakan pekerjaan cron yang tidak akan berfungsi. Inilah output dari log server yang sesuai dengan login yang berhasil
Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Sep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Sep 7 16:06:02 <hostname> sshd[6747]...
. Apakah Anda 100% positif bahwa logline ini dari server dan itu adalah baris yang benar? Crontab yang Anda poskan adalah crontab khusus cadangan ? Juga, cobalah untuk menambahkan file identitas secara manual:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
auth.log
Anda posting di bawah Edit 2 adalah untuk cron berjalan di server, dan seharusnya tidak ada hubungannya dengan upaya login Anda. Bisakah Anda mencobatail -f /var/log/auth.log
di server saat Anda mencoba menjalankan skrip melalui cron? Juga, saya tidak yakin apakah ini akan berhasil, tetapi dapatkah Anda mencobaenv
perintah pertama dengan Andarsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...
untuk melihat apakah ia mengeluarkan lebih banyak kesalahan?Jawaban:
Karena semuanya bekerja dengan baik dari baris perintah, kesalahan
Permission denied (publickey)
berarti bagian SSHrsync
menggunakan file identitas yang berbeda dari nama pengguna yang ditentukan.Dari komentar Jan pada pertanyaan awal, kita dapat menentukan file identitas dalam
rsync
perintah menggunakan-e 'ssh -i /path/to/identity.file' ...
.Menggunakan perintah di bawah ini untuk memulai dengan lingkungan baru di cron dan menentukan path lengkap ke file tampaknya memecahkan masalah:
Saya masih sangat tertarik dengan temuan ini. Mungkin ada hubungannya dengan cron, fakta bahwa ia dimulai dengan variabel lingkungan minimal, dan ssh-agent. Saya akan menyiapkan skenario yang sama dalam beberapa hari untuk mengujinya dan melaporkan kembali.
sumber
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Saya baru saja menyelesaikan masalah ini yang membuat saya sibuk ..
Tidak dapat terhubung di RSYNC melalui SSH, meskipun telah menetapkan identitas untuk SSH ... Tidak ada yang dilakukan ... Rsync mengatakan "izin ditolak" dan ssh memberi tahu saya "read_passphrase: tidak dapat membuka / dev / tty: Tidak ada perangkat atau alamat tipe ini"
Tetapi saya membaca posting yang menjelaskan bahwa crontab memiliki lingkungannya sendiri yang tidak sama dengan root. Saya sudah tahu itu tetapi saya tidak mengerti dampaknya pada SSH saat menggunakan AGEN SSH
Tetapi pertukaran kunci SSH saya dilakukan dengan PassPhrase ... jadi jika lingkungannya berbeda dan RSYNC saya atas SSH mengharapkan frasa sandi yang tidak dapat dimasukkan => Info debug SSH juga menunjukkan kesalahan:
Di mesin saya, saya menggunakan "Keychain" untuk memiliki agen SSH diluncurkan jadi saya tidak perlu memasukkan kembali kata sandi setiap kali saya mencoba koneksi jarak jauh. Keychain menghasilkan file yang berisi informasi berikut
==> Perintah SSH-AGENT mengembalikan info yang sama.
Jadi, pada akhirnya, informasi ini terkait dengan sesi saat ini yang memungkinkan otentikasi masa depan dari sesi saat ini, tanpa perlu memasukkan frasa sandi karena sudah dilakukan sebelumnya dan dihafal ...
==> Solusinya ada ... cukup di skrip yang diluncurkan oleh crontab, dan untuk "sumber" file yang berisi informasi ini atau melakukannya di baris perintah ds crontab ...
=> Dengan sumber ini, tidak ada lagi kekhawatiran. Informasi SSH_AUTH_SOCK dan SSH_AGENT_PID dimuat di lingkungan Crontab dan oleh karena itu diketahui, RSYNC melalui SSH berfungsi tanpa masalah.
Itu membuat saya sibuk tetapi sekarang, ia bekerja :)
sumber
Peringatan bagi mereka yang menggunakan SSH Agent Forwarding:
Jika Anda melihat perilaku ini ketika men-debug skrip pada host jarak jauh, itu karena bahkan dengan
-e "ssh -i /path/to/key"
flag, ssh akan menggunakan kunci lokal Anda (diteruskan) daripada yang ada di server.Contoh konkret: Saya memiliki skrip pada server dev yang menarik data dari "server data" menggunakan rsync over ssh. Ketika saya masuk ke server dev dan menjalankannya, semuanya baik-baik saja, tetapi ketika menjalankan dari cron, saya mendapatkan izin yang ditolak. Menambahkan beberapa verbositas ke proses SSH (flag
-vv
) saya perhatikan hal berikut:Apa petunjuk saya di sini adalah bahwa kebetulan, saya kebetulan memiliki nama pengguna yang berbeda pada host lokal ("nighty") daripada pada server dev ("juanr").
Perhatikan bagaimana ini menandai kunci pada dev server sebagai "eksplisit", tetapi masih menggunakan kunci diteruskan dari laptop saya untuk login. Melakukan
ssh-copy-id
pada saat ini tidak menyelesaikan apa-apa, karena itu hanya menginstal ulang kunci yang diteruskan daripada yang dari dev server. Jika Anda menggunakan ssh-copy-id dengan agen forwarding, Anda perlu menentukan kunci yang untuk menginstal dengan bendera -i:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
.sumber
Sudahkah Anda mencoba trik lama membersihkan file host? Maksudku:
Layak dicoba karena ssh akan membangunnya kembali dan Anda akan menyingkirkan barang-barang basi. Anda tentu saja dapat juga menghapus bagian-bagian milik IP / Host yang diberikan.
Pertanyaan lain: Apakah pekerjaan cron Anda berjalan di bawah UID Anda atau apakah berjalan sebagai pengguna cron atau root?
sumber
~/.ssh/known_hosts
akan mengubah apa pun? Dan cron berjalan sebagai 'tom' pengguna saya di desktop, dengan tujuan masuk ke server sebagai 'cadangan-saja' pengguna dengan kunci SSH (tanpa kata sandi) yang sesuai, yang ada di tom pengguna~/.ssh
.-r
maupun-f
bendera diperlukan untuk menghapusknown_hosts
--Itu adalah file biasa (bukan sebuah direktori), dan tidak dibaca.rm .ssh/known-hosts
akan jauh lebih aman, mengingat bahwa kesalahan ketik satu karakter - tanpa sengaja menambahkan ruang antara.
danssh/known_hosts
setelahrm -rf
(ataurm -r
) biasanya akan menghapus seluruh isi folder rumah pengguna!Gunakan
rrsync
skrip bersama dengan kunci ssh khusus sebagai berikut:Server REMOTE
Komputer LOKAL
Komputer remot
Ikuti baris yang baru ditambahkan berikut ini
Sehingga hasilnya terlihat seperti
LOKAL
Masukkan
crontab
skrip berikut denganx
izin:Sumber: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/
sumber
Untuk mencoba dan men-debug tambahkan ke bagian ssh "ssh -v" dengan cara ini Anda bisa mendapatkan mode verbose dengan beberapa informasi bermanfaat.
Edit: Dari halaman manual:
sumber
Saya pikir Anda belum mengkonfigurasi file sshd_config dengan benar. Pastikan itu
PermitRootLogin yes
danPubkeyAuthentication yes
untuk pemeliharaan jarak jauh.sumber
PermitRootLogin
mengaktifkan dan tidak punya rencana untuk mengubahnya. Praktik terbaik adalah menonaktifkannya, dan ssh hanya sebagai pengguna biasa (tambahkan mereka ke 'sudoers' Anda jika perlu) dan jangan pernah sebagai root.