PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : djb's ucspi-tcp, es muss nicht immer (x)inetd sein



derRichard
28.09.03, 01:03
dj bernstein hat neben qmail und djbdns auch eine ganze reihe von "kleineren" programmen geschrieben, dazu gehört ucspi-tcp.
ucspi-tcp enhlät tcpserver und tcpclients.
ich werde hier aber nur den tcpserver beschreiben.
ucspi-tcp kann man ganz leicht installieren, einfach http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz downloaden und mit tar xvfz ucspi-tcp-0.88.tar.gz entpacken und dann mit make && make setup check kompilieren und installieren.

lange rede kurzer sinn, ich mach einfach mal ein beispiel:

als ersten legen wir das skript show_sysstat.sh an und schreiben das rein:


#!/bin/bash

echo "hallo, hier siehst du meine sysinfos..."
echo "------------uptime------------"
uptime
echo "-----------speicher------------"
df -h

dann starten wir den tcpserver:


tcpserver -v 192.168.0.2 5000 /home/richard/tcp/show_sysstat.sh

so, jetzt hört der tcpserver auf 192.168.0.2 und port 5000.
dann verbinden wir uns mal per telnet auf port 5000.



richard@raccoon richard $ telnet 192.168.0.2 5000
Trying 192.168.0.2...
Connected to 192.168.0.2.
Escape character is '^]'.
hallo, hier siehst du meine sysinfos...
------------uptime------------
01:15:43 up 13:39, 1 user, load average: 0.16, 0.22, 0.20
-----------speicher------------
Dateisystem Größe Benut Verf Ben% Eingehängt auf
/dev/hda2 19G 12G 6.6G 64% /
tmpfs 2.0M 28K 2.0M 2% /mnt/.init.d
/dev/hda4 56G 50G 3.1G 95% /mnt/big_data
/dev/hdb2 28G 24G 2.4G 92% /home
/dev/hdb1 9.6G 8.7G 946M 91% /mnt/win2k
tmpfs 251M 0 251M 0% /dev/shm
Connection closed by foreign host.

cool, oder? :D

also, sobald der tcpserver eine verbindung bekommt startet er das programm, das wir ihm als parameter gegeben haben.
wenn das programm fertig ist, dann trennt er die verbindung wieder.

der tcpserver kann aber noch mehr, er bietet eine reihe von environment-variablen, die man in den programmen nutzen kann.
eine davon ist $TCPREMOTEIP.

jetzt bauen wir in unserem systeminfo-skript eine log-funktion ein, wir wollen ja wissen, wer und wann das skript aufgerufen hat.
dazu fügen wir diese zwei zeilen ein:

datum=`date`
echo "$datum $TCPREMOTEIP" >> /home/richard/tcp/sysinfo.log

jetzt sieht man in der datei sysinfo.log, wer und wann das skript aufgerufen hat.
hier gibt es eine liste aller variablen:
http://cr.yp.to/ucspi-tcp/environment.html

wenn wir dem tcpserver sagen wollen, dass er maximal 3 verbindungen erlauben soll, dann starten wir ihn einfach mit -c 3 als zusätzlichen parameter.
das kann dann so aussehen:

tcpserver -v -c 3 192.168.0.2 5000 /home/richard/tcp/show_sysstat.sh
weitere optionen gibt es hier:
http://cr.yp.to/ucspi-tcp/tcpserver.html

natürlich kann der tcpserver auch "echte" server-programme starten.
zb: das swat von samba.
das geht ganz einfach mit:

tcpserver 192.168.0.2 901 /usr/sbin/swat
achtung: wenn man den tcpserver auf ports <= 1024 hören lassen will, dann muss man den tcpserver als root starten!

so, jetzt wollen wir ein paar extras einbauen.
mit dem programm tcprules kann man eine acl erstellen, an die sich er tcpserver haltet.
denken wir uns folgendes:
der rechner 192.168.0.1 darf bei unserem sysinfo-skript auch erfahren, wer ein geloggt ist. (mit dem befehl who)
der rechner 192.168.0.7 darf nix machen.
alle anderen dürfen die standardinfos sehen.
die tcprules-file würde dann so aussehen:


:allow
192.168.0.1:allow,EXTRA="who"
192.168.0.7:deny

in der zeile 1 legen wir fest, dass alle hosts erlaubt sind.
mit der zeile 2 sagen wir, dass wenn sich der host 192.168.0.1 verbindet die variable extra, mit dem inhalt "who" an das zu startende programm übergeben werden soll.
und in der zeile 3 verbieten wir den host 192.168.0.7.

diese drei zeilen stehen in der datei /home/richard/tcp/sysinfo.rules.
in unserem skript tragen wir diese zwei zeilen ein:


echo "------------extras------------"
exec $EXTRA

also, wenn die variable extra gesetzt ist, dann wird ihr inhalt ausgefüht.
in unserem fall ist es "who" für 192.168.0.1.

damit der tcpserver diese regeln versteht, müssen wir sie in eine cdb-datenbank umwandeln.
(cdb ist eine datenbank von dj bernstein, die ist sehr schnell und einfach...
weitere infos: http://cr.yp.to/cdb.html)
das machen wir jetzt mit dem tcprules programm.

tcprules /home/richard/tcp/sysinfo.rules.cdb /home/richard/tcp/sysinfo.rules.tmp < /home/richard/tcp/sysinfo.rules
jetzt haben wir eine schöne cdb. :)
mit dem parameter "-x" sagen wir dem tcpserver, dass er eine tcprules-datenbank verwenden soll.
das würde dann so aussehen:

tcpserver -v -x /home/richard/tcp/sysinfo.rules.cdb 192.168.0.2 5000 /home/richard/tcp/show_sysstat.sh

das waren jetzt so die wichtigsten sachen zum tcpserver.
jetzt ist es fast 2 in der nacht, ich geht lieber ins bett. :D

ich hoffe ihr findet gefallen an uscpi-tcp.
//richard

p.s: dj bernstein rockt!