Надсилання вмісту текстового файлу на сервер за допомогою netcat?


13

На порту 5144 є прослуховування демона, який я не можу змінити.

Я хочу використовувати netcat для надсилання вмісту текстового файлу на сервер, але це змушує netcatзависати термінал, поки я не натискаю Ctrl+ C:

cat file.txt | nc -u 127.0.0.1 5144

Єдиний спосіб, коли я можу змусити його працювати - це запустити nc -u 127.0.0.1 5144та скопіювати / вставити вміст файлу вручну.

Будь-які ідеї?


Також зверніть увагу:

  1. cat file.txt | ...веде до bash: ...: command not foundі я можу продовжувати використовувати термінал
  2. використання nc -u 127.0.0.1 5144 < file.txtпризводить до тієї ж поведінки, що і використання | вище

Що відбувається, коли ти кажеш cat file.txt | …? Як щодо nc -u 127.0.0.1 5144 < file.txt?
Скотт

вам потрібно використовувати -u? Крім того, ви спробували для іншої сторони, nc -l -p? а ви спробували nc -p? (є один nc, який використовує -l -p, і один, я думаю, що використовує -p без -l). Ви показали лише одну сторону, клієнт / ініціюючу сторону. Що ви робите для сервера? Спробуйте як тест, змусивши nc прослухати порт 1234 і побачити, чи кішка ... | nc ... працює на це. Я ніколи цього не бачив, тому, можливо, це слабкий, але, можливо, це щось своєрідне для цього конкретного демона, який не сприймає пограбовані речі.
барлоп

Я не можу змінити демон. @Scott: bash: ...: command not foundі використання "<file.txt" робить те саме, що і | оператор (netcat просто висить)
Аміль

Чи можете ви будьте точнішими? Це говорить " bash: ...: command not found"? Або сказано " bash: cat: command not found" чи " bash: nc: command not found"? І тоді він виходить на запит на оболонку чи він висить? (Я рекомендую вам відредагувати питання, щоб додати ці деталі, тому людям в Австралії, які щойно прокидаються, не потрібно читати всі ці коментарі, щоб дізнатися, які у вас симптоми.)
Скотт

@Scott: Спасибі, я інтегрував свої відповіді на ваші запитання в оригінальне запитання. Будь-які ідеї?
Аміль

Відповіді:


7

Якщо ви використовуєте GNU версію netcat, ви можете використовувати прапор -c, щоб закрити з'єднання на EOF.

-c, --закрийте тісний зв'язок на EOF від stdin

Якщо ви використовуєте оригінальну версію інструменту, ви можете використовувати прапор -q.

-q сек вийдуть після EOF на stdin та затримка сек

Прикладом оригінальної версії є:

cat file.txt | nc -u -q 0 127.0.0.1 5144

Я додаю "-q 0" до вашої початкової команди. Це закриває з'єднання після надсилання файлу.


Щоб відрізнити: оригінальна версія - це та, яку потрібно вказати -l -p <port>для прослуховування. Версія GNU просто займає -l <port>.
tueftl

1

Якщо припустити, що після надсилання EOF з'єднання залишиться в режимі очікування, ви можете скористатися -w timeoutопцією, яка працює на timeoutрівні нуля (на відміну від дурного -qваріанта ...)

cat file.text | nc -u localhost 4300 -w0

0

Якщо ви переходите з FreeBSD до Windows:

FreeBSD: cat file.txt | nc -N 10.0.0.5 5144

-N вимкне мережевий сокет після EOF

Windows: nc -l -p 5144 > output.txt

-lперестане слухати при закритому з’єднанні (на відміну від -L)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.