Saya ingin mentransfer file antara dua host jarak jauh yang menggunakan shell lokal, tetapi sepertinya rsync tidak mendukung sinkronisasi jika dua remote ditentukan sebagai berikut:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
Solusi / perintah lain apa yang bisa saya gunakan untuk mencapai hasil yang serupa?
sshfs
adalah bahwa kemudianrsync
melihat sumber dan sistem file tujuan keduanya lokal, sehingga menonaktifkan algoritma delta-nya. Pada titik itu Anda hampir bisa juga menggunakannyacp -p
. Lihat jawaban yang mengusulkan ini dan komentar selanjutnya.Jawaban:
Seperti yang telah Anda temukan, Anda tidak dapat menggunakan rsync dengan sumber jarak jauh dan tujuan jarak jauh. Dengan asumsi kedua server tidak dapat berbicara langsung satu sama lain, dimungkinkan untuk menggunakan ssh to tunnel melalui mesin lokal Anda.
Dari pada
Anda bisa menggunakan ini
Jika Anda bertanya-tanya,
-R
opsi mengatur saluran balik dari port 50000 di host1 yang memetakan (melalui mesin lokal Anda) ke port 22 di host2. Tidak ada koneksi langsung dari host1 ke host2.sumber
sshfs
untuk me-mount kedua direktori remote secara lokal, kemudian digunakanrsync
di dua direktori yang dipasang secara lokal.-i
untuk menentukan kunci yang diperlukan untuk perintah ssh.-i key...
parameter di dalam tanda kutip setelahssh
perintah. Jika itu tidak membantu Anda, jangan ragu untuk mengajukan Pertanyaan Baru, merujuk jawaban ini untuk konteksscp -3
.Anda tidak mengatakan mengapa Anda tidak ingin masuk ke satu host dan kemudian menyalin ke host lain sehingga saya akan membagikan salah satu alasan dan solusi saya.
Saya tidak bisa masuk ke satu mesin kemudian rsync ke yang lain karena tidak ada host yang memiliki kunci SSH yang bisa masuk ke yang lain. Saya memecahkan masalah ini dengan menggunakan penerusan agen SSH untuk memungkinkan host pertama menggunakan kunci SSH saya saat saya masuk.
PERINGATAN: Penerusan SSH memungkinkan host untuk menggunakan kunci SSH Anda selama login Anda. Meskipun mereka tidak dapat menyalin kunci Anda, mereka dapat masuk ke mesin lain dengan itu. Pastikan Anda memahami risikonya dan jangan gunakan forwarding agen untuk mesin yang tidak Anda percayai.
Perintah berikut akan menggunakan penerusan agen SSH untuk membuka koneksi langsung dari
host1
kehost2
. Ini memiliki keuntungan bahwa mesin yang menjalankan perintah tidak menghambat transfer.sumber
-D
daripada-A
berkeliling jaringan daripada pembatasan kunci); untuk menjelaskan keuntungan; karena perintahnya singkat; dan itu benar-benar berfungsi. Perhatikan bahwa Anda mungkin perlu menentukanusername@host1
apakah itu berbeda dengan nama pengguna lokal. Juga bahwa rsync melakukan verifikasi kunci host ketika menghubungkan ke host2, jadi kunci host1 harus sudah ada di ~ / .ssh / known_hosts pada host2 atau perintah akan gagal.ssh -A
, lihat pertemuan. jetbrains.com/display/TCD10/SSH+Agent ).Saya suka jawaban roaima, tapi jalannya sama di kedua contoh, mengaburkan mana. Kami telah menetapkan bahwa yang berikut ini tidak berfungsi:
Tapi ini tidak (saya menghilangkan bind_address eksplisit localhost dari
-R
opsi karena itu defaultnya):Perhatikan bahwa Anda harus mengatur kunci ssh dengan benar antara dua host jarak jauh, dengan kunci pribadi di host1 dan kunci publik di host2.
Untuk men-debug koneksi, pecah ini menjadi dua bagian dan tambahkan status verbose:
Jika ini berhasil, Anda akan memiliki shell di host1. Sekarang coba perintah rsync dari host1. Saya sarankan melakukan ini di jendela yang berbeda sehingga info ssh verbose tidak tercampur dengan info status rsync:
sumber
rsync
dimulai pada host1 dengan target pada host2. (Anda bisa meminta klarifikasi dalam komentar.)Memformat ulang jawaban oleh roaima dalam sintaks skrip bash (dan menambahkan karakter kelanjutan garis '\' untuk kejelasan) Saya secara acak memilih port 22000 ...
sumber
Cara yang ideal adalah menjalankannya
rsync
di salah satu server itu. Tetapi jika Anda tidak ingin menjalankan skrip di server jauh. Anda dapat menjalankan skrip pada sistem lokal Anda dan melakukan ssh dan menjalankan rsync di sana.ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH
Juga, karena Anda mungkin menyadari rysnc melakukan sinkronisasi satu arah. Jika Anda ingin sinkronisasi dua arah, Anda dapat melihat osync ( https://github.com/deajan/osync ). Saya menggunakannya dan ternyata bermanfaat.
sumber
Sama seperti info tambahan:
Jika Anda menggunakan host melompat untuk menghubungkan dua mesin lain tetapi mereka tidak dapat menjangkau satu sama lain secara langsung, Anda dapat menggunakan sshfs sebagai media antara dua mesin ini seperti itu (pada host melompat):
SSHFS menyediakan dua jalur pada host melompat dan rsync mengelola sinkronisasi file seperti biasa (hanya dengan perbedaan yang sebenarnya dilakukan secara lokal).
sumber
Anda dapat menjalankan rsyncd (server) di salah satu komputer.
Ini adalah pendekatan yang saya ambil, karena saya tidak ingin menggunakan ssh untuk mengizinkan 'sumber' (dalam kata-kata rsync) akses ke 'tujuan' sebagai root tanpa kata sandi (seperti yang diperlukan untuk menggunakan tunneling SSH dengan rsync di sebuah skrip)
Dalam kasus saya, saya cukup mengatur server rsyncd di komputer tujuan dengan satu pengguna diizinkan dari PC sumber dan menggunakan rsync dari sisi sumber.
Bagus sekali.
sumber
Coba gunakan ini. Ini bekerja untuk saya.
sumber
Script yang mudah digunakan
Selama bertahun-tahun saya telah melakukan ini berkali-kali dengan trik yang kurang lebih sama seperti dalam setiap jawaban lainnya di sini. Namun karena sangat mudah untuk mendapatkan detail yang salah dan menghabiskan banyak waktu untuk mencari tahu masalah saya telah membuat skrip di bawah ini:
ssh -A
gagal menyebarkan data otentikasi (tidak tahu mengapa ini terjadi kadang-kadang karena solusinya lebih mudah daripada menemukan akar penyebabnya)Cara menggunakan skrip
Bagaimana itu bekerja
Seperti yang saya katakan itu menggunakan trik yang sama seperti pada setiap jawaban lainnya di sini:
-R
pilihan untuk ssh dari localhost ke host1 sementara pada saat yang sama menyiapkan port forwarding yang kemudian memungkinkan host1 untuk terhubung melalui localhost ke host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-A
Opsi ssh untuk memungkinkan otentikasi mudah dari ssh chanel keduaIni rumit! Apakah ada cara yang lebih mudah?
Saat menyalin semua atau sebagian besar byte dari sumber ke tujuan, JAUH lebih mudah digunakan
tar
:Naskah
sumber
tar
luar biasa ketika Anda mendapat satu transfer (non-incremental) dan transfer Anda selesai dalam satu pass tunggal. Di sisi lain,rsync
dengan pegangan penerusan mulai ulang dan transfer tambahan.Dimungkinkan untuk menggunakan
tar
viassh
untuk mentransfer file:Ubah
j
parameter (untuktar
) menjadiz
di dua tempat jika Anda ingin mengompres arsip dengangzip
, alih-alihbzip2
. Biasanyabzip2
memiliki kompresi yang lebih tinggi daripadagzip
, tetapi lebih lambat, jadi ubah tergantung pada kebutuhan Anda (lihat: bzip2 vs gzip ).Terkait: Bagaimana cara menyalin antara dua host jarak jauh menggunakan tar yang disalurkan ke SSH dari server jauh ketika di belakang firewall?
Atau (untuk mengamankan bandwidth, karena kompresi transparan) dimungkinkan
sshfs
untuk me-mount sistem file jarak jauh sebagai lokal dan menggunakanrsync
seperti biasa, misalnyasumber