1 Reaktion

Debian Server auf Updates prüfen via Shell Script (apt-get update)

Geschätzte Lesedauer:

Wer unter Linux arbeitet und mehrere Debian Server verwaltet, sollte sich Gedanken darüber machen, wie er zeitsparend überprüft, ob für einen Server Updates verfügbar sind (via APT).
Jedes mal einen Login per SSH auszuführen ist ein wenig lästig und erst recht bei vielen Servern.

Hier nun eine Schritt für Schritt Anleitung, wie ich viele Server automatisch auf Updates prüfe.

Schritt 1:
Einen Public Key für SSH erstellen, den wir nur für diesen Zweck verwenden.

[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]

ssh-keygen -b 2048 -f /pfad/zum/key/upserver.key

[/pastacode]

Es werden zwei Dateien erstellt: /pfad/zum/key/upserver.key und /pfad/zum/key/upserver.key.pub
In diesem Fall verzichte ich auf die Vergabe einer Passphrase, da diese meiner Meinung nach für diesen Zweck nicht wichtig ist.

Schritt 2:
Auf jedem Server, den wir auf diese Art prüfen wollen, richten wir nun einen User ohne besondere Rechte ein.

[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]

# Verbindung zum Server als root
ssh -l root server.meinserver.de
 
# folgende Befehle dann auf dem Server
 
# Zuerst konfigurieren wir Apt so, dass einmal am Tag die Paketliste erneuert wird (apt-get update)
echo 'APT::Periodic::Update-Package-Lists "1"' >> /etc/apt/apt.conf.d/10-userconf
 
# Neuen Benutzer "serverupdate" anlegen
useradd -d /home/serverupdate -m -s /bin/rbash serverupdate
logout
 
# Folgende Befehle dann wieder auf dem lokalen Rechner
 
# Vorhin angelegten Key (Public!) auf den Server kopieren
ssh root@server.meinserver.de 'mkdir /home/serverupdate/.ssh;echo '`cat /pfad/zum/key/upserver.key.pub`' >> /home/serverupdate/.ssh/authorized_keys;chown -R serverupdate:serverupdate /home/serverupdate/.ssh'

[/pastacode]

Schritt 3:
Wir haben nun auf dem Server die Voraussetzung geschaffen um automatisch prüfen zu können, ob es Updates gibt.
Dies machen wir nun mit folgendem Befehl:

[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]

ssh -i /pfad/zum/key/upserver.key serverupdate@server.meinserver.de "apt-get dist-upgrade -qq -y -s | grep '^Inst ' | wc -l"

[/pastacode]

Als Ergebnis kriegen wir einfach nur eine Zahl – die Anzahl der neuen oder aktualisierbaren Pakete.

Schritt 4:
Nun setzen wir ein kleines Shell-Script zusammen:

[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]

#!/bin/bash
SERVER=$1
PORT=$2
SSHKEY=/pfad/zum/key/upserver.key
 
if [[ "$SERVER" = "" ]] ; then
  echo "Nutzung: $0  [
]" ;
  exit 1 ;
fi
 
if [[ "$PORT" = "" ]] ; then
  PORT=22 ;
fi
 
NUM=`ssh -p $PORT -i $SSHKEY serverupdate@$SERVER "apt-get dist-upgrade -qq -y -s | grep '^Inst ' | wc -l"` ;
if [[ "$NUM" -lt 1 ]] ; then
  echo "Keine Updates gefunden." ;
else
  echo "Es wurden $NUM Updates gefunden." ;
fi
 
exit 0 ;

[/pastacode]

Dem Script noch mit chmod 755 ./updatecheck ausführbare Rechte geben.
Nun kann einfach mit ./updatecheck server.meinserver.de geprüft werden, ob Updates vorliegen – und das ganz ohne weiteren Login auf dem Server. Die Updates muss man dann ggf. natürlich weiterhin als root installieren.

Hat man mehrere Server, so kann man das Ganze auch sehr einfach erweitern. Für jeden Server sind die gleichen Schritte wie oben genannt notwendig (User anlegen, public Key kopieren, tgl. Apt-Update aktivieren).

[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]

#!/bin/bash
SERVERLIST="server1.meinserver.de server2.meinserver.com server3.yzabc.de"
SSHKEY=/pfad/zum/key/upserver.key
 
for SERVER in $SERVERLIST ; do
  NUM=`ssh -i $SSHKEY serverupdate@$SERVER "apt-get dist-upgrade -qq -y -s | grep '^Inst ' | wc -l"` ;
  if [[ "$NUM" -lt 1 ]] ; then
    echo "Server ${SERVER}: Keine Updates gefunden." ;
  else
    echo "Server ${SERVER}: Es wurden $NUM Updates gefunden." ;
  fi ;
done
 
exit 0 ;

[/pastacode]

Modifikation:
Mit einer kleinen Änderung ist es natürlich auch möglich sich nicht die Anzahl der Updates sondern die einzelnen Pakete anzeigen zu lassen.
Folgende Zeilen werden dabei ersetzt:

[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]

NUM=`ssh -p $PORT -i $SSHKEY serverupdate@$SERVER "apt-get dist-upgrade -qq -y -s | grep '^Inst ' | wc -l"` ;
if [[ "$NUM" -lt 1 ]] ; then
  echo "Keine Updates gefunden." ;
else
  echo "Es wurden $NUM Updates gefunden." ;
fi

[/pastacode]

in

[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]

NUM=`ssh -p $PORT -i $SSHKEY serverupdate@$SERVER "apt-get dist-upgrade -qq -y -s | grep '^Inst '"` ;
if [[ "$NUM" = "" ]] ; then
  echo "Keine Updates gefunden." ;
else
  echo "Folgende Updates gefunden:" ;
  echo $NUM ;
fi

[/pastacode]

Dieser Artikel wurde von Marius Burkard verfasst.

Marius Burkard ist Diplom-Wirtschaftsinformatiker und arbeitet seit 2006 als selbstständiger Software-Entwickler und Linux-Server-Administrator mit der Firma pixcept KG. Er ist unter anderem mitverantwortlich für die Projekte Was-lese-ich.de und ISPProtect.

1 Kommentar - bis jetzt!

Eigenen Kommentar verfassen
  1. schrieb am :

    Hi Marius, super Script. Danke für die Anregung!
    Der Parameter -qq führt bei mir allerdings dazu, dass grep nichts findet:

    root@server / # apt-get dist-upgrade -s | grep ‚Pake‘
    Paketlisten werden gelesen…
    root@server / # apt-get dist-upgrade -s -qq | grep ‚Pake‘
    root@server / #

    Daher lasse ich ihn einfach weg, dann läuft’s 🙂

Und jetzt du! Deine Meinung?

Erforderliche Felder sind mit einem Asterisk (*) gekennzeichnet. Die E-Mail-Adresse wird nicht veröffentlicht.
  1. Nach Absenden des Kommentar-Formulars erfolgt eine Verarbeitung der von Ihnen eingegebenen personenbezogenen Daten durch den datenschutzrechtlich Verantwortlichen zum Zweck der Bearbeitung Ihrer Anfrage auf Grundlage Ihrer durch das Absenden des Formulars erteilten Einwilligung.
    Weitere Informationen