/usr/bin/mail

Es ist immer mal wieder sinnvoll von der Bash aus Skripten Emails zu verschicken. Ich vergesse immer wieder einige nuetzliche Schalter deswegen zum festhalten:

  • mail -s „Betreff“ empfaenger@example.net (EMail mit Betreff)
  • mail -s „Betreff“ empfaenger@example.net < /tmp/meinbrief (Email mit Betreff und meinbrief als Text)
  • cat /tmp/meinbrief | mail -e -s „Betreff“ empfaenger@example.net (Email wird nur verschickt wenn der body nicht leer ist)
  • mail -a „From: Sender <sender@example.net>“ -s „Betreff“ empfaenger@example.net (Schreibt den From-Header um)
  • uuencode /tmp/meinbild.png /tmp/meinbild.png | mail -s „Betreff“ empfaenger@example.net (Versendet meinbild.png als Anlage)

An welchem Port befindet sich der Host?

Diese Frage muss natuerlich beantwortet sein, wenn ich Rechner die einen Virus haben automatisch in ein VLAN packen moechte. Gestern habe ich geschrieben, wie man auf den FSM726v2 einen Port via SNMP automatisch in ein VLAN setzt. Heute geht es nun darum, basierend auf einer MAC-Adresse, in unserem Wohnheim herauszufinden, auf welchem Switch und an welchem Port darauf ein Rechner sitzt, bzw. DER vireninfizierte Rechner sitzt. Es gab dafuer bei uns im Tutorium ein perl-Skript, das fuer diese Aufgabe gute 4 1/2 Minuten benoetigte.  Wir haben so um die 45 Switche bei uns im Wohnheim.

Meine erste Loesung in bash dauerte ca. doppelt so lange wie das perl Skript, aber nachdem ich das ganze noch einmal ueberdacht hatte bekomme ich die gewuenschte Information nun in Sekunden. Das Skript in dieser Form funktioniert fuer FSM726v2 und FSM7328 Switche, sollte aber ohne Probleme wenn man die OIDs anpasst auch fuer alle anderen Switchtypen funktionieren.  Hier das Skript:

#!/bin/bash
 
##
# sucht nach mac-adressen auf den switchen und
# gibt den port aus, auf dem sie zu finden ist
#
# syntax: ./mac-port.sh 00:11:22:33:44:55
#
# 04/2009 - Jan Toenjes - jan@atw.goe.net
##
 
# Ueberpruefen ob uns eine gueltige MAC-Adresse uebergeben wurde
VALID=$( echo $1 | sed -n "/^\([0-9A-Z][0-9A-Z]:\)\{5\}[0-9A-Z][0-9A-Z]$/p" )
 
if [ -z $VALID ]; then
  echo ""
  echo " syntax: $0 00:11:22:33:44:55"
  echo ""
  echo ""
  echo " Dem Skript muss eine gueltige MAC-Adresse als Parameter uebergeben werden."
  echo ""
  echo " Version: 0.1 von Jan Toenjes - jan@atw.goe.net "
  echo ""
 
else
 
# SWITCHE1 = FSM726v2 ; SWITCHE2 = FSM7328
SWITCHE1="1.1.1.1 1.1.1.2 1.1.1.3 "
SWITCHE2="1.1.2.1 1.1.2.2"
 
# Zeugs
OID1=".1.3.6.1.2.1.17.4.3.1.2"
OID2="SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.1"
MACDEC=""
 
# Doppelpunkte aus MAC-Adresse entfernen
MACSPLIT=`echo $1 | sed 's/:/ /g'`
 
# MAC-Adresse von HEX in DEC konvertieren
for i in $MACSPLIT ; do
  MACDEC=$MACDEC.$(echo "ibase=16; $i"| bc) ;
done
 
# Gucken ob die MAC-Adresse auf dem Switch FSM726v2 vorhanden ist und wenn ja welcher Port
for i in $SWITCHE1 ; do
  RESULT1=`snmpget -v1 -c tutrw $i $OID1$MACDEC 2&gt;&amp;1 | head -1 | grep INTEGER`;
  # Port extrahieren
  RESULT2=`echo $RESULT1 | sed 's/.*INTEGER: //g'` ;
  # Wenn kein Uplink-Port dann Info ausgeben
  if ([ "$RESULT2" != "25" ] &amp;&amp; [ "$RESULT2" != "26" ]  &amp;&amp; [ -n "$RESULT2" ]); then
    echo Mac-Adresse: $1 gefunden auf Switch $i und Port $RESULT2
  fi
done
 
# und das gleiche auch noch einmal fuer die FSM7328
for i in $SWITCHE2 ; do
  RESULT1=`snmpget -v1 -c tutrw $i $OID2$MACDEC 2&gt;&amp;1 | head -1 | grep INTEGER`;
  RESULT2=`echo $RESULT1 | sed 's/.*INTEGER: //g'` ;
 
  if ([ "$RESULT2" != "25" ] &amp;&amp; [ "$RESULT2" != "26" ] &amp;&amp; [ "$RESULT2" != "27" ] &amp;&amp; [ "$RESULT2" != "28" ] &amp;&amp; [ -n "$RESULT2" ]); then
    echo Mac-Adresse: $1 gefunden auf Switch $i und Port $RESULT2
  fi
done
 
fi

Viele Server updaten

Wer mehr als zwei oder drei Server betreut, den kennt sicherlich das Problem, dass man den Ueberblick ueber den aktuellen Updatestatus der Systeme verliert. Damit mir das nicht passiert nutze ich Nagios mit dem schoenen Plugin check_debian_packages.

Wenn es jetzt ein Update gibt, dann hab ich mich bisher auf jeder Maschine von Hand per SSH eingeloggt und dann die Updates installiert. Ab einem gewissen Zeitpunkt eine sehr zeitaufwendige Geschichte. Zu Zeitaufwendig ab einer gewissen Anzahl zu betreuender Server.

Die Nutzung von Tools wie pssh, cluster ssh, oder onall waere jetzt sicherlich eine Loesung aber da ich keine bestehende ssh-key-infrastruktur zu allen Servern habe und es auch erstmal eine „schnelle“ Loesung tut heute erstmal eine for-Schleife in bash was seine Dienste aber fuer mich erstmal erledigt. onall finde ich interessant und dazu gibts dann spaeter mal was ;-)

#!/bin/bash
SERVERS=“1.1.1.1 2.2.2.2 3.3.3.3″
USR=“USERNAME“

for host in $SERVERS
do
ssh $USR@$host ’sudo aptitude upgrade‘
done