|
| 1 | +--- |
| 2 | +title: Automatische Updates von RHEL-Systemen mit einem Bash-Script |
| 3 | +description: Automatisierte Updates auf einem RHEL-basierenden OS mit einem Bash-Script |
| 4 | +date: 2025-08-17T13:34:19.769Z |
| 5 | +tags: |
| 6 | + - bash |
| 7 | + - linux |
| 8 | + - rhel |
| 9 | +categories: |
| 10 | + - Linux |
| 11 | + - Tutorials |
| 12 | +menu: |
| 13 | + sidebar: |
| 14 | + name: Bash-Script für automatische Updates auf RHEL-Systemen |
| 15 | + identifier: rhel-update |
| 16 | + parent: linux-scripting |
| 17 | +keywords: |
| 18 | + - rhel-update |
| 19 | +draft: true |
| 20 | +preview: ../../../../assets/images/posts/linux/bash-update-script-rhel.webp |
| 21 | +hero: /images/posts/linux/bash-update-script-rhel.webp |
| 22 | +--- |
| 23 | +## Updates auf RHEL-basierenden Systemen automatisieren mit einem Bash-Script |
| 24 | + |
| 25 | +In diesem kleinen Tutorial möchte ich zeigen, wie ihr mit Hilfe eines Bash-Script, RHEL-basierende Server-Systeme automatisch aktualisieren lassen könnt. |
| 26 | + |
| 27 | +## Warum ein Bash-Script nutzen |
| 28 | + |
| 29 | +Ich denke jeder Administrator weiß die Vorzüge der Verwendung von Scripte zur Automatierung von immer wiederkehrenden Aufgaben zu schätzen und kann so seine produktive Arbeit effizienter gestalten. |
| 30 | + |
| 31 | +Daher habe ich mir gedacht, dass ich euch in diesem Tutorial das Bash-Scripting ein wenig näher bringe und euch anhand eines Beispiels, dass Scripting in der Shell zeige. |
| 32 | +Als Beispiel schreibe ich ein Script mit dessen Hilfe, Updates von RHEL-basierenden Betriebssystemen, vollkommen automatisiert ablaufen. |
| 33 | + |
| 34 | +## Erstellung des Bash-Scripts für automatische Updates |
| 35 | + |
| 36 | +<!-- FM:Snippet:Start data:{"id":"Warning","fields":[]} --> |
| 37 | +{{< alert type="warning" >}} |
| 38 | +**Warnung** |
| 39 | + |
| 40 | +Bitte Bash-Scripte immer erst auf **Test-Systeme** vorab Testen und dann auf Produktiv-Systemen ausrollen!!! |
| 41 | +{{< /alert >}} |
| 42 | +<!-- FM:Snippet:End --> |
| 43 | + |
| 44 | +## Zum Aufbau von diesem Beispiel-Script |
| 45 | +Zunächst werde ich in diesem Beispiel-Script euch die **einzelnen Befehls-Abschnitte** des Bash-Scripts nacheinander deren Bedeutung und Funktionsweise erklären und weiter unten in diesem Artikel findet ihr dann das fertige Update-Script zur eurer freien Verfügung. |
| 46 | +<!-- FM:Snippet:Start data:{"id":"Info","fields":[]} --> |
| 47 | +{{< alert type="info" >}} |
| 48 | +In meinem GitHub-Repository findet ihr noch viele praktische Scripte für die Bash oder das Scripting mit Phyton. |
| 49 | + |
| 50 | +[**--> Hier geht es zum Repository**](https://github.com/securebitsorg/community-templates) |
| 51 | + |
| 52 | +{{< /alert >}} |
| 53 | +<!-- FM:Snippet:End --> |
| 54 | + |
| 55 | +#### Was braucht ihr für die Erstellung eines Bash-Scripts?! |
| 56 | +Für das Erstellen eines Bash-Scripts braucht es eigentlich nur einen einfachen Text-Editor. |
| 57 | +Besser jedoch ist es, wenn ihr einen Editor nutzt, der auch das Syntax-Highlighting der Bash-Scripting beherrscht. So ist einfacher, die richtige Formatierung für das Script einzuhalten und sorgt auch für eine bessere Übersicht. |
| 58 | + |
| 59 | +##### Hier eine kleine Auswahl an Editoren unter Linux: |
| 60 | +- KWrite |
| 61 | +- VSCode |
| 62 | +- nano |
| 63 | +- VIM |
| 64 | +- NEOvim |
| 65 | +- Kate |
| 66 | + |
| 67 | + |
| 68 | +### Erstellung der Bash-Script-Datei |
| 69 | +Bevor mit dem Erstellen des Bash-Scripts für unser Update-Script anfangen können, brauchen wir zunächst eine Script-Datei. |
| 70 | +Um diese zu Bash-Script-Datei zu erstellen, erstellt ihr eine neue Datei mit der Endung **`.sh`** mit dem **nano-Editor** oder dem Editor eurer Wahl. |
| 71 | + |
| 72 | +**In diesem Beispiel erstellen wir das Script im Wurzelverzeichnis des `root-users`** |
| 73 | + |
| 74 | +> |
| 75 | +> #### Installieren des **nano-Editor** |
| 76 | +> |
| 77 | +> Bei den meisten Distros ist der **nano-Editor** schon vorinstalliert. Sollte das nicht der Fall sein, könnt ihr einfach die Installation mit diesen Befehl nachholen. |
| 78 | +> |
| 79 | +>```sh |
| 80 | +># Installation des nano-Editor |
| 81 | +> |
| 82 | +>sudo dnf update |
| 83 | +> |
| 84 | +>sudo dnf install nano |
| 85 | +>``` |
| 86 | +### Schritt 1 - Erstellung einer Bash-Script-Datei |
| 87 | +In diesem Beispiel nutze ich einfachshalber den `nano-editor` im Terminal, da dieser einfach zu Bedienen ist und auch für alle Distros (meines Wissens) verfügbar ist. |
| 88 | +
|
| 89 | +```sh |
| 90 | +# Solltet ihr als nicht root-user angemeldet sein, könnt ihr euch mit dem folgenden Befehl als root-user anmelden |
| 91 | +
|
| 92 | +sudo -s |
| 93 | +
|
| 94 | +# Erstellen der Script-Datei im root-Verzeichnis |
| 95 | +touch ~/simple_update_RHEL_script.sh |
| 96 | +
|
| 97 | +# Bearbeiten der Script-Datei |
| 98 | +nano ~/simple_update_RHEL_script.sh |
| 99 | +``` |
| 100 | +Im nun offnen Editor-Fenster der Datei `simple_update_RHEL_script.sh`, gibt ihr in der ersten Zeile, das folgende ein: |
| 101 | + |
| 102 | +`/bin/bash` |
| 103 | + |
| 104 | +> Mit dieser ersten Zeile `/bin/bash` weisen wir aus, das es sich hier um ein Bash-Script handelt und so weiß das Betriebssystem, mit welchem Interpreter (Shell) unser Script ausgeführt werden soll. |
| 105 | +
|
| 106 | +### Schritt 2 - Bash-Script Kommentare und Anweisungen einfügen |
| 107 | +#### Warum Kommentare und Anweisungen erstellen? |
| 108 | +Generell sollte man sich von Anfang angewöhnen, die erstellten Bash-Scripte gut zu Dokumentieren. |
| 109 | + |
| 110 | +Erstens hilft es einem Selbst, wenn man eine Vielzahl an Bash-Scripte in seinem Werkzeugkasten hat, um sich auch später noch daran erinnern zu können, welche Funktionalität mit dem Script bereitgestellt wird. |
| 111 | + |
| 112 | +Zweitens ist natürlich von Vorteil, dass auch Andere mit dem Bash-Script etwas anfangen können, wenn ihr eure Scripte zum Beispiel intern oder auf GitHub etc. mit anderen Usern teilt. |
| 113 | +#### Einfügen von Kommentare oder Anweisungen |
| 114 | +Ich für meinen Teil schreibe am Anfang meiner Scripte immer erst die Versionsnummer (für den Versionsverlauf), eine Beschreibung wofür dieses Script gedacht ist und Anweisungen für die Nutzung des Scripts. |
| 115 | + |
| 116 | +Den einzelnen auszuführenden Befehle im Bash-Script, füge ich auch noch eine kurze Beschriftung sowie Funktionsart hinzu, wenn ich diese mit Dritten teile. |
| 117 | + |
| 118 | +**Im folgendem sieht das dann so aus:** |
| 119 | + |
| 120 | +```bash |
| 121 | +# Version: 1.0 |
| 122 | + |
| 123 | +# Hinweis: |
| 124 | +# Dieses Script ist für RHEL-basierte Systeme gedacht. |
| 125 | +# Es aktualisiert das System und entfernt nicht mehr benötigte Pakete. |
| 126 | +# Es überprüft, ob ein Neustart des Systems erforderlich ist und startet es gegebenenfalls SOFORT neu. |
| 127 | +# Es ist wichtig, dass das Script als root ausgeführt wird. |
| 128 | + |
| 129 | +# Anwendung: |
| 130 | +# sudo chmod +x simple_update_RHEL_script.sh |
| 131 | +# sudo ./simple_update_RHEL_script.sh |
| 132 | + |
| 133 | +# Info: |
| 134 | +# This script is intended for RHEL-based systems. |
| 135 | +# It updates the system and removes unused packages. |
| 136 | +# It checks if a system restart is required and restarts the system if necessary. |
| 137 | +# It is important that the script is run as root. |
| 138 | + |
| 139 | +# Using: |
| 140 | +# sudo chmod +x simple_update_RHEL_script.sh |
| 141 | +# sudo ./simple_update_RHEL_script.sh |
| 142 | + |
| 143 | + |
| 144 | + |
| 145 | +# Automatisches Update-Script für RHEL-basierte Systeme / Automatic update script for RHEL-based systems |
| 146 | +``` |
| 147 | + |
| 148 | +### Schritt 3 - `echo` Ausgabe im Terminalfenster |
| 149 | +Um dem Anwender des Bash-Scripts eine Rückmeldung zu geben, was gerade bei der Ausführung des Scripts ausgeführt wird, gibt es den Befehl `echo` für den Ausdruck im Terminal. |
| 150 | + |
| 151 | +In unserem Beispiel-Script nutzen wir den Befehl `echo` zum ersten Mal, um dem Anwender eine Nachricht im Terminal zu übergeben, welche darüber informiert, was nun durch dieses Script auf dem System durchgeführt wird. |
| 152 | + |
| 153 | +```bash |
| 154 | +echo "=================================================================" |
| 155 | +echo " Automatisches System-Update / Automatic system update" |
| 156 | +echo " (RHEL/Fedora/CentOS)" |
| 157 | +echo "=================================================================" |
| 158 | +``` |
| 159 | +### Schritt 4 - Bash-Anweisung `if, then, fi` (root-Berechtigung überprüfen) |
| 160 | +Unsere erste Anweisung die wir in unser Bash-Update-Script einfügen werden, ist die Überprüfung, ob wir die `root - Rechte` haben, um die Befehle auf dem System ausführen zu können. |
| 161 | + |
| 162 | +```bash |
| 163 | +# Prüfen, ob root-Rechte vorhanden sind / Check if root privileges are present |
| 164 | +if [ "$EUID" -ne 0 ]; then |
| 165 | + echo "Bitte führen Sie dieses Script als root aus (sudo) / Please run this script as root (sudo)." |
| 166 | + exit 1 |
| 167 | +fi |
| 168 | +``` |
| 169 | +Hierzu bedienen wir uns der `if, then, fi` -Anweisung. |
| 170 | +Im Klarnamen heißt das, **'wenn (`if`)' "nicht gleich Benutzer-ID + 0 `[ "$EUID" -ne 0 ];` ist (root-User)", 'dann (`then`)' gebe eine Ausgabe im Terminal (`echo`) ab "Bitte führen Sie dieses Script als root aus (sudo) / Please run this script as root (sudo)." und beende das Script (`exit 1` (steht für "Script wurde mit Fehler oder besonderem Status beendet")). Der Befehl `fi` beendet die Anweisung. |
| 171 | + |
| 172 | +### Schritt 5 - Bash-Anweisung (Überprüfung Paketmanager) |
| 173 | +In diesem Schritt werden wir eine weitere Systemprüfung durchführen, um zu Überprüfen, ob der Paketmanager `dnf` auf dem System vorhanden ist. |
| 174 | + |
| 175 | +```bash |
| 176 | +# Prüfen, ob apt verfügbar ist / Check if apt is available |
| 177 | +if ! command -v dnf >/dev/null 2>&1; then |
| 178 | + echo "Kein 'dnf'-Paketmanager gefunden. Dieses Script funktioniert nur auf RHEL-basierten Systemen / No 'dnf' package manager found. This script only works on RHEL-based systems." |
| 179 | + exit 2 |
| 180 | +fi |
| 181 | +``` |
| 182 | + |
| 183 | + |
| 184 | +<!-- FM:Snippet:Start data:{"id":"Info","fields":[]} --> |
| 185 | +{{< alert type="info" >}} |
| 186 | +```bash |
| 187 | +if ! command -v dnf >/dev/null 2>&1; |
| 188 | +``` |
| 189 | +Damit wird überprüft, ob das Kommando `dnf` im System verfügbar ist. |
| 190 | +{{< /alert >}} |
| 191 | +<!-- FM:Snippet:End --> |
| 192 | +
|
| 193 | +### Schritt 4 - Bash-Anweisung (RHEL-Paketquellen aktualisieren und Update durchführen) |
| 194 | +In diesem Schritt geben wir zunächst die Ausgabe (`echo`) in das Terminal, dass die Paketquellen aktualisiert werden. |
| 195 | +Dann wird der Befehl `dnf update -y` ausgeführt um die angekündigte Aktualisierung der Paketquellen durchzuführen und bei vorhandenen neueren Paketen das System zu aktualisieren. |
| 196 | +
|
| 197 | +```bash |
| 198 | +# Paketquellen aktualisieren / Update package sources |
| 199 | +echo "Aktualisiere Paketquellen / Ausführung Upgrade | Update package sources / " |
| 200 | +dnf update -y |
| 201 | +``` |
| 202 | +
|
| 203 | +### Schritt 5 - Bash-Anweisung (unnötige dnf-Pakete entfernen) |
| 204 | +Als nächstes werden wir noch eine Anweisung einbauen, um unnötige / nicht mehr benötigte `dnf`-Pakete automatisch zu löschen. |
| 205 | +
|
| 206 | +```bash |
| 207 | +# Nicht mehr benötigte Pakete entfernen / Remove unused packages |
| 208 | +echo "Entferne nicht mehr benötigte Pakete / Remove unused packages" |
| 209 | +dnf autoremove -y |
| 210 | +``` |
| 211 | +
|
| 212 | +### Schritt 6 - Bash-Anweisung (dnf-cache leeren) |
| 213 | +Zu guter Letzt werden wir noch eine letzte Anweisung für den Update-Prozess einfügen, um den Cache des Paketmanager zu leeren. |
| 214 | +
|
| 215 | +```bash |
| 216 | +# Paketdatenbank bereinigen / Clean up cached package data |
| 217 | +echo "Bereinige zwischengespeicherte Paketdaten / Clean up cached package data" |
| 218 | +dnf clean all |
| 219 | +``` |
| 220 | +
|
| 221 | +### Schritt 7 - Bash-Anweisung (echo-Ausgabe Update-Prozess abgeschlossen) |
| 222 | +Da der Update-Prozess nach den letzten Anweisungen fertiggestellt ist, geben wir noch eine Mitteilung an den User im Terminal, dass der Update-Prozess zu Ende ist. |
| 223 | +
|
| 224 | +```bash |
| 225 | +echo "=================================================================" |
| 226 | +echo " System-Update abgeschlossen / System update completed" |
| 227 | +echo "=================================================================" |
| 228 | +``` |
| 229 | +
|
| 230 | +### Schritt 10 - Bash-Anweisung (Erforderliches Reboot überprüfen) |
| 231 | +Da zum Beispiel einige Aktualisierungen (z.B. Änderung am Kernel) einen Neustart des Betriebssystem benötigen, werden wir noch eine letzte Anweisung hinzufügen, um dieses zu überprüfen und gegebenfalls einen Neustart auslösen. |
| 232 | +
|
| 233 | +```bash |
| 234 | +# Überprüfen ob ein Neustart des Systems erforderlich ist / Check if a system restart is required |
| 235 | +if [ -f /var/run/reboot-required ]; then |
| 236 | + echo "Ein Neustart des Systems ist erforderlich. Das System wird jetzt neu gestartet / A system restart is required. The system will now restart." |
| 237 | + reboot |
| 238 | +fi |
| 239 | +``` |
| 240 | +
|
| 241 | +#### Bash-Update-Script abspeichern |
| 242 | +> Nach einer letzten Überprüfung von unserem Script müssen wir dieses natürlich nach abspeichern! |
| 243 | +
|
| 244 | +## Fertiges RHEL-Update Bash-Script |
| 245 | +Hier nun das fertige Bash-Script um automatisiert Update-Routinen auf RHEL-Systemen durchlaufen zu lassen. |
| 246 | +
|
| 247 | +Diese könnt ihr dann wie cronjob automatisiert auf den Linux-Systemen laufen lassen. |
| 248 | +
|
| 249 | +<!-- FM:Snippet:Start data:{"id":"Success","fields":[]} --> |
| 250 | +{{< alert type="success" >}} |
| 251 | +Gerade wenn ihr eine Vielzahl an Linux-Server zum Beispiel auf einen Proxmox VE-Server laufen habt, erleichtern euch solche Bash-Scripte enorm die Arbeit. |
| 252 | +{{< /alert >}} |
| 253 | +
|
| 254 | +<!-- FM:Snippet:End -->## Schritt 11 - Bash-Update-Script ausführbar machen |
| 255 | +Damit wir das Bash-Update-Script auch nutzen / ausführen können, muss das Script noch mit dem entsprechenden Rechten versehen werden. |
| 256 | +
|
| 257 | +```sh |
| 258 | +sudo chmod +x simple_update_RHEL_script.sh |
| 259 | +``` |
| 260 | +
|
| 261 | +
|
| 262 | +```bash |
| 263 | +#!/bin/bash |
| 264 | + |
| 265 | +# Version: 1.0 |
| 266 | + |
| 267 | +# Hinweis: |
| 268 | +# Dieses Script ist für RHEL-basierte Systeme gedacht. |
| 269 | +# Es aktualisiert das System und entfernt nicht mehr benötigte Pakete. |
| 270 | +# Es überprüft, ob ein Neustart des Systems erforderlich ist und startet es gegebenenfalls SOFORT neu. |
| 271 | +# Es ist wichtig, dass das Script als root ausgeführt wird. |
| 272 | + |
| 273 | +# Anwendung: |
| 274 | +# sudo chmod +x simple_update_RHEL_script.sh |
| 275 | +# sudo ./simple_update_RHEL_script.sh |
| 276 | + |
| 277 | +# Info: |
| 278 | +# This script is intended for RHEL-based systems. |
| 279 | +# It updates the system and removes unused packages. |
| 280 | +# It checks if a system restart is required and restarts the system if necessary. |
| 281 | +# It is important that the script is run as root. |
| 282 | + |
| 283 | +# Using: |
| 284 | +# sudo chmod +x simple_update_RHEL_script.sh |
| 285 | +# sudo ./simple_update_RHEL_script.sh |
| 286 | + |
| 287 | + |
| 288 | + |
| 289 | +# Automatisches Update-Script für RHEL-basierte Systeme / Automatic update script for RHEL-based systems |
| 290 | + |
| 291 | +echo "=================================================================" |
| 292 | +echo " Automatisches System-Update / Automatic system update" |
| 293 | +echo " (RHEL/Fedora/CentOS)" |
| 294 | +echo "=================================================================" |
| 295 | + |
| 296 | +# Prüfen, ob root-Rechte vorhanden sind / Check if root privileges are present |
| 297 | +if [ "$EUID" -ne 0 ]; then |
| 298 | + echo "Bitte führen Sie dieses Script als root aus (sudo) / Please run this script as root (sudo)." |
| 299 | + exit 1 |
| 300 | +fi |
| 301 | + |
| 302 | +# Prüfen, ob apt verfügbar ist / Check if apt is available |
| 303 | +if ! command -v dnf >/dev/null 2>&1; then |
| 304 | + echo "Kein 'dnf'-Paketmanager gefunden. Dieses Script funktioniert nur auf RHEL-basierten Systemen / No 'dnf' package manager found. This script only works on RHEL-based systems." |
| 305 | + exit 2 |
| 306 | +fi |
| 307 | + |
| 308 | +# Paketquellen aktualisieren / Update package sources |
| 309 | +echo "Aktualisiere Paketquellen und Installation von Updates/ Update package sources and update packges" |
| 310 | +dnf update -y |
| 311 | + |
| 312 | +# Nicht mehr benötigte Pakete entfernen / Remove unused packages |
| 313 | +echo "Entferne nicht mehr benötigte Pakete / Remove unused packages" |
| 314 | +dnf autoremove -y |
| 315 | + |
| 316 | +# Paketdatenbank bereinigen / Clean up cached package data |
| 317 | +echo "Bereinige zwischengespeicherte Paketdaten / Clean up cached package data" |
| 318 | +dnf clean all |
| 319 | + |
| 320 | +echo "=================================================================" |
| 321 | +echo " System-Update abgeschlossen / System update completed" |
| 322 | +echo "=================================================================" |
| 323 | + |
| 324 | +# Überprüfen ob ein Neustart des Systems erforderlich ist / Check if a system restart is required |
| 325 | +if [ -f /var/run/reboot-required ]; then |
| 326 | + echo "Ein Neustart des Systems ist erforderlich. Das System wird jetzt neu gestartet / A system restart is required. The system will now restart." |
| 327 | + reboot |
| 328 | +fi |
| 329 | + |
| 330 | +# Ende des Scripts / End of script |
| 331 | + |
| 332 | +``` |
| 333 | +
|
| 334 | +## Schritt 11 - Bash-Update-Script ausführbar machen |
| 335 | +Damit wir das Bash-Update-Script auch nutzen / ausführen können, muss das Script noch mit dem entsprechenden Rechten versehen werden. |
| 336 | +
|
| 337 | +**Script-Rechte anpassen** |
| 338 | +
|
| 339 | +```sh |
| 340 | +# Sript-Rechte anpassen |
| 341 | + |
| 342 | +sudo chmod +x simple_update_RHEL_script.sh |
| 343 | + |
| 344 | +``` |
| 345 | +
|
| 346 | +**Bash-Update-Script ausführen** |
| 347 | +
|
| 348 | +```sh |
| 349 | +# Möglichkeit 1: Ausführen des Bash-Scripts |
| 350 | + |
| 351 | +sudo sh simple_update_RHEL_script.sh |
| 352 | + |
| 353 | +# Möglichkeit 2: Ausführung des Scripts |
| 354 | + |
| 355 | +sudo ./simple_update_RHEL_script.sh |
| 356 | + |
| 357 | +``` |
| 358 | +
|
| 359 | +## Fazit zum Bash-Scripting |
| 360 | +Wer effizient mehrere Linux-Server zu administrieren hat, kommt an Bash- / oder Python-Scripting meiner Meinung nicht vorbei. |
| 361 | +
|
| 362 | +Natürlich gibt es zum Beispiel auch mächtige Tools wie [**Ansible**](https://docs.ansible.com/ansible/latest/index.html) für die Automatisierung von Deployment, Wartung, etc., aber ist das Lernen einer Script-Sprache in meinen Augen der beste Anfang. |
| 363 | +
|
| 364 | +<!-- FM:Snippet:Start data:{"id":"Help deutsch","fields":[]} --> |
| 365 | +> ## Fragen und Antworten |
| 366 | +> |
| 367 | +> Wenn Sie Fragen oder Feedback zu diesem Blog oder YouTube-Kanal haben, nutzen Sie bitte meine Hilfeseite. Dort finden Sie Fragen und Antworten zu den verschiedenen Beiträgen. Sie können dort auch gerne Ihre eigene Frage stellen. |
| 368 | +> |
| 369 | +> [**Zur Hilfeseite**](https://help.secure-bits.org) |
| 370 | +<!-- FM:Snippet:End --> |
| 371 | +
|
| 372 | +
|
| 373 | +
|
0 commit comments