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
скидає вміст файлу на stdout, а потім чекає на stdin).
Якщо ви хочете відправити команду з самої оболонки, ви можете зробити це:
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
На сторінці man 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 (інший socat пов'язуючи unix-сокет до stdin / out), він закрив сеанс socat TCP.
Проблема тут полягає в тому, що кожне з'єднання через netcat / socat здійснює нове з'єднання потоку TCP з сервером, і воно закриває сеанс потоку TCP, коли локальний кінець відключається.
Я думаю, що вам, мабуть, доведеться написати певне програмне забезпечення для цього проксі, яке відкриє TCP-з'єднання на віддалений кінець, а потім прослуховує локально на сокет / трубу / фіфо або що завгодно, а потім просто надсилає дані вниз по існуючій 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 на фіктивну фіфо допомагає.
mkfifo dummy
cat command.txt dummy | nc host port
Оскільки ніколи нічого не пише на фіфо, після виведення файлу 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 секунд після відправлення "бла".