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.
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 :-)
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.
Gab doch sogar hier Mal eine Anleitung, glaub zwar für GitHub aber die Oberflächen unterscheiden sich nur minimal.
> 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.
Magst du das nicht mal auf CodeBerg oder so stellen? Dann kann man MR stellen für Verbesserungen.
> 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.
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.
Finde ich nun etwas schade, dass Gentoo nicht unterstützt ist. Magst du das nicht so? Gentoo ist die Basis für viele Distributionen...
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
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. 😄
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.
Hier mal eine von mir Überarbeitete Version: https://paste.rollenspiel.monster/?650cfc585231d08f#FMns62D5JQ2R6KRQ3mo1oYr1PBQwLx6FbwpErZdSRQVZ
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
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.
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
Das relevante xlcd comic dazu: https://xkcd.com/1654/
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.