Hành vi Netcat / socat với đường ống và UDP?


16

Tôi đoán điều này gần với linux - Netcat ngừng lắng nghe lưu lượng UDP - Siêu người dùng , nhưng tôi nghĩ tôi nên hỏi bằng mọi cách

Theo như các phiên bản của netcat tôi đang sử dụng Ubuntu 11.04 và mặc định netcattrên đó, điều mà tôi đoán là openbsd:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Đây là điều tôi thấy lạ: trường hợp đầu tiên hoạt động như mong đợi - Tôi mở máy chủ UDP trong một thiết bị đầu cuối:

$ sudo nc -ul 5000

... và trong một thiết bị đầu cuối khác, tôi khởi tạo kết nối máy khách UDP mới - và tôi nhập helloba lần, nhấn ENTER sau mỗi lần:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... và quay trở lại thiết bị đầu cuối máy chủ, nó đã được in helloba lần, như mong đợi:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Cho đến nay rất tốt, tất cả các công trình như mong đợi. Tuy nhiên, giả sử bây giờ tôi thử tương tự bằng cách chuyển đầu vào vào máy khách; vì vậy hãy thiết lập máy chủ UDP đầu tiên trong một thiết bị đầu cuối:

$ sudo nc -ul 5000

... và trong một trường hợp khác, chuyển một số dữ liệu thành ncmáy khách UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... Sau lệnh máy khách, loại vỏ đóng băng như thể đang chờ đầu vào - vì vậy tôi nhập hellovà ENTER thêm hai lần nữa; nhưng máy chủ chỉ đăng ký đầu tiên hello(được dẫn qua echo). Hơn nữa, ngay cả khi bạn nhấn Ctrl-C và cố gắng lặp lại echo hello | nc -u 127.0.0.1 5000lệnh máy khách , máy chủ vẫn sẽ vẫn báo cáo ngay lần đầu tiên hello:

$ sudo nc -ul 57130 
hello
^C

... và chỉ sau khi dừng máy chủ bằng Ctrl-C và khởi động lại nó, người ta mới có thể lặp lại echo hello | nc -u 127.0.0.1 5000lệnh máy khách và quan sát nó hoạt động.

 

Đây có phải là cách ncđược cho là cư xử? Tôi hy vọng rằng ít nhất các cuộc gọi lặp đi lặp lại echo hello | nc -u 127.0.0.1 5000sẽ được đăng ký - mà không phải khởi động lại máy chủ? Hoặc có thể có một chuyển đổi dòng lệnh đặc biệt cho loại hành vi đó?

EDIT: Tôi tìm thấy trình bày này thoải mái PDF: socat - Xử lý tất cả các loại của Sockets , trong đó có những điều sau netcatvs socatghi chú:

netcat - Hạn chế
● chỉ một lần bắn (chấm dứt sau khi đóng socket)
...
Ví dụ 1: Thay thế netcat
...
● Máy khách UDP có cổng nguồn:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Máy chủ TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...

... tuy nhiên, tôi gần như nhận được hành vi tương tự như trên, nếu tôi thay thế lệnh máy chủ bằng " socat - udp4-listen:5000,reuseaddr" - và dòng máy khách bằng " socat - udp:127.0.0.1:5000" ... Với đầu vào đường ống, " echo hello | socat - udp:127.0.0.1:5000", sự khác biệt duy nhất là Ở đây, lệnh ít nhất tồn tại sau khi từ hellođã được gửi - tuy nhiên, một lần nữa, các lần chạy liên tiếp của lệnh này sẽ không gây ra bất kỳ sự tiếp nhận nào tại máy chủ, cho đến khi máy chủ được khởi động lại.

Câu trả lời:


23

Ok, tôi nghĩ rằng ít nhất tôi đã có một cái gì đó với socat- cụ thể là, tùy chọn forkcần phải được thêm vào dòng máy chủ:

$ socat - udp4-listen:5000,reuseaddr,fork

... Và sau đó, trong một thiết bị đầu cuối khác, chúng ta có thể gọi echođường ống vào socatdòng máy khách nhiều lần trên dòng lệnh, vì nó sẽ thoát ngay lập tức ( tốt, sau nửa giây :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... và quay trở lại thiết bị đầu cuối đầu tiên, chúng ta có thể thấy rằng máy chủ đã hiển thị thành công cả ba hellos:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Lưu ý rằng ngay cả với máy chủ fork-ed socat, dòng echo "hello" | nc -u 127.0.0.1 5000vẫn sẽ 'khóa' như thể đang chờ người dùng nhập liệu; tuy nhiên, bây giờ sau khi Ctrl-C và chạy lại lệnh, nghĩa là

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... Máy chủ fork-ed socatsẽ hiển thị ba hellogiây mà không cần phải khởi động lại ..

 

Dường như, openBSD netcatnày không có forktùy chọn - nhưng tôi không chắc liệu nó có một tùy chọn tương ứng với nó không ..

Dù sao, hy vọng điều này sẽ giúp ai đó,
Chúc mừng!


4

Netcat của bạn chỉ đọc đầu ra từ thiết bị xuất chuẩn của echo khi bạn sử dụng đường ống, nó không còn "kết nối" với bàn phím nữa. Để nhận được phản hồi mà bạn mong đợi, bạn có thể thêm ba "xin chào" của bạn vào một tệp đang chạy

cat [myfile] | nc -u 127.0.0.1 5000

Xin chào @OldWolf - cảm ơn rất nhiều vì câu trả lời của bạn! Tôi đã thử đề xuất của bạn (cũng theo một cách hơi phức tạp hơn, " cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), tuy nhiên, trong khi tôi thấy ba hellogiây, câu đố tôi vẫn hiện diện: lệnh đó cũng sẽ sắp xếp "khóa", như thể đang chờ nhập từ người dùng và sau khi Ctrl-C và chạy lại nó, máy chủ sẽ không thấy bất kỳ dữ liệu nào cho đến khi được khởi động lại!? Đó là những gì tôi muốn biết rõ hơn - chúc mừng!
sdaau

2
nc đang chờ trên EOF, trong trường hợp này, nó không nhận được cho đến khi bạn gửi tín hiệu thoát đến chương trình.
OldWolf

À, tôi hiểu rồi - cảm ơn rất nhiều vì lời giải thích đó, @OldWolf! Dường như socatcó thể làm việc xung quanh điều đó với forktùy chọn ... Cảm ơn một lần nữa, chúc mừng!
sdaau

3

Nếu bạn thực hiện một bước của nc lắng nghe, nó sẽ cho thấy netcat đang chờ kết nối và một khi nó nhận được nó, sẽ kết nối với máy chủ và cổng đó, bỏ qua tất cả những người khác. Bạn cần thêm '-k' để tiếp tục và '-w 0' để hết thời gian chờ mỗi kết nối sau 0 giây. Socat là một lựa chọn tốt hơn, tôi nghĩ vậy.

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.