Come impostare uno script da eseguire quando una porta riceve un messaggio


12

Mi chiedo come ottenere uno script di shell da ascoltare su una determinata porta (magari usando netcat?). Si spera che quando un messaggio viene inviato a quella porta, lo script registri il messaggio e quindi esegua una funzione.

Esempio:

  1. Il computer 1 ha lo script in esecuzione in background, lo script ha aperto la porta 1234 al traffico in entrata

  2. Il computer 2 invia il messaggio "ciao mondo" alla porta 1234 del computer 1

  3. Script on Computer 1 registra il messaggio "ciao mondo" in una variabile $ MESSAGE

  4. Lo script funziona ora che è stata impostata la variabile $ MESSAGE

Come posso fare per donare questo?

Risposte:


12

Dovrebbe essere possibile con socat.

Scrivi un tale script "getmsg.sh" per ricevere un messaggio tramite stdin:

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

Quindi eseguire questo socatcomando per richiamare il nostro script per ogni connessione tcp sulla porta 7777:

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

Invia un messaggio di prova da un'altra shell:

echo "message 1" | netcat localhost 7777

L'hai provato?

Riscritto e testato ora;)
rudimeier,

1
Sono stato ispirato dalla tua soluzione e ho trovato un modo che funziona con netcat: nc -l 7777 | ./getmsg.sh
Daniel,

Felice di sentirlo. Ma netcatesiste dopo una connessione. socatfarebbe lo stesso se rimuovessi ", fork" dalla mia riga di comando.
rudimeier,

7

Il modo UCSPI-TCP

Esistono set di strumenti diversi da netcat. Ecco come usarne alcuni. Presumono tutti l'esistenza di uno servicescript che esegue il tuo func, qualunque esso sia:

#! / Bin / sh
durante la lettura -r MESSAGGIO
fare
    echo 1> & 2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}" rx "$ {MESSAGE}"
    func
fatto

Le variabili di ambiente TCPREMOTEIPe TCPREMOTEPORTsono definite dal protocollo UCSPI-TCP.

Lo script viene generato come processo individuale per connessione TCP utilizzando i vari set di strumenti. Di seguito, gli strumenti sono mostrati come utilizzati all'interno di un breve script. Una tale sceneggiatura, convenzionalmente chiamata run, è come li gestiresti sotto un gestore di servizi della famiglia demoniols. Naturalmente possono essere invocati direttamente.

Bernstein ucspi-tcp

Con ucspi-tcp di Daniel J. Bernstein, tcpservergenera la servicesceneggiatura:

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

Esistono versioni migliorate IPv6 di Bernstein ucspi-tcp. Con Erwin Hoffman, tcpservertenta di gestire sia IPv4 che IPv6 in uno (se il sistema operativo lo supporta, alcuni non lo fanno) e genera lo servicescript:

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

Bercot s6-networking, s6 ed execline

Con S6-networking di Laurent Bercot, s6-tcpserver4e s6-tcpserver6gestire IPv4 e IPv6 a parte, e deporre le uova la servicesceneggiatura:

#! / Comando / execlineb
s6-tcpserver4 -v 0.0.0.0 7777 
./servizio
#! / Comando / execlineb
s6-tcpserver6 -v :: 0 7777 
./servizio

Si possono costruire server più complessi interponendo strumenti come s6-tcpserver-accesse s6-applyuidgidnella catena immediatamente prima ./service.

nosh UCSPI tools

Con il set di strumenti nosh, tcp-socket-listenascolta sul socket TCP, gestendo di nuovo contemporaneamente IPv4 e IPv6 se il sistema operativo lo supporta e catene a tcp-socket-acceptcui a sua volta genera lo servicescript:

#! / Bin / nosh
tcp-socket-hear --combine4and6 :: 7777
tcp-socket-accept --verbose --localname 0
./servizio

Oppure si eseguono due processi separati, su sistemi operativi come OpenBSD:

#! / Bin / nosh
tcp-socket-Listen 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
./servizio
#! / Bin / nosh
tcp-socket-hear :: 7777
tcp-socket-accept --verbose --localname ::
./servizio

Si possono costruire server più complessi interponendo strumenti come ucspi-socket-rules-checke setuidgidnella catena.

#! / Bin / nosh
tcp-socket-hear --combine4and6 :: 7777
setuidgid utente non privilegiato
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
./servizio

Pape ipsvd

Con l'iPvd di Gerrit Pape, tcpsvdgenera la servicesceneggiatura:

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

Ucspi-UDP

Lo servicescript comune può gestire quando l'input standard è un socket di flusso . Ma non hai specificato TCP esplicitamente.

Sebbene alcuni dei suddetti toolkit possano essere usati per costruire server UDP in modo simile a come si possono usare per costruire server TCP (cfr udp-socket-listenin nosh), è difficile costruire il programma di servizio effettivo con script di shell, poiché i builtin della shell non lo fanno necessariamente far fronte bene quando l'input standard è un socket di datagramma .

Ulteriori letture


0

Questo può anche essere fatto con il udpsvdquale è disponibile su Ubuntu / Debian ( vedi la manpage ) e integrato in busybox. Esempio:

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

Sostituisci catcon lo script della shell da eseguire, stdin è il pacchetto.

Con netcat, è possibile eseguire in loop per continuare ad ascoltare e passare ciascun pacchetto a myscript:

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

Se si desidera passare tutti i pacchetti ricevuti come stream a una singola chiamata del proprio script:

# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.