#!/bin/bash # Name: dienstmon # Zweck: Überwacht offene Ports auf eine andre Rechner # Syntax: dienstmon rechnername port1 port2 port3 port4 ... # oder dienstmon port1 port2 port3 .... # Notiz: Port1 u.s.w.sind in numerische format # Anderungen: 02.03.2005 Erste erstellung von Script # Author: Michel Bisson (michel@linuxint.com) # Beschreibung: Wenn der erste Parameter ist ein rechnername oder IP Dann: # Der Script wird für nur ein Rechner, ein Port oder mehrere # port Überprüfen und auf eine Zeile in terminal Zeigen. # Wenn der erste Parameter ist ein port nummer dann: # Der Script wird für alle Rechner im Netz die Liste von # offene Ports überprüfen. Dann eine liste von Rechner und # offene Port in ein Terminal regelmässig anzeigen. # ---------------------------------------------------------------------------------------------------- # Parameter liste Überprüfung #------------- z.B. error "FEHLER: Falsche Parameter typ" abstand=17 spalte=10 error () { echo -e $ROT$1$BLAU echo "Syntax: $0 [hostname] Port1 Port2 Port3 ...(Portx sind in numerische Format)" echo " z.B. $0 laptop.linux.site 21 22 25 80 ..." echo " oder $0 21 22 25 80 ....." echo "Wenn kein Hostname gegeben ist, dann alle interne (class C) LAN rechner werden überprüft" echo -e $NORMALE exit 1 } #--- Function to display a word ($1) and fill the rest with spaces #--- until the length of the word is according to parameter $2 #--- Character Color according to $3 #--- Background Color according to $4 #--- Syntax: eg. show SSH 8 ROT GELBE-H #--- Would display the word SSH in red on yellow #--- and add 5 spaces at the end of it.(8-3=5) #--------Effekte: TOP="\\033[H" FETT="\\033[1m" UNTERSTRICHT="\\033[4m" FLACKER="\\033[5m" UNSICHBAR="\\033[8m" #--------Schrift Farbe: ROT="\\033[31m" GRUEN="\\033[32m" GELB="\\033[33m" BLAU="\\033[34m" VIOLET="\\033[35m" HELLBLAU="\\033[36m" WEISS="\\033[37m" SCHWARTZ="\\033[39m" #---------Hintergrund Farbe: SCHWARTZ_H="\\033[40m" ROT_H="\\033[41m" GRUEN_H="\\033[42m" GELB_H="\\033[43m" BLAU_H="\\033[44m" VIOLET_H="\\033[45m" HELLBLAU_H="\\033[46m" WEISS_H="\\033[47m" #Schwartz auf Weiss, Effekt sind ausgeschaltet NORMALE="\\033[m" #---Hintergrund nimmt die Schrift Farbe #---und die Schriten nehmen eine sichbare Farbe) REVERSE="\\033[7m" #--------------- Syntax: show text länge [schriftfarbe] [hintergrundfarbe] show () { #----- Leerzeichen nach den Wort weg nehmen word=$(echo -n $1 | sed 's/ \+$//g') let sp=$2-$(echo -n $word | wc -c) if [ "$3" ]; then echo -ne $(eval echo \$$3) ; fi if [ "$4" ]; then echo -ne $(eval echo \$$4) ; fi echo -ne $word$NORMALE #------- erganzundg von länge for ((j=1;$j<=$sp;j++)); do echo -n " ";done } # Einzel Rechner mit offene Port Überprüfen und Ergebnis auf ein Zeile anzeigen #---------------- Kein parameter nötig. Gibt alle netz hosts in '$allehosts' hosts () { #---------- Schleife 254 Pings gleichzeitig zu senden >/tmp/netzping teil=$(hostname -i | cut -d. -f1,2,3) for ((i=1; $i<=254;i++)); do /bin/ping -w3 -c1 $teil.$i >> /tmp/netzping 2>/dev/null & done sleep 3 allehosts=$(grep "^64 bytes from" /tmp/netzping | cut -d" " -f4 | cut -d: -f1| sort -t. -k4n -u) } #--------- scan ports von Hosts ----------------- #--------- Zeigt alle offene Ports von ein host # Syntax: portscan $@ (alle port zu scannen) # Notiz: die Variable $host muss schon bereit mit der hostname als inhalt portscan () { show $host 17 BLAU echo -n " " for p ; do result=$(nmap -n --host_timeout 300 --max_rtt_timeout 300 -p $p -P0 $host) if (echo $result | grep open &>/dev/null); then show "O" $spalte ROT elif (echo $result | grep closed &>/dev/null); then show "-" $spalte FETT else show "x" $spalte fi done echo } #--------------- Zeigt die Dienst liste(spalte) als seite kopf kopf () { echo -e "${ROT}'O'$NORMALE=Open '${FETT}-$NORMALE'=Closed 'x'=No answer(Firewall?)" for ((ab=1;ab<=$abstand;ab++));do echo -n " " ; done for port ; do show $(grep "[[:blank:]]$port\/tcp " /etc/services | head -n1 | expand |cut -d" " -f1 \ | tr "a-z" "A-Z") $spalte UNTERSTRICHT done echo } #----------------------------------- START ------------------------------------------------------ # Anzahl von parameter Überprüfen Minimale Anzahl=1 if [ $# -lt 1 ]; then error "FEHLER: Falsche Anzahl von Parameter." fi # Ist der erste Parameter ein port nummer oder ein hostname oder ein IP nummer? if (echo $1 | grep "^[0-9]\+$" &>/dev/null); then # Es ist ein port nummer dann wir machen ein port scan für alle aktive rechner in unsere Netz clear while [ "A" ]; do #--------- Kursot ganz Oben echo -ne $TOP hosts if [ "$altehosts" != "$allehosts" ]; then clear ; fi #----------- Schreib die Dienst liste als kopf kopf $@ #------------ Holt alle hosts IP von Class C netzwerk altehosts=$allehosts for host in $allehosts ; do portscan $@ done done elif (ping -w3 -c1 $1 &>/dev/null); then if [ $# -lt 2 ]; then error "FEHLER: Falsche Anzahl von Parameter." else # Es ist ein gültige und aktive hostname oder ein aktive IP host=$1 #------- Rutsch alle parameter nach links (hostname ($1) ist weg von Parameterliste) shift clear while [ "A" ]; do echo -ne $TOP # Ersetz alle Port-Nummer für richtige Dienst-Namen kopf $@ portscan $@ echo done fi else # Fehler es ist keine gültige Port oder Hostname oder IP-Nummer error "FEHLER: Der erste Paramater ist kein gültige Hostname oder IP oder Port Nummer" fi