From 13f240dbaa17acf74844c2f2d4b5dc03e8130e1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Wed, 10 Nov 2021 17:48:53 +0100 Subject: [PATCH 01/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b56898..3aa54b5 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Pi, check SHA256, and copy to SD-Card, a Bashscript. ## Hilfe raspi-install -h -![alt text](https://github.com/dewomser/Raspi-auto-downloader/blob/main/bilder/help.png "help") +![alt text](./Raspi-auto-downloader/blob/main/bilder/help.png "help") ## Copy and check SD-Image From d6ea7dfe303e52842c7634c7960478dae384188e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Wed, 10 Nov 2021 17:50:31 +0100 Subject: [PATCH 02/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3aa54b5..90260c3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Pi, check SHA256, and copy to SD-Card, a Bashscript. ## Hilfe raspi-install -h -![alt text](./Raspi-auto-downloader/blob/main/bilder/help.png "help") +![alt text](./bilder/help.png "help") ## Copy and check SD-Image From a7c9c704adf2119a45cdb85a3d6f96d0b5469236 Mon Sep 17 00:00:00 2001 From: dewomser Date: Thu, 25 Nov 2021 17:11:18 +0100 Subject: [PATCH 03/29] Ups! Ohne Exit funktioniert das besser /Zeile 33 --- raspi-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index e6ff515..2db7281 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -30,7 +30,8 @@ fi #rimage ="raspios_lite_armhf" #rimage="raspios_full_armhf" -cd "$HOME/Downloads" || exit +cd "$HOME/Downloads" || echo"Downloads Ordner nicht vorhanden" + dirr=$(curl --silent https://downloads.raspberrypi.org/$rimage/images/ | grep -o -E "$rimage-$datum" | tail -1 ) pathr="https://downloads.raspberrypi.org/$rimage/images/$dirr/" From badce00de26a1d276621fb48039cb5a7f7430dfd Mon Sep 17 00:00:00 2001 From: dewomser Date: Fri, 4 Feb 2022 11:51:02 +0100 Subject: [PATCH 04/29] Jetzt mit Raspi 64 und neuer Fehlerseite wenn kein Attribut --- raspi-install.sh | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index 2db7281..75256d0 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -16,16 +16,35 @@ Option Bedeutung -l raspios_lite_armhf Raspberry Pi OS Lite -d raspios_armhf Raspberry Pi OS with desktop -h Diese Hilfe +-f64 raspios_full_arm64 +-l64 raspios_lite_arm64 +-d64 raspios_arm64 " && exit +elif [[ "$attribut" = "-f" ]] +then +rimage="raspios_full_armhf" elif [[ "$attribut" = "-l" ]] then rimage="raspios_lite_armhf" + elif [[ "$attribut" = "-d" ]] then rimage="raspios_armhf" + +elif [[ "$attribut" = "-f64" ]] +then +rimage="raspios_full_arm64" + +elif [[ "$attribut" = "-l64" ]] +then +rimage="raspios_lite_arm64" + +elif [[ "$attribut" = "-d64" ]] +then +rimage="raspios_arm64" + else -rimage="raspios_full_armhf" -attribut="-f" +echo "Kein Pi-Image ausgewählt. \"raspi-install.sh -h \" für Hilfe!" && exit fi #rimage ="raspios_lite_armhf" #rimage="raspios_full_armhf" @@ -34,12 +53,17 @@ cd "$HOME/Downloads" || echo"Downloads Ordner nicht vorhanden" dirr=$(curl --silent https://downloads.raspberrypi.org/$rimage/images/ | grep -o -E "$rimage-$datum" | tail -1 ) +echo dirr :: $dirr pathr="https://downloads.raspberrypi.org/$rimage/images/$dirr/" -rname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip" | head -1) +echo pathr :: $pathr +#rname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip" | head -1) +rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.zip" | head -1) + +echo rname :: $rname wget -c "$pathr""$rname" -O "raspi$attribut".zip -#echo Test kompletter Pfad :: "$pathr""$rname" -shaname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip\.sha256" | head -1) -#echo Test kompletter sha256-Pfad :: $pathr$shaname +echo Test kompletter Pfad :: "$pathr""$rname" +shaname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:alnum:]-]*\.zip\.sha256" | head -1) +echo Test kompletter sha256-Pfad :: $pathr$shaname wget "$pathr""$shaname" -O raspi"$attribut".sha256 echo "Bitte ein paar Sekunden warten. Der Hash wird erzeugt." sha1=$(shasum -a 256 raspi"$attribut".zip | grep -o -P "[0-9a-z]{40,}") From 5bb63744a5b4dd2191889d64dbec15fb594759bc Mon Sep 17 00:00:00 2001 From: dewomser Date: Fri, 4 Feb 2022 11:59:30 +0100 Subject: [PATCH 05/29] shellchecked --- raspi-install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index 75256d0..2156198 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -53,17 +53,14 @@ cd "$HOME/Downloads" || echo"Downloads Ordner nicht vorhanden" dirr=$(curl --silent https://downloads.raspberrypi.org/$rimage/images/ | grep -o -E "$rimage-$datum" | tail -1 ) -echo dirr :: $dirr pathr="https://downloads.raspberrypi.org/$rimage/images/$dirr/" -echo pathr :: $pathr #rname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip" | head -1) rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.zip" | head -1) -echo rname :: $rname wget -c "$pathr""$rname" -O "raspi$attribut".zip -echo Test kompletter Pfad :: "$pathr""$rname" +#echo Test kompletter Pfad :: "$pathr""$rname" shaname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:alnum:]-]*\.zip\.sha256" | head -1) -echo Test kompletter sha256-Pfad :: $pathr$shaname +#echo Test kompletter sha256-Pfad :: $pathr$shaname wget "$pathr""$shaname" -O raspi"$attribut".sha256 echo "Bitte ein paar Sekunden warten. Der Hash wird erzeugt." sha1=$(shasum -a 256 raspi"$attribut".zip | grep -o -P "[0-9a-z]{40,}") From 52496316485ee2f717a28e77ed0eb9f9baa160b5 Mon Sep 17 00:00:00 2001 From: dewomser Date: Wed, 23 Feb 2022 23:01:20 +0100 Subject: [PATCH 06/29] =?UTF-8?q?Achtung=20der=20Downloader=20schreibt=20j?= =?UTF-8?q?etzt=20wirklich=20!=20Abhilfe=20bei=20fehlenden=20Rootrechten?= =?UTF-8?q?=20werden=20erkl=C3=A4rt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspi-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index 2156198..0945b47 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -103,7 +103,7 @@ echo Ich bin mir SICHER und will auf SD-Karte schreiben : /dev/"${laufwerke2[0]} read -r endgueltigja if [ "$endgueltigja" == "y" ]; then # das hier aktivieren --TOTENKOPF--- zum Schreiben -#unzip -p raspi"attribut".zip | dd of=/dev/${laufwerke2[0]} bs=4M conv=fsync status=progress +unzip -p raspi"attribut".zip | dd of=/dev/${laufwerke2[0]} bs=4M conv=fsync status=progress echo "Tatatatah ! fertig" else exit From 4a56da9763e5291981441876debc0ac3d839d600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Wed, 23 Feb 2022 23:13:27 +0100 Subject: [PATCH 07/29] Achtung Schreibt jetzt --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 90260c3..a9b6bad 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Load fresh images for the Raspberry Pi, check SHA256, and copy to SD-Card, a Bashscript. +Jetzt auch mit den 64er Images + ## Hilfe raspi-install -h ![alt text](./bilder/help.png "help") @@ -14,4 +16,15 @@ Pi, check SHA256, and copy to SD-Card, a Bashscript. ![alt text](https://github.com/dewomser/Raspi-auto-downloader/blob/main/bilder/copy.png "copy and check") ## Fork, Issue, Pull request, Clone -Be carefull, this script is in status Alpha 0.2. ! +Be carefull, this script is in status Beta 0.2. ! + +## Bei fehlenden Rootrechten zum Schreiben auf SD-Karte + +Wenn die Karte nur als Root gemountet werden kann, muss dd durch sudo dd ersetzt werden. umount -> sudo umount. Gilt ab Zeile 105 + +### Alternative für Ubuntu: + +echo 'KERNEL=="sd*", SUBSYSTEMS=="usb", MODE="0666"' | sudo tee /etc/udev/rules.d/99-usb-storage.rules + +Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo + From 1fdf9dc29d56e44260bc920cbc7e8c7f833e8738 Mon Sep 17 00:00:00 2001 From: dewomser Date: Wed, 23 Feb 2022 23:23:48 +0100 Subject: [PATCH 08/29] sorry falsches Repository, aber jetzt ! --- raspi-install.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index 0945b47..55ff2d7 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -1,7 +1,7 @@ #!/bin/bash # gemacht von Stefan Höhn #https://github.com/dewomser/Raspi-auto-downloader - +#ACHTUNG : Zeile 106-112 Beachten ! attribut=$1 datum="[0-9]{4}-[0-9]{2}-[0-9]{2}" @@ -102,9 +102,18 @@ echo Ich bin mir SICHER und will auf SD-Karte schreiben : /dev/"${laufwerke2[0]} read -r endgueltigja if [ "$endgueltigja" == "y" ]; then -# das hier aktivieren --TOTENKOPF--- zum Schreiben -unzip -p raspi"attribut".zip | dd of=/dev/${laufwerke2[0]} bs=4M conv=fsync status=progress + +# Wenn die Karte nur als root gemountet werden kann, muss dd durch sudo dd ersetzt werden. umount -> sudo umount +# Alternative für Ubuntu: +# echo 'KERNEL=="sd*", SUBSYSTEMS=="usb", MODE="0666"' | sudo tee /etc/udev/rules.d/99-usb-storage.rules +# Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo + +# Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" +umount /dev/${laufwerke2[0]}[0-9] +echo "Fehler umount … nicht eingehängt oder nicht gefunden ist nicht schlimm." +unzip -p raspi$attribut.zip | dd of=/dev/${laufwerke2[0]} bs=4M conv=fsync status=progress || echo "Es gibt Probleme, Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" +umount /dev/${laufwerke2[0]}[0-9] else exit fi From 038ba40494a3f54b29582d220eaeed352672f9d2 Mon Sep 17 00:00:00 2001 From: dewomser Date: Wed, 23 Feb 2022 23:40:15 +0100 Subject: [PATCH 09/29] =?UTF-8?q?Der=20shellcheck=20schon=20wieder=20?= =?UTF-8?q?=E2=80=A6=20Grrr=20.=20Hoffentlich=20hilfts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspi-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index 55ff2d7..391d5c4 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -109,11 +109,11 @@ if [ "$endgueltigja" == "y" ]; then # Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" -umount /dev/${laufwerke2[0]}[0-9] +umount /dev/"${laufwerke2[0]}"[0-9] echo "Fehler umount … nicht eingehängt oder nicht gefunden ist nicht schlimm." -unzip -p raspi$attribut.zip | dd of=/dev/${laufwerke2[0]} bs=4M conv=fsync status=progress || echo "Es gibt Probleme, Ab Zeile 105 gibts Hilfe" +unzip -p raspi"$attribut".zip | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme, Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" -umount /dev/${laufwerke2[0]}[0-9] +umount /dev/"${laufwerke2[0]}"[0-9] else exit fi From ee04158e7329431fc1958d4c3722dade06010bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Wed, 23 Feb 2022 23:48:56 +0100 Subject: [PATCH 10/29] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9b6bad..641fb7e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Pi, check SHA256, and copy to SD-Card, a Bashscript. Jetzt auch mit den 64er Images -## Hilfe raspi-install -h +## Hilfe raspi-install.sh -h ![alt text](./bilder/help.png "help") From d84dbdbff2ddc1a91b368c61fd0cdd7edc9d4df6 Mon Sep 17 00:00:00 2001 From: dewomser Date: Thu, 24 Feb 2022 01:01:55 +0100 Subject: [PATCH 11/29] aktualisiertes help.png --- bilder/help.png | Bin 7686 -> 16440 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bilder/help.png b/bilder/help.png index fd4eef86a084a29df01f4f4269eaf263d0458a5e..765ba88c354a90637ab837f42bfae48766aa3c8d 100644 GIT binary patch literal 16440 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

`2x+S=4Xf9nF(J%w|F>H|JV#HeSXoeEmds z+G5tZeIU>y5CC{g(l%gvTfSd^L5~XData&ZYE8HHUd`e1h1%1c&2m{rq#_b0y-^p2 zrU!H#E%UU3bt&BGzODS1@MG;ar_HwlViM|tSbdRE+^QmV-)KdxEmF{LL0#I>lbq8> z?lgW3Y)d7NF#JA#gwJHb+fm6>rK3}<^NPC%9KTRrWA-w}}>GG|qhHpUsS#wx5bhaGa zmzXX^xGXg~{ z@FrH|>%6WIKO#@aZ&Oa0G|%W^E_MGicULQ9ct8sLt75P6H+i77!Pyb#7XvP5r&?xK z;4&1dmM!qq1DAR^{PJMqib{kSz*cCpDE@(P_0KY(bYb;_;E->2@Sr%n9Vv^$GAL^^U-dtZ`7ry;F36}JG zs~f~O!Ma)y@a(i4*y7^$u zh%auYo$$#IVD?)i#e=U*^q6LlJ$51=b{?%VhE8!iwLS(-&a)$ADX$WZUC~^#Le}u4 z(LKMrV@*mWr^e{fhPIwCxZ16JRgIRWrH}wYiyrZum8ugPh>zzYmq?)bs=kP;_zwK- zGhU`J?dLyez8Z3)f@a#{%{a1en|4;cubk4^U z-y^EC?Q+^t@0Qc;YMYjQN*ezo&K&DkpPCp2#N@%?GX9HVpvVcpulEl{sjHpu!*hSS z)5AoQvJk1?*U3`tE`k}y`xif6&-+3_{6A%J<{Z3h)}?ERGv=rvaUoZPd+XD)S2HPj zxiLj~ToSBq%vBq?>&bnZ0)MLBvhZ>Op1ka$0;|6a`R#pEt@O=0Z2ys@C9rt)<8m;9 zn}3CvLQJssZ?se7Z;^ztYqhet-J4P~qkVQdZW4!MmBb?&Q4Rd*cME9_HtPooa7`mA zr|P*{dXF+P8S_%l{4YbI^iKL?4(x+ZkCO^?0qvXl9* zeuKg@j;O6p@;?9s@u$)Krc;2dR2!3$EtAuPyK{l2pD&prcV?SyKUEFpKeWKC4rv<4 z+XxrX|C?H?u8Hx}J{JH`Te!dvI!$r{{ez{M^Cd z((r-orRBybwYEkkzC11BY&1q(1(jsT^!Aht0HEw>gY+>?hERWUr491yPpPrl-S5lZ zFImAMSoqNEl-+)n-0u`o(|;B>I@$o=qj3C0k++&(Hj z#AWqSH80xUO=Mg4e*pmp|Dk|c9EBITvhjhp-u7^+(+f!gzB?AKYUe8IsbxXjaJj$) zE|*N%eBL_5_VIZN^S^gU*{AB98+FZ}QJyF$3`bp@idYnbQ90L6UoV&|D(JEJfKS;t z3gZQ5p$bTZ`)0X~f8!PqD=$dheT(49R4iMZ)1sa!XF=aTDM13LIYNang&!aPwie;& zc!fteu#O`RJD5z1l3Dv!8=I_3=m4MY{2^~X^bB`_?<0RB4=zk%aEgm(&m8+*98Qj% zq_Cj4KB@`dv0|H#zi5bB24V#$AI)M`58bZ?i*vdtQ|@5MWpH+- z@lKN?z>f|$>w83Spx@5n@kv8Y|4*C*s4Op+?0R4OX1E)1k50wS@+};8U0?*x{dLO4 zNB_uBjl2d+=9{-q`ipwcM{*6|QSov)E z_k7X8Hv#o|pmeinaibacehI&}9A_)>1izj4oXX=`nW@t^v|K5E=h?qcYNf*1#?AJ3 zolg9qgVo~^B^ZD`<$I|P!L_kl0V_p!*A2it8}1zkflNotb3O(Hn6mWAu{e@W`2 zU;dW^W9wV}rxW3*tT&9mP5bA^zq-vpMVWX=Drv+(*M^d~d7*|QWe+${oR N-ztGh-+b`@{{XZ5uUG&8 literal 7686 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 SobN7n0cCl0xiT5Ez<&ckw=jDE From 312a91a6fd62bd8d1e5278b9f8d07211c88a1189 Mon Sep 17 00:00:00 2001 From: dewomser Date: Thu, 24 Feb 2022 18:04:04 +0100 Subject: [PATCH 12/29] Nervige Fehlermelung beim unmounten weg gemacht. --- raspi-install.sh | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index 391d5c4..f24d937 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -109,16 +109,13 @@ if [ "$endgueltigja" == "y" ]; then # Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" -umount /dev/"${laufwerke2[0]}"[0-9] -echo "Fehler umount … nicht eingehängt oder nicht gefunden ist nicht schlimm." -unzip -p raspi"$attribut".zip | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme, Ab Zeile 105 gibts Hilfe" +umount /dev/"${laufwerke2[0]}"[0-9] 1&>2 +unzip -p raspi"$attribut".zip | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" -umount /dev/"${laufwerke2[0]}"[0-9] +umount /dev/"${laufwerke2[0]}"[0-9] 1&>2 else exit fi else echo "Achtung,Prüfsumme stimmt nicht überein !" fi - -#http://downloads.raspberrypi.org/raspios_full_armhf/images/raspios_full_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-full.zip From b0b72d2f9baedfb12514ec90a7cf4f10fcd02c15 Mon Sep 17 00:00:00 2001 From: dewomser Date: Thu, 24 Feb 2022 18:21:40 +0100 Subject: [PATCH 13/29] =?UTF-8?q?Und=20immer=20wieder=20gr=C3=BCsst=20das?= =?UTF-8?q?=20Murmeltier=20..=20shellcheck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspi-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index f24d937..34a9327 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -109,10 +109,10 @@ if [ "$endgueltigja" == "y" ]; then # Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" -umount /dev/"${laufwerke2[0]}"[0-9] 1&>2 +umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 unzip -p raspi"$attribut".zip | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" -umount /dev/"${laufwerke2[0]}"[0-9] 1&>2 +umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 else exit fi From 69b70cfebde99b27789c89086cfc94fa3759fd7b Mon Sep 17 00:00:00 2001 From: dewomser Date: Thu, 5 May 2022 20:46:50 +0200 Subject: [PATCH 14/29] =?UTF-8?q?Gef=C3=A4hrliche=20Testversion=20umgestel?= =?UTF-8?q?lt=20von=20zip=20auf=20xZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspi-install.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/raspi-install.sh b/raspi-install.sh index 34a9327..2f7e57c 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -4,7 +4,7 @@ #ACHTUNG : Zeile 106-112 Beachten ! attribut=$1 datum="[0-9]{4}-[0-9]{2}-[0-9]{2}" - +zipp="xz" if [[ "$attribut" = "-h" ]] then @@ -55,15 +55,16 @@ cd "$HOME/Downloads" || echo"Downloads Ordner nicht vorhanden" dirr=$(curl --silent https://downloads.raspberrypi.org/$rimage/images/ | grep -o -E "$rimage-$datum" | tail -1 ) pathr="https://downloads.raspberrypi.org/$rimage/images/$dirr/" #rname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip" | head -1) -rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.zip" | head -1) +#rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.xz" | head -1) +rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.img.\xz"|tail -1) -wget -c "$pathr""$rname" -O "raspi$attribut".zip +wget -c "$pathr""$rname" -O "raspi$attribut".xz #echo Test kompletter Pfad :: "$pathr""$rname" -shaname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:alnum:]-]*\.zip\.sha256" | head -1) +shaname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:alnum:]-]*\.img.\xz\.sha256" | tail -1) #echo Test kompletter sha256-Pfad :: $pathr$shaname wget "$pathr""$shaname" -O raspi"$attribut".sha256 echo "Bitte ein paar Sekunden warten. Der Hash wird erzeugt." -sha1=$(shasum -a 256 raspi"$attribut".zip | grep -o -P "[0-9a-z]{40,}") +sha1=$(shasum -a 256 raspi"$attribut".xz | grep -o -P "[0-9a-z]{40,}") sha2=$( grep -o -P "[0-9a-z]{40,}" < raspi"$attribut".sha256 ) sleep 1 echo Prüfsumme aus Download "$sha1" @@ -110,7 +111,7 @@ if [ "$endgueltigja" == "y" ]; then # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 -unzip -p raspi"$attribut".zip | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" +xz --keep --decompress raspi"$attribut".xz | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 else From 11d8bae6571ffcbe54327e9b0b600de02f0c867e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Thu, 5 May 2022 20:51:06 +0200 Subject: [PATCH 15/29] unsinnige Variable entfernt --- raspi-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index 2f7e57c..f55c6a0 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -4,7 +4,6 @@ #ACHTUNG : Zeile 106-112 Beachten ! attribut=$1 datum="[0-9]{4}-[0-9]{2}-[0-9]{2}" -zipp="xz" if [[ "$attribut" = "-h" ]] then From 605b950d3aa41a4fa7e075bfd17db49598ebdebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Thu, 5 May 2022 20:55:59 +0200 Subject: [PATCH 16/29] Vorsichtig benutzen ! Nur teilweise getestet --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 641fb7e..0aa5bcb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # Raspi-auto-downloader -[![Trigger: Push action](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml/badge.svg)](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml) Shellchecked + +# Achtung ! Nur teilweise getestet. +05.05.2022 Diese Version kann jetzt Images die mit xz gepackt wurden. + + +.[![Trigger: Push action](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml/badge.svg)](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml) Shellchecked Load fresh images for the Raspberry Pi, check SHA256, and copy to SD-Card, a Bashscript. From ef423126765355cf88abd926532722cb5311f244 Mon Sep 17 00:00:00 2001 From: dewomser Date: Thu, 5 May 2022 21:39:32 +0200 Subject: [PATCH 17/29] Schreibprobleme und entpacken gefixt --- raspi-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index f55c6a0..16ce2b2 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -110,7 +110,8 @@ if [ "$endgueltigja" == "y" ]; then # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 -xz --keep --decompress raspi"$attribut".xz | dd of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" +xz --keep --decompress raspi"$attribut".xz +dd if=raspi"$attribut" of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 else From b38c267ffb0ebfefc6d5e3e627b9ea9e57fbabd0 Mon Sep 17 00:00:00 2001 From: Stefan Hoehn Date: Fri, 2 Sep 2022 08:38:53 +0200 Subject: [PATCH 18/29] README.md --- README.md | 2 +- raspi-install.sh | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0aa5bcb..8ebc89a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Raspi-auto-downloader -# Achtung ! Nur teilweise getestet. +. 05.05.2022 Diese Version kann jetzt Images die mit xz gepackt wurden. diff --git a/raspi-install.sh b/raspi-install.sh index 16ce2b2..b3d5c68 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -75,7 +75,9 @@ echo "-----------------" echo "SD-Karte auf die geschrieben werden soll ENTFERNEN !" \"y\" read -r input if [ "$input" == "y" ]; then -mapfile -t laufwerke < <(lsblk -l -o Name | grep -E -v "[0-9]" | grep -E "sd[a-z]") +mapfile -t laufwerke < <(lsblk -l -o Name | grep -E "^sd[a-z]*$") +laufwerke[0]="lolo" +laufwerke1[0]="lolo" else exit fi @@ -84,11 +86,19 @@ echo Es gibt diese seriellen Blockdevices "${laufwerke[*]}" echo "SD-Karte auf die geschrieben werden soll EINSCHIEBEN !" \"y\" read -r input if [ "$input" == "y" ]; then -mapfile -t laufwerke1 < <(lsblk -l -o Name | grep -E -v "[0-9]" | grep -E "sd[a-z]") - +mapfile -t laufwerke1 < <(lsblk -l -o Name |grep -E "^sd[a-z]*$") +echo "$laufwerke1[0]" mapfile -t laufwerke2 < <({ printf "%s\n" "${laufwerke[@]}" | sort -u; printf "%s\n" "${laufwerke1[@]}" "${laufwerke[@]}"; } | sort | uniq -u) zahl_laufwerke="${#laufwerke2[@]}" -echo neu erkannte Laufwerke "$zahl_laufwerke" + + +echo neu erkannte Es gibt jetzt dieses neue serielle Blockdevice: "${laufwerke2[@]}" +echo Laufwerke ${#laufwerke2[@]} + +echo lwo:"${laufwerke2[0]}" +echo lw1:"${laufwerke2[1]}" + + if [ "$zahl_laufwerke" -eq 1 ]; then echo Es gibt jetzt dieses neue serielle Blockdevice: "${laufwerke2[0]}" else @@ -109,11 +119,11 @@ if [ "$endgueltigja" == "y" ]; then # Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" -umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 +#umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 xz --keep --decompress raspi"$attribut".xz dd if=raspi"$attribut" of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" -umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 +#umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 else exit fi From b4286f28fb12b494653c152a2e95355b4dd7e85b Mon Sep 17 00:00:00 2001 From: Stefan Hoehn Date: Fri, 2 Sep 2022 09:01:50 +0200 Subject: [PATCH 19/29] brackets vergessen Shellcheck --- raspi-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index b3d5c68..0875a22 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -87,7 +87,7 @@ echo "SD-Karte auf die geschrieben werden soll EINSCHIEBEN !" \"y\" read -r input if [ "$input" == "y" ]; then mapfile -t laufwerke1 < <(lsblk -l -o Name |grep -E "^sd[a-z]*$") -echo "$laufwerke1[0]" +echo "${laufwerke1[0]}" mapfile -t laufwerke2 < <({ printf "%s\n" "${laufwerke[@]}" | sort -u; printf "%s\n" "${laufwerke1[@]}" "${laufwerke[@]}"; } | sort | uniq -u) zahl_laufwerke="${#laufwerke2[@]}" From 8b8c93d558580f023aafa08849c488a618dbf9ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Tue, 6 Sep 2022 13:59:51 +0200 Subject: [PATCH 20/29] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ebc89a..a3253ae 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ -# Raspi-auto-downloader +# Raspi-auto-downloader +Jetzt Bashcode ist Shellchecked +[![Trigger: Push action](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml/badge.svg)](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml) . 05.05.2022 Diese Version kann jetzt Images die mit xz gepackt wurden. From 8054c4af0491576a1ec2f5a4d7ba1b52452e421d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Tue, 6 Sep 2022 14:01:04 +0200 Subject: [PATCH 21/29] shellchecked --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index a3253ae..194396c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # Raspi-auto-downloader -Jetzt Bashcode ist Shellchecked -[![Trigger: Push action](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml/badge.svg)](https://github.com/dewomser/Raspi-auto-downloader/actions/workflows/main.yml) . 05.05.2022 Diese Version kann jetzt Images die mit xz gepackt wurden. From 7f39d6424037e77880da03d0ea1465e980023623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Tue, 20 Sep 2022 08:41:10 +0200 Subject: [PATCH 22/29] readme pfad screenshot angepasst --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 194396c..4ad011f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Jetzt auch mit den 64er Images ## Copy and check SD-Image -![alt text](https://github.com/dewomser/Raspi-auto-downloader/blob/main/bilder/copy.png "copy and check") +![alt text](./bilder/copy.png "copy and check") ## Fork, Issue, Pull request, Clone Be carefull, this script is in status Beta 0.2. ! From 10bcc31ca8460cb8aa8489dece784ab34be0d7c8 Mon Sep 17 00:00:00 2001 From: Stefan Hoehn Date: Mon, 26 Sep 2022 02:11:50 +0200 Subject: [PATCH 23/29] dd ist jetzt sudo --- raspi-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index 0875a22..bed6b16 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -114,6 +114,7 @@ read -r endgueltigja if [ "$endgueltigja" == "y" ]; then # Wenn die Karte nur als root gemountet werden kann, muss dd durch sudo dd ersetzt werden. umount -> sudo umount +## sudo ddd – is now on # Alternative für Ubuntu: # echo 'KERNEL=="sd*", SUBSYSTEMS=="usb", MODE="0666"' | sudo tee /etc/udev/rules.d/99-usb-storage.rules # Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo @@ -121,7 +122,7 @@ if [ "$endgueltigja" == "y" ]; then # Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" #umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 xz --keep --decompress raspi"$attribut".xz -dd if=raspi"$attribut" of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" +sudo dd if=raspi"$attribut" of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" echo "Tatatatah ! fertig" #umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 else From 0ccbe9c4c2b53f67f4ebc0ecfd74f6bd3df5ef69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Tue, 24 Jan 2023 02:22:57 +0100 Subject: [PATCH 24/29] =?UTF-8?q?curl=20URL=20gequotet.=20Alles=20f=C3=BCr?= =?UTF-8?q?=20Shellcheck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspi-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index bed6b16..39f818f 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -51,7 +51,7 @@ fi cd "$HOME/Downloads" || echo"Downloads Ordner nicht vorhanden" -dirr=$(curl --silent https://downloads.raspberrypi.org/$rimage/images/ | grep -o -E "$rimage-$datum" | tail -1 ) +dirr=$(curl --silent "https://downloads.raspberrypi.org/$rimage/images/" | grep -o -E "$rimage-$datum" | tail -1 ) pathr="https://downloads.raspberrypi.org/$rimage/images/$dirr/" #rname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip" | head -1) #rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.xz" | head -1) From b15e329dbe18a4f501fc228dd7f56343df9e95d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Tue, 24 Jan 2023 02:25:42 +0100 Subject: [PATCH 25/29] nee version mit v3 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1db445a..fdc4761 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,6 @@ jobs: name: Shellcheck runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Run ShellCheck uses: ludeeus/action-shellcheck@master From 18a6f40626b52894f765eccaffabf3b61b3b5a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Mon, 15 May 2023 10:27:41 +0200 Subject: [PATCH 26/29] typo .\ --- raspi-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/raspi-install.sh b/raspi-install.sh index 39f818f..0c5f946 100755 --- a/raspi-install.sh +++ b/raspi-install.sh @@ -55,7 +55,7 @@ dirr=$(curl --silent "https://downloads.raspberrypi.org/$rimage/images/" | grep pathr="https://downloads.raspberrypi.org/$rimage/images/$dirr/" #rname=$(curl --silent "$pathr" | grep -o -E -w "$datum-[[:lower:]-]*\.zip" | head -1) #rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.xz" | head -1) -rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.img.\xz"|tail -1) +rname=$(curl --silent "$pathr" | grep -o -E "$datum-[[:alnum:]-]*\.img\.xz"|tail -1) wget -c "$pathr""$rname" -O "raspi$attribut".xz #echo Test kompletter Pfad :: "$pathr""$rname" From def511e24414db98c7aa6fe3a8f705a266803e5d Mon Sep 17 00:00:00 2001 From: Stefan Hoehn Date: Sat, 14 Feb 2026 17:09:56 +0100 Subject: [PATCH 28/29] Dietpi muss noch getestet werden --- dietpi-install.sh | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 dietpi-install.sh diff --git a/dietpi-install.sh b/dietpi-install.sh new file mode 100755 index 0000000..994f75b --- /dev/null +++ b/dietpi-install.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# gemacht von Stefan Höhn +#https://github.com/dewomser/Raspi-auto-downloader +#ACHTUNG : Zeile 106-112 Beachten ! +attribut=$1 +datum="[0-9]{4}-[0-9]{2}-[0-9]{2}" +url="https://dietpi.com/downloads/images/" +if [[ "$attribut" = "-h" ]] +then +echo " +Aufruf dietpi-install.sh [OPTION] + +Option Bedeutung +-1 dietpi für Raspberry v1 ARMv6 +-2 dietpi für Raspberry v2 ARNv7 +-234 dietpi für Raspberry v2-4 ARMv8 +-h Diese Hilfe +-5 dietpi für Raspberrx v5 ARMv8 + +" && exit +elif [[ "$attribut" = "-1" ]] +then +rimage="DietPi_RPi1-ARMv6-Trixie" +elif [[ "$attribut" = "-2" ]] +then +rimage="DietPi_RPi2-ARMv7-Trixie" + +elif [[ "$attribut" = "-234" ]] +then +rimage="DietPi_RPi234-ARM8-Trixie" + +elif [[ "$attribut" = "-5" ]] +then +rimage="DietPi_RPi5-ARMv8-Trixie" + +else +echo "Kein Pi-Image ausgewählt. \"raspi-install.sh -h \" für Hilfe!" && exit +fi + + +cd "$HOME/Downloads" || echo"Downloads Ordner nicht vorhanden" + +#https://dietpi.com/downloads/images/DietPi_RPi2-ARMv7-Trixie.img.xz + +pathr="$url$rimage.img.xz" +pathrs="$pathr.sha256" + +# -c +wget -c "$pathr" -O "$rimage.img.xz" +wget "$pathrs" -O "$rimage.img.xz.sha256" +echo "Bitte ein paar Sekunden warten. Der Hash wird erzeugt." +sha1=$(shasum -a 256 "$rimage.img.xz") +sha2=$(cat "$rimage.img.xz.sha256") +sleep 1 +echo Prüfsumme aus Download "$sha1" +echo Prüfsumme von Webseite "$sha2" + +if [ "$sha1" == "$sha2" ]; then +echo "Prüfsumme stimmt." +echo "-----------------" +echo "SD-Karte auf die geschrieben werden soll ENTFERNEN !" \"y\" +read -r input +if [ "$input" == "y" ]; then +mapfile -t laufwerke < <(lsblk -l -o Name | grep -E "^sd[a-z]*$") +laufwerke[0]="lolo" +laufwerke1[0]="lolo" +else +exit +fi + +echo Es gibt diese seriellen Blockdevices "${laufwerke[*]}" +echo "SD-Karte auf die geschrieben werden soll EINSCHIEBEN !" \"y\" +read -r input +if [ "$input" == "y" ]; then +mapfile -t laufwerke1 < <(lsblk -l -o Name |grep -E "^sd[a-z]*$") +echo "${laufwerke1[0]}" +mapfile -t laufwerke2 < <({ printf "%s\n" "${laufwerke[@]}" | sort -u; printf "%s\n" "${laufwerke1[@]}" "${laufwerke[@]}"; } | sort | uniq -u) +zahl_laufwerke="${#laufwerke2[@]}" + + +echo neu erkannte Es gibt jetzt dieses neue serielle Blockdevice: "${laufwerke2[@]}" +echo Laufwerke ${#laufwerke2[@]} + +echo lwo:"${laufwerke2[0]}" +echo lw1:"${laufwerke2[1]}" + + +if [ "$zahl_laufwerke" -eq 1 ]; then +echo Es gibt jetzt dieses neue serielle Blockdevice: "${laufwerke2[0]}" +else +echo "Es kann nicht geschrieben werden. Es wurden mehr oder weniger als 1 SD-Karte erkannt" ; exit +fi +else +exit +fi + +echo Ich bin mir SICHER und will auf SD-Karte schreiben : /dev/"${laufwerke2[0]}" \"y\" oder \"n\" + +read -r endgueltigja +if [ "$endgueltigja" == "y" ]; then + +# Wenn die Karte nur als root gemountet werden kann, muss dd durch sudo dd ersetzt werden. umount -> sudo umount +## sudo ddd – is now on +# Alternative für Ubuntu: +# echo 'KERNEL=="sd*", SUBSYSTEMS=="usb", MODE="0666"' | sudo tee /etc/udev/rules.d/99-usb-storage.rules +# Quelle : https://askubuntu.com/questions/828545/using-dd-without-sudo + +# Wenn die nächsten 3 Zeilen aktiviert sind: "don't blame me!" +#umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 +xz --keep --decompress dietpi"$attribut".xz +sudo dd if=raspi"$attribut" of=/dev/"${laufwerke2[0]}" bs=4M conv=fsync status=progress || echo "Es gibt Probleme mit Schreibrechten.Ab Zeile 105 gibts Hilfe" +echo "Tatatatah ! fertig" +#umount /dev/"${laufwerke2[0]}"[0-9] > /dev/null 2>&1 +else +exit +fi +else +echo "Achtung,Prüfsumme stimmt nicht überein !" +fi From e049be0cf6bd9e94892db5e8b810417e20d9ff42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=B6hn?= Date: Sat, 14 Feb 2026 17:19:09 +0100 Subject: [PATCH 29/29] Comment out date regex assignment Comment out the date regex assignment in the script. --- dietpi-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dietpi-install.sh b/dietpi-install.sh index 994f75b..f346d83 100755 --- a/dietpi-install.sh +++ b/dietpi-install.sh @@ -3,7 +3,7 @@ #https://github.com/dewomser/Raspi-auto-downloader #ACHTUNG : Zeile 106-112 Beachten ! attribut=$1 -datum="[0-9]{4}-[0-9]{2}-[0-9]{2}" +# datum="[0-9]{4}-[0-9]{2}-[0-9]{2}" url="https://dietpi.com/downloads/images/" if [[ "$attribut" = "-h" ]] then