Inilah situasinya:
- Saya mengunggah file besar dari klien A ke server menggunakan sftp.
- Saya juga perlu mengunduh file ini dari server ke klien B melalui ssh.
Yang ingin saya lakukan adalah memulai transfer dari server ke klien B ketika unggahan masih terjadi dari klien A.
Apa metode / alat terbaik untuk menyelesaikan ini?
PEMBARUAN :
Jawabannya sejauh ini menarik - saya pasti akan membaca dan menguji semuanya. Poin bonus untuk jawaban yang tidak bergantung pada pengontrolan cara Klien A mengunggah file. (mis. satu-satunya hal yang kita ketahui dari klien A adalah bahwa file sedang ditulis ke nama file yang dikenal.)
ssh
file-transfer
Steven D
sumber
sumber
Jawaban:
Untuk satu file alih-alih menggunakan SFTP Anda bisa mem-pipe file lebih dari ssh menggunakan
cat
ataupv
di sisi pengirim dan menggunakantee
pada server tengah untuk mengirim data ke file di sana dan mengirim salinan melalui tautan ssh lain di sisi lain di mana hanya menulis data ke file. Voodoo yang tepat mengharuskan saya pergi sebagai latihan untuk pembaca, karena saya tidak punya waktu untuk bermain sekarang (maaf). Metode ini hanya akan berfungsi jika tujuan kedua dapat diakses secara publik melalui SSH yang mungkin tidak seperti yang Anda gambarkan sebagai mesin klien.Pendekatan lain, yang kurang "jalankan dan tunggu" tetapi sebaliknya mungkin lebih mudah, itu digunakan
rsync
antara server dan klien B. Pertama kali Anda menjalankan ini mungkin mendapatkan salinan sebagian data, tetapi Anda bisa menjalankan kembali untuk mendapatkan lebih banyak data setelahnya (dengan satu kali jalan terakhir setelah transfer Server Client1-> selesai). Ini hanya akan berfungsi jika server menempatkan data langsung ke nama file yang benar selama transfer SFTP (kadang-kadang Anda akan melihat data masuk ke file sementara yang kemudian diganti namanya setelah file sepenuhnya ditransfer - ini dilakukan untuk membuat pembaruan file lebih banyak atom tetapi akan membuat ide rsync tidak dapat digunakan). Anda juga dapat menggunakan rsync untuk transfer C1-> S alih-alih scp (jika Anda menggunakan--inplace
pilihan untuk menghindari masalah yang disebutkan di atas) - menggunakan rsync juga akan memberi Anda perlindungan terhadap keharusan mengirim ulang semuanya jika koneksi Server C1-> mengalami masalah selama transfer besar (saya cenderung menggunakanrsync --inplace -a --progress <source> <dest>
bukan scp / sftp ketika rsync tersedia, untuk perilaku "transfer resume" ini).Untuk meringkas di atas, jalankan:
pada client1 lalu jalankan
pada client2 berulang kali hingga transfer pertama selesai (lalu jalankan sekali lagi untuk memastikan Anda sudah mendapatkan semuanya).
rsync
sangat baik hanya mentransfer minimum absolut yang dibutuhkan untuk memperbarui lokasi daripada mentransfer seluruh lot setiap kali. Untuk paranoia, Anda mungkin ingin menambahkan--checksum
opsi ke perintah rsync (yang akan membutuhkan lebih banyak waktu CPU untuk file besar tetapi tidak akan secara signifikan menghasilkan lebih banyak data yang ditransfer kecuali diperlukan) dan untuk kecepatan--compress
pilihan akan membantu jika data Anda mentransfer belum dalam format terkompresi.sumber
Saya tidak dapat mencobanya saat ini, jadi ini mungkin gagal: Ide saya adalah ini: Pasang direktori di mana file tersebut tiba di klien B, misalnya dengan sshfs ke / mnt / server di sistem file klien b. Kemudian
sumber
rsync --append
dan kemudian diperiksa denganmd5sum
tetapi file tidak pernah cocok.tail -c +0
melakukan pekerjaan untuk saya. Saya juga biasapv -ptera
memantau perkembangan ekor, ini memungkinkan saya untuk melihat apakah itu berhasil. Saya belum selesai memeriksa md5s untuk memverifikasi bahwa itu berhasil, tetapi tampak hebat.Saya pikir ini harus berhasil:
lalu
Tambahkan perintah pv jika Anda ingin melihat throughput Anda.
sumber
tail -c +0
?Anda bisa menggunakan fifo untuk itu. Untuk kesederhanaan, pertama tanpa ssh hanya melibatkan dua xterms:
Pada xterm A:
Di xterm B:
Dengan ssh seharusnya ada sesuatu di sepanjang baris ini - mungkin Anda harus menonaktifkan karakter escape di ssh (-e none):
klien A:
klien B:
sumber
Saya memiliki situasi yang memerlukan solusi seperti yang diminta poster asli. Saya merekam permainan hoki di komputer saya di satu lokasi dan saya ingin menontonnya di TV saya di lokasi lain. Tautan antara kedua lokasi memungkinkan penyalinan sekitar 1,3 MB / detik dan video rekaman sekitar 1,5 MB / detik. Jadi, saya ingin menyalin file ketika mulai merekam. Dengan cara ini permainan 3 jam saya akan menyalin dalam waktu sekitar 3,5 jam. Jadi, saya menyalinnya saat mulai merekam dan saya bisa mulai menontonnya 30 menit setelah dimulai. Maka saya bisa menontonnya tanpa gangguan, hampir secara real time. Yaitu, selama saya bisa menyalinnya saat menulis file baru. Masalah dengan alat-alat seperti rsync dan scp adalah bahwa mereka melihat ukuran file ketika Anda memulai salinan dan setelah itu menyalin jumlah data, itu berhenti; bahkan jika file tersebut tumbuh lebih dari dua kali lipat selama salinan itu. Dan, jika, saya hanya menggunakan rsync dalam satu lingkaran untuk menyalinnya setelah itu berhenti, ketika rsync berikutnya selesai itu membangun kembali file target dan yang membunuh pemutar video saya dan saya harus me-restart menontonnya dan maju cepat ke mana pun saya berada dalam program ketika tiba-tiba membunuhnya. Saya menginginkan solusi yang lebih baik dan saya belum dapat menemukannya, jadi saya menyatukan ini sebagai gantinya:
Jadi apa fungsinya?
Pertama, saya menggunakan dd untuk menyalin file saat tumbuh. Karena file tumbuh lebih cepat daripada dd dapat mengirimkannya melalui jaringan, dd tidak pernah mengejar hingga akhir file. Selanjutnya, saya pipe ke "pipe viewer (pv)" dan saya berikan perkiraan seberapa besar file akan didasarkan pada seberapa besar file-file ini biasanya. Ini tidak perlu, tapi saya suka melihat meteran kemajuan. Kemudian, saya menyalurkan aliran ke koneksi ssh saya. Sambungan ssh digunakan
-C
untuk kompresi (untuk mengurangi bandwidth jaringan dan mencoba mempercepatnya),-c arcfour,blowfish-cbc
untuk enkripsi yang paling murah (sekali lagi untuk mempercepat sedikit),-p
adalah untuk port firewall yang saya gunakan di tujuan, dan ssh akhirnya menjalankan perintah dd pada target untuk membuat ulang file ketika menerimanya. Saya senang mengatakan, solusi ini sangat bagus. Saya bisa menonton pertandingan hoki sementara file sedang dibuat dan disalin dengan hanya penundaan singkat.sumber
Saya tidak yakin bahwa metode tail -f bekerja (walaupun mungkin tidak jika file tersebut adalah teks). Alasannya adalah bahwa saya tidak tahu bagaimana tail -f, dan sftp mentransfer dan mengandalkan informasi meta.
Jika sftp mentransfer informasi meta terlebih dahulu dan tail -f bergantung pada informasi meta untuk memberi tahu bahwa tidak ada lagi file, maka tail mungkin buruk akhirnya dengan EOFs atau nulls.
Jika Anda tidak peduli dengan jalur pengunggahan, yaitu Komputer 1 mengunggah ke komputer 2 mengunggah ke komputer 3, maka Anda dapat mencoba menggunakan bittorent bukan sftp. Nampaknya itulah yang dirancang untuk itu.
sumber
Anda dapat mencoba membaca file dari awal tetapi Anda harus yakin bahwa Anda dapat menulisnya dengan kecepatan yang sama setidaknya.
sumber