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:
#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress
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 salinan / bin / sh sebagai / usr / local / bin / shforkeepalive. Gunakan tautan simbolis daripada salinan maka Anda tidak perlu memperbaruinya setelah pembaruan keamanan yang menambal / bin / sh.
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:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
( 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):
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ssh user@server2 killall shforkeepalive
Cara kerjanya:
- Baris 1: standar "perintah untuk digunakan untuk menafsirkan skrip ini" penanda
- Baris 2: mulai koneksi SSH dengan terowongan terbalik dan jalankan skrip keepalive melalui itu untuk tetap terbuka. Trailing & memberitahu bash untuk menjalankan ini di latar belakang sehingga baris berikutnya dapat berjalan tanpa menunggu sampai selesai
- Baris 3: mulai terowongan yang akan terhubung ke terowongan di atas sehingga server1 dapat melihat server2, dan jalankan rsync untuk melakukan salin / perbarui melalui pengaturan ini
- Baris 4: bunuh skrip keep-hidup setelah operasi rsync selesai (dan panggilan SSH kedua kembali), yang akan dan sesi ssh pertama.
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:
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
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:
#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
di mana 123.123.123.123 adalah alamat publik untuk server2, yang dapat digunakan sebagai salin + tempel satu-liner alih-alih skrip.