Pertama beberapa latar belakang
Ada beberapa versi berbeda nc
, seperti yang dapat Anda temukan di nc (1) - Linux man page atau nc (1) Manual Perintah Umum BSD , koneksi harus dimatikan segera setelah transfer. Ada contoh yang diberikan di kedua situs yang terhubung:
Mulailah dengan menggunakan nc untuk mendengarkan pada port tertentu, dengan output ditangkap ke dalam file:
$ nc -l 1234 > filename.out
Menggunakan mesin kedua, terhubung ke proses mendengarkan nc, mengumpankannya file yang akan ditransfer:
$ nc host.example.com 1234 < filename.in
Setelah file ditransfer, koneksi akan ditutup secara otomatis.
Anda netcat
tidak menutup koneksi setelah transfer, jadi itu berbeda dari yang dijelaskan di atas. Berperilaku seperti milik saya, Netcat 1.10 di Debian Jessie. Perilaku ini didokumentasikan dalam /usr/share/doc/netcat-traditional/README.gz
(pada mesin saya), boldening adalah milik saya:
Dalam penggunaan paling sederhana, "port host nc" membuat koneksi TCP ke port yang diberikan pada host target yang diberikan. Input standar Anda kemudian dikirim ke host, dan apa pun yang kembali melintasi koneksi dikirim ke output standar Anda. Ini berlanjut tanpa batas waktu, sampai sisi jaringan koneksi dimatikan. Perhatikan bahwa perilaku ini berbeda dari sebagian besar aplikasi lain yang mematikan semuanya dan keluar setelah file selesai pada input standar.
Inilah alasan di balik perilaku ini:
Anda mungkin bertanya "mengapa tidak hanya menggunakan telnet untuk terhubung ke port arbitrary?" Pertanyaan yang valid, dan berikut adalah beberapa alasannya. Telnet memiliki masalah "input standar EOF", jadi orang harus memperkenalkan penundaan yang dihitung dalam skrip mengemudi untuk memungkinkan hasil jaringan selesai. Ini adalah alasan utama netcat tetap berjalan sampai sisi jaringan ditutup.
Wikipedia memiliki berbagai implementasi yang berbeda . Saya tidak bisa menyebutkan perbedaan. Mungkin orang lain bisa?
Sekarang, solusinya
1
Anda dapat meminta nc
untuk berhenti setelah file dibaca. Opsi ini berguna:
-q seconds after EOF on stdin, wait the specified number of seconds
and then quit. If seconds is negative, wait forever.
Jika Anda menggunakan perintah ini di ujung pengiriman:
nc -q 0 MachineIP Port < test.txt
nc
akan berhenti 0 detik setelah membaca EOF, itu hanya setelah file berakhir. Kemudian akan keluar dan penerima juga akan berakhir nc
.
Jika Anda bertanya-tanya apa yang terjadi jika paket tidak sampai, inilah komentar oleh Juraj.
Ketika semua paket tidak menemukan, sistem akan mendeteksi ini dan mengirimkannya kembali tanpa pemberitahuan aplikasi (atau jika tidak memungkinkan, aplikasi akan mendapatkan kesalahan batas waktu). Pengiriman yang andal adalah tujuan protokol TCP yang disediakan oleh kernel OS, yang nc
menggunakannya. Anda dapat meminta protokol UDP yang tidak melakukan ini, menggunakan nc -u
tetapi ini tidak terjadi.
2
Ada contoh asli dalam yang disebutkan di atas README.gz
, yang didasarkan pada -w
batas waktu dan tidak memerlukan -q
opsi untuk hadir dalam implementasi Anda.
Netcat dapat digunakan sebagai agen transfer data sederhana, dan tidak masalah ujung mana yang menjadi pendengar dan ujung mana yang merupakan klien - input di satu sisi tiba di sisi lain sebagai output. Sangat membantu untuk memulai pendengar di sisi penerima tanpa batas waktu yang ditentukan, dan kemudian memberikan batas waktu sedikit pada sisi pengirim. Dengan cara itu pendengar tetap mendengarkan sampai Anda menghubunginya, dan setelah data berhenti mengalir klien akan kehabisan waktu, ditutup, dan bawa pendengar bersamanya. Kecuali jika jaringan intervensinya penuh dengan masalah, ini harus benar-benar andal, dan Anda selalu dapat menambah waktu tunggu. Contoh khas dari sesuatu "rsh" sering digunakan untuk: di satu sisi,
nc -l -p 1234 | uncompress -c | tar xvfp -
dan kemudian di sisi lain
tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234
akan mentransfer isi direktori dari satu mesin ke mesin lain, tanpa harus khawatir tentang file .rhosts, akun pengguna, atau konfigurasi inetd di kedua ujungnya.