Bagaimana Anda menggunakan file identitas dengan rsync?

125

Bagaimana Anda menggunakan file identitas dengan rsync?

Ini adalah sintaks yang menurut saya harus saya gunakan dengan rsync untuk menggunakan file identitas untuk terhubung:

rsync -avz -e 'ssh -p1234 -i ~ / .ssh / 1234-identitas' \
"/ local / dir /" [email protected]: "/ remote / dir /"

Tapi itu memberi saya kesalahan:

Peringatan: File identitas ~ / .ssh / 1234-identitas tidak dapat diakses: File atau direktori tersebut tidak ada.

File ini baik-baik saja, izin ditetapkan dengan benar, berfungsi saat melakukan ssh - tidak dengan rsync - setidaknya dalam sintaks saya. Apa yang saya lakukan salah? Apakah itu mencoba mencari file identitas di mesin jarak jauh? Jika demikian, bagaimana cara menentukan bahwa saya ingin menggunakan file identitas di komputer lokal saya ?

cwd
sumber

Jawaban:

86

Anda mungkin ingin menggunakan ssh-agentdan ssh-addmemuat kunci ke dalam memori. sshakan mencoba identitas dari ssh-agent secara otomatis jika dapat menemukannya. Perintah akan menjadi

eval $(ssh-agent) # Create agent and environment variables
ssh-add ~/.ssh/1234-identity

ssh-agentadalah daemon pengguna yang menyimpan kunci ssh tidak terenkripsi dalam memori. ssh menemukannya berdasarkan variabel lingkungan yang dikeluarkan oleh ssh-agent saat dijalankan. Menggunakan evaluntuk mengevaluasi keluaran ini menciptakan variabel lingkungan. ssh-addadalah perintah yang mengelola memori kunci. Agen dapat dikunci menggunakan ssh-add. Seumur hidup default untuk kunci dapat ditentukan saat ssh-agent dimulai, dan atau ditentukan untuk kunci saat ditambahkan.

Anda mungkin juga ingin menyiapkan file ~ / .ssh / config untuk menyediakan definisi port dan kunci. (Lihat `man ssh_config untuk opsi lebih lanjut.)

host 22.33.44.55
    IdentityFile ~/.ssh/1234-identity
    Port 1234

Mengutip tunggal perintah ssh akan mencegah ekspansi shell yang diperlukan untuk ~atau $HOME. Anda dapat menggunakan jalur lengkap atau relatif ke kunci dalam tanda kutip tunggal.

BillThor
sumber
2
Kutipan ganda dan menggunakan $ HOME memecahkan masalah saya. Bisakah Anda menjelaskan lebih lanjut tentang apa yang dilakukan dua perintah pertama? Saya sudah terbiasa dengan menyiapkan file konfigurasi - satu-satunya masalah adalah ketika saya memiliki banyak akun di satu server. Saya tidak berharap itu akan membiarkan saya menentukan beberapa file identitas untuk host yang sama.
cwd
+1 Ini memperbaiki masalah saya dengan drone.io :) Terima kasih banyak.
Bhargav Nanekalva
Ini sangat mengagumkan. FTR, Anda juga dapat menentukan nama pengguna default untuk dihubungkan sebagai, misalnya User ubuntusaat mengkonfigurasi untuk instance Ubuntu EC2 :) Terima kasih!
DanielSmedegaardBuus
Jika Anda menggunakan csh style shell (seperti fish) maka lakukaneval (ssh-agent -c)
Dave
77

Gunakan salah satunya $HOME

rsync -avz -e "ssh -p1234  -i \"$HOME/.ssh/1234-identity\"" dir remoteUser@server:

atau jalur lengkap ke kunci:

rsync -avz -e "ssh -p1234  -i /home/username/.ssh/1234-identity" dir user@server:

Diuji dengan rsync 3.0.9 di Ubuntu

Tombart
sumber
3
Ya, ini berfungsi dengan baik, tidak perlu menggunakan ssh-agent atau opsi konfigurasi lainnya.
laurent
2
+1: ini adalah masalah global, sama seperti Anda tidak bisa melakukan "ls '~'"
Alex
$HOMEtidak akan berfungsi di dalam tanda kutip sederhana (tanpa perluasan variabel), jadi Anda harus menggunakan tanda kutip ganda atau jalur absolut.
anol
dalam standar Bash harus bekerja "$HOME"atau $HOMEtanpa perbedaan (juga "${HOME}"memungkinkan, jika Anda ingin membuatnya rumit)
Tombart
Saya telah mengubah tanda kutip tunggal menjadi ganda.
Steve Bennett
36

Anda harus menentukan jalur absolut ke file kunci identitas Anda. Ini mungkin semacam quirck di rsync. (Lagipula tidak bisa sempurna)

Saya mengalami masalah ini beberapa hari yang lalu :-)

Alpha01
sumber
Anda dapat menggunakan ~ tetapi Anda tidak dapat menyematkannya dalam tanda kutip tunggal, karena itu tidak dapat diganti dengan benar ke / home / username / Anda harus menggunakan tanda kutip ganda untuk memperbaikinya agar berfungsi dengan benar, lihat solusi @ilcavero
X Tian
24

Ini berhasil untuk saya

rsync -avz --rsh="ssh -p1234  -i ~/.ssh/1234-identity"  \
"/local/dir/" [email protected]:"/remote/dir/"
ilcavero
sumber
2
Untuk beberapa alasan saya harus menentukan path lengkap ke file identitas, yaitu /home/user/.ssh/1234-identity. Kemudian berhasil. Mungkin karena cangkangnya berbeda, seperti yang dikemukakan dalam jawaban Darhuuk.
osa
@osa Anda menyelamatkan saya di sana! Saya mengalami masalah dengan Drupal dan rSYNC dan masalahnya adalah jalannya ... aneh.
Lee Woodman
6

Apakah Anda menjalankan perintah di bash atau sh? Ini mungkin membuat perbedaan. Coba ganti ~dengan $HOME. Coba kutip ganda string untuk -eopsi tersebut.

Darhuuk
sumber
6

gunakan file kunci dengan rsync:

rsync -rave "ssh -i /home/test/pkey_new.pem" /var/www/test/ [email protected]:/var/www/test
Avinash Raut
sumber