Inilah hubungannya:
[Server1] <---> [my desktop] <---> [Server2]
Server1 dan server2 tidak diizinkan untuk berbicara langsung dengan satu sama lain (jangan tanya). Desktop saya, bagaimanapun dapat mengakses kedua server melalui ssh.
Saya perlu menyalin file dari server1 ke server2.
Secara tradisional saya telah menggunakan hack ssh + tar, seperti:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
Dan itu bekerja dengan baik, tapi saya ingin mengambil langkah lebih jauh dan membuat rsync bekerja antara dua server melalui desktop saya.
Sekarang saya tahu bahwa saya dapat memulai sebuah ssh port-forward tunnel di satu terminal dan kemudian rsync melewati tunnel tersebut di jendela lain, tetapi saya tidak ingin repot-repot dengan terminal kedua atau membuat dan memecah port forward tunnel yang terpisah. yang saya inginkan adalah:
- Perintah one liner untuk rsync file dari Server1 ke server2 MELALUI desktop saya
- semua pada SATU baris perintah, satu jendela terminal
- Saya ingin port forward tunnel hanya ada untuk kehidupan perintah rsync.
- Saya tidak ingin scp, saya ingin rsync.
Adakah yang punya trik untuk melakukan itu?
EDIT: Ini perintahnya! Kerja bagus semua orang: 1. Untuk jalur kunci rsa, tidak dapat menggunakan tildae, harus menggunakan "/ root /". 2. Inilah perintah terakhir:
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
Boom melanjutkan dinamit.
Jawaban:
Jika Anda senang menyimpan salinan data di mesin perantara maka Anda cukup menulis skrip yang memperbarui salinan lokal menggunakan server1 sebagai referensi kemudian memperbarui cadangan di server2 menggunakan salinan lokal sebagai referensi:
Menggunakan skrip sederhana berarti Anda menginginkan satu perintah untuk melakukan segalanya. Ini tentu saja bisa menjadi keamanan tidak-tidak jika data sensitif (Anda, atau orang lain di perusahaan Anda, mungkin tidak ingin salinan mengambang di laptop Anda). Jika server1 bersifat lokal bagi Anda maka Anda bisa menghapus salinan lokal setelahnya (karena akan lebih cepat untuk merekonstruksi melalui LAN lokal lain kali).
Membangun terowongan sehingga server dapat berbicara secara efektif satu sama lain secara lebih langsung harus dimungkinkan seperti:
Pada server 2 buat skrip yang tidak melakukan apa-apa selain loop sleep selama beberapa detik kemudian menggemakan sejumlah kecil teks, dan minta ini menggunakan "copy" dari sh:
(
echo
mungkin tidak diperlukan, karena sesi tidak akan cukup lama untuk time-out bahkan jika SSHd dikonfigurasi untuk mengabaikan paket tetap hidup dari klien ssh)Sekarang Anda dapat menulis skrip pada laptop Anda yang memulai terowongan terbalik di latar belakang, memberi tahu server1 untuk menggunakan rsync untuk melakukan operasi penyalinan, kemudian membunuh terowongan terbalik dengan mematikan skrip pengulangan (yang akan menutup sesi SSH):
Cara kerjanya:
Ini tidak terasa bersih, tetapi harusnya berhasil. Saya belum menguji di atas sehingga Anda mungkin perlu men-tweak itu. Membuat perintah rsync sebagai skrip baris tunggal pada server1 dapat membantu dengan mengurangi kebutuhan untuk melarikan diri karakter seperti 'pada perintah ssh panggilan.
BTW: Anda mengatakan "jangan tanya" mengapa kedua server tidak dapat melihat satu sama lain secara langsung, tetapi seringkali ada alasan bagus untuk ini. Server rumah saya dan server tempat cadangan onlinenya tidak dapat login satu sama lain (dan memiliki kata sandi + kunci yang berbeda untuk semua pengguna) - ini berarti bahwa jika salah satu dari keduanya diretas, itu tidak dapat digunakan sebagai rute mudah untuk meretas yang lain sehingga cadangan online saya lebih aman (seseorang yang jahat menghapus data saya dari live tidak dapat menggunakan kemampuannya untuk memperbarui cadangan untuk menghapus cadangan tersebut, karena tidak memiliki kemampuan langsung untuk menyentuh situs cadangan utama). Kedua server dapat terhubung ke server perantara di tempat lain - server langsung diatur untuk mendorong cadangannya (melalui rsync) ke mesin perantara di pagi hari dan server cadangan diatur (beberapa saat kemudian untuk memungkinkan langkah satu selesai) untuk menghubungkan dan kumpulkan pembaruan (sekali lagi melalui rsyc diikuti oleh langkah snapshotting untuk mempertahankan beberapa usia cadangan). Teknik ini mungkin dapat digunakan dalam keadaan Anda juga, dan jika demikian saya akan merekomendasikannya sebagai cara yang jauh lebih bersih dalam melakukan sesuatu.
Sunting: Menggabungkan hack saya dengan Harun untuk menghindari semua mucking dengan salinan / bin / sh dan skrip keep-hidup terpisah pada server2, skrip ini pada laptop Anda harus melakukan seluruh pekerjaan:
Seperti di atas, rsync terhubung ke localhost: 2222 yang meneruskan terowongan ke localhost laptop Anda: 2222 yang meneruskan melalui terowongan lain ke server2 localhost: 22.
Sunting 2: Jika Anda tidak keberatan server1 memiliki kunci yang memungkinkannya untuk mengotentikasi dengan server2 secara langsung (meskipun tidak dapat melihat server2 tanpa terowongan) Anda dapat menyederhanakan lebih lanjut dengan:
di mana 123.123.123.123 adalah alamat publik untuk server2, yang dapat digunakan sebagai salin + tempel satu-liner alih-alih skrip.
sumber
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
If you don't mind server1 having a key ...
. Bisakah Anda memberi tahu saya jika benar-benar memungkinkan untuk menghindari memiliki kunci server2 pada server1?Berikut adalah beberapa metode yang membuat sinkronisasi menjadi satu garis sederhana, tetapi memerlukan beberapa pengaturan.
Siapkan terowongan ssh terbalik dari server1 ke desktop Anda (maaf, saya tidak bisa memberi tahu Anda
.ssh/config
mantera dari atas kepala saya). Rangkai dengan koneksi dari desktop Anda ke server2. Jalankan rsync dari server1.Atur proxy kaus kaki (atau proxy http yang menerima CONNECT) di desktop Anda. Gunakan untuk membuat koneksi ssh dari server1 ke server2. Jalankan rsync dari server2.
Gunakan bersamaan daripada rsync. Tetapi alur kerjanya berbeda.
Pasang direktori dari satu atau kedua server di desktop Anda menggunakan sshfs .
sumber
Mengapa satu baris? Gunakan skrip shell kecil:
IIRC, Anda dapat mengatur waktu tidur lebih rendah; yang pertama
ssh
tidak akan berakhir selama seseorang menggunakan saluran tersebut.sumber
sleep
dantrap
adalah lebih rapi daripada "tetap hidup dan membunuh" metode dalam jawaban saya .