Bir bağlantı noktası bir ileti aldığında yürütülecek bir komut dosyası nasıl ayarlanır


12

Belirli bir bağlantı noktasında dinlemek için bir kabuk komut dosyası almak nasıl merak ediyorum (belki netcat kullanarak?). Umarım bu bağlantı noktasına bir mesaj gönderildiğinde, komut dosyası mesajı kaydeder ve sonra bir işlevi çalıştırır.

Misal:

  1. Bilgisayar 1 arka planda çalışan bir komut dosyasına sahip, komut dosyası 1234 numaralı bağlantı noktasını gelen trafiğe açtı

  2. Bilgisayar 2 bilgisayarın 1234 limanına "merhaba dünya" mesajı gönderir 1

  3. Bilgisayar 1'deki komut dosyası, "merhaba dünya" iletisini bir değişkene kaydeder $ MESSAGE

  4. Komut dosyası şimdi $ MESSAGE değişkeni ayarlanmış olarak çalışıyor

Bunu nasıl bağışlayacağım?

Yanıtlar:


12

İle mümkün olmalıdır socat.

Stdin yoluyla bir mesaj almak için böyle bir komut dosyası "getmsg.sh" yazın:

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

Ardından socat, 7777 numaralı bağlantı noktasındaki her bir tcp bağlantısı için komut dosyamızı çağırmak üzere bu komutu çalıştırın :

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

Başka bir kabuktan test mesajı gönderin:

echo "message 1" | netcat localhost 7777

Test ettin mi?


1
Çözümünüzden ilham aldım ve netcat ile çalışan bir yol buldum: nc -l 7777 | ./getmsg.sh
Daniel

Bunu duyduğuma sevindim. Ancak netcatbir bağlantıdan sonra var olur. socatkomut satırımdan ", fork" öğesini kaldırırsanız da aynısını yaparsınız.
rudimeier

7

UCSPI-TCP yolu

Netcat dışında araç setleri vardır. Bunlardan birkaçının nasıl kullanılacağı aşağıda açıklanmıştır. Hepsi , ne olursa olsun, servicesizin çalıştıran bir komut dosyasının varlığını varsayar func:

#! / Bin / sh
okunurken -r MESAJ
yapmak
    echo 1> & 2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}" rx "$ {MESSAGE}"
    fonk
tamam

TCPREMOTEIPVe TCPREMOTEPORTortam değişkenleri UCSPI-TCP protokolü tarafından tanımlanır.

Komut dosyası, çeşitli araç setleri kullanılarak her TCP bağlantısı için ayrı bir işlem olarak oluşturulur. Aşağıda, araçlar kısa bir komut dosyasında kullanıldığı şekilde gösterilmektedir. Geleneksel olarak adlandırılan böyle bir senaryo, runbunları bir daemontools-aile hizmet yöneticisi altında nasıl çalıştıracağıdır. Tabii ki doğrudan çağrılabilirler.

Bernstein ucspi-tcp

Daniel J. Bernstein'ın ucspi-tcp tcpserverile servicesenaryoyu doğurur :

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

Bernstein ucspi-tcp'nin IPv6 özellikli geliştirilmiş sürümleri vardır. Erwin Hoffman ile tcpserverIPv4 ve IPv6'yı bir arada ele almaya çalışır (işletim sistemi bunu destekliyorsa, birkaç tanesi desteklemez) ve servicekomut dosyasını ortaya çıkarır :

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

Bercot s6-networking, s6 ve yürütme

Laurent Bercot en s6-ağ ile, s6-tcpserver4ve s6-tcpserver6ayrı ayrı IPv4 ve IPv6 işlemek ve yumurtlamaya servicesenaryoyu:

#! / Komut / execlineb
s6-tcpserver4 -v 0.0.0.0 7777 
./hizmet
#! / Komut / execlineb
s6-tcpserver6 -v :: 0 7777 
./hizmet

Daha önce zincir gibi s6-tcpserver-accessve s6-applyuidgidzincirdeki araçları arayarak daha karmaşık sunucular oluşturabilir ./service.

nosh UCSPI araçları

Nosh araç seti tcp-socket-listenile, TCP soketini dinler, işletim sistemi bunu destekliyorsa IPv4 ve IPv6'yı tekrar simüle eder tcp-socket-acceptve servicekomut dosyasını ortaya koyan zincirler :

#! / Bin / nosh
tcp-soket-dinle - kombine4ve6 :: 7777
tcp-socket-accept --verbose --localname 0
./hizmet

Veya biri OpenBSD gibi işletim sistemlerinde iki ayrı işlem gerçekleştirir:

#! / Bin / nosh
tcp-soket-dinleme 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
./hizmet
#! / Bin / nosh
tcp-soket-dinle :: 7777
tcp-socket-accept --verbose --localname ::
./hizmet

Bir gibi araçlar konulması yoluyla daha karmaşık sunucularını oluşturabilir ucspi-socket-rules-checkve setuidgidzincirde.

#! / Bin / nosh
tcp-soket-dinle - kombine4ve6 :: 7777
setuidgid ayrıcalıklı kullanıcı
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
./hizmet

Pape ipsvd

Gerrit Pape ipsvd tcpsvdile servicesenaryoyu ortaya çıkarır :

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

UCSPI-UDP

serviceStandart komut bir akış soketi olduğunda ortak komut dosyası işleyebilir . Ancak TCP'yi açıkça belirtmediniz.

Yukarıda belirtilen araç setlerinden bazıları, TCP sunucuları oluşturmak için onları nasıl kullanabileceğine benzer şekilde UDP sunucuları oluşturmak için kullanılabilse udp-socket-listende, kabuk yerleşikleri olmadığı için kabuk komut dosyası ile gerçek hizmet programını oluşturmak zor standart giriş bir datagram soketi olduğunda mutlaka iyi başa çıkabilir .

daha fazla okuma


0

Bu, udpsvdUbuntu / Debian'da ( manpage'e bakınız ) ve ayrıca meşgul kutusuna yerleşik olarak da yapılabilir. Misal:

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

Yürütmek catiçin kabuk betiğinizle değiştirin , stdin pakettir.

İle netcat, dinlemeye devam etmek için bir döngüde çalışabilir ve her paketi aşağıdakilere aktarabilirsiniz myscript:

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

Alınan tüm paketleri komut dosyanızın tek bir çağrısına akış olarak aktarmak istiyorsanız:

# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.