Стандартный инструмент командной строки Unix для подключения к сокету - PullRequest
22 голосов
/ 23 февраля 2009

У меня есть некоторые приложения и стандартные инструменты Unix, отправляющие свои выходные данные в именованные каналы в Solaris, однако именованные каналы можно читать только из локального хранилища (в Solaris), поэтому я не могу получить к ним доступ из сети или поместите каналы в хранилище NFS для сетевого доступа к их выводу.

Что заставило меня задуматься, существует ли аналогичный способ перенаправления вывода инструментов командной строки непосредственно в сокеты, скажем что-то вроде:

mksocket mysocket:12345
vmstat 1 > mysocket 2>&1

Ответы [ 5 ]

24 голосов
/ 23 февраля 2009

Netcat отлично подходит для этого. Вот страница с некоторыми типичными примерами .

Использование в вашем случае может выглядеть примерно так:

  1. Сервер прослушивает соединение, а затем отправляет на него вывод:

    server$ my_script | nc -l 7777

  2. Удаленный клиент подключается к server через порт 7777, получает данные, сохраняет в файл журнала:

    client$ nc server 7777 >> /var/log/archive

15 голосов
/ 23 февраля 2009

netcat (также известный как nc) - именно то, что вы ищете. Он становится достаточно стандартным, но доступен не во всех системах.

socat представляется улучшенной версией netcat, с гораздо большим количеством функций, но менее доступным.

В Linux вы также можете использовать /dev/tcp/<host>/<port>. Для получения дополнительной информации см. Расширенное руководство по написанию сценариев .

6 голосов
/ 23 февраля 2009

netcat поможет установить канал по сети.

4 голосов
/ 23 февраля 2009

Вы можете использовать один из:

  1. ssh: безопасный (зашифрованный), уже установленный в Solaris "из коробки", но вам нужно настроить пару ключей для неинтерактивных сеансов
    • например. vmstat 2>&1 | ssh -i private.key oss@remote.node "cat >vmstat.out"
  2. netcat: прост в настройке, но небезопасен и открыт для атак
0 голосов
/ 19 октября 2017

Каждый на правильном пути с Netcat. Но я хочу добавить, что если вы подключаетесь к nc и ожидаете ответа, вам нужно будет использовать опцию -q <seconds>. Из руководства:

-q секунд

после EOF на stdin, подождите указанное количество секунд и затем выйдите. Если секунды отрицательны, подождите вечно.

Например, если вы хотите взаимодействовать с вашим агентом SSH, вы можете сделать что-то вроде этого:

echo -en '\x00\x00\x00\x01\x0b' | nc -q 1 -U $SSH_AUTH_SOCK | strings

Более полный пример на https://gist.github.com/RichardBronosky/514dbbcd20a9ed77661fc3db9d1f93e4

* Я украл это у https://ptspts.blogspot.com/2010/06/how-to-use-ssh-agent-programmatically.html

...