netcat: gửi văn bản đến dịch vụ echo, đọc trả lời sau đó thoát


8

Tôi muốn sử dụng netcatđể gửi một đoạn văn bản đến dịch vụ echo trên máy chủ của mình, nhận được phản hồi sau đó thoát, để tôi biết kết nối vẫn tốt. Cho đến nay tôi đã thử:

 echo 'test' | netcat server 7 

Bằng cách này, netcat sẽ đợi nhiều đầu vào hơn là thoát.

Làm cách nào tôi có thể netcatthoát sau khi nhận được trả lời từ dịch vụ echo?


Netcat là lỗi - vấn đề là làm điều này một cách chính xác không đơn giản như nó có vẻ.
peterh - Phục hồi Monica

Câu trả lời:


5

Chỉ cần thử - hành vi hơi khác nhau giữa netcat-openbsdnetcat-traditional(ubfox 16.4). Biến thể OpenBSD làm những gì bạn mong đợi, trong khi với netcat-truyền thống, tôi cần thêm vào -q 1để tránh phải chờ thêm đầu vào.

echo 'test' | netcat -q 1 server 7

5

Lệnh của bạn sẽ hoạt động. Nó rất giống với một số ví dụ trong netcattrang.

Đây chính xác là cách thức netcathoạt động: một khi nó đã đạt EOF trên stdin, nó (một chiều) sẽ đóng kết nối / đến / máy chủ và sau đó chờ dữ liệu đến từ máy chủ. Khi cái sau đóng kết nối (theo cách khác: server-> client), sau đó netcatdừng lại.

Nếu netcatlệnh của bạn không kết thúc, tôi cho rằng có một điều kỳ lạ xảy ra ở cấp độ mạng giúp echomáy chủ luôn lắng nghe đầu vào bổ sung.

Bạn có thể thử -qtùy chọn buộc netcatdừng N giây sau khi gặp EOF trên stdin:

netcat -q1 server echo <<< "test"

( <<< "test"là một bashism, sử dụng echo ... |cú pháp của bạn nếu bạn không sử dụng bash)


5

Dùng cái này:

cat <(echo command) - | nc host port

Vấn đề là ncsẽ đóng kết nối ngay lập tức sau khi đóng stdin, rất nhanh cho một my_commandchuỗi đơn giản , và do đó không bao giờ có cơ hội nhận được phản hồi. Nếu bạn đặt một tệp rất lớn, bạn sẽ thấy rằng nó có thể nhận được phản hồi trước khi gửi xong tệp.

Nhập catvới -đối số thứ hai: nó làm cho catlắng nghe trên stdin để biết thêm nội dung để chuyển qua sau khi nó đã gửi nội dung của đối số thứ nhất. Đối số đầu tiên chỉ là nhận echolệnh thông qua cat- nó cũng có thể là một tệp với các lệnh của bạn a la cat < file - | ....

