Как я могу передать команды netcat, который останется живым?
32
echo command | netcat host port
В результате команда отправляется на удаленный хост, а некоторые данные читаются обратно. Но через несколько секунд соединение закрывается. Параметр -w ничего не изменил. Я использую Netcat v1.10 на SuSE 10.1.
Это приятно, так как работает на очень простой встроенной системе, где netcat не хватает всех модных опций.
SF.
{ echo command; cat;}будет делать то же самое, и, возможно, будет легче понять.
G-Man говорит: «Восстановите Монику»
1
Как я вижу, netcatкоманда будет держать сокет открытым, пока не увидит конец ввода. Все эти примеры демонстрируют это, фактически не говоря о том, почему . Я взаимодействие с сервером , используя в течение длительного периода только с использованием: . SocketTest - это удобный инструмент, который может прослушивать или обслуживать любой порт TCP или UDP. SocketTestnetcatcat - | nc localhost 8063
Я не думаю, что вы справитесь с этим с помощью 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
Метод Жоржа хорошо работает в интерактивной оболочке, но он не поможет со сценариями, когда вы, например, вызываете свой сценарий как nohup ./script &.
Я нашел замену stdin на фиктивные подсказки fifo.
mkfifo dummy
cat command.txt dummy | nc host port
Поскольку ничего не записывает в fifo, после вывода файла, catвисит на нем бесконечно.
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.
Ваша команда завершается, если либо удаленный хост закрывает соединение (или недоступен), либо команда до завершения канала (в то время как netcat по-прежнему отправляет оставшуюся часть своей входной очереди).
Ответы:
Это работает с
nc
командой в OS X (при условии, что команда, которую вы хотите отправить, находится в файле):(По сути,
cat
выдает содержимое файла на стандартный вывод и затем ждет вас на стандартном вводе).Если вы хотите отправить команду из самой оболочки, вы можете сделать это:
источник
{ echo command; cat;}
будет делать то же самое, и, возможно, будет легче понять.netcat
команда будет держать сокет открытым, пока не увидит конец ввода. Все эти примеры демонстрируют это, фактически не говоря о том, почему . Я взаимодействие с сервером , используя в течение длительного периода только с использованием: . SocketTest - это удобный инструмент, который может прослушивать или обслуживать любой порт TCP или UDP.SocketTest
netcat
cat - | nc localhost 8063
С помощью
nc
Ubuntu:Со страницы руководства Ubuntu
nc
:Обратите внимание, что доступные
nc
параметры сильно различаются в разных дистрибутивах, поэтому они могут не работать в вашем (OpenSUSE).источник
Я нашел это:
Мой коллега знал это. Я не вижу этого в документации вообще.
источник
Я не думаю, что вы справитесь с этим с помощью netcat или socat. Я только что проделал обширную работу с обоими, и Socat выглядел наиболее перспективным.
Мне удалось настроить socat для подключения к удаленному TCP-порту и прослушивания сокета локального домена unix (теоретически, чтобы связь могла постоянно поддерживаться), но как только локальный процесс отсоединился от сокета unix (другой сокат привязав сокет unix к stdin / out) он закрыл сеанс TCP socat.
Проблема здесь заключается в том, что каждое соединение через netcat / socat устанавливает новое соединение TCP-потока с сервером и закрывает сеанс TCP-потока, когда локальный конец отключается.
Я думаю, что вам, вероятно, придется написать какое-то специальное прокси-программное обеспечение для этого, которое открывает TCP-соединение с удаленным концом, а затем локально прослушивает сокет / pipe / fifo или что-то еще, а затем просто отправляет данные по существующему TCP-каналу. и возвращает результаты.
источник
Может ли быть так, что соединение закрыто на другом конце сокета?
По умолчанию
nc
закрывает соединение после завершения, если вы явно не говорите ему, чтобы он продолжал слушать (с-k
опцией):См
man nc.1
.Я успешно передаю данные между двумя машинами, как это:
отправитель:
приемник:
источник
Метод Жоржа хорошо работает в интерактивной оболочке, но он не поможет со сценариями, когда вы, например, вызываете свой сценарий как
nohup ./script &
.Я нашел замену stdin на фиктивные подсказки fifo.
Поскольку ничего не записывает в fifo, после вывода файла,
cat
висит на нем бесконечно.источник
socat
«Sshut-none
вариант должен помочь здесь:Возможно, вам также придется переопределить период ожидания по умолчанию, используя
-t <timeout>
, иначе сокет будет закрыт через 0,5 с. Эта опция переопределяет поведение по умолчанию, а именно:Итак, такая команда как:
будет держать сокет открытым в течение 10 секунд после отправки «бла».
источник
Ваша команда завершается, если либо удаленный хост закрывает соединение (или недоступен), либо команда до завершения канала (в то время как netcat по-прежнему отправляет оставшуюся часть своей входной очереди).
источник