Làm cách nào để chỉ gửi một gói UDP với netcat?


120

Tôi chỉ muốn gửi một giá trị ngắn trong gói UDP nhưng đang chạy lệnh

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

Tôi có thể thấy rằng máy chủ đang nhận nội dung xin chào nhưng tôi phải nhấn Ctrl+ cđể thoát lệnh netcat.

Làm cách nào tôi có thể tắt nó sau khi gửi lời chào ?


Xin lỗi, vì sự ồn ào, tôi đã đọc lại trang người đàn ông và tìm thấy -qtùy chọn.

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

hoạt động (nó thoát sau 1 giây).

Vì một số lý do nó không hoạt động với -q0.


Trang người đàn ông trên debian:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
luckydonald

Câu trả lời:


204

Nếu bạn đang sử dụng bash, bạn cũng có thể viết

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

và tránh tất cả các đặc điểm riêng và sự không tương thích của netcat.

Điều này cũng hoạt động khi gửi đến các máy chủ khác, ví dụ:

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

Đây không phải là các thiết bị "thực" trên hệ thống tệp, mà là các bí danh "đặc biệt" . Có thông tin bổ sung trong Sổ tay Bash .


24
Ok, bạn nói đúng, hãy để tôi nói rõ rằng điều này sẽ không hoạt động với ZSH.
jturolla

1
Đây là cách tốt hơn so với mucking với netcat. Cảm ơn vì tiền hỗ trợ!
johnboiles

3
Đây có thể là điều tuyệt vời nhất mà tôi từng thấy.
freb

4
Vì một số lý do, tôi cần sử dụng 127.0.0.1thay thế localhosttrên Ubuntu 14.04. (Vâng, tôi có localhosttrong /etc/hosts.)
tuomassalo

3
/dev/udp/không phải là một tệp thực. Nó chỉ là một tên tệp được giải thích đặc biệt bởi bash.
Peter Eisentraut

46

Tôi không tìm thấy -q1tùy chọn trên netcat của mình. Thay vào đó tôi đã sử dụng -w1tùy chọn. Dưới đây là tập lệnh bash tôi đã thực hiện để gửi một gói udp đến bất kỳ máy chủ và cổng nào:

#!/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 làm việc này: "echo -n "test" | nc -4u -w0 localhost 9999" như SimonW nói
Simon Unsworth

14

Trên netcat hiện tại (v0.7.1), bạn có một công tắc -c:

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

Vì thế,

echo "hi" | nc -cu localhost 8000

nên làm thủ thuật.


3
Điều quan trọng cần lưu ý là điều này chỉ đúng với GNU netcat, nhưng không đúng với netcat BSD.
MarSoft

Để rõ ràng, với netcat dựa trên Linux, tùy chọn -c yêu cầu một lệnh làm đối số, lệnh này "thực thi đối số đã cho qua / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal

5

Netcat gửi một gói cho mỗi đường dây mới. Vì vậy, bạn ổn. Nếu bạn làm bất cứ điều gì phức tạp hơn thì bạn có thể cần thứ khác.

Tôi đã đánh lừa Wireshark khi tôi nhận ra điều này. Không biết nếu nó giúp.


3
Tôi nghĩ rằng điều này chỉ đúng cho TCP. Với UDP, nó sẽ gửi nhiều dòng trong một gói (nếu chúng phù hợp).
sleske

1
Số Đơn giản chỉ cần kiểm tra echo -n "hello\nworld" >/dev/udp/localhost/514và bạn sẽ nhận được 2 dòng
bebbo

5

Tôi đã gặp vấn đề tương tự nhưng tôi sử dụng -w 0tùy chọn để chỉ gửi một gói và thoát. Bạn nên sử dụng lệnh này:

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

nc 1.10-41 + b1 không chấp nhận -w0. Lỗi: thời gian chờ không hợp lệ 0
palik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.