Как настроить скрипт для выполнения, когда порт получает сообщение

12

Мне интересно, как получить сценарий оболочки для прослушивания на определенном порту (может быть, с помощью netcat?). Надеюсь, что когда сообщение отправляется на этот порт, сценарий записывает сообщение, а затем запускает функцию.

Пример:

  1. Компьютер 1 имеет скрипт, работающий в фоновом режиме, скрипт открывает порт 1234 для входящего трафика

  2. Компьютер 2 отправляет сообщение «Hello World» на порт 1234 компьютера 1

  3. Скрипт на компьютере 1 записывает сообщение «hello world» в переменную $ MESSAGE

  4. Скрипт запускает функцию теперь, когда установлена ​​переменная $ MESSAGE

Как мне пожертвовать этим?

Даниил
источник

Ответы:

12

Должно быть возможно с socat.

Напишите такой скрипт "getmsg.sh" для получения одного сообщения через stdin:

#!/bin/bash
read MESSAGE
echo "PID: $$"
echo "$MESSAGE"

Затем выполните эту socatкоманду, чтобы вызвать наш сценарий для каждого соединения TCP по порту 7777:

socat -u tcp-l:7777,fork system:./getmsg.sh

Отправить тестовое сообщение из другой оболочки:

echo "message 1" | netcat localhost 7777
rudimeier
источник
Вы проверяли это?
Переписан и протестирован сейчас;)
rudimeier
1
Я был вдохновлен вашим решением и нашел способ, который работает с netcat: nc -l 7777 | ./getmsg.sh
Даниэль
Рад это слышать. Но netcatсуществует после одного соединения. socatсделал бы то же самое, если вы удалите «, fork» из моей командной строки.
rudimeier
7

Путь UCSPI-TCP

Есть наборы инструментов, отличные от netcat. Вот как использовать некоторые из них. Все они предполагают существование serviceскрипта, который запускает ваш func, что бы это ни было:

#! / Bin / ш
пока читаешь -r СООБЩЕНИЕ
делать
    echo 1> & 2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}" rx "$ {MESSAGE}"
    FUNC
сделанный

В TCPREMOTEIPи TCPREMOTEPORTпеременные среды определяются протоколом UCSPI-TCP.

Сценарий создается как отдельный процесс для каждого соединения TCP с использованием различных наборов инструментов. В дальнейшем инструменты будут показаны как используемые в коротком скрипте. Такой сценарий, условно названный run, - это то, как его можно запустить под менеджером службы семейства daemontools. Они, конечно, могут быть вызваны напрямую.

Бернштейн UCSPI-TCP

С UCSPI-ТКФ Daniel J. Бернштейна, tcpserverпорождает serviceсценарий:

#! / bin / sh -e
exec tcpserver -v -P -R -H -l 0 0.0.0.0 7777 ./service

Существуют расширенные версии Bernstein ucspi-tcp с поддержкой IPv6. В случае с Эрвином Хоффманом tcpserverпопытки обрабатывать как IPv4, так и IPv6 в одном (если операционная система поддерживает это, некоторые не поддерживают) и порождают serviceсценарий:

#! / bin / sh -e
exec tcpserver -v -P -R -H -l 0 :: 0 7777 ./service

Bercot s6-network, s6 и execline

С s6-сетью Лорана Беркота, s6-tcpserver4и s6-tcpserver6обрабатывать IPv4 и IPv6 отдельно, и порождать serviceсценарий:

#! / Команда / execlineb
s6-tcpserver4 -v 0.0.0.0 7777 
./оказание услуг
#! / Команда / execlineb
s6-tcpserver6 -v :: 0 7777 
./оказание услуг

Можно создавать более сложные серверы, вставляя инструменты, такие как s6-tcpserver-accessи s6-applyuidgidв цепочку, непосредственно перед этим ./service.

Nosh UCSPI инструменты

С помощью набора инструментов nosh tcp-socket-listenпрослушивает сокет TCP, снова обрабатывая IPv4 и IPv6 одновременно, если операционная система поддерживает это, и цепочки, в tcp-socket-acceptкоторые в свою очередь порождает serviceсценарий:

#! / Bin / перекус
tcp-socket-listen --combine4and6 :: 7777
tcp-socket-accept --verbose --localname 0
./оказание услуг

Или один запускает два отдельных процесса в операционных системах, таких как OpenBSD:

#! / Bin / перекус
tcp-socket-listen 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
./оказание услуг
#! / Bin / перекус
tcp-socket-listen :: 7777
tcp-socket-accept --verbose --localname ::
./оказание услуг

Можно создавать более сложные серверы, вставляя такие инструменты, как ucspi-socket-rules-checkи setuidgidв цепочку.

#! / Bin / перекус
tcp-socket-listen --combine4and6 :: 7777
setuidgid непривилегированный пользователь
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
./оказание услуг

Папе Ипсвд

С ipsvd Геррита Папа tcpsvdпорождает serviceсценарий:

#! / bin / sh -e
exec tcpsvd -v 0.0.0.0 7777 ./service

UCSPI-UDP

Общий serviceсценарий может обрабатывать, когда стандартный ввод является потоковым сокетом. Но вы не указали TCP явно.

Хотя некоторые из вышеупомянутых наборов инструментов можно использовать для создания серверов UDP аналогично тому, как их можно использовать для создания серверов TCP (см. udp-socket-listenNosh), сложно создать реальную служебную программу с помощью сценария оболочки, поскольку встроенные функции оболочки не Обязательно хорошо справляются, когда стандартный ввод является сокетом дейтаграммы .

дальнейшее чтение

JdeBP
источник
0

Это также можно сделать с помощью, udpsvdкоторый доступен в Ubuntu / Debian ( см. Man-страницу), а также встроен в busybox. Пример:

# simple UDP "echo" on port 9998
udpsvd 0.0.0.0 9998 cat

Замените catна ваш скрипт для запуска, stdin - это пакет.

С помощью netcatвы можете запустить цикл, чтобы продолжить прослушивание, и передать каждый пакет myscript:

 while true; do nc -ul 9998 | myscript.sh; done

Если вы хотите передать все полученные пакеты в виде потока на один вызов вашего скрипта:

# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh
thom_nic
источник