Стандартный инструмент командной строки Unix для подключения к сокету
У меня есть некоторые приложения и стандартные инструменты Unix, отправляющие свой вывод в named-pipe в Solaris, однако именованные каналы могут быть прочитаны только из локального хранилища (в Solaris), поэтому я не могу получить к ним доступ из сети или поместите трубы в хранилище NFS для сетевого доступа к их выходу.
Что заставило меня задаться вопросом, был ли аналогичный способ перенаправления вывода инструментов командной строки непосредственно в сокеты, скажем что-то вроде:
mksocket mysocket:12345
vmstat 1 > mysocket 2>&1
Ответы
Ответ 1
Netcat отлично подходит для этого. Здесь страница с некоторыми распространенными примерами.
Использование для вашего случая может выглядеть примерно так:
-
Сервер прослушивает соединение, затем отправляет на него вывод:
server$ my_script | nc -l 7777
-
Удаленный клиент подключается к server
на порту 7777, получает данные, сохраняет файл журнала:
client$ nc server 7777 >> /var/log/archive
Ответ 2
netcat
(также известный как nc
) именно то, что вы ищете. Это становится достаточно стандартным, но недоступным для всех систем.
socat
, похоже, является обновленной версией netcat с большим количеством функций, но менее распространенным.
В Linux вы также можете использовать /dev/tcp/<host>/<port>
. Дополнительную информацию см. В Advanced Bash -Scripting Guide.
Ответ 3
netcat поможет установить канал по сети.
Ответ 4
Возможно, вы захотите использовать один из:
- ssh: безопасный (зашифрованный), уже установленный из коробки на Solaris, но вам нужно настроить пару ключей для неинтерактивных сеансов
- netcat: простой в настройке - но небезопасный и открытый для атак
Ответ 5
Каждый находится на правильном пути с 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