Cara mengatur skrip untuk dijalankan ketika port menerima pesan

12

Saya bertanya-tanya bagaimana cara mendapatkan skrip shell untuk mendengarkan pada port tertentu (mungkin menggunakan netcat?). Semoga saat pesan dikirim ke port itu, skrip merekam pesan dan kemudian menjalankan fungsinya.

Contoh:

  1. Komputer 1 memiliki skrip berjalan di latar belakang, skrip membuka port 1234 untuk lalu lintas masuk

  2. Komputer 2 mengirim pesan "hello world" ke port 1234 komputer 1

  3. Script on Computer 1 mencatat pesan "hello world" ke variabel $ MESSAGE

  4. Script menjalankan fungsi sekarang bahwa variabel $ MESSAGE telah ditetapkan

Bagaimana cara saya menyumbang ini?

Daniel
sumber

Jawaban:

12

Seharusnya dimungkinkan dengan socat.

Tulis skrip seperti "getmsg.sh" untuk menerima satu pesan melalui stdin:

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

Kemudian jalankan socatperintah ini untuk memanggil skrip kami untuk setiap koneksi tcp pada port 7777:

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

Kirim pesan percobaan dari shell lain:

echo "message 1" | netcat localhost 7777
rudimeier
sumber
Sudahkah Anda mengujinya?
Ditulis ulang dan diuji sekarang;)
rudimeier
1
Saya terinspirasi oleh solusi Anda dan menemukan cara yang bekerja dengan netcat: nc -l 7777 | ./getmsg.sh
Daniel
Senang mendengarnya. Tetapi netcatada setelah satu koneksi. socatakan melakukan hal yang sama jika Anda menghapus ", garpu" dari baris perintah saya.
rudimeier
7

Cara UCSPI-TCP

Ada toolets selain netcat. Berikut ini cara menggunakannya. Mereka semua menganggap keberadaan serviceskrip yang menjalankan Anda func, apa pun itu:

#! / bin / sh
saat membaca -r PESAN
melakukan
    echo 1> & 2 "$ {TCPREMOTEIP}" "$ $ TCPREMOTEPORT}" rx "$ {MESSAGE}"
    func
selesai

The TCPREMOTEIPdan TCPREMOTEPORTvariabel lingkungan didefinisikan oleh protokol ucspi-TCP.

Script ini muncul sebagai proses individu per koneksi TCP menggunakan berbagai toolet. Dalam apa yang berikut, alat ditampilkan seperti yang digunakan dalam skrip pendek. Skrip semacam itu, yang dinamai secara konvensional run, adalah cara seseorang menjalankannya di bawah manajer layanan keluarga-daemontools. Mereka tentu saja dapat dipanggil secara langsung.

Bernstein ucspi-tcp

Dengan ucspi-tcp Daniel J. Bernstein, tcpservermemunculkan serviceskrip:

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

Ada versi Bernstein yang ditingkatkan versi IPv6 ucspi-tcp. Dengan Erwin Hoffman, tcpserverupaya untuk menangani IPv4 dan IPv6 dalam satu (jika sistem operasi mendukung ini, beberapa tidak) dan memunculkan serviceskrip:

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

Bercot s6-networking, s6, dan execline

Dengan s6-networking Laurent Bercot, s6-tcpserver4dan s6-tcpserver6menangani IPv4 dan IPv6 secara terpisah, dan menelurkan serviceskrip:

#! / command / execlineb
s6-tcpserver4 -v 0.0.0.0 7777 
./layanan
#! / command / execlineb
s6-tcpserver6 -v :: 0 7777 
./layanan

Seseorang dapat membangun server yang lebih kompleks dengan menempatkan alat seperti s6-tcpserver-accessdan s6-applyuidgiddalam rantai segera sebelumnya ./service.

tidak ada alat UCSPI

Dengan nosh toolset, tcp-socket-listendengarkan pada soket TCP, lagi-lagi menangani IPv4 dan IPv6 secara bersamaan jika sistem operasi mendukung melakukannya, dan rantai tcp-socket-acceptyang pada gilirannya memunculkan serviceskrip:

#! / bin / nosh
tcp-socket-listen --combine4and6 :: 7777
tcp-socket-accept --verbose --localname 0
./layanan

Atau satu menjalankan dua proses terpisah, pada sistem operasi seperti OpenBSD:

#! / bin / nosh
tcp-socket-listen 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
./layanan
#! / bin / nosh
tcp-socket-listen :: 7777
tcp-socket-accept --verbose --localname ::
./layanan

Seseorang dapat membangun server yang lebih kompleks dengan menempatkan alat-alat seperti ucspi-socket-rules-checkdan setuidgiddalam rantai.

#! / bin / nosh
tcp-socket-listen --combine4and6 :: 7777
setuidgid unprivileged-user
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
./layanan

Pape ipsvd

Dengan ipsvd Gerrit Pape, tcpsvdmenumbuhkan para servicenaskah:

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

UCSPI-UDP

serviceSkrip umum dapat menangani ketika input standar adalah soket aliran . Tapi Anda tidak menentukan TCP secara eksplisit.

Meskipun beberapa toolkit yang disebutkan di atas dapat digunakan untuk membangun server UDP dengan cara yang mirip dengan bagaimana seseorang dapat menggunakannya untuk membangun server TCP (cf udp-socket-listenin nosh), sulit untuk membangun program layanan aktual dengan skrip shell, karena bawaan shell tidak tentu mengatasi dengan baik ketika input standar adalah soket datagram .

Bacaan lebih lanjut

JdeBP
sumber
0

Ini juga dapat dilakukan dengan udpsvdyang tersedia di Ubuntu / Debian ( lihat manual ) serta built-in ke busybox. Contoh:

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

Ganti catdengan skrip shell Anda untuk mengeksekusi, stdin adalah paket.

Dengan netcat, Anda dapat berjalan dalam satu lingkaran untuk terus mendengarkan, dan meneruskan setiap paket ke myscript:

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

Jika Anda ingin meneruskan semua paket yang diterima sebagai aliran ke satu permintaan naskah Anda:

# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh
thom_nic
sumber