Làm thế nào tôi có thể đặt lệnh cho một con mèo sẽ sống sót?


32
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.


Bạn có chắc chắn đó không phải là máy chủ từ xa đóng kết nối?
grawity

Vâng. Làm netcat và sau đó gõ thủ công lệnh sẽ dẫn đến việc netcat tồn tại vô thời hạn.
Chris

Tại sao nó vẫn sống? Nó chỉ in các tham số echo rồi chết?
M'vy

1
Tôi muốn nó tồn tại để nó tiếp tục nhận dữ liệu đến từ máy chủ từ xa.
Chris

2
Đo không phải sự thật. "netcat <host> <port>" mở ổ cắm TCP hai chiều.
Chris

Câu trả lời:


33

Điều này hoạt động với nclệ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, catbỏ 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

Thật tuyệt khi nó hoạt động trên một hệ thống nhúng xương trần, nơi netcat thiếu về tất cả các tùy chọn ưa thích.
SF.

{ echo command; cat;}sẽ làm như vậy, và có thể được coi là dễ hiểu hơn.
G-Man nói 'Phục hồi Monica'

1
Như tôi thấy, netcatlệ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 netcatcat - | nc localhost 8063
sẽ

14

Với nctrê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 nctù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).


13

Tôi đã tìm thấy nó:

echo command | netcat host port -

Đồng nghiệp của tôi biết điều đó. Tôi không thấy điều đó trong tài liệu.


2

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ả.


Hãy lắng nghe Matt Jenkins toàn năng: D
M'vy

2

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 -ktù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> 
    

1

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, catbị treo trên đó vô thời hạn.


0

socat's shut-nonetù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'.


0

Lệnh của bạn chấm dứt, nếu máy chủ từ xa đóng kết nối (hoặc không truy cập được) hoặc lệnh trước khi đường ống bị chấm dứt (trong khi netcat vẫn gửi phần còn lại của hàng đợi đầu vào).

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.