Đầu tiên một số nền tảng
Có nhiều phiên bản khác nhau nc
, như bạn có thể tìm thấy trên nc (1) - Trang người dùng Linux hoặc nc (1) Hướng dẫn về lệnh chung của BSD , kết nối sẽ tắt ngay sau khi chuyển. Có một ví dụ được đưa ra trên cả hai trang web được liên kết:
Bắt đầu bằng cách sử dụng nc để nghe trên một cổng cụ thể, với đầu ra được ghi vào một tệp:
$ nc -l 1234 > filename.out
Sử dụng máy thứ hai, kết nối với quá trình nghe nc, cung cấp cho nó tệp sẽ được chuyển:
$ nc host.example.com 1234 < filename.in
Sau khi tập tin đã được chuyển, kết nối sẽ tự động đóng lại.
Bạn netcat
không tắt kết nối sau khi chuyển, vì vậy nó khác với kết nối được mô tả ở trên. Nó hoạt động giống như của tôi, Netcat 1.10 trên Debian Jessie. Hành vi này được ghi lại trong /usr/share/doc/netcat-traditional/README.gz
(trên máy của tôi), phần in đậm là của tôi:
Trong cách sử dụng đơn giản nhất, "cổng máy chủ nc" tạo kết nối TCP đến cổng đã cho trên máy chủ đích đã cho. Đầu vào tiêu chuẩn của bạn sau đó được gửi đến máy chủ lưu trữ và mọi thứ quay trở lại qua kết nối sẽ được gửi đến đầu ra tiêu chuẩn của bạn. Điều này tiếp tục vô thời hạn, cho đến khi phía kết nối mạng tắt. Lưu ý rằng hành vi này khác với hầu hết các ứng dụng khác sẽ tắt mọi thứ và thoát sau khi kết thúc tệp trên đầu vào tiêu chuẩn.
Đây là lý do đằng sau hành vi này:
Bạn có thể hỏi "tại sao không sử dụng telnet để kết nối với các cổng tùy ý?" Câu hỏi hợp lệ, và đây là một số lý do. Telnet có vấn đề "EOF đầu vào tiêu chuẩn", do đó, người ta phải đưa ra độ trễ được tính toán trong các tập lệnh lái xe để cho phép đầu ra mạng kết thúc. Đây là lý do chính khiến netcat vẫn chạy cho đến khi phía mạng đóng cửa.
Wikipedia có một loạt các triển khai khác nhau . Tôi không thể đặt tên khác nhau mặc dù. Có lẽ người khác có thể?
Bây giờ, giải pháp
1
Bạn có thể nói nc
để thoát sau khi tập tin đã được đọc. Tùy chọn này rất hữu ích:
-q seconds after EOF on stdin, wait the specified number of seconds
and then quit. If seconds is negative, wait forever.
Nếu bạn sử dụng lệnh này ở cuối gửi:
nc -q 0 MachineIP Port < test.txt
nc
sẽ thoát 0 giây sau khi đọc EOF, tức là ngay sau khi tệp kết thúc. Sau đó nó sẽ thoát và kết thúc nhận cũng vậy nc
.
Nếu bạn tự hỏi điều gì sẽ xảy ra nếu các gói không đi qua, đây là một nhận xét của Juraj.
Khi tất cả các gói không đi qua, hệ thống sẽ phát hiện ra điều này và truyền lại chúng mà không nhận thấy ứng dụng (hoặc nếu không thể, ứng dụng sẽ gặp lỗi hết thời gian chờ). Phân phối đáng tin cậy là mục đích của giao thức TCP được cung cấp bởi kernel OS, nc
sử dụng. Bạn có thể yêu cầu giao thức UDP không làm điều này, bằng cách sử dụng nc -u
nhưng đây không phải là trường hợp.
2
Có một ví dụ ban đầu đã nói ở trên README.gz
, dựa trên -w
thời gian chờ và không yêu cầu -q
tùy chọn phải có mặt trong quá trình thực hiện của bạn.
Netcat có thể được sử dụng như một tác nhân truyền dữ liệu đơn giản và thực sự không quan trọng phần nào là người nghe và phần cuối là máy khách - đầu vào ở một bên đến bên kia là đầu ra. Sẽ rất hữu ích khi bắt đầu người nghe ở phía nhận mà không có thời gian chờ được chỉ định, và sau đó cho bên gửi một khoảng thời gian chờ nhỏ. Bằng cách đó, người nghe sẽ lắng nghe cho đến khi bạn liên lạc với nó, và sau khi dữ liệu ngừng chảy, máy khách sẽ hết thời gian, tắt và đưa người nghe đi cùng. Trừ khi mạng can thiệp gặp nhiều vấn đề, điều này sẽ hoàn toàn đáng tin cậy và bạn luôn có thể tăng thời gian chờ. Một ví dụ điển hình của một cái gì đó "rsh" thường được sử dụng cho: ở một bên,
nc -l -p 1234 | uncompress -c | tar xvfp -
và sau đó ở phía bên kia
tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234
sẽ chuyển nội dung của một thư mục từ máy này sang máy khác mà không phải lo lắng về các tệp .rhosts, tài khoản người dùng hoặc cấu hình inetd ở hai đầu.