echo command | netcat host port
В результате команда отправляется на удаленный хост, а некоторые данные считываются. Но через несколько секунд соединение закрывается. Параметр -w ничего не изменил. Я использую Netcat v1.10 на SuSE 10.1.
echo command | netcat host port
В результате команда отправляется на удаленный хост, а некоторые данные считываются. Но через несколько секунд соединение закрывается. Параметр -w ничего не изменил. Я использую Netcat v1.10 на SuSE 10.1.
Это работает с командой nc
в OS X (при условии, что команда, которую вы хотите отправить, находится в файле):
cat file - | nc host port
(По сути, cat
выводит содержимое файла на стандартный вывод и затем ждет вас на стандартном вводе).
Если вы хотите отправить команду из самой оболочки, вы можете сделать это:
cat <(echo command) - | nc host port
С помощью 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).
Я нашел это:
echo command | netcat host port -
Мой коллега знал это. Я не вижу этого в документации вообще.
Я не думаю, что вы справитесь с этим с помощью Netcat или Socat. Я только что проделал обширную работу с обоими, и Socat выглядел наиболее перспективным.
Мне удалось настроить socat на подключение к удаленному TCP-порту и прослушивание сокета локального домена Unix (теоретически, чтобы связь могла постоянно поддерживаться), но как только локальный процесс отсоединился от сокета Unix (другой сокат привязав сокет unix к stdin/out) он закрыл сеанс TCP socat.
Проблема здесь заключается в том, что каждое соединение через netcat / socat устанавливает новое соединение TCP-потока с сервером и закрывает сеанс TCP-потока, когда локальный конец отключается.
Я думаю, что вам, вероятно, придется написать какое-то специальное прокси-программное обеспечение для этого, которое открывает TCP-соединение с удаленным концом, а затем локально прослушивает сокет / pipe / fifo или что-то еще, а затем просто отправляет данные по существующему TCP-каналу. и возвращает результаты.
Метод Жоржа хорошо работает в интерактивной оболочке, но он не поможет со скриптами, когда вы, например, называете свой скрипт как nohup ./script &
.
Я нашел замену stdin на фиктивные подсказки fifo.
mkfifo dummy
cat command.txt dummy | nc host port
Поскольку ничего не пишет в fifo, после вывода файла cat
висит на нем бесконечно.
Может ли быть так, что соединение закрыто на другом конце сокета?
По умолчанию 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>
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 секунд после отправки «бла».
Ваша команда завершается, если либо удаленный хост закрывает соединение (или недоступен), либо команда до завершения канала (в то время как netcat по-прежнему отправляет оставшуюся часть своей входной очереди).