Як встановити сценарій для виконання, коли порт отримує повідомлення


12

Мені цікаво, як отримати скрипт оболонки для прослуховування на певному порті (можливо, за допомогою netcat?). Будемо сподіватися, що коли повідомлення буде надіслане на цей порт, сценарій записує повідомлення, а потім виконує функцію.

Приклад:

  1. Комп'ютер 1 має сценарій, що працює у фоновому режимі, сценарій відкрив порт 1234 для вхідного трафіку

  2. Комп'ютер 2 надсилає повідомлення "привіт світ" на порт 1234 комп'ютера 1

  3. Сценарій на комп’ютері 1 записує повідомлення "привіт світ" на змінну $ ПОВІДОМЛЕННЯ

  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

1
Я надихнувся Вашим рішенням і знайшов спосіб, який працює з netcat: nc -l 7777 | ./getmsg.sh
Даніель

Радий це чути. Але netcatіснує після одного з'єднання. socatзробить те саме, якщо ви видалите "fork" з мого командного рядка.
rudimeier

7

Шлях UCSPI-TCP

Є набори інструментів, крім netcat. Ось як використовувати декілька з них. Всі вони припускають існування serviceсценарію, який виконує ваш func, незалежно від того, що це може бути:

#! / бін / ш
під час читання -r ПОВІДОМЛЕННЯ
робити
    echo 1> & 2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}" rx "$ {ПОВІДОМЛЕННЯ}"
    функц
зроблено

В TCPREMOTEIPі TCPREMOTEPORTзмінні середовища визначаються протоколом UCSPI-TCP.

Сценарій породжується як індивідуальний процес за з'єднанням TCP, використовуючи різні набори інструментів. Далі інструменти відображаються як використані в короткому сценарії. Такий сценарій, умовно названий run, - це те, як можна було б запустити їх під керівником служби сімейних служб daemontools. На них, звичайно, можна звернутися безпосередньо.

Бернштейн ucspi-tcp

За допомогою ucspi-tcp Даніеля Дж. Бернштейна tcpserverпороджує serviceсценарій:

#! / бін / ш -е
exec tcpserver -v -P -R -H -l 0 0.0.0.0 7777 ./service

Існують покращені версії Bernstein ucspi-tcp з підтримкою IPv6. Завдяки Ервіну Гофману, tcpserverспроби обробляти і IPv4, і IPv6 в одному (якщо операційна система підтримує це, декілька - ні) і породжує serviceсценарій:

#! / бін / ш -е
exec tcpserver -v -P -R -H -l 0 :: 0 7777 ./service

Bercot s6-networking, s6 та execline

З s6-мережі Laurent Bercot, в 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.

інструменти UCSPI

За допомогою інструмента "nosh" tcp-socket-listenслухає сокет TCP, знову обробляючи IPv4 та IPv6 одночасно, якщо операційна система підтримує це, і ланцюги, до tcp-socket-acceptяких у свою чергу породжує serviceсценарій:

#! / бін / ніш
tcp-socket-listen --combine4and6 :: 7777
tcp-socket-accept --verbose --localname 0
./сервіс

Або один запускає два окремих процеси в операційних системах, таких як OpenBSD:

#! / бін / ніш
tcp-socket-прослуховування 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
./сервіс
#! / бін / ніш
tcp-socket-liste: 7777
tcp-socket-accept --verbose --localname ::
./сервіс

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

#! / бін / ніш
tcp-socket-listen --combine4and6 :: 7777
setuidgid непривілейований користувач
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
./сервіс

Pape ipsvd

За допомогою ipsvd Герріта Папа tcpsvdпороджує serviceсценарій:

#! / бін / ш -е
exec tcpsvd -v 0.0.0.0 7777 ./service

UCSPI-UDP

Загальний serviceскрипт може працювати, коли стандартним входом є гніздо потоку . Але ви не вказали прямо TCP.

Хоча деякі з вищезгаданих наборів інструментів можна використовувати для створення серверів UDP аналогічно тому, як можна використовувати їх для побудови серверів TCP (див. udp-socket-listenУ носі), складно створити фактичну службову програму із скриптом оболонки, оскільки вбудовані оболонки не мають обов'язково добре справляється, коли стандартним входом є розетка дейтаграми .

Подальше читання

  • Протокол:
  • набори інструментів:
    • Даніель Дж. Бернштейн. ucspi-tcp . cr.yp.to.
    • s6-мережа . Лоран Беркот. skarnet.org.
    • s6 . Лоран Беркот. skarnet.org.
    • Джонатан де Бойне Поллард (2016). ніш . Програмне забезпечення.
    • ipsvd . Герріт Папе. smarden.org.
  • довідкові посібники:
    • Даніель Дж. Бернштейн. Програма . ucspi-tcp.tcpserver
    • Ервін Гофман. tcpserver. ucspi-tcp6 . fehcom.de.
    • s6-tcpserver4. Лоран Беркот. s6-мережа . skarnet.org.
    • s6-tcpserver6. Лоран Беркот. s6-мережа . skarnet.org.
    • s6-tcpserver-access. Лоран Беркот. s6-мережа . skarnet.org.
    • s6-applyuidgid. Лоран Беркот. s6 . skarnet.org.
    • Джонатан де Бойне Поллард (2016). tcpserver. ніс путівник . Програмне забезпечення.
    • Джонатан де Бойне Поллард (2016). tcp-socket-listen. ніс путівник . Програмне забезпечення.
    • Джонатан де Бойне Поллард (2016). tcp-socket-accept. ніс путівник . Програмне забезпечення.
    • Джонатан де Бойне Поллард (2016). ucspi-socket-rules-check. ніс путівник . Програмне забезпечення.
    • Джонатан де Бойне Поллард (2016). setuidgid. ніс путівник . Програмне забезпечення.
    • Джонатан де Бойне Поллард (2016). udp-socket-listen. ніс путівник . Програмне забезпечення.
    • tcpsvd. ipsvd . Герріт Папе. smarden.org.

0

Це також можна зробити за допомогою програми, udpsvdяка доступна на Ubuntu / Debian ( див. Сторінку ), а також у вбудованому в busbox. Приклад:

# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.