netcat tidak berhenti ketika stdin ditutup

11

Saya mencoba mengirim pesan netcat. Setelah mengirim pesan, netcatharus diakhiri.

Saya sudah mencoba yang berikut ini:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

The -qpilihan negara:

-q detik

setelah EOF pada stdin, tunggu jumlah detik yang ditentukan dan kemudian berhenti. Jika detik negatif, tunggu selamanya.

Tapi

nc -q0 -u localhost 4300 < message.bin

juga tidak berfungsi.

Apa yang saya lewatkan?

Frank Kusters
sumber

Jawaban:

6

Dengan asumsi bahwa setelah mengirim koneksi EOF akan diam, Anda dapat menggunakan -w timeoutopsi, yang berfungsi timeoutsama dengan nol (tidak seperti -qopsi bodoh ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0
Bora M. Alper
sumber
1
Ini adalah jawaban yang benar dan harus diterima sebagai jawaban -q.
ccpizza
1
zero time out tidak berfungsi pada mesin saya (debian stretch). katanyainvalid wait-time 0
Anubis
3

Tanpa -qbendera instance Anda netcatakan menunggu selamanya. Tidak ada pesan "end of stream" dengan UDP sehingga tidak ada cara untuk netcatmengetahui bahwa stdin dan koneksi jaringan telah selesai.

Misalnya, menggunakan TCP / IP ini berfungsi seperti yang diharapkan:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

Tetapi seperti yang telah Anda tentukan, menggunakan UDP / IP ini tidak pernah berakhir:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

Di sinilah -qbendera masuk. Tapi sayangnya itu tidak menerima nilai 0. Itu juga tidak akan menerima nilai-nilai non-integer. Berikut ini adalah alternatif terbaik yang dapat saya tawarkan tanpa bantuan ke timeoutatau beberapa utilitas eksternal lainnya:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

Bahkan di sini, tidak mungkin memiliki netcatwaktu mendengarkan dengan anggun. ( -wOpsi batas waktu diabaikan, dan -qtidak relevan.) Sesuatu seperti ini mungkin berguna dalam situasi praktis, sehingga netcatterbunuh setelah 90 detik:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2
roaima
sumber
-q 0bekerja untukku.
AlikElzin-kilaka
@ AlikElzin-kilaka tidak bekerja untuk saya. Anda pasti menggunakan UDP dalam pengujian Anda? Versi netcat apa yang Anda miliki? Anda mungkin menggunakan versi yang lebih baru.
roaima
0

udp

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

tcp

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300
krazedkrish
sumber
mengapa downvotes? opsi -N memecahkan masalah ini
camelccc
-1

Stumbled atas ini ketika Googling tentang masalah yang hampir sama. Ternyata masalahnya adalah bahwa netcat terbunuh oleh bash tepat setelah semua data tersedot, tanpa mendapatkan kesempatan untuk menerima respons.

Solusi saya untuk ini adalah menambahkan beberapa penundaan setelah memipakan data, seperti ini:

(echo INFO; sleep 1) | nc redis.service.consul 6379

Dengan file ini dapat terlihat seperti:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
Penulis SkyWriter
sumber
netcatmasih tidak menutup saat sleepselesai. Saya akan mengharapkan baris perintah pertama untuk kembali ke prompt setelah 1 detik, tetapi tidak.
Frank Kusters
bagaimana kalau menambahkan -q 1? yaitu (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter
Dengan -qsemuanya berfungsi, bahkan contoh di pertanyaan awal saya. Saya sudah pindah ke versi Ubuntu yang lebih baru sejak itu, mungkin itu yang menyebabkan perbedaan.
Frank Kusters
Itu aneh.
Ngomong