Jawaban:
Anda harus menggunakan file kunci tanpa frasa sandi untuk login ssh dengan skrip. Ini jelas merupakan risiko keamanan, berhati-hatilah agar keyfile itu sendiri diamankan dengan memadai.
ssh -i
harus selalu memungkinkan di sisi klien. Apakah maksud Anda server mungkin tidak mendukung semua jenis kunci (mis. ECDSA)? Itu tidak akan menjadi masalah besar, hanya kasus penggunaan ssh-keygen -t
. Apakah saya melewatkan sesuatu?
rsync -e
danssh -i
.
Gunakan utilitas penyedia sandi ssh non-interaktif "sshpass"
Di Ubuntu
sudo apt-get install sshpass
Perintah untuk rsync
/usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path dest_path
sshpass -p`cat .password` ssh [...]
. Kemudian lindungi .password
file Anda dengan chmod 400 .password
memastikan hanya pengguna Anda yang dapat membacanya.
src_path
seharusnya server: path, seperti ini:server01.mydomain.local:/path/to/folder
-a
mengaktifkan rsync termasuk -rlptgoD
, Anda dapat mempersingkat perintah seperti ini:rsync -az ...
Anda dapat menghindari prompt kata sandi pada rsync
perintah dengan mengatur variabel lingkungan RSYNC_PASSWORD
ke kata sandi yang ingin Anda gunakan atau menggunakan --password-file
opsi.
Jika Anda tidak dapat menggunakan kunci publik / pribadi, Anda dapat menggunakan:
#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
puts "rsync failed"
exit 1
}
exit 0
Anda perlu mengganti SRC dan DEST dengan sumber rsync normal dan parameter tujuan, dan mengganti PASS dengan kata sandi Anda. Pastikan file ini disimpan dengan aman!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
Saya membuatnya berfungsi seperti ini:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
disetel? Sepertinya placeholder untuk nilai sebenarnya.
Gunakan kunci ssh.
Lihat ssh-keygen
dan ssh-copy-id
.
Setelah itu Anda bisa menggunakan cara rsync
ini:
rsync -a --stats --progress --delete /home/path server:path
Kemungkinan menarik lainnya:
rsync --pihak --progress --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.
Catatan: -i dsa_private_file yang merupakan kunci pribadi RSA / DSA Anda
Pada dasarnya, pendekatan ini sangat mirip dengan yang dijelaskan oleh @Mad Scientist, namun Anda tidak perlu menyalin kunci pribadi Anda ke ~ / .ssh. Dengan kata lain, ini berguna untuk tugas ad-hoc (satu kali akses tanpa kata sandi)
Pekerjaan berikut untuk saya:
SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root" source-path myDomain:dest-path >&2
Saya harus menginstal sshpass
Sulit memasukkan kata sandi secara otomatis untuk perintah rsync. Solusi sederhana saya untuk menghindari masalah ini adalah memasang folder yang akan dicadangkan. Kemudian gunakan perintah rsync lokal untuk membuat cadangan folder yang dipasang.
mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp
Meskipun Anda sudah menerapkannya sekarang,
Anda juga dapat menggunakan berharap pelaksanaan (Anda akan menemukan alternatif di Perl, Python: Pexpect, paramiko, dll ..)
Saya menggunakan file VBScript untuk melakukan ini di platform Windows, itu server saya dengan sangat baik.
set shell = CreateObject("WScript.Shell")
shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"
Solusi resmi (dan lainnya) tidak lengkap ketika saya pertama kali mengunjungi, jadi saya kembali, bertahun-tahun kemudian, untuk memposting pendekatan alternatif ini jika ada orang lain di sini yang bermaksud menggunakan pasangan kunci publik / pribadi:
Jalankan ini dari mesin cadangan target, yang menarik dari sumber ke cadangan target
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/
Jalankan ini dari mesin sumber, yang mengirim dari sumber ke cadangan target
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/
Dan, jika Anda tidak menggunakan port alternatif untuk ssh, pertimbangkan contoh yang lebih elegan di bawah ini:
Jalankan ini dari mesin cadangan target, yang menarik dari cadangan sumber ke target:
sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/
Jalankan ini dari mesin sumber, yang mengirim dari sumber ke cadangan target:
sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/
Jika Anda masih dimintai kata sandi, maka Anda perlu memeriksa konfigurasi ssh Anda /etc/ssh/sshd_config
dan memverifikasi bahwa pengguna di sumber dan target masing-masing memiliki kunci ssh publik masing-masing dengan mengirimkannya ssh-copy-id user@10.9.9.3
.
(Sekali lagi, ini untuk menggunakan pasangan kunci ssh tanpa kata sandi, sebagai pendekatan alternatif, dan bukan untuk meneruskan kata sandi melalui file.)
Mengikuti ide yang diposting oleh Andrew Seaford, ini dilakukan dengan menggunakan sshfs:
echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp