Debian Server auf Updates prüfen via Shell Script (apt-get update)
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]
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 🙂