จะส่งแพ็คเก็ต UDP เพียงชุดเดียวกับ netcat ได้อย่างไร


122

ฉันต้องการส่งค่าสั้น ๆ เพียงค่าเดียวในแพ็กเก็ต UDP แต่เรียกใช้คำสั่ง

echo -n "hello" | nc -4u localhost 8000

ฉันเห็นว่าเซิร์ฟเวอร์ได้รับสิ่งที่สวัสดีแต่ฉันต้องกดCtrl+ cเพื่อออกจากคำสั่ง netcat

ฉันจะเลิกใช้งานหลังจากส่งสวัสดีได้อย่างไร


ขออภัยสำหรับเสียงรบกวนฉันอ่านหน้าคนอีกครั้งและพบ-qตัวเลือก

 echo -n "hello" | nc -4u -q1 localhost 8000

ใช้งานได้ (จะหยุดทำงานหลังจากผ่านไป 1 วินาที)

-q0ด้วยเหตุผลบางอย่างมันไม่ได้ทำงานร่วมกับ


Man page บน debian:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
luckydonald

คำตอบ:


205

หากคุณใช้ bash คุณอาจเขียนได้เช่นกัน

echo -n "hello" >/dev/udp/localhost/8000

และหลีกเลี่ยงความแปลกประหลาดและความเข้ากันไม่ได้ทั้งหมดของ netcat

นอกจากนี้ยังสามารถส่งไปยังโฮสต์อื่น ๆ เช่น:

echo -n "hello" >/dev/udp/remotehost/8000

เหล่านี้ไม่ได้ "ของจริง" อุปกรณ์บนระบบไฟล์ แต่ทุบตี "พิเศษ" นามแฝง มีข้อมูลเพิ่มเติมในการเป็นคู่มือการทุบตี


25
ตกลงคุณพูดถูกขอฉันพูดให้ชัดเจนว่าสิ่งนี้ใช้ไม่ได้กับ ZSH
jturolla

1
นี่เป็นวิธีที่ดีกว่าการโกงกับ netcat ขอบคุณสำหรับทิป!
johnboiles

3
นี่อาจเป็นสิ่งที่น่าอัศจรรย์ที่สุดที่ฉันเคยเห็นมา
freb

4
ด้วยเหตุผลบางอย่างฉันต้องใช้127.0.0.1แทนlocalhostบน Ubuntu 14.04 (ใช่ฉันจะมีlocalhostใน/etc/hosts.)
tuomassalo

3
/dev/udp/ไม่ใช่ไฟล์จริง เป็นเพียงชื่อไฟล์ที่ตีความเป็นพิเศษโดย bash
Peter Eisentraut

46

ฉันไม่พบ-q1ตัวเลือกใน netcat ของฉัน ฉันใช้-w1ตัวเลือกนี้แทน ด้านล่างนี้เป็นสคริปต์ทุบตีที่ฉันทำเพื่อส่งแพ็กเก็ต udp ไปยังโฮสต์และพอร์ตใด ๆ :

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT

OS X ใช้งานได้: "echo -n" test "| nc -4u -w0 localhost 9999" ตามที่ SimonW กล่าว
Simon Unsworth

14

ใน netcat ปัจจุบัน (v0.7.1) คุณมีสวิตช์ -c:

-c, --close                close connection on EOF from stdin

ดังนั้น

echo "hi" | nc -cu localhost 8000

ควรทำเคล็ดลับ


3
โปรดทราบว่านี่เป็นจริงสำหรับ GNU netcat เท่านั้น แต่ไม่ใช่สำหรับ BSD netcat
MarSoft

เพื่อความชัดเจนด้วย netcat บน Linux อ็อพชัน -c ต้องการคำสั่งเป็นอาร์กิวเมนต์ซึ่ง "เรียกใช้อาร์กิวเมนต์ที่กำหนดผ่าน / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal

5

Netcat ส่งหนึ่งแพ็คเก็ตต่อบรรทัดใหม่ คุณสบายดี หากคุณทำอะไรที่ซับซ้อนกว่านั้นคุณอาจต้องการอย่างอื่น

ฉันกำลังหลอกล่อกับ Wireshark เมื่อฉันตระหนักถึงสิ่งนี้ ไม่รู้ว่ามันช่วย.


3
ฉันคิดว่านี่ถูกต้องสำหรับ TCP เท่านั้น ด้วย UDP มันจะส่งหลายบรรทัดในหนึ่งแพ็คเก็ต (ถ้ามันพอดี)
sleske

1
ไม่เพียงแค่ทดสอบecho -n "hello\nworld" >/dev/udp/localhost/514แล้วคุณจะได้ 2 บรรทัด
bebbo

5

ฉันมีปัญหาเดียวกัน แต่ฉันใช้-w 0ตัวเลือกเพื่อส่งเพียงหนึ่งแพ็คเก็ตและออก คุณควรใช้คำสั่งนี้:

echo -n "hello" | nc -4u -w0 localhost 8000

NC 1.10-41 + b1 -w0ไม่ยอมรับ ข้อผิดพลาด: เวลารอไม่ถูกต้อง 0
palik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.