echo command | netcat host port
Điều này dẫn đến lệnh được gửi đến máy chủ từ xa và một số dữ liệu được đọc lại. Nhưng sau vài giây, kết nối sẽ đóng lại. Tham số -w không thay đổi gì cả. Tôi đang sử dụng netcat v1.10 trên SuSE 10.1.
echo command | netcat host port
Điều này dẫn đến lệnh được gửi đến máy chủ từ xa và một số dữ liệu được đọc lại. Nhưng sau vài giây, kết nối sẽ đóng lại. Tham số -w không thay đổi gì cả. Tôi đang sử dụng netcat v1.10 trên SuSE 10.1.
Câu trả lời:
Điều này hoạt động với nc
lệnh trên OS X (giả sử lệnh bạn muốn gửi nằm trong một tệp):
cat file - | nc host port
(Về cơ bản, cat
bỏ nội dung của tệp trên thiết bị xuất chuẩn và sau đó chờ bạn trên stdin).
Bằng cách mở rộng, nếu bạn muốn gửi lệnh từ chính shell, bạn có thể thực hiện việc này:
cat <(echo command) - | nc host port
{ echo command; cat;}
sẽ làm như vậy, và có thể được coi là dễ hiểu hơn.
netcat
lệnh sẽ giữ ổ cắm mở cho đến khi thấy hết đầu vào. Tất cả những ví dụ này chứng minh điều này mà không thực sự nói nhiều về lý do tại sao . Tôi đang tương tác với máy chủ bằng cách sử dụng trong một thời gian dài chỉ sử dụng : . SocketTest là một công cụ tiện dụng có thể nghe hoặc phục vụ trên bất kỳ cổng TCP hoặc UDP nào. SocketTest
netcat
cat - | nc localhost 8063
Với nc
trên Ubuntu:
nc -q -1 host port
Từ trang người dùng Ubuntunc
:
-q seconds
after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
Lưu ý rằng các nc
tùy chọn khả dụng khác nhau rất nhiều giữa các bản phân phối, vì vậy điều này có thể không hoạt động trên của bạn (OpenSUSE).
Tôi không nghĩ rằng bạn sẽ quản lý điều này với netcat hoặc socat. Tôi vừa mới thực hiện mày mò với cả hai, và socat có vẻ hứa hẹn nhất.
Tôi đã quản lý để thiết lập socat để kết nối với cổng TCP từ xa và lắng nghe ổ cắm miền unix cục bộ (theo lý thuyết để liên kết có thể được duy trì liên tục) nhưng ngay khi quy trình cục bộ tách khỏi ổ cắm unix (một socat khác liên kết ổ cắm unix với stdin / out) nó đã đóng phiên giao tiếp TCP.
Vấn đề ở đây là mỗi kết nối thông qua netcat / socat tạo ra kết nối luồng TCP mới đến máy chủ và nó sẽ đóng phiên luồng TCP đó khi kết thúc cục bộ ngắt kết nối.
Tôi nghĩ rằng có lẽ bạn sẽ phải viết một số phần mềm proxy tùy chỉnh để mở kết nối TCP đến đầu cuối từ xa và sau đó lắng nghe cục bộ trên một ổ cắm / ống / fifo hoặc bất cứ điều gì và sau đó chỉ cần gửi dữ liệu xuống đường ống TCP hiện có và trả về kết quả.
Có thể là kết nối được đóng ở đầu kia của ổ cắm?
Theo mặc định, nc
đóng kết nối sau khi hoàn thành, nếu bạn không nói rõ ràng cho anh ấy nghe (với -k
tùy chọn):
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
Xem man nc.1
.
Tôi đang truyền dữ liệu thành công giữa hai máy như thế này:
người gửi:
while (true); do
echo -n "$RANDOM " | nc <host> <port>
done
người nhận:
nc -kl <port>
Phương pháp của Georges hoạt động tốt từ trình bao tương tác, nhưng sẽ không giúp ích cho việc viết kịch bản, khi bạn ví dụ như gọi tập lệnh của mình là nohup ./script &
.
Tôi tìm thấy thay thế stdin với một fifo giả giúp.
mkfifo dummy
cat command.txt dummy | nc host port
Vì không có gì ghi vào fifo, sau khi xuất tệp, cat
bị treo trên đó vô thời hạn.
socat
's shut-none
tùy chọn sẽ giúp ở đây:
Changes the (address dependent) method of shutting down the write part of a connection to not do anything.
Có lẽ bạn cũng cần ghi đè khoảng thời gian chờ mặc định bằng cách sử dụng -t <timeout>
, nếu không ổ cắm sẽ bị đóng sau 0,5 giây. Tùy chọn này ghi đè hành vi mặc định, đó là:
When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.
Vì vậy, một lệnh như:
echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none
sẽ giữ cho ổ cắm mở trong 10 giây sau khi gửi 'blah'.