Nhược điểm của nó là bây giờ nó vẫn mở cho đến khi bạn nhấn ^Choặc ^Dtrên vỏ. Thêm thời gian chờ bằng cách sử dụng -w 1(OSX netcat) hoặc -i 1(nmap's ncat) sẽ khiến nó đóng kết nối sau 1 giây, nhưng nó sẽ không thoát khỏi quy trình cho đến khi bạn nhập một số ký tự.

Câu trả lời này dựa trên câu trả lời này cho một câu hỏi siêu người dùng giống hệt nhau .


cat <(echo command) <(sleep 1) | nc host portlàm cho stdin duy trì mở miễn là sleeplệnh chạy mà không cần thiết lập thời gian chờ nc hoặc để người dùng "nhập một số ký tự".
romanows

2

Tôi không hiểu câu hỏi của bạn đúng không?

Trình nghe netcat mặc định sẽ thoát khi nhận đầu vào (trong trường hợp này là echo của bạn chuyển nó sang netcat để chuyển tiếp nó đến người nghe).

Nếu bạn muốn dịch vụ Netcat nghe tiếp tục nghe sau khi nhận được đầu vào:

nc -lk 12345
  • Trong đó 12345 là số cổng

Mặc dù vậy, quan trọng nhất, vui lòng kiểm tra trang man cho netcat .. chúng rất hữu ích cho tất cả các lệnh ...

man nc

1

Tôi biết điều này hơi cũ nhưng không có câu trả lời nào khác phù hợp với tôi và điều này đã làm:

echo 'test' | netcat -N $server $port

Lưu ý -N:

tắt ổ cắm mạng sau EOF trên đầu vào. Một số máy chủ yêu cầu điều này để hoàn thành công việc của họ.

Làm việc cho tôi trên cả Windows và Linux.


0

gửi ping đến Redis và grep PONG:

echo 'PING' | nc -w 1 server 6379 | grep PONG

Hoạt động như lệnh Ansible.


0

Trên thực tế, cách tốt nhất để đóng kết nối một cách duyên dáng là gửi Content-Lengthtiêu đề như sau. Khách hàng (thích curlsẽ đóng kết nối sau khi nhận được dữ liệu.

DATA="Date: $(date)"; 
LENGTH=$(echo $DATA | wc -c);
echo -e "HTTP/1.1 200 OK\nContent-Length: ${LENGTH}\n\n${DATA}" | nc -l -p 8000;

0

Tôi chỉ kiểm tra timeoutcmd trong khi thử nclệnh, như:

echo "test" | timeout 10 netcat server 7

Điều này đợi 10 giây trước khi đóng kết nối.


0

Tôi muốn giới thiệu socatthay thế:

echo test | socat -t 10 - tcp:server:7

(ở đây chờ tối đa 10 giây để máy chủ trả lời và tắt máy)

socatcó thể làm nhiều hơn nhiều so với các triển khai khác nhau (khác nhau và không tương thích) của nc/ netcat, và nói chung hoạt động đáng tin cậy hơn. Đó là con dao quân đội Thụy Sĩ cuối cùng của bạn.

Trích dẫn trang man cho -ttùy chọn:

-t <thời gian chờ>
Khi một kênh đạt EOF, phần ghi của kênh khác sẽ bị tắt. Sau đó, socat đợi [timeval] giây trước khi chấm dứt. Mặc định là 0,5 giây. Thời gian chờ này chỉ áp dụng cho các địa chỉ nơi phần viết và đọc có thể được đóng độc lập. Khi trong khoảng thời gian chờ, phần đọc cho EOF, socatchấm dứt mà không chờ thời gian chờ.

Vì vậy, ở trên, sau khi echoviết test\n, nó thoát ra, đóng ống. socatnhìn thấy EOF trên -kênh của nó (stdin), sau đó tắt hướng ghi của ổ cắm TCP và chờ dịch vụ từ xa cũng tắt hoặc trong 10 giây không hoạt động trước. Các echodịch vụ có nghĩa là chấm dứt kết nối càng sớm càng đầu kia đã đóng cửa hướng gửi nó, vì vậy lệnh đó không nên dùng bất kỳ dài hơn thời gian cần thiết để thiết lập kết nối, trao đổi dữ liệu và tắt.

Với OpenBSD netcathoặc cổng của nó sang Linux đó là một mặc định trên các phiên bản gần đây của Debian và các dẫn xuất ít nhất, một xấp xỉ sẽ là nc -Nw10 server 7(đó là khác nhau ở chỗ nc's -wlà cả một thời gian chờ kết nối và thời gian chờ không hoạt động)

Để triển khai echodịch vụ TCP trên cổng 7777 để thử nghiệm:

socat tcp-listen:7777,reuseaddr,fork exec:cat,nofork

( forkđể rẽ nhánh một quy trình cho mỗi kết nối đến, noforkđể thực hiện cattrực tiếp trong quy trình đó với stdin / stdout của nó ổ cắm TCP, giống như khi sử dụng (x)inetd).

Một số thời gian trên giao diện loopback, với zsh:

$ time echo test | socat -t10 - tcp:localhost:7777
test
echo test  0.00s user 0.00s system 54% cpu 0.001 total
socat -t10 - tcp:localhost:7777  0.00s user 0.01s system 55% cpu 0.009 total

-1
(echo 'test'; sleep 1) | netcat server 7 

Điều này giữ cho đầu vào mở trong một thời gian để trì hoãn netcatkết thúc.

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.