Як я можу передавати команди netcat, які залишаться живими?


32
echo command | netcat host port

Це призводить до того, що команда надсилається віддаленому хосту, а деякі дані зчитуються назад. Але через кілька секунд зв’язок перерветься. Параметр -w нічого не змінив. Я використовую netcat v1.10 на SuSE 10.1.


Ви впевнені, що не віддалений хост закриває з'єднання?
grawity

Так. Робити netcat, а потім вручну вводити команду, це призводить до того, що netcat залишається живим нескінченно.
Кріс

Чому він залишився б живим? це просто надрукувати параметри ехо, а потім померти?
M'vy

1
Я хочу, щоб він залишався живим, щоб він продовжував отримувати дані, що надходять з віддаленого сервера.
Кріс

2
Що це не так. "netcat <host> <port>" відкриває двосторонній сокет TCP.
Кріс,

Відповіді:


33

Це працює з ncкомандою на OS X (припускаючи, що команда, яку ви хочете відправити, знаходиться у файлі):

cat file - | nc host port

(По суті, catскидає вміст файлу на stdout, а потім чекає на stdin).

Якщо ви хочете відправити команду з самої оболонки, ви можете зробити це:

cat <(echo command) - | nc host port

Це приємно, оскільки це працює на дуже голій кості, вбудованій системі, де сітка не вистачає на всі фантазійні варіанти.
СФ.

{ echo command; cat;}зробив би те саме, і, можливо, це буде легше зрозуміти.
G-Man каже: "Відновіть Моніку"

1
Як я бачу, netcatкоманда буде тримати сокет відкритим, поки він не побачить кінець введення. Усі ці приклади демонструють це, не кажучи особливо про те, чому . Я взаємодія з сервером , використовуючи в протягом тривалого періоду тільки з використанням: . SocketTest - це зручний інструмент, який може слухати або обслуговувати будь-який порт TCP або UDP. SocketTest netcatcat - | nc localhost 8063
буде

14

З ncUbuntu:

nc -q -1 host port

На сторінці man Ubuntunc :

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

Зауважте, що доступні ncопції сильно відрізняються між дистрибутивами, тому це може не працювати на ваших (OpenSUSE).


13

Я знайшов це:

echo command | netcat host port -

Мій колега це знав. Я цього не бачу в документації.


2

Я не думаю, що ти будеш керувати цим ні netcat, ні socat. Я щойно робив обширні майстерності з обома, і socat виглядав найбільш перспективно.

Мені вдалося встановити socat для підключення до віддаленого порту TCP і прослуховування в локальному сокеті домену unix (теоретично, щоб посилання могло постійно підтримуватися), але як тільки локальний процес від'єднався від сокета unix (інший socat пов'язуючи unix-сокет до stdin / out), він закрив сеанс socat TCP.

Проблема тут полягає в тому, що кожне з'єднання через netcat / socat здійснює нове з'єднання потоку TCP з сервером, і воно закриває сеанс потоку TCP, коли локальний кінець відключається.

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


Послухайте всесильного Метта Дженкінса: D
M'vy

2

Може бути, що з'єднання закрите на іншому кінці розетки?

За замовчуванням ncпісля завершення з’єднання закриває з'єднання, якщо ви прямо не скажете йому продовжувати слухати (з -kопцією):

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

Див man nc.1.


Я успішно передаю дані між двома машинами, як це:

  • відправник:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • приймач:

    nc -kl <port> 
    

1

Метод Жоржа добре працює з інтерактивної оболонки, але не допоможе в написанні сценаріїв, наприклад, коли ви називаєте свій сценарій як nohup ./script &.

Я знайшов, що заміна stdin на фіктивну фіфо допомагає.

 mkfifo dummy
 cat command.txt dummy | nc host port

Оскільки ніколи нічого не пише на фіфо, після виведення файлу catвішається на нього нескінченно.


0

socat«S shut-noneваріант повинен допомогти тут:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

Можливо, вам також знадобиться змінити період очікування за замовчуванням, використовуючи -t <timeout>, інакше сокет буде закритий через 0,5 с. Цей параметр переосмислює поведінку за замовчуванням:

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.

Отже, така команда, як:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

буде тримати розетку відкритою протягом 10 секунд після відправлення "бла".


0

Ваша команда припиняється, якщо або віддалений хост перерве з'єднання (або недоступний), або команду до припинення роботи труби (поки netcat все ще надсилає решту своєї черги на вхід).

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