Cara mengetahui kapan NC selesai mentransfer file

11

Apakah ada cara untuk mengetahui kapan netcat selesai mentransfer file antar mesin?

Perintah saat ini:

Mesin # 2: nc -lp 5555 > test.txt

Mesin # 1: nc MachineIP Port < test.txt

Transfer terjadi, tetapi tidak ada indikasi visual bahwa itu telah selesai.

Anthony Russell
sumber

Jawaban:

19

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 netcattidak 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 ncuntuk 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

ncakan 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 ncmenggunakannya. Anda dapat meminta protokol UDP yang tidak melakukan ini, menggunakan nc -utetapi ini tidak terjadi.

2

Ada contoh asli dalam yang disebutkan di atas README.gz, yang didasarkan pada -wbatas waktu dan tidak memerlukan -qopsi 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.


sumber
Sepertinya saya tidak bisa melakukan ini. Ketika saya melakukannya -q dikatakan perintah itu tidak ada. Saya melihat -w terlihat serupa tetapi ini tidak menyebabkan koneksi untuk berhenti
Anthony Russell
Apa ncversimu? Untuk memeriksa nc -h:, baris pertama.
ehh ya sudah cukup tua. Saya pada gambar lama linux. Saya akan memperbaruinya dan mencobanya lagi
Anthony Russell
Saya memperbarui jawaban saya.
1
Ketika semua paket tidak menemukan, sistem operasi akan mendeteksi ini dan mengirimkannya kembali tanpa pemberitahuan aplikasi (atau jika masih gagal, aplikasi akan mendapatkan kesalahan batas waktu). Pengiriman yang andal adalah tujuan protokol TCP yang disediakan oleh kernel OS, yang digunakan oleh nc. Anda dapat meminta protokol UDP yang tidak melakukan ini, menggunakan nc -u tetapi ini tidak terjadi.
Juraj