netcat ไม่ยุติเมื่อ stdin ปิด


11

netcatฉันพยายามที่จะส่งข้อความผ่าน หลังจากส่งข้อความnetcatจะต้องยกเลิก

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

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

-qตัวเลือกฯ :

-q วินาที

หลังจาก EOF บน stdin ให้รอจำนวนวินาทีที่ระบุแล้วออกจาก หากวินาทีเป็นลบให้รอตลอดไป

แต่

nc -q0 -u localhost 4300 < message.bin

ยังใช้งานไม่ได้

ฉันกำลังคิดถึงอะไร

คำตอบ:


6

สมมติว่าหลังจากส่งการเชื่อมต่อ EOF จะไม่ได้ใช้งานคุณสามารถใช้-w timeoutตัวเลือกซึ่งทำงานtimeoutได้เท่ากับศูนย์ (ไม่เหมือนกับ-qตัวเลือกโง่... )

cat tsmmessage.bin | nc -u localhost 4300 -w0

1
-qนี่คือคำตอบที่ถูกต้องและจะต้องได้รับการยอมรับอย่างใดอย่างหนึ่งมากกว่า
ccpizza

1
การหมดเวลาเป็นศูนย์จะไม่ทำงานบนเครื่องของฉัน (ยืดเดเบียน) มันบอกว่าinvalid wait-time 0
Anubis

3

หากไม่มีการ-qตั้งค่าสถานะอินสแตนซ์ของคุณnetcatจะรอตลอดไป ไม่มีข้อความ "สิ้นสุดการสตรีม" ด้วย UDP ดังนั้นจึงไม่มีทางnetcatรู้ว่าทั้งstdinและการเชื่อมต่อเครือข่ายเสร็จสิ้นแล้ว

ตัวอย่างเช่นการใช้ TCP / IP สามารถทำงานได้ตามที่คาดไว้:

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

แต่ตามที่คุณพิจารณาแล้วการใช้ UDP / IP จะไม่มีวันสิ้นสุด:

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

นี่คือที่-qธงมาใน. 0แต่โชคร้ายที่มันไม่ยอมรับค่าของ นอกจากนี้ยังจะไม่ยอมรับค่าที่ไม่ใช่จำนวนเต็ม นี่เป็นทางเลือกที่ดีที่สุดที่ฉันสามารถเสนอได้โดยไม่ต้องขอความช่วยเหลือtimeoutจากบุคคลภายนอก

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

แม้แต่ที่นี่มันเป็นไปไม่ได้ที่จะหยุดพักการฟังnetcatอย่างสง่างาม ( -wตัวเลือกการหมดเวลาจะถูกละเว้นและ-qไม่เกี่ยวข้อง) บางสิ่งเช่นนี้อาจถูกนำไปใช้ในสถานการณ์จริงเพื่อที่netcatจะถูกฆ่าหลังจาก 90 วินาที:

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

-q 0ทำงานได้สำหรับฉัน
AlikElzin-kilaka

@ AlikElzin-kilaka ไม่ได้ผลสำหรับฉัน คุณใช้ UDP แน่นอนในการทดสอบของคุณ? netcat รุ่นใดที่คุณมี คุณอาจเป็นรุ่นที่ใหม่กว่า
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

ทำไม downvotes ตัวเลือก -N แก้ปัญหานี้
camelccc

-1

สะดุดเมื่อนี้เมื่อ Googling เกี่ยวกับปัญหาเดียวกันมาก มันกลับกลายเป็นว่า netcat ถูกฆ่าโดยการทุบตีทันทีหลังจากที่ข้อมูลทั้งหมดถูกดูดเข้ามาโดยไม่ได้รับโอกาสในการตอบสนองใด ๆ

ทางออกของฉันคือการเพิ่มความล่าช้าหลังจากท่อข้อมูลเช่นนี้

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

ด้วยไฟล์นี้สามารถมีลักษณะดังนี้:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcatยังคงไม่ปิดเมื่อsleepเสร็จสิ้น ฉันคาดว่าบรรทัดคำสั่งแรกจะกลับไปที่พรอมต์หลังจาก 1 วินาที แต่ไม่
Frank Kusters

วิธีการเกี่ยวกับการเพิ่ม-q 1? คือ(echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379อะไร
SkyWriter

ด้วย-qผลงานทุกอย่างแม้กระทั่งเช่นในคำถามเดิมของฉัน ฉันย้ายไป Ubuntu รุ่นใหม่กว่าตั้งแต่นั้นมาบางทีอาจเป็นสาเหตุของความแตกต่าง
Frank Kusters

แปลก. Anyways ดีใจที่เราทั้งสองพบวิธีที่รอบนี้ :)
Skywriter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.