Perhatikan bahwa saya tidak dapat menyimpan file lebih dulu secara lokal - terlalu besar.
Halaman (menjengkelkan) ini (gulir semua jalan ke bawah) tampaknya memberikan jawaban tapi saya mengalami kesulitan menguraikan bagian yang khusus untuk tape drive:
Untuk membuat ini lebih konkret, inilah cara Anda berpikir itu mungkin berhasil:
Di mesin lokal:
% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt
(Itu menggunakan konvensi - yang scp sebenarnya tidak mendukung - mengganti tanda hubung untuk file sumber untuk mengatakannya untuk mendapatkannya dari stdin sebagai gantinya.)
Jawaban:
Anda dapat melakukan pipe ke ssh dan menjalankan perintah jarak jauh. Dalam hal ini, perintah jarak jauh adalah
cat > big.txt
yang akan menyalin stdin ke dalambig.txt
file.Sangat mudah dan mudah, selama Anda dapat menggunakan ssh untuk menghubungkan ke ujung jarak jauh.
Anda juga dapat menggunakan
nc
(NetCat) untuk mentransfer data. Di mesin penerima (mis., Host.example.com):Ini akan diatur
nc
untuk mendengarkan port 1234 dan menyalin apa pun yang dikirim ke port tersebut kebig.txt
file. Kemudian, pada mesin pengirim:Perintah ini akan memberi tahu
nc
di sisi pengirim untuk terhubung ke port 1234 pada penerima dan menyalin data dari stdin di seluruh jaringan.Namun,
nc
solusinya memiliki beberapa kelemahan:ssh
.ssh
solusinya, Anda dapat memulai transfer hanya dari satu titik akhir.sumber
tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
nc
itu juga menawarkan enkripsi dan kompresi data Anda secara default dan yang lebih penting: deteksi kesalahan. Saya mengalami situasi di mana saya menggunakannc
driver jaringan yang salah dan data yang rusak dapat dikirim tanpa terdeteksi. SSH akan gagal dalam situasi itu, karena tidak dapat mendekripsi / mendekompresi data yang salah.Menggunakan ssh:
sumber
Gunakan nc (Net Cat), yang tidak perlu menyimpan file secara lokal.
sumber
nc
. Saya pernah membuang disk image mentah dari satu mesin ke komputer lain hanya untuk mengetahui kemudian bahwa driver jaringan saya salah dan mentransfer bit yang salah. Gunakanscp
,ssh
atau apa pun yang akan memberi tahu Anda ketika ada kesalahan transmisi.Gunakan pipa FIFO:
sumber
scp
mengeluh bahwa mypipe bukan file biasa.mkfifo
untuk membuat pipa.)scp <(ls) destination
Thanx Denis Scherbakov!
Ketika saya mencoba skrip Anda di cloud Hetzner saya dapatkan
Tetapi hanya file tanpa konten yang dibuat. Karena konten aktual sudah dienkripsi dengan openssl, kita sebenarnya tidak perlu scp. Linux builtin
ftp
juga memiliki kemampuan perpipaan yang bagus. Jadi, inilah solusi (masih sangat manual) saya:sumber
Inilah solusi alternatif:
Semua contoh di atas menyarankan ssh + cat menganggap bahwa "cat" tersedia di sistem tujuan.
Dalam kasus saya sistem (cadangan Hetzner) memiliki seperangkat alat yang sangat terbatas yang menawarkan sftp, tetapi tidak lengkap shell. Jadi tidak mungkin menggunakan ssh + cat. Saya datang dengan solusi yang menggunakan flag "scp -t" tidak berdokumen. Script lengkap dapat ditemukan di bawah.
Pembaruan 2019.05.08:
Sesuai permintaan, di bawah ini adalah versi yang jauh lebih sederhana dan lebih pendek.
sumber
scp -t
? Saat ini Anda memiliki skrip lengkap yang sangat khusus / terlokalisasi untuk lingkungan Anda. Suatu hal yang baik untuk wiki Hetzner, tetapi tidak untuk Pengguna Super di mana kebanyakan orang hanya mencari cara menyalurkan input melalui scp.