Saya memiliki kotak Linux di tempat kerja yang sering saya masuki dari rumah. Kotak Linux ada di jaringan internal, tapi ada kotak yang merentang kedua jaringan, jadi saya bisa masuk seperti ini:
ssh -tA [email protected] ssh [email protected]
Saya memiliki beberapa file yang duduk di ~ / tmp yang ingin saya salin ke mesin lokal saya. (sebut saja mereka ~ / tmp / file1 ~ / tmp / file2 dan ~ / tmp / file3 demi argumen)
Saya telah melihat sesuatu seperti pekerjaan ini:
ssh -tA [email protected] ssh [email protected] 'tar cf - ~/tmp/file*' | tar xf -
Ini akan tar file pada mesin jarak jauh, mengirim hasilnya ke stdout, lalu pipa hasilnya ke tar lokal, yang sedang membongkar data pada stdin lokal.
Tidak bekerja:
Pada mesin jarak jauh, jika saya jalankan
tar cf - tmp/file* | md5sum
f1b776364c10dfc20500f228399a7c63 -
Dari mesin lokal:
ssh -tA [email protected] ssh [email protected] 'tar cf - ~/tmp/file*' | md5sum
bc7436c9771ee2b4978ffd29b8b7ed36 -
Saya berasumsi bahwa ini mungkin byte pemesanan snafu di seluruh jaringan ... Saya akhirnya bisa mengatasinya dengan uuencoding file, catting di jaringan kemudian uudecoding secara lokal ... untuk beberapa alasan saya tidak bisa dapatkan sintaks yang benar untuk dapat tar | uuencode di sisi jarak jauh dan uudecode | untar di sisi lokal.
Saya mencari cara yang baik untuk melakukan ini semua dalam satu langkah; lebih disukai sesuatu yang bisa saya bungkus dengan fungsi shell.
Anda dapat mengatur penerusan porta. Ubah perintah inital Anda menjadi:
Kemudian abaikan perintah ini. Buka terminal baru dan jalankan salah satu dari:
Setiap kali sistem lokal Anda mendapatkan permintaan koneksi pada port alamat IP localhost 2222, perintah SSH yang Anda jalankan terlebih dahulu akan meneruskannya ke sistem jarak jauh dan membuatnya mengeluarkan permintaan koneksi ke 10.10.10.130. Ini semua ditentukan oleh saklar -L.
sumber
Pemesanan byte hanya berlaku untuk hal-hal seperti header IP (yang memiliki alamat berukuran empat byte sebagai satu unit), tetapi tidak mempengaruhi protokol layer yang lebih tinggi yang hanya bekerja dengan byte 8-bit - IP, TCP, dan SSH semuanya menjamin bahwa Anda menerima data persis seperti yang dikirim, byte demi byte.
Masalahnya disebabkan oleh
-t
opsi ke yang pertamassh
. Ini memaksa alokasi pseudo-tty untuk koneksi pertama, yang hanya diperlukan untuk terminal (dan terminal emulator) dan akan memotong-motong data tertentu selama transfer. Secara khusus, carriage return (0x0D) akan dimasukkan secara otomatis sebelum setiap umpan baris (0x0A).Hapus saja
-t
opsi, dan Anda akan memiliki saluran yang bersih untuk mentransfer data biner.sumber
z
opsi gzip (the ), yang menyematkan stempel waktu saat ini di header gzip, menyebabkan hash yang berbeda setiap waktu.tar -z
, tidak ada "file tar"; hanya ada aliran anonim yang menghasilkan tar dan kompres gzip.-t
itu mengacaukan sungai. Masalahnya adalah, saya ingin mendefinisikan skrip shell atau alias sebagaissh -[t]A bridge.work.com ssh 10.10.10.130
dan saya membutuhkan dua di antaranya, untuk masing-masing interaktif dan non-interaktif!