Tôi đang thực hiện lệnh sau từ một kịch bản:
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001
Tuy nhiên, khách hàng netcat vẫn mở vô thời hạn. Làm cách nào để đóng kết nối sau khi dữ liệu này được gửi?
Tôi đang thực hiện lệnh sau từ một kịch bản:
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001
Tuy nhiên, khách hàng netcat vẫn mở vô thời hạn. Làm cách nào để đóng kết nối sau khi dữ liệu này được gửi?
Câu trả lời:
Cả hai câu trả lời khác -c
và -q
được đưa ra đều đúng trong ngữ cảnh phù hợp, nhưng nó có thể giúp tóm tắt lý do tại sao có nhiều câu trả lời và đưa ra một giải pháp tổng quát hơn.
Các tùy chọn khác nhau này làm cùng một việc nhưng là các triển khai khác nhau của netcat:
-c
GNU triển khai netcat-q
OpenBSD thực hiện netcat. -w
(khác?) Thực hiện OpenBSD của netcat. Một số phiên bản yêu cầu int để chỉ định số giây chờ trước khi thoát khỏi các tùy chọn -q
và -w
. Int này phải > 0
hoặc >= 0
, tùy thuộc vào phiên bản.
Nếu bạn đang triển khai một cái gì đó trên nhiều máy và không chắc chắn chúng sử dụng cùng một cách thực hiện netcat, bạn có thể xem xét kết thúc cuộc gọi netcat của mình với timeout
chương trình để giết netcat sau vài giây.
timeout 5 echo '{"hostUp": true}' | netcat localhost 8001
Cách tiếp cận này hơi vụng về vì nó đặt giới hạn trên cho việc thực thi netcat bất kể có gửi dữ liệu thành công hay không, nhưng nếu bạn đang gửi một lượng nhỏ dữ liệu và có vài giây dự phòng thì việc này sẽ hiệu quả với bất kỳ thực hiện netcat.
Trong trường hợp của tôi, bản sao netcat mà tôi đang sử dụng trên máy Mac được cài đặt qua Homebrew (v 0.7.1) không có tùy chọn -q, nhưng tôi đã có thể sử dụng tùy chọn -c để đóng trên STDIN EOF và đặt toàn bộ lệnh trong một vòng lặp:
while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
Trên máy chủ Ubuntu 18.04 tôi phải sử dụng như sau: (tìm thấy trong trang man)
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -N localhost 8001
Rõ ràng -N
là tương tự -q
hoặc -c
trên các bản phát hành khác