Distributionsübergreifendes Update Skript

  Ephraim   Lesezeit: 6 Minuten  🗪 17 Kommentare

Vorstellung meines Bash Skriptes zum Updaten von Linux Distros.

distributionsübergreifendes update skript

Es gab eine Zeit, in der ich relativ viele VM's laufen hatte und auch mehrere Rechner mit verschiedenen Distros gewartet habe, weshalb ich mich damals (Anfang 2022) dazu entschied mir ein Skript zu basteln, welches die meisten Distros updated.

Ein Gedanke war, das Skript auch anderen Leuten zur Verfügung zu stellen. Weshalb viele der (meistens) unwichtigen Informationen nicht angezeigt werden. Ich hatte sogar mal angefangen eine GUI dafür zu schreiben, nur leider habe ich von höherem "Programmieren" als Bash oder HTML keine Ahnung. Einsatz gefunden hat es auf allen meinen privaten Rechnern und auf den Schulrechnern meiner ehemaligen Schule. Es ist immer wieder lustig, dass man sofort als "Hacker" abgestempelt wird, sobald man ein Terminal öffnet. :D


Das ist jedenfalls das Skript. (Die Datei heisst bei mir updates.sh)

#!/bin/bash
mkdir -p ~/.cache/updates
# Output Datei wird nur zur sicherheit angelegt. Sollte etwas schiefgehen, können dort noch ein paar Infos abgerufen werden.
output=~/.cache/updates/updates_info.txt
echo "Dieses Skript Installiert Updates auf dem Computer"
sudo echo "Die Paketdatenbank wird abgerufen. Das kann einen Moment dauern."
date >> $output
if uname -r | grep -q -i -e 'arch' -e 'manjaro'; then
    sudo pacman -Sy 1>> $output
    yay -Su || sudo pamac update; sudo pamac upgrade || sudo pacman -Su
    sudo pacman -Rcs $(pacman -Qdtq)
elif uname -a | grep -q -i -e 'Ubuntu' -e 'Debian'; then
    sudo apt-get update 1> $output
    sudo apt-get upgrade && sudo apt autoremove && echo "Alle Updates wurden erfolgreich durchgeführt"
    sudo snap refresh 2>> $output
elif uname -a | grep -q -i 'fedora'; then
    sudo dnf check-update
    sudo dnf update && echo "Alle Updates wurden erfolgreich durchgeführt"
    sudo dnf autoremove
elif uname -a | grep -q -i 'pae'; then
    sudo zypper dup -d 1> $output
    sudo zypper dup && echo "Alle Updates wurden erfolgreich durchgeführt"
else
# Sollte keine der Distributionen genutzt werden, werden alle Optionen einmal durchprobiert.
      sudo dnf update  && echo "Alle Updates wurden erfolgreich durchgeführt"
      sudo pacman -Syu && echo "Alle Updates wurden erfolgreich Abgeschlossen"
      sudo apt-get update -y && echo "Alle Update Informationen wurden erfolgreich geholt"
      sudo apt-get upgrade && echo "Alle Updates wurden erfolgreich durchgeführt" && sudo apt autoremove
      sudo zypper dup && echo "Alle Updates wurden erfolgreich durchgeführt"
fi
echo ""
echo "Folgende Flatpaks können Aktualisiert werden:"
flatpak update 2>> $output
echo ""
echo "Folgende Flatpaks werden nicht mehr benötigt und können deinstalliert werden:"
flatpak uninstall --unused 2>> $output || echo "Flatpak ist nicht installiert, keine Flatpaks zum entfernen vorhanden"

Im ersten Teil des Skriptes wird eine Output-Datei angelegt, in der ein paar der Daten (wenn auch zumindest unter Archlinux keine allzu wichtigen) über den Update-Prozess gespeichert werden. Ich dachte mir zwar anfangs, dass die Datei nach einer Weile riesig werden muss, allerdings ist meine Datei gerade etwa fünf Monate alt (ich update fast jeden Tag) und noch nicht mal 30 Kilobyte gross. Eine einfache Textdatei verbraucht also zum Glück nicht viel Speicherplatz.

Im "zweiten Teil" des Skriptes werden Distributionen abgefragt, um diese zu Updaten. Das wird so gemacht, weil es viel schneller ist, als einfach nur alles nacheinander abzufragen.

Mit dieser Lösung wird festgestellt, dass auf dem Rechner z.B. Fedora genutzt wird, sodass gar nicht erst probiert wird `apt-get` auszuführen. Sollte weder Arch, Manjaro, Ubuntu, Debian, Fedora oder OpenSuse benutzt werden, werden einfach nur die verschiedenen Paketmanager aufgerufen, was dann entsprechend länger dauert. **Zu beachten ist dabei, dass die *if*-Schleife bei mehr Distributionen als den genannten funktioniert**, da manche Distros keinen eigenen Kernel kompilieren, sondern den der Mutter-Distribution nutzen. Linux Mint nutzt z.B. einen Ubuntu Kernel, da es auf Ubuntu basiert.

