Tôi muốn giới thiệu socat
thay 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)
socat
có 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 -t
tù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, socat
chấm dứt mà không chờ thời gian chờ.
Vì vậy, ở trên, sau khi echo
viết test\n
, nó thoát ra, đóng ống. socat
nhì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 echo
dị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 netcat
hoặ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 -w
là cả một thời gian chờ kết nối và thời gian chờ không hoạt động)
Để triển khai echo
dị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 cat
trực tiếp trong quy trình đó với stdin / stdout của nó là ổ 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