Як знати, коли NC проводиться передача файлу


11

Чи є спосіб дізнатися, коли Netcat робиться для передачі файлу між машинами?

Поточні команди:

Машина №2: nc -lp 5555 > test.txt

Машина №1: nc MachineIP Port < test.txt

Передача відбувається, але немає візуальних ознак того, що вона завершена.

Відповіді:


19

Спочатку деяке тло

Існують різні версії nc, як ви можете знайти на nc (1) - man man на сторінці Linux або nc (1) BSD General Commands Manual, з'єднання має відключитися відразу після передачі. На обох пов’язаних сайтах є приклад:

Почніть з використання nc для прослуховування на певному порту, з виводу, захопленого у файл:

$ nc -l 1234 > filename.out

За допомогою другої машини підключіться до процесу прослуховування nc, подаючи йому файл, який потрібно перенести:

$ nc host.example.com 1234 < filename.in

Після передачі файлу з'єднання автоматично закриється.

netcatПісля перенесення ваше з'єднання не припиняється, тому воно відрізняється від описаного вище. Він поводиться як мій, Netcat 1.10 на Debian Jessie. Така поведінка задокументована в /usr/share/doc/netcat-traditional/README.gz(на моїй машині).

При найпростішому використанні "nc host port" створює TCP-з'єднання з даним портом на даному цільовому хості. Потім ваш стандартний вхід надсилається хосту, а все, що повертається через з'єднання, надсилається на ваш стандартний вихід. Це триває нескінченно, поки мережна сторона з'єднання не відключиться. Зауважте, що така поведінка відрізняється від більшості інших програм, які закривають усе та виходять після закінчення файлу на стандартному вході.

Ось міркування такої поведінки:

Ви можете запитати "чому б просто не використовувати telnet для підключення до довільних портів?" Дійсне питання, і ось деякі причини. У Telnet є проблема "стандартного вхідного EOF", тому потрібно вводити розраховані затримки в сценаріях керування, щоб дозволити завершення роботи мережі. Це основна причина, по якій netcat працює, поки мережа не закриється.

У Вікіпедії є збір різних реалізацій . Я не можу назвати відмінності. Може хтось ще може?


Тепер рішення

1

Ви можете сказати, ncщоб вийти після того, як файл був прочитаний. Цей варіант корисний:

-q seconds   after EOF on stdin, wait the specified number  of  seconds
             and then quit. If seconds is negative, wait forever.

Якщо ви використовуєте цю команду для надсилання:

nc -q 0 MachineIP Port < test.txt

ncзавершиться 0 секунд після читання EOF, тобто відразу після закінчення файлу. Потім він вийде, і так закінчиться прийом nc.

Якщо вам цікаво, що станеться, якщо пакети не потраплять, - ось коментар Юрая.

Коли всі пакети не трапляються, система виявить це і повторно передасть їх, не помічаючи програми (або, якщо це неможливо, програма отримає помилку тайм-ауту). Надійна доставка - це призначення протоколу TCP, наданого ядром ОС, яке ncвикористовує. Ви можете запитати протокол UDP, який цього не робить, використовуючи, nc -uале це не так.

2

У згаданому вище є оригінальний приклад README.gz, який ґрунтується на -wтайм-ауті і не вимагає -qможливості присутніх у вашій реалізації.

Netcat може використовуватися як простий агент передачі даних, і це неважливо, який кінець є слухачем і який кінець є клієнтом - вхід з одного боку надходить на інший бік як вихід. Корисно запустити слухача на приймальній стороні без вказаного часу, а потім надати стороні, що надсилає невеликий час очікування. Таким чином слухач залишається слухати, поки ви не зв’яжетеся з ним, і після того, як дані перестануть надходити, клієнт вимкне, вимкнеться та візьме слухача із собою. Якщо інтервенційна мережа не загрожує проблемами, це має бути повністю надійним, і ви завжди можете збільшити час очікування. Типовий приклад чогось "рш" часто використовується для: з одного боку,

nc -l -p 1234 | uncompress -c | tar xvfp -

а потім з іншого боку

tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234

буде переносити вміст каталогу з однієї машини на іншу, не турбуючись про файли .rhosts, акаунти користувачів або конфігурації inetd на будь-якому кінці.


Я не можу зробити так, щоб це спрацювало. Коли я роблю -q, він говорить, що команда не існує. Я бачу - я схожий, але це не викликає припинення зв'язку
Ентоні Рассел

Яка ваша ncверсія? Щоб перевірити:, nc -hперший рядок.

еге так, це досить старе. Я на старому зображенні Linux. Я оновлю його та віддам ще раз
Ентоні Рассел

Я оновив свою відповідь.

1
Якщо всі пакети не трапляються, операційна система виявить це і повторно передасть їх, не помічаючи додатків (або якщо це все-таки виходить з ладу, програма отримає помилку очікування). Надійна доставка - це призначення протоколу TCP, що надається ядром ОС, яке використовує nc. Ви можете запитати протокол UDP, який цього не робить, використовуючи nc -u, але це не так.
Юрай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.