Nachdem die Updates über den normalen Paketmanager gelaufen sind, wird bei allen Distributionen geschaut, ob es Flatpaks gibt, bei denen ein Update offen ist, oder die nicht mehr benötigt werden.

Eine weitere Tätigkeit, die das Skript mir abnimmt, ist die Deinstallation von nicht mehr benötigten Paketen. Diese fallen an, wenn ein Programm deinstalliert wird, allerdings nicht alle Abhängigkeiten mit entfernt werden. Da beim Basteln zwar viele dieser Pakete anfallen, habe ich es irgendwann einfach mit in das Skript eingebaut, da es nicht lange dauert und ich die Pakete ansonsten sowieso per Hand löschen würde.

Probleme

Beim Betrachten des Codes ist einigen vielleicht aufgefallen, dass bei dem Skript mehrere Probleme bestehen:

1. Sollte weder `yay` noch `pamac` installiert sein, werden Pakete aus dem AUR nicht mit Updates versorgt.
2. Snap Pakete werden nur unter Ubuntu (bzw. auch Debian, damit das Skript nicht unnötig verlängert wird) geupdated.
3. gibt es natürlich noch mehr, als die unterstützten Distributionen.

Das erste Problem ist darin begründet, dass ich annehme, dass fast alle Nutzer von Archlinux basierten Distributionen einen der beiden Dienste nutzen. Manjaro verwendet pamac, endeavour OS yay. Deshalb habe ich mich entschieden nur diese beiden Dienste abzufragen, im Zweifelsfall lassen sich ja Abfragen für weitere Dienste hinzufügen.

Snap wird nur bei Ubuntu abgefragt, da ich Snap nicht leiden kann und vor allem auch annehme, dass es ausserhalb von Ubuntu nicht viel Einsatz findet.

Das dritte Problem besteht deshalb, weil ich andere Distributionen weder nutze (noch denke, dass sie allzu viel eingesetzt werden), noch über viel Wissen über diese verfüge.

Ich finde, bei allen Problemen ist zu merken, dass ich das Skript primär für meinen eigenen Einsatz geschrieben habe - mich betreffen sie nicht.

Mein Einsatz des Skriptes

Wie bereits erwähnt, läuft das Skript bei mir auf fast allen Computern. Da es aber auf Dauer etwas nervig ist, jedes Mal `~/.updates.sh` ins Terminal zu tippen, habe ich mir in der bashrc Datei (`/home/USER/.bashrc`) einen alias eingerichtet: `alias update='/home/ephraim/.updates.sh'`. Dadurch brauche ich zum Updaten nur noch `upd` eintippen und mit der Tab-Taste den Befehl vervollständigen.

Letztlich hat das Skript meinen Update-Prozess deutlich beschleunigt. Vorher habe ich die Updates grafisch über Pamac gemacht, heute mit meinem Skript, was viel schneller (es muss kein aufwändiges Programm gestartet werden) und informativer ist. Ich hoffe, mein Skript kann auch der einen oder anderen Person aus der Community behilflich sein.

Tags

Update, bash, Distribution

Beat Jäckle
Geschrieben von Beat Jäckle am 6. Oktober 2023 um 12:11

Danke für das Skript. Magst du es auf codeberg.org o.ä. hosten? Mit welcher Lizenz dürfen wir dein Skript verwenden? (z.B. GPL3+)

Vielleicht werde ich einen Pullrequest zukommen lassen, wenn du möchtest :-)

Ephraim
Geschrieben von Ephraim am 6. Oktober 2023 um 19:09

Leider habe ich überhaupt keine Ahnung von Git, das Skript kannst du aber gerne Verwenden wie du magst.:)

Gibt es denn eine gute Einführung in Git und Codeberg o.ä.? Ich wäre grundsätzlich schon an so etwas interessiert.

Tealk
Geschrieben von Tealk am 6. Oktober 2023 um 22:42

Gab doch sogar hier Mal eine Anleitung, glaub zwar für GitHub aber die Oberflächen unterscheiden sich nur minimal.

tux0r
Geschrieben von tux0r am 6. Oktober 2023 um 12:46

> Zu beachten ist dabei, dass die if-Schleife bei mehr Distributionen als den genannten funktioniert

Es gibt keine if-Schleifen. if wird exakt einmal durchlaufen.

YoSiJo
Geschrieben von YoSiJo am 6. Oktober 2023 um 13:47

Magst du das nicht mal auf CodeBerg oder so stellen? Dann kann man MR stellen für Verbesserungen.

tux0r
Geschrieben von tux0r am 6. Oktober 2023 um 14:10

