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
{ echo command; cat;}
будет делать то же самое, и, возможно, будет легче понять.
netcat
команда будет держать сокет открытым, пока не увидит конец ввода. Все эти примеры демонстрируют это, фактически не говоря о том, почему . Я взаимодействие с сервером , используя в течение длительного периода только с использованием: . SocketTest - это удобный инструмент, который может прослушивать или обслуживать любой порт TCP или UDP. SocketTest
netcat
cat - | nc localhost 8063
С помощью nc
Ubuntu:
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).
Я не думаю, что вы справитесь с этим с помощью netcat или socat. Я только что проделал обширную работу с обоими, и Socat выглядел наиболее перспективным.
Мне удалось настроить socat для подключения к удаленному TCP-порту и прослушивания сокета локального домена unix (теоретически, чтобы связь могла постоянно поддерживаться), но как только локальный процесс отсоединился от сокета unix (другой сокат привязав сокет unix к stdin / out) он закрыл сеанс TCP socat.
Проблема здесь заключается в том, что каждое соединение через netcat / socat устанавливает новое соединение TCP-потока с сервером и закрывает сеанс TCP-потока, когда локальный конец отключается.
Я думаю, что вам, вероятно, придется написать какое-то специальное прокси-программное обеспечение для этого, которое открывает TCP-соединение с удаленным концом, а затем локально прослушивает сокет / pipe / fifo или что-то еще, а затем просто отправляет данные по существующему TCP-каналу. и возвращает результаты.
Может ли быть так, что соединение закрыто на другом конце сокета?
По умолчанию 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>
Метод Жоржа хорошо работает в интерактивной оболочке, но он не поможет со сценариями, когда вы, например, вызываете свой сценарий как nohup ./script &
.
Я нашел замену stdin на фиктивные подсказки fifo.
mkfifo dummy
cat command.txt dummy | nc host port
Поскольку ничего не записывает в fifo, после вывода файла, cat
висит на нем бесконечно.
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 секунд после отправки «бла».