Làm thế nào để biết khi nào NC hoàn thành việc chuyển một tập tin


11

Có cách nào để biết khi nào netcat hoàn thành việc chuyển một tập tin giữa các máy không?

Các lệnh hiện tại:

Máy số 2: nc -lp 5555 > test.txt

Máy số 1: nc MachineIP Port < test.txt

Việc chuyển tiền xảy ra, nhưng không có dấu hiệu trực quan nào cho thấy nó đã hoàn thành.

Câu trả lời:


19

Đầ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 netcatkhô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

ncsẽ 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, ncsử 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 -unhư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 -wthời gian chờ và không yêu cầu -qtù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.


Tôi dường như không thể làm điều này để làm việc. Khi tôi làm -q nó nói lệnh không tồn tại. Tôi thấy -w trông tương tự nhưng điều này không khiến kết nối bị ngắt
Anthony Russell

ncPhiên bản của bạn là gì? Để kiểm tra : nc -h, dòng đầu tiên.

ehh yeah nó khá cũ Im trên một hình ảnh cũ của linux. Tôi sẽ cập nhật nó và cho nó đi tiếp
Anthony Russell

Tôi cập nhật câu trả lời của tôi.

1
Khi tất cả các gói không đi qua, hệ điều hành 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 vẫn không thành công, ứ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, mà nc sử dụng. Bạn có thể yêu cầu giao thức UDP không làm điều này, sử dụng nc -u nhưng đây không phải là trường hợp.
Juraj
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.