> Zu beachten ist dabei, dass die if-Schleife bei mehr Distributionen als den genannten funktioniert, da manche Distros keinen eigenen Kernel kompilieren, sondern den der Mutter-Distribution nutzen.

Es geht nicht um den Kernel, sondern um den Paketmanager.

Ephraim
Geschrieben von Ephraim am 6. Oktober 2023 um 19:11

In den Fall checkt das Skript aber, mithilfe des Kernels welchen Paketmanager es verwenden soll. Bestimmt nicht optimal, aber das beste/erste was mir eingefallen ist.

Dieter
Geschrieben von Dieter am 6. Oktober 2023 um 15:28

Finde ich nun etwas schade, dass Gentoo nicht unterstützt ist. Magst du das nicht so? Gentoo ist die Basis für viele Distributionen...

Tealk
Geschrieben von Tealk am 6. Oktober 2023 um 16:25

Wenn du Gentoo verwendest, hier mal eine version die das unterstützen sollte; kannst du mal prüfen ob die Commands stimmen? Kenn mich mit Gentoo nicht aus, hab nur mal aus dem Netz kopiert was ich gefunden habe: https://paste.rollenspiel.monster/?32f2179c4f0fadd7#9d9nEYxzkvVwed5WutmNaGfVGEGjS69os2b1Frhg4WvU

Dieter
Geschrieben von Dieter am 6. Oktober 2023 um 21:14

Der Paketmanager Portage ist ein schweizer Taschenmesser

Ich würde emerge -avuDU @world machen

machen. Das -U steht für "--changed-use" also wenn sich USE Flags ändern, Profilupdate oder in der make.conf. Vorher stand da -N für "newuse". Aber da ein Rebuild von Paketen für neue USE Flags in 99% nicht norwendig ist, ist das halt nicht notwendig.

Aber da du auch ein --depclean loslässt, wäre wenn da was passiert, ein newuse anschließend empfohlen.

emerge -avuDN @world

auf jeden falle sollte ein:

emerge -a @preserved-rebuild

nach --depclean kommen.

Aber mein Posting war auch ein Witz, der Paketmanager ist zu komplex für ein kleines Script. 😄

Tealk
Geschrieben von Tealk am 6. Oktober 2023 um 15:34

Warum Prüfst du nicht einfach ob der Command existiert und fürst darauf basierend die Updates aus? Z.B. yay wird kaum auf einem Debian installiert sein

Genauso kannst du dann mit flat und SNAP verfahren und damit das für alle Distros bereit stellen.

Tealk
Geschrieben von Tealk am 6. Oktober 2023 um 16:21
Tealk
Geschrieben von Tealk am 6. Oktober 2023 um 16:38

Ich war mal so frei und hab es in ein Repo gepackt, nachdem ich hier noch ein paar Kommentare gefunden habe, was man erweitern könnte: https://codeberg.org/Tealk/systemupdate Wenn du willst, kann ich dir das auch gern überschreiben @Ephraim

Ephraim
Geschrieben von Ephraim am 6. Oktober 2023 um 19:27

Cool, vielen Dank.

"command" kannte ich z.B. noch gar nicht. Damit lässt sich natürlich einiges verbessern, da hast du recht... Generell fände ich es schon cool, deine Änderungen zu übernehmen. Aus irgendeinem Grund funktioniert dein Skript bei mir übrigens nicht. Beim Updaten von Flatpaks kann ich nicht bestätigen (es wird automatisch n ausgegeben) und Nach Arch Updates scheint nicht gesucht zu werden (zumindest wird es nicht angezeigt und es läuft auch zu schnell durch). LG, Ephraim.

Tealk
Geschrieben von Tealk am 6. Oktober 2023 um 22:41

Hey, kannst mich ja Mal auf Matrix anschreiben: https://matrix.to/#/@tealk:rollenspiel.chat

Also arch hat bei mir geklappt, flatpak hab ich nicht aufgepasst, wahrscheinlich muss man noch paar -y Schalter einbauen

kaligule
Geschrieben von kaligule am 6. Oktober 2023 um 23:05

Das relevante xlcd comic dazu: https://xkcd.com/1654/

Claudia
Geschrieben von Claudia am 7. Oktober 2023 um 13:31

Danke für Dein Skript - Ich werde es etwas anpassen, dass es für mich übersichtlicher ist. Mein Skript wird dann auf Codeberg.com liegen. Die URL lautet "https://codeberg.org/claudia_33155/linux-multi-update-script". Dein Skript war der erste push und habe es hier her verlink, damit die Quelle vom Skript-Code auch bei liegt.

Kleiner Tipp es ist eine IF-Bedingung und keine Schleife. In der Programmierung sind Schleifen nur for und while, dann gibt es noch Kopf-bzw.Fuß-gesteuerte Schleifen. Aber dies soll kein Tutorial für die Programmierung sein.