Bagaimana cara memasukkan kata sandi secara otomatis untuk perintah rsync SSH?

111

Aku perlu melakukan rsyncoleh sshdan ingin melakukannya secara otomatis tanpa perlu melewati password untuk sshsecara manual.

liysd
sumber

Jawaban:

44

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.

Petunjuk untuk mengatur akses ssh tanpa kata sandi

Ilmuwan gila
sumber
9
Apakah tidak ada kemungkinan untuk memasukkan kata sandi dalam teks perintah?
Liysd
3
Tidak mudah, tidak ada pilihan untuk itu di ssh
Mad Scientist
Perlu dicatat bahwa ini tidak selalu memungkinkan untuk dilakukan (misalnya, banyak implementasi server ssh android sangat terbatas).
Ponkadoodle
@Ponkadoodle OP adalah tentang permintaan sisi klien, bukan sisi server. ssh -iharus 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?
Jonathan H
1
Meskipun ini mungkin tampak merepotkan pada awalnya, ini adalah jawaban yang benar. Kata sandi adalah informasi sensitif, dan ini tidak boleh disimpan dengan jelas, atau digunakan secara sembarangan dalam program. Itulah gunanya file kunci; cukup pelajari tentang file identitas, rsync -edanssh -i .
Jonathan H
94

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
Rajendra
sumber
4
Saya tahu ini bukan praktik terbaik, tapi saya punya NAS dengan SSHD lumpuh yang tidak akan melakukan autentikasi berbasis kunci. Jawaban ini adalah bagian yang hilang dari teka-teki cadangan otomatis saya. Jadi +1 untuk jawaban pilihan terakhir
Mike Gossmann
8
Jika Anda tidak dapat menggunakan keyfile, tetapi tidak ingin memasukkan password dalam perintah, Anda dapat menulis ke file sementara dan memasukkannya seperti ini: sshpass -p`cat .password` ssh [...]. Kemudian lindungi .passwordfile Anda dengan chmod 400 .passwordmemastikan hanya pengguna Anda yang dapat membacanya.
lutuh
5
Untuk kelengkapan, dalam kasus ssh'ing ke remote server, src_pathseharusnya server: path, seperti ini:server01.mydomain.local:/path/to/folder
harperville
ini pasti jawaban yang benar! itu memungkinkan Anda untuk melakukan scripting tanpa sihir ssh, hanya scripting satu. ;) Kudos @Rajendra
genuinefafa
1
karena -amengaktifkan rsync termasuk -rlptgoD, Anda dapat mempersingkat perintah seperti ini:rsync -az ...
Jannie Theunissen
24

Anda dapat menghindari prompt kata sandi pada rsyncperintah dengan mengatur variabel lingkungan RSYNC_PASSWORDke kata sandi yang ingin Anda gunakan atau menggunakan --password-fileopsi.

Dexter
sumber
41
hanya berfungsi jika server tujuan menjalankan daemon rsync
Darryl Hebbes
4
Meskipun jawaban ini tidak membantu kecuali menggunakan rsync daemon, Google membawa saya ke sini dan itulah yang saya butuhkan. Bagi saya, saya membutuhkan rsync langsung ke rsyncd, tanpa ssh. Saya baru saja menggunakan opsi file kata sandi, dan bekerja dengan sempurna untuk skrip.
gregthegeek
14

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!

kainjow
sumber
3
perintah-perintah itu tidak tersedia diRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra
13

Saya membuatnya berfungsi seperti ini:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir
andrey465
sumber
apa yang akan remote_port_sshdisetel? Sepertinya placeholder untuk nilai sebenarnya.
Max Williams
6

Gunakan kunci ssh.

Lihat ssh-keygendan ssh-copy-id.

Setelah itu Anda bisa menggunakan cara rsyncini:

rsync -a --stats --progress --delete /home/path server:path
Guillaume Lebourgeois
sumber
Jika saya menggunakan kunci dengan ssh saya menulis: ssh u @ serv -i ./rsa Tapi bagaimana melakukannya di rsync?
Liysd
2
Jika Anda memasukkan kunci ke direktori .ssh Anda dan memberinya nama standar (biasanya id_rsa / id_rsa.pub), kunci itu akan diambil secara otomatis oleh rsync.
Craig Trader
6

Kemungkinan menarik lainnya:

  1. menghasilkan RSA, atau pasangan kunci DSA (seperti yang dijelaskan)
  2. letakkan kunci publik ke host (seperti yang sudah dijelaskan)
  3. Lari:
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)

xhudik.dll
sumber
5

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

mario
sumber
2
-a sudah menyiratkan -rlptgoD dan secara umum, akan jauh lebih membantu jika baris perintah dikurangi di sini.
Christian
4

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
Andrew Seaford
sumber
3

Meskipun Anda sudah menerapkannya sekarang,

Anda juga dapat menggunakan berharap pelaksanaan (Anda akan menemukan alternatif di Perl, Python: Pexpect, paramiko, dll ..)

Joao Figueiredo
sumber
2

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 [email protected]:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"
joseph.smeng
sumber
2

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' [email protected]:/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/ [email protected]:/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 [email protected]:/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/ [email protected]:/var/www/

Jika Anda masih dimintai kata sandi, maka Anda perlu memeriksa konfigurasi ssh Anda /etc/ssh/sshd_configdan memverifikasi bahwa pengguna di sumber dan target masing-masing memiliki kunci ssh publik masing-masing dengan mengirimkannya ssh-copy-id [email protected].

(Sekali lagi, ini untuk menggunakan pasangan kunci ssh tanpa kata sandi, sebagai pendekatan alternatif, dan bukan untuk meneruskan kata sandi melalui file.)

oemb1905
sumber
Dan catatan penting lainnya adalah bahwa dalam contoh port alternatif, Anda mengarahkan ssh ke file kunci pribadi Anda, dan ketika menjalankan perintah pada target, itu akan mengotentikasi terhadap kunci publiknya.
oemb1905
-1

Mengikuti ide yang diposting oleh Andrew Seaford, ini dilakukan dengan menggunakan sshfs:

echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp
lepe
sumber