Als spätes Osterei möchte ich eines meiner ältesten Skripte mit Euch teilen. Die Urfassung wurde erstmals am 22. März 2005 um 17:56 veröffentlicht [wofür alte Chatlogs doch gut sein können ].
Das Skript benutzt das mächtige netcat (bei manchen Systemem nennt es sich nc) mit dem eine head-Anfrage an einen Port eines Rechners gestellt wird. Die Abfrfage eines Ports sähe so aus:
netcat -z HOST PORT
Ist der Port offen wird 0 als Exitcode zurückgegeben, andernfalls 1.
Der Wert hinter -w begrenzt die Wartezeit in Sekunden.
2 Beispielabfragen auf SSH und HTTP
Manchmal möchte man einfach testen, ob bei einem Rechner bestimmte Ports offen bzw. geschlossen sind. Dafür ist mein Skript, welches dem Posting angehängt ist, gedacht.
Erläuterungen zu den Variablen im Skript
<Edit (24.10.24)>netcat möchte die Portnummer nummerisch haben, der Mensch aber lieber den Dienstenamen. In der Variable ports werden die Dienstenamen, mit Leerzeichen getrennt, angegeben. Das Skript holt dann aus der Datei /etc/services die Portnummer zum Dienst.
Der Mensch möchte lieber die Dienstenamen angeben statt die Portnummer. Das ist für netcat auch kein Problem. Allerdings gibt es Probleme mit Dienstenamen, die ein - enthalten (z.B. netbios-ssn). Der Dienstename wird in mehrere Argumente zerlegt. Deshalb holt sich xping.sh anhand des Dienstenamens die Portnummer aus der /etc/services.
</Edit>
Wie ich heute feststellen mußte, ist diese Datei im Raspberry Pi OS (Bookworm) kastriert und habe deswegen noch die Möglichkeit geschaffen, eine eigene Dienstedatei zu verwenden. Diese wird mit vollem Pfad in die Variable my_services geschrieben und um sie zu aktivieren wird die Variable use_services von 0 auf 1 geändert.
Zur Erleichterung hänge ich noch ein Beispiel für eine eigene Dienstedatei (xping.services -- ähm, mußte ein .txt anhängen, damit ich die hochladen konnte) an.
Und das ganze sieht dann so aus:
~> xping.sh localhost
use services portnumber from /etc/services
----------------------------------------------
localhost has address 127.0.0.1
localhost has IPv6 address ::1
----------------------------------------------
Service Port (TCP) Status
----------------------------------------------
domain 53 close
whois++ 63 close
finger 79 close
smtp * 25 open
pop3 110 close
http 80 close
https 443 close
ftp 21 close
telnet 23 close
ssh * 22 open
ldap 389 close
mysql 3306 close
postgresql 5432 close
nntp 119 close
irc 194 close
ntp 123 close
epmap 135 close
netbios-ssn 139 close
microsoft-ds 445 close
cvspserver 2401 close
svn 3690 close
git 9418 close
ipp * 631 open
----------------------------------------------
Display More
Nach Ausgabe der verwendeten Dienstedatei erfolgt (wenn installiert) die Ausgabe von /usr/bin/host und danach der Tabellenkopf und die in der Variablen ports angegebenen Dienste.
Offene Dienste erhalten nach dem Dienstenamen ein Sternchen.
Anmerkung: Es wird IPv4 abgefragt. Wer die Ports auf IPv6 prüfen will, muß den IPv6-DN oder die IPv6-Adresse angeben.
~> xping.sh ::1
use services portnumber from /etc/services
----------------------------------------------
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa has no PTR record
----------------------------------------------
Service Port (TCP) Status
----------------------------------------------
domain 53 close
...
Einen Schönheitsfehler hat das Skript allerdings. Wegen der zwei verschiedenen Namen netcat bzw. nc mußte ich das teuflische eval benutzen.
Vielleicht konnte ich damit jemanden eine Freude machen.