32
echo command | netcat host port

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

8 ответов8

31

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

cat file - | nc host port

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

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

cat <(echo command) - | nc host port
15

С помощью nc на Ubuntu:

nc -q -1 host port

Со страницы руководства Ubuntu nc:

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

Обратите внимание, что доступные параметры nc сильно различаются в разных дистрибутивах, поэтому это может не сработать на вашем (OpenSUSE).

11

Я нашел это:

echo command | netcat host port -

Мой коллега знал это. Я не вижу этого в документации вообще.

3

Я не думаю, что вы справитесь с этим с помощью Netcat или Socat. Я только что проделал обширную работу с обоими, и Socat выглядел наиболее перспективным.

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

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

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

1

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

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

 mkfifo dummy
 cat command.txt dummy | nc host port

Поскольку ничего не пишет в fifo, после вывода файла cat висит на нем бесконечно.

1

Может ли быть так, что соединение закрыто на другом конце сокета?

По умолчанию 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> 
    
0

socat ' 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 по-прежнему отправляет оставшуюся часть своей входной очереди).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .