Как я могу передать команды netcat, который останется живым?

32
echo command | netcat host port

В результате команда отправляется на удаленный хост, а некоторые данные читаются обратно. Но через несколько секунд соединение закрывается. Параметр -w ничего не изменил. Я использую Netcat v1.10 на SuSE 10.1.

Крис
источник
Вы уверены, что не удаленный хост закрывает соединение?
grawity
Да. Выполнение netcat, а затем ввод команды вручную приводит к тому, что netcat остается живым неограниченное время.
Крис
Почему он остался в живых? это просто напечатать параметры эха, а затем умереть?
M'vy
1
Я хочу, чтобы он оставался в живых, чтобы он продолжал получать данные, поступающие с удаленного сервера.
Крис
2
Это не правда. «netcat <хост> <порт>» открывает двунаправленный сокет TCP.
Крис

Ответы:

33

Это работает с ncкомандой в OS X (при условии, что команда, которую вы хотите отправить, находится в файле):

cat file - | nc host port

(По сути, catвыдает содержимое файла на стандартный вывод и затем ждет вас на стандартном вводе).

Если вы хотите отправить команду из самой оболочки, вы можете сделать это:

cat <(echo command) - | nc host port
Чайтанья Гупта
источник
Это приятно, так как работает на очень простой встроенной системе, где netcat не хватает всех модных опций.
SF.
{ echo command; cat;}будет делать то же самое, и, возможно, будет легче понять.
G-Man говорит: «Восстановите Монику»
1
Как я вижу, netcatкоманда будет держать сокет открытым, пока не увидит конец ввода. Все эти примеры демонстрируют это, фактически не говоря о том, почему . Я взаимодействие с сервером , используя в течение длительного периода только с использованием: . SocketTest - это удобный инструмент, который может прослушивать или обслуживать любой порт TCP или UDP. SocketTest netcatcat - | nc localhost 8063
будет
14

С помощью ncUbuntu:

nc -q -1 host port

Со страницы руководства 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 (другой сокат привязав сокет unix к stdin / out) он закрыл сеанс TCP socat.

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

Я думаю, что вам, вероятно, придется написать какое-то специальное прокси-программное обеспечение для этого, которое открывает TCP-соединение с удаленным концом, а затем локально прослушивает сокет / pipe / fifo или что-то еще, а затем просто отправляет данные по существующему TCP-каналу. и возвращает результаты.

Majenko
источник
Послушайте всемогущего Мэтта Дженкинса: 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> 
    
Campa
источник
1

Метод Жоржа хорошо работает в интерактивной оболочке, но он не поможет со сценариями, когда вы, например, вызываете свой сценарий как nohup ./script &.

Я нашел замену stdin на фиктивные подсказки fifo.

 mkfifo dummy
 cat command.txt dummy | nc host port

Поскольку ничего не записывает в fifo, после вывода файла, 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 по-прежнему отправляет оставшуюся часть своей входной очереди).

алло
источник