Ich hab mal weiter am Script gearbeitet; mittlerweile übertreib ich wohl ein wenig xD
Danke fürs Teilen.
Ich nutze das Script mittlerweile fast täglich. Der Aufwand hat sich auf jeden Fall gelohnt, spart doch eine Menge Zeit ein.
Ich hab mal weiter am Script gearbeitet; mittlerweile übertreib ich wohl ein wenig xD
Danke fürs Teilen.
Ich nutze das Script mittlerweile fast täglich. Der Aufwand hat sich auf jeden Fall gelohnt, spart doch eine Menge Zeit ein.
Überseh ich grad was? Bash arbeitet ja von oben nach unten, dann wird jetzt erst 4 mal die obere schleife ausgeführt, dann gewartet und dann 4 mal die untere. Sehe jetzt keinen Vorteil.
Ja, übersiehst du
Ich starte die Prozesse fast zeitgleich und verschiebe sie in den Hintergrund. Habe unmittelbar vor dem wait ein jobs eingefügt, um mir die laufenden Hintergrundprozesse anzeigen zu lassen.
Noch in der gleichen Sekunde nach dem Start sind alle 8 Prozesse (im Beispielscript waren es nur 4) im Hintergrund gestartet und werden parallel abgearbeitet.
Insgesamt benötigt der Durchlauf 8 Sekunden, beim alten Script waren es 26 Sekunden.
## Start des Scripts: So 3. Apr 06:38:10 CEST 2022
## jobs
[1] Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[2] Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[3] Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[4] Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[5] Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[6] Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[7]- Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
[8]+ Läuft $(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
## nach Ende der 1. Schleife, vor dem wait: So 3. Apr 06:38:10 CEST 2022
## wait
...
## Ende des Scripts: So 3. Apr 06:38:18 CEST 2022
Alles anzeigen
Ich überlege gerade wie man das machen könnte das alle abfragen gleichzeitig getätigt werden und man nicht so lange warten muss.
Habe jetzt die SSH-Abfragen als Hintergrundprozess laufen, geht jetzt schon deutlich flotter.
Da ich aber nicht weiß, wie ich den Rückgabewert aus einem Hintergrundprozess in eine Variable bekomme, habe ich das ganze temporär nach /dev/shm geschrieben.
#!/bin/bash
hosts=(
"xxx@IP:Pihole"
"xxx@IP:Syncthing"
"xxx@IP:MariaDB"
"xxx@IP:ioBroker"
)
for host in ${hosts[@]}
do
IFS=":" item=( $host )
$(ssh ${item[0]} "sudo apt update >/dev/null 2>&1 && apt-get -s dist-upgrade | grep 'Inst'" > /dev/shm/${item[1]}) &
done
wait
for host in "${hosts[@]}"
do
IFS=":" item=( $host )
echo "### ${item[1]}"
cat "/dev/shm/${item[1]}"
done
exit 0
Alles anzeigen
D.h. deine SSH-Keys sind ohne Passwort?
Im heimischen Netzwerk ohne Passwort, extern mit Passwort.
Und wenn du das Update machst wenn du eingeloggt bist fehlt dir jetzt aber das Datum; wäre es nicht sinniger einen hook einzubauen der die log immer schreibt wenn du apt upgrade ausführst?
Stehe irgendwie auf dem Schlauch, verstehe deine Frage nicht.
Ich frage doch nur das Datum des letzten Upgrades ab, dass wird doch durch apt update gar nicht beeinflusst.
Wie hast du dann jetzt deine Unterschiedlichen Update Commands gelöst?
Habe das Script noch etwas aufgeräumt und die SSH-Anmeldedaten in der .ssh/config hinterlegt.
# ~/.ssh/config
Host server
HostName 192.168.178.50
User xxx
IdentityFile ~/.ssh/id_home
Host pihole
HostName 192.168.178.51
User xxx
IdentityFile ~/.ssh/id_home
Host syncthing
HostName 192.168.178.52
User xxx
IdentityFile ~/.ssh/id_home
Alles anzeigen
Sieht gleich etwas übersichtlicher aus und der einfache Aufruf "ssh server" verbindet mich mit dem Homeserver.
Meine zusätzlich, speicher doch das Ergebens in eine variable und werte es 2 mal aus?
Allerdings fehlt diese Zeile bei Archlinux und ich habe mich jetzt für ein einheitliches Layout entschieden.
Zusammengefasst ist es genau das was ich haben wollte, vielen Dank für deine Hilfe Tealk .
Warum benutzt du nicht den Schnipsel für deb?
Weil ich sehen möchte, welche Pakete aktualiert werden können.
Sollte ich mich umentscheiden, dann ist das schnell getan. Ist ja nur eine Stelle im Script anzupassen.
Bin gerade noch dabei, die Anzahl der Updates einzubauen.
Für Archlinux klappt es schon, Debian hat gerade keine offenen Updates, muss ich später testen.
GIbt nen grund warum case und kein IF? Weil dann könntest du schöner Fehler abfangen. Tippfehler oder Einträge die es nicht gibt.
Nein, gibt keinen besonderen Grund. Kam mir halt als erstes in den Sinn.
Die Idee mit dem Online-Status ist gut, werde ich noch einbauen...danke.
du kannst oben einfach noch etwas mit : hingen anfügen, so wie namen und userip getrennt sind und das dann mit ${item[2]} bis unendlich weiter führen
Habe ich auch schon gemacht.
So sieht's jetzt aus
#!/bin/bash
hosts=(
"Homeserver:xxx@192.168.178.50:Archlinux"
"Pihole:xxx@192.168.178.51:Debian"
"Syncthing:xxx@192.168.178.52:Debian"
"TVheadend:xxx@192.168.178.53:Debian"
"Oscam:xxx@192.168.178.54:Ubuntu"
"Deconz:xxx@192.168.178.55:Debian"
"MariaDB:xxx@192.168.178.56:Debian"
"ioBroker:xxx@192.168.178.57:Debian"
"Airsonic:xxx@192.168.178.54:Debian"
"Gitea:xxx@192.168.178.61:Archlinux"
)
# Keyfile
cert="~/.ssh/id_home"
# Farben
NORMAL='\033[0;39m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
clear
for host in "${hosts[@]}"; do
IFS=":" item=( $host )
echo -e "$GREEN###$NORMAL ${item[0]} $YELLOW ${item[2]} $NORMAL"
case ${item[2]} in
Debian | Ubuntu)
ssh -i "$cert" "${item[1]}" "sudo apt update >/dev/null 2>&1 && \
apt-get --just-print dist-upgrade | awk '/^Inst/ { print $2 }'"
;;
Archlinux)
ssh -i "$cert" "${item[1]}" "checkupdates"
;;
esac
echo
done
exit 0
Alles anzeigen
Tealk : Danke für deinen Input
Musste zuerst noch das Problem lösen, dass "apt update" nur zusammen mit sudo funktioniert.
Um die Passwortabfrage zu vermeiden, habe ich in der Sudoers "apt update" vom Passwort "befreit". Hoffe mal, dass stellt jetzt kein Sicherheitsproblem dar. Aber in meinem Fall sind die Rechner eh nur von Zuhause aus erreichbar.
# /etc/sudoers
NUTZER ALL=(ALL:ALL) ALL,NOPASSWD:/usr/bin/apt update
# oder
%sudo ALL=(ALL:ALL) ALL,NOPASSWD:/usr/bin/apt update
Das läuft jetzt schon mal sauber ohne Passwort durch
ssh NUTZER@192.168.178.54 "sudo apt update >/dev/null 2>&1 && apt-get --just-print dist-upgrade | awk '/^Inst/ { print $2 }'"
Eine Schleife ist eine gute Idee, muss aber berücksichtigen, dass ich neben Debian auch noch Archlinux habe. Also irgendwo noch eine Bedingung einbauen.
Bringt das dist-upgrade überhaupt was wenn du davor nicht die repos updatest; also ohne apt update?
Mist, du hast recht.
Da hatte ich wohl vorab ein apt update gemacht und konnte mich nicht mehr daran erinnern.
Also muss ich weiter nach einer Lösung suchen.
Grundsätzlich schon, erfordert aber Root-Rechte. Ich wollte eine Passwortabfrage vermeiden.
Unter Archlinux gibt's ja den Befehl "checkupdates", der funktioniert ohne sudo. Sowas habe ich auch für apt gesucht.
Habe gerade wieder einen Punkt auf meiner ToDo-Liste erledigt, vielleicht ist es ja für den einen oder anderen interessant. Sorry. wenn es etwas länger wird.
Wer kennt es nicht, ihr habt diverse VM / Container oder Raspberries am Laufen und müsst regelmäßig manuell nachschauen, ob Updates vorhanden sind.
+-----------+---------+-----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-----------+---------+-----------------------+------+-----------+-----------+
| airsonic | RUNNING | 192.168.178.59 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| deconz | RUNNING | 192.168.178.55 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| gitea | RUNNING | 192.168.178.61 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| iobroker | RUNNING | 192.168.178.57 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| mariadb | RUNNING | 192.168.178.56 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| oscam | RUNNING | 192.168.178.54 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| pihole | RUNNING | 192.168.178.51 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| syncthing | RUNNING | 192.168.178.52 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
| tvheadend | RUNNING | 192.168.178.53 (eth0) | | CONTAINER | 0 |
+-----------+---------+-----------------------+------+-----------+-----------+
Alles anzeigen
Also fassen wir diese Abfragen in einem Script zusammen.
Voraussetzung
Zum Script
#!/bin/bash
echo "########## Homeserver | Archlinux ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.50 "checkupdates"
echo
echo "########## Pihole | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.51 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## Syncthing | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.52 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## TVheadend | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.53 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## Oscam | Ubuntu ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.54 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## Deconz | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.55 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## MariaDB | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.56 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## ioBroker | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.57 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## Airsonic | Debian ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.59 "apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'"
echo
echo "########## Gitea | Archlinux ############################################"
ssh -i ~/.ssh/id_home NUTZERNAME@192.168.178.61 "checkupdates"
exit 0
Alles anzeigen
Und so sieht's dann aus. Auf dem Homeserver, Oscam und Gitea liegen Updates vor.
########## Homeserver | Archlinux ############################################
grub 2:2.06-4 -> 2:2.06-5
linux-lts 5.15.31-1 -> 5.15.32-1
linux-lts-headers 5.15.31-1 -> 5.15.32-1
samba 4.16.0-1 -> 4.16.0-2
smbclient 4.16.0-1 -> 4.16.0-2
sqlite 3.38.1-1 -> 3.38.2-1
util-linux 2.37.4-1 -> 2.38-1
util-linux-libs 2.37.4-1 -> 2.38-1
zlib 1:1.2.11-5 -> 1:1.2.12-1
########## Pihole | Debian ############################################
########## Syncthing | Debian ############################################
########## TVheadend | Debian ############################################
########## Oscam | Ubuntu ############################################
Inst libnetplan0 [0.103-0ubuntu5~20.04.6] (0.104-0ubuntu2~20.04.1 Ubuntu:20.04/focal-updates [amd64])
Inst netplan.io [0.103-0ubuntu5~20.04.6] (0.104-0ubuntu2~20.04.1 Ubuntu:20.04/focal-updates [amd64])
########## Deconz | Debian ############################################
########## MariaDB | Debian ############################################
########## ioBroker | Debian ############################################
########## Airsonic | Debian ############################################
########## Gitea | Archlinux ############################################
libsysprof-capture 3.42.1-3 -> 3.44.0-1
sqlite 3.38.1-1 -> 3.38.2-1
util-linux 2.37.4-1 -> 2.38-1
util-linux-libs 2.37.4-1 -> 2.38-1
zlib 1:1.2.11-5 -> 1:1.2.12-1
Alles anzeigen