<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <generator uri="https://gohugo.io/" version="0.152.2">Hugo</generator>
    <title>toheine.net</title>
            <link href="https://toheine.net/" rel="alternate" type="text/html" title="html" />
            <link href="https://toheine.net/feed.xml" rel="self" type="application/atom+xml" title="atom" />
    <updated>2026-04-02T10:16:05+00:00</updated>
        <author>
            <name>toheine</name>
                <email>mail[at]toheine[dot]net</email>
        </author>
    <id>https://toheine.net/</id>
        <entry>
            <title>Chemnitzer Linux-Tage 2026</title>
            <link href="https://toheine.net/posts/2026/clt26/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2026/clt26/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2026-03-31T19:51:53+01:00</published>
            <updated>2026-03-31T19:51:53+01:00</updated>
            <content type="html">
                &lt;p&gt;Wieder hatte ich die Gelegenheit die diesjährigen Linux-Tage in Chemnitz zu besuchen. Gemeinsam mit  &lt;a href=&#34;https://social.tchncs.de/@and1bm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@and1bm&lt;/a&gt;
, &lt;a href=&#34;https://social.tchncs.de/@angry&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@angry&lt;/a&gt;
, &lt;a href=&#34;https://social.tchncs.de/@frank@moessingen.social&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@frank&lt;/a&gt;
, &lt;a href=&#34;https://social.tchncs.de/@graueralltag@mastodon.linuxmuster.net&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@graueralltag&lt;/a&gt;
 Jürgen und &lt;a href=&#34;https://social.tchncs.de/@miXsed&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@miXsed&lt;/a&gt;
 war das wieder ein überragendes Erlebnis. Bei allen Veranstaltungen die im Jahr so anfallen, sind die CLTs mein Favorit!&lt;/p&gt;
&lt;p&gt;Die Begegnungen und Gespräche vor Ort sind einfach unersetzlich, die Vorträge waren super und mein persönlicher Ideen-Rucksack ist prall gefüllt. Ich kann diese Art von Veranstaltung aus dem Umfeld der FLOSS-Szene total empfehlen. Das muss man erlebt haben.&lt;/p&gt;
&lt;p&gt;Auch in diesem Jahr hatte ich einen Vortrag mit dem Thema &lt;strong&gt;Der eigene Blog mit Hugo – Ein Praxisbeispiel&lt;/strong&gt;. Das Material dazu gibt es hier:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;ressources/der_eigene_blog_mit_hugo.pdf&#34;&gt;Foliendownload&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chemnitzer.linux-tage.de/2026/de/programm/beitrag/290&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Link zum Programmpunkt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://media.ccc.de/v/clt26-290-der-eigene-blog-mit-hugo-ein-praxisbeispiel&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Video-Aufzeichnung&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Korrektur zum Vortrag&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Es gab im Anschluss an den Vortrag eine Frage aus dem Publikum, wie man Beiträge veröffentlicht, die erst in X Tagen erscheinen sollen. Ich war etwas im Tunnel und habe das missverständlich ausgedrückt, aber von einem der weiteren Zuhörenden kam der richtige Hinweis. Daher möchte ich das hiermit richtig stellen:&lt;/p&gt;
&lt;p&gt;Wenn ein neuer Hugo-Blogpost verfasst ist, der ein Veröffentlichungsdatum in der Zukunft beinhaltet und der Buildprozess durch ist, dann erscheint dieser erst im Blog, wenn ein erneuter Build (nach dem Veröffentlichungsdatum), zusammen mit einer Bereitstellung auf einem Webserver erfolgt. Um das zu automatisieren bietet Woodpecker die Möglichkeit &lt;strong&gt;Cron-Jobs&lt;/strong&gt; zu hinterlegen. Infos dazu sind hier zu finden: &lt;a href=&#34;https://woodpecker-ci.org/docs/usage/cron&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://woodpecker-ci.org/docs/usage/cron&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lesson learned&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Von &lt;a href=&#34;https://social.tchncs.de/@ascherbaum@mastodon.social&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@ascherbaum&lt;/a&gt;
 kam noch der Hinweis, dass Hugo relativ häufig einzelne Features für deprecated erklärt. Je nach eingesetztem Theme oder nach den verwendeten Features kann das zu Problemen führen. Bisher bin ich da noch nicht drüber gestolpert. Da geht ein fetter Dank an &lt;a href=&#34;https://social.tchncs.de/@xoxys&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@xoxys&lt;/a&gt;
, der das hier eingesetzte Theme &lt;a href=&#34;https://github.com/thegeeklab/hugo-geekblog&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hugo-geekblog&lt;/a&gt;
 so aktuell hält.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weitere Infos&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webseite der Veranstaltung
&lt;br&gt;&lt;a href=&#34;https://chemnitzer.linux-tage.de/2026/de/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://chemnitzer.linux-tage.de/2026/de/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video-Aufzeichnungen der Vorträge:
&lt;br&gt;&lt;a href=&#34;https://media.ccc.de/c/clt26&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://media.ccc.de/c/clt26&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Event" term="Event" label="Event" />
        </entry>
        <entry>
            <title>PostgreSQL Upgrade</title>
            <link href="https://toheine.net/posts/2026/postgres_update/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2026/postgres_update/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2026-02-21T11:39:06+01:00</published>
            <updated>2026-02-21T11:39:06+01:00</updated>
            <content type="html">
                &lt;p&gt;Gestern hab ich Wartungsarbeiten auf einem Peertube-Server durchgeführt. Dieser verwendet im Hintergrund eine PostgreSQL-Datenbank. In diesem Zusammenhang hab ich auch das darunter liegende Debian auf die Version 13 (Trixie) aktualisiert. Dabei wurde auch die PostgreSQL Datenbank von 15 auf Version 17 aktualisert. Mittlerweile geht das ja wirklich gut von der Hand, aber wenn ich nachfolgende Warnmeldungen sehe, bin ich immer etwas skeptisch.&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2026/postgres_update/images/apt_configure_postgresql.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2026/postgres_update/images/apt_configure_postgresql.png&#34;
              alt=&#34;Hinweis zur Konfiguration von Postgres beim Update auf Debian Trixie&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Hinweis zur Konfiguration von Postgres beim Update auf Debian Trixie
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Im Zweifel sage ich bei solchen Dingen eher &amp;ldquo;Nein&amp;rdquo;. So auch gestern. Nach dem Upgrade musste ich dann aber das Upgrade selbst durchführen. Vorher noch schnell einen Snapshot erstellt und die entsprechenden Man-Pages konsultiert. Die Lösung sah wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;update-durchführen&#34;
    &gt;
        Update durchführen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/postgres_update/#update-durchführen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Update durchführen&#34; href=&#34;#update-durchf%c3%bchren&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die aktuellen Posgres-Instanzen können mit dem Befehl &lt;code&gt;pg_lsclusters&lt;/code&gt; angezeigt werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;root@video01:~# pg_lsclusters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Ver Cluster Port Status Owner    Data directory              Log file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;15  main    5432 online postgres /var/lib/postgresql/15/main /var/log/postgresql/postgresql-15-main.log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;17  main    5433 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Die alte Version 15, läuft unter dem Standard-Port 5432 und wird von Peertube verwendet. Der neue Cluster mit der Version 17, ist nicht aktiv genutzt. Dieser Cluster wurde in einem ersten Schritt entfernt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;root@video01:~# pg_dropcluster 17 main --stop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;root@video01:~# pg_lsclusters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Ver Cluster Port Status Owner    Data directory              Log file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;15  main    5432 online postgres /var/lib/postgresql/15/main /var/log/postgresql/postgresql-15-main.log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nun konnte der neue Postrgres-Cluster angelegt und die Datenbank aus dem alten Postgres-Cluster rüber gezogen werden. Es wurde der entsprechende Befehl (siehe Screenshot oben) ausgeführt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;pg_upgradecluster 15 main -v 17
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Es folgten eine Latte von Ausgabemeldungen die mit einem &lt;code&gt;Success [..]&lt;/code&gt; endeten. Im Anschluss konnte der alte Postgres-Cluster entfernt und die entsprechenden Pakete gelöscht werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;pg_dropluster 15 main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;apt purge postgresql-15 postgresql-client-15
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/postgres_update/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Dieser kurze Artikel fällt Mal wieder unter die Kategorie &amp;ldquo;Info an mich&amp;rdquo;. Wenn ich erneut in die Situation komme einen PostrgeSQL-Cluster zu aktuslisieren, weiß ich wo ich nachschauen kann.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/postgres_update/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/trixie/postgresql-common/pg_upgradecluster.1.en.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;man pg_upgradecluster&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/trixie/postgresql-common/pg_dropcluster.1.en.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;man pg_dropcluster&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Server" term="Server" label="Server" /> 
                                <category scheme="https://toheine.net/tags/Debian" term="Debian" label="Debian" /> 
                                <category scheme="https://toheine.net/tags/Postgres" term="Postgres" label="Postgres" />
        </entry>
        <entry>
            <title>Fosdem 2026</title>
            <link href="https://toheine.net/posts/2026/fosdem/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2026/fosdem/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2026-02-01T19:40:41+01:00</published>
            <updated>2026-02-01T19:40:41+01:00</updated>
            <content type="html">
                &lt;p&gt;Durch ein paar glückliche Umstände, bekam ich die Gelegenheit dieses Jahr auf die &lt;a href=&#34;https://fosdem.org/2026/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fosdem 2026&lt;/a&gt;
 (&lt;strong&gt;Free and Open Source Software Developers European Meeting&lt;/strong&gt;) zu fahren. Gemeinsam mit &lt;a href=&#34;https://social.tchncs.de/@angry&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@angry&lt;/a&gt;
 sind wir am Freitag nach Brüssel gereist um uns Europas größte Entwicklerkonferenz mit über 8.000 Besuchern und 1.013 Vorträgen nicht entgehen zu lassen.&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2026/fosdem/images/fosdem_2026.jpg&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2026/fosdem/images/fosdem_2026.jpg&#34;
              alt=&#34;Banner der Fosdem 2026&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Banner der Fosdem 2026
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tag 1&lt;/strong&gt; verbrachten wir fast ausschließlich im Developer Room &lt;a href=&#34;https://fosdem.org/2026/schedule/track/modern-email/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Modern Email&lt;/a&gt;
. Hier bekam man das Gefühl, es passiert richtig was &amp;hellip; in dem schon so häufig tot gesagten Protokoll. Neben Erfahrungsberichten und modernen Ansätzen von Mail-Clients, ging es vielfach um das Protokoll &lt;a href=&#34;https://de.wikipedia.org/wiki/JSON_Meta_Application_Protocol&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;JMAP&lt;/a&gt;
 und das Mailserver-Projekt &lt;a href=&#34;https://stalw.art/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Stalwart&lt;/a&gt;
. Meine beiden Favoriten waren hier:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://fosdem.org/2026/schedule/event/3JQKHF-jmap-for-everything/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;JMAP for Everything (Destroy All Monsters): JMAP Calendar, Contacts, Files&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://fosdem.org/2026/schedule/event/FP8EFX-scaling-email/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Stalwart: Can Open Source do Gmail-scale Email?&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beide Vorträge waren kurzweilig und informativ. Inbesondere der Mensch hinter Stalwart, &lt;strong&gt;Mauro De Gennaro&lt;/strong&gt;, war der gefragte Typ im Raum, da die Mail-Server-Communiy nach der ersten stabilen Version 1.0 lechzt, die im Sommer 2026 zu erwarten ist. Für mich ist das schon äußerst beeindruckend. Hier wird quasi ein neues Protokoll mit JMAP entwickelt und die &lt;strong&gt;ICANN&lt;/strong&gt; (auch vor Ort vertreten) wartet auf &amp;ldquo;Futter&amp;rdquo; um die Details in einen Standard zu gießen. Mir ist zwar grundsätzlich klar wie das läuft, aber ich war noch nie (gefühlt) live dabei.&lt;/p&gt;
&lt;p&gt;Dass die Vertreter von &lt;strong&gt;Thunderbird&lt;/strong&gt;, in ihrem Vortrag die aktuelle Entwicklung mit nur EINEM Wort (in den Slides) erwähnt und sich sonst um die Integration von Microsoft-Exchange befasst haben, hab ich überhaupt nicht verstanden.&lt;/p&gt;
&lt;p&gt;Neben den Vorträgen gab es einen persönlichen Austausch zwischen ein paar Entwicklern der Heinlein-Gruppe und uns. Die sind in der Szene insbesondere für die Mail-Server-Angebote von &lt;a href=&#34;https://mailbox.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://mailbox.org&lt;/a&gt;
 bekannt.&lt;/p&gt;
&lt;p&gt;Am Abend fanden wir uns dann in einer Brüssler Bar, mitten im Treffen der XWiki-, CryptPad-, Passbolt-, Nextcloud-, und OpenProject-Communitiy, wieder. Auch an dieser Stelle gab es noch einen bereichernden Austausch mit einer Psychologin (Bereich Forschung) und &lt;a href=&#34;https://social.tchncs.de/@ramrom@infosec.exchange&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@ramrom&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tag 2&lt;/strong&gt; wurde dann hauptsächlich zur Erkundundung der zahlreichen Aussteller mit vielen kleinen Gesprächen, dem ein oder anderen Wiedersehen von bekannten Gesichtern und ein paar Vorträgen aus dem Track &lt;a href=&#34;https://fosdem.org/2026/schedule/track/identity-and-access-management/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Identity and Access Management&lt;/a&gt;
 gefüllt. Auch das war interessant. Aber wir waren dann irgendwann komplett bedient. Wenn wundert es? Nach zwei Tagen Druckbetankung von technisch anspruchsvollen Vorträgen ist das Hirn irgendwann nicht mehr aufnahmefähig.&lt;/p&gt;
&lt;p&gt;Nun (auf der Heimfahrt) denke ich, dass sich der Weg nach Brüssel absolut gelohnt hat. Ich hab das Gefühl nicht das letzte Mal auf der Fosdem gewesen zu sein und freue mich wenn es nochmal klappt. Aber das nächste Mal gibt es gleich an Tag 1 einen Fosdem-Hoodie. Die waren einfach zu schnell ausverkauft.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Event" term="Event" label="Event" /> 
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/Mail" term="Mail" label="Mail" />
        </entry>
        <entry>
            <title>Aktuelles zu Let&#39;s Encrypt</title>
            <link href="https://toheine.net/posts/2026/lets-encrypt-news/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2026/lets-encrypt-news/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2026-01-03T06:05:59+01:00</published>
            <updated>2026-01-03T06:05:59+01:00</updated>
            <content type="html">
                &lt;p&gt;Ich bin diese Woche über die Podcast-Episode &lt;strong&gt;News PKI-Neuerungen, Tor-Umbau und React2Shell&lt;/strong&gt; von &lt;a href=&#34;https://passwort.podigee.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Passwort&lt;/a&gt;
 gestolpert, die sich mit den Neuerungen von Let&amp;rsquo;s Encrypt sowie dem Thema PKI insgesammt angenommen hat. Die &lt;a href=&#34;https://passwort.podigee.io/47-news-pki-neuerungen-tor-umbau-und-react2shell&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;komplette Episode&lt;/a&gt;
 geht dabei auf einige weitere interessante Themen ein. Für mich wertvoll waren insbesondere die im Folgenden beschriebenen Infos.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#laufzeit-von-lets-encrypt-zertifikaten-wird-angepasst&#34;&gt;Laufzeit von Let&amp;rsquo;s-Encrypt-Zertifikaten wird angepasst&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#dns-persist-01-in-planung&#34;&gt;DNS-PERSIST-01 in Planung&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#baseline-requirements&#34;&gt;Baseline Requirements&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#certificate-transparency-ct-logs&#34;&gt;Certificate Transparency (CT) Logs&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;laufzeit-von-lets-encrypt-zertifikaten-wird-angepasst&#34;
    &gt;
        Laufzeit von Let&amp;rsquo;s-Encrypt-Zertifikaten wird angepasst
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/lets-encrypt-news/#laufzeit-von-lets-encrypt-zertifikaten-wird-angepasst&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Laufzeit von Let&amp;rsquo;s-Encrypt-Zertifikaten wird angepasst&#34; href=&#34;#laufzeit-von-lets-encrypt-zertifikaten-wird-angepasst&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Am &lt;strong&gt;02.12.2025&lt;/strong&gt; veröffentlichte Let&amp;rsquo;s Encrypt einen &lt;a href=&#34;https://letsencrypt.org/2025/12/02/from-90-to-45&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Blog-Post&lt;/a&gt;
, in dem eine Änderung der Zertifikats-Laufzeiten bekannt gegeben wurde. Die Umsetzung wird in folgenden Schritten geschehen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;13.05.2026&lt;/strong&gt;: Reduzierung der Laufzeit von Zertifikaten auf 45 Tagen im ACME-Profil &lt;strong&gt;tlsserver&lt;/strong&gt;. &lt;br&gt;Das Default-Profil &lt;strong&gt;classic&lt;/strong&gt; ist davon nicht betroffen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10.02.2027&lt;/strong&gt;: Reduzierung der Laufzeit von Zertifikaten im Default-Profil &lt;strong&gt;classic&lt;/strong&gt; auf 64 Tage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16.02.2028&lt;/strong&gt;: Reduzierung der Laufzeit von Zertifikaten im Default-Profil &lt;strong&gt;classic&lt;/strong&gt; auf 45 Tage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Damit die ACME-Clients ordentlich mitbekommen, wann sie das Zeritifkat erneuern müssen, sollten diese das Feature &lt;a href=&#34;https://letsencrypt.org/2023/03/23/improving-resliiency-and-reliability-with-ari&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ACME Renewal Information (ARI)&lt;/a&gt;
 unterstützen. Ich präferiere bisher &lt;a href=&#34;https://dehydrated.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;dehydrated&lt;/a&gt;
 als ACME-Client. Dieser unterstützt (soweit ich das sehe) derzeit noch kein ARI. Aber ein entsprechender &lt;a href=&#34;https://github.com/dehydrated-io/dehydrated/pull/959&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pull-Request&lt;/a&gt;
 liegt bereits vor. Ich gehe davon aus, dass das rechtzeitig umgesetzt wird.&lt;/p&gt;
&lt;p&gt;Mit der Anpassung der Laufzeiten kommt Let&amp;rsquo;s Encrypt den &lt;strong&gt;Basline Requirements&lt;/strong&gt; (s.u.) nach die u. a. die maximale Dauer von Zertifikats-Laufzeiten für CAs vorgibt. Dort heißt es aktuell:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Subscriber Certificates issued on or after 15 March 2029 SHOULD NOT have a Validity Period greater than 46 days and MUST NOT have a Validity Period greater than 47 days.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das muss man aktiv weiter verfolgen. Es ist zu erwarten, dass die Laufzeiten in Zukunft weiter reduziert werden. Das ist zumindest der Wunsch der Browserhersteller.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;dns-persist-01-in-planung&#34;
    &gt;
        DNS-PERSIST-01 in Planung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/lets-encrypt-news/#dns-persist-01-in-planung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor DNS-PERSIST-01 in Planung&#34; href=&#34;#dns-persist-01-in-planung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Im gleichen Blog-Post von Let&amp;rsquo;s Encrypt wird ein neuer DNS-Challenge-Typ namens &lt;a href=&#34;https://letsencrypt.org/2025/12/02/from-90-to-45#making-automation-easier-with-a-new-dns-challenge-type&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DNS-PERSIST-01&lt;/a&gt;
 angekündigt. Dieser soll die Automatisierung zur Ausstellung von Zertifikaten vereinfachen. Geplant ist, dass der DNS-Ressource-Record vom Typ TXT, der bei der (bisherigen) DNS-01-Challgenge dynamisch gesetzt werden musste, einmalig und dauerhaft eingetragen wird. Hier darf man gespannt sein, wie schnell das kommt, da es hier Absprachen mit der &lt;strong&gt;IETF&lt;/strong&gt; und dem &lt;strong&gt;CA/Browser-Forum&lt;/strong&gt; gibt/geben muss. Ein erster &lt;a href=&#34;https://www.ietf.org/archive/id/draft-ietf-acme-dns-persist-00.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Entwurf&lt;/a&gt;
 liegt bei der IETF bereits vor.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;baseline-requirements&#34;
    &gt;
        Baseline Requirements
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/lets-encrypt-news/#baseline-requirements&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Baseline Requirements&#34; href=&#34;#baseline-requirements&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Nicht neu &amp;hellip; aber ich hatte das bisher einfach noch nicht hinterfragt: Wie kann es funktionieren, dass verschiedene die &lt;strong&gt;Certificate Authorities (CAs)&lt;/strong&gt; die ausgestellten Zertifikate einheitlich und nach bestimmten Qualitätskriterien/Richtlinien ausstellen? Hier kommen die eben erwähnten &lt;a href=&#34;https://cabforum.org/working-groups/server/baseline-requirements/about/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Baseline Requirements&lt;/a&gt;
 ins Spiel. Verfasser ist ein Zusammenschluss verschiedener Browser-Hersteller und Zertifizierungsstellen, der unter dem namen &lt;a href=&#34;https://de.wikipedia.org/wiki/CA/Browser_Forum&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CA/Browser-Fourm&lt;/a&gt;
 auftritt.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;certificate-transparency-ct-logs&#34;
    &gt;
        Certificate Transparency (CT) Logs
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/lets-encrypt-news/#certificate-transparency-ct-logs&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Certificate Transparency (CT) Logs&#34; href=&#34;#certificate-transparency-ct-logs&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Logs über die bisher ausgestellten Zertifikate wechseln von &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc6962&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RFC 6962 API&lt;/a&gt;
 zu &lt;a href=&#34;https://github.com/C2SP/C2SP/blob/main/static-ct-api.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Static CT API&lt;/a&gt;
.  Der eigentlich neue &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc9162&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RFC 9162&lt;/a&gt;
 fand keine praktische Anwendung. Durch &lt;strong&gt;Static CT&lt;/strong&gt; wird der Aufwand für das Vorhalten der Logs und die Beantwortung von Anfragen deutlich reduziert. Eine Beschreibung, wie das funktioniert, ist im Let&amp;rsquo;s-Encrypt-Blogbeitrag &lt;a href=&#34;https://letsencrypt.org/2025/08/14/rfc-6962-logs-eol&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;End of Life Plan for RFC 6962 Certificate Transparency Logs&lt;/a&gt;
 vom 14.08.2025 und im Heise-Artikel &lt;a href=&#34;https://www.heise.de/hintergrund/Static-CT-verbessert-Zertifikatsprotokolle-10482301.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Static-CT verbessert Zertifikatsprotokolle&lt;/a&gt;
 vom 18.07.25 gut nachzulesen.&lt;/p&gt;
&lt;p&gt;Um die CT Logs einzusehen gibt es Tools wie z. B. &lt;a href=&#34;https://crt.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;crt.sh&lt;/a&gt;
. Das war mir auch komplett neu. Hier sind pro Domain alle bisher ausgestellten Zeritifikate hinterlegt. Ich bin fasst vom Stuhl gefallen, als ich gesehen hab, was man hier alles ablesen kann:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2026/lets-encrypt-news/images/crt.sh_search_toheine.net.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2026/lets-encrypt-news/images/crt.sh_search_toheine.net.png&#34;
              alt=&#34;Gekürzte Ausgabe von crt.sh am Beispiel toheine.net&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Gekürzte Ausgabe von crt.sh am Beispiel toheine.net
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Natürlich sind die ausgestellten und produktive Zertifikate im Internet und damit für alle Welt einsehbar. Aber mir war nicht klar, dass jede Erzeugung auch offen im Netz steht (auch wenn ich das Zertifikat nicht nutze). In Zukunft werde ich wohl in meinen Fortbildungen keine exemplarischen Zertifikate auf den Namen &lt;strong&gt;&amp;lt;name&amp;gt;-is-doof.meine-domain.tld&lt;/strong&gt; erzeugen &lt;span class=&#34;emoji&#34;&gt;😉&lt;/span&gt;
.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/lets-encrypt-news/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die erwähnte Podcast-Episode mit dem Titel &lt;strong&gt;News PKI-Neuerungen, Tor-Umbau und React2Shell&lt;/strong&gt; war mit zahlreichen wichtigen Infos für mich gespickt. Nicht nur zu den aktuellen News von &lt;strong&gt;Let&amp;rsquo;s Encrypt&lt;/strong&gt; &amp;hellip; auch die weiteren Themen waren super aufbereitet. Ich muss peinlich berührt zugeben, dass ich entsprechende SSL-/TLS-Zertifikate schon seit vielen Jahren fröhlich ausstelle, aber mir hat gleichzeitig einiges an Hintergrundwissen gefehlt. Wieder was gelernt! Danke an &lt;a href=&#34;https://social.tchncs.de/@christopherkunz@chaos.social&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@christopherkunz&lt;/a&gt;
 und &lt;a href=&#34;https://social.tchncs.de/@syt@social.heise.de&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@syst&lt;/a&gt;
 für die Aufbereitung. Euren Podcast werde ich in Zukunft aktiv verfolgen und weiter empfehlen.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2026/lets-encrypt-news/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://passwort.podigee.io/47-news-pki-neuerungen-tor-umbau-und-react2shell&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://passwort.podigee.io/47-news-pki-neuerungen-tor-umbau-und-react2shell&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://letsencrypt.org/2025/12/02/from-90-to-45&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://letsencrypt.org/2025/12/02/from-90-to-45&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://letsencrypt.org/2023/03/23/improving-resliiency-and-reliability-with-ari&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://letsencrypt.org/2023/03/23/improving-resliiency-and-reliability-with-ari&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.heise.de/news/47-Tage-CAs-und-Browserhersteller-beschliessen-kuerzere-Laufzeit-fuer-Zertifikate-10352867.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.heise.de/news/47-Tage-CAs-und-Browserhersteller-beschliessen-kuerzere-Laufzeit-fuer-Zertifikate-10352867.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.heise.de/news/Web-PKI-Let-s-Encrypt-verkuerzt-Laufzeit-von-Zertifikaten-auf-45-Tage-11100233.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.heise.de/news/Web-PKI-Let-s-Encrypt-verkuerzt-Laufzeit-von-Zertifikaten-auf-45-Tage-11100233.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://dehydrated.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://dehydrated.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dehydrated-io/dehydrated/pull/959&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/dehydrated-io/dehydrated/pull/959&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ietf.org/archive/id/draft-ietf-acme-dns-persist-00.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.ietf.org/archive/id/draft-ietf-acme-dns-persist-00.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://de.wikipedia.org/wiki/CA/Browser_Forum&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://de.wikipedia.org/wiki/CA/Browser_Forum&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Security" term="Security" label="Security" /> 
                                <category scheme="https://toheine.net/tags/Lets-Encrypt" term="Lets-Encrypt" label="Lets Encrypt" />
        </entry>
        <entry>
            <title>Debian: Einzelne Pakete aus Testing installieren</title>
            <link href="https://toheine.net/posts/2025/package-from-testing/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/package-from-testing/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-11-29T14:47:13+01:00</published>
            <updated>2025-11-29T14:47:13+01:00</updated>
            <content type="html">
                &lt;p&gt;Auf meinen PCs oder Notebooks setze ich in der Regel auf &lt;strong&gt;Debian&lt;/strong&gt; oder &lt;strong&gt;Arch Linux&lt;/strong&gt;. Dieser Mix ermöglicht mir entweder eine stabile Distribution mit Point-Releases (Debian) oder ein Rolling-Release-Prinzip mit wirklich aktueller Software (Arch Linux). Somit habe ich das Beste aus zwei Welten. Brauch ich auf meinen Debian-Kisten vereinzelt aktuellere Software, helfe ich mir mit &lt;a href=&#34;https://flatpak.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Flatpak&lt;/a&gt;
 aus.&lt;/p&gt;
&lt;p&gt;In seltenen Fällen möchte ich auf Debian neuere Software nutzen, die ich nicht über Flatpak installieren kann oder will und die aus einer zuverlässigen Paket-Quelle stammen soll. Hierfür gibt es für mich zwei Möglichkeiten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://backports.debian.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Debian Backports&lt;/a&gt;
: Hier handelt es sich um Pakete aus dem Testing-Repo die jedoch mit dem aktuellen Stable-Release kompatibel sind (&lt;strong&gt;Zitat&lt;/strong&gt;: &lt;em&gt;adjusted and recompiled for usage on Debian stable&lt;/em&gt;). Das ist super. Allerdings muss das jeweilige Paket auch in den Backports vorliegen. Häufig ist genau das Paket, das ich suche, hierüber nicht verfügbar.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.debian.org/DebianTesting&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Debian Testing&lt;/a&gt;
 aktivieren und über &lt;a href=&#34;https://wiki.debian.org/AptConfiguration?action=show&amp;amp;redirect=AptPreferences#Using_pinning&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Apt pinning&lt;/a&gt;
 dafür sorgen, dass nur bestimmte Pakete aus Testing installiert werden. Grundsätzlich verbleibt das System auf dem jeweiligen Stable-Zweig.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für mein heutiges Bedüfrnis, ein aktuelles Paket &lt;code&gt;fwupd&lt;/code&gt; zu installieren, musste ich an dieser Stelle &lt;strong&gt;Variante 2&lt;/strong&gt; wählen, da dieses nicht über die &lt;strong&gt;Debian Backports&lt;/strong&gt; angeboten wird.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#vorbereitung-der-debian-quellen&#34;&gt;Vorbereitung der Debian Quellen&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#feinjustierung-mit-apt-pinning&#34;&gt;Feinjustierung mit Apt Pinning&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;vorbereitung-der-debian-quellen&#34;
    &gt;
        Vorbereitung der Debian Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/package-from-testing/#vorbereitung-der-debian-quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Vorbereitung der Debian Quellen&#34; href=&#34;#vorbereitung-der-debian-quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;In einem ersten Schritt müssen die notwendigen Einträge für Testing in den Quellen eingetragen werden. Ich hab seit Debian Trixie die neue Schreibweise nach &lt;a href=&#34;https://manpages.debian.org/trixie/apt/sources.list.5.de.html#FORMAT_IM_DEB822-STIL&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;deb822&lt;/a&gt;
 übernommen. Sofern dass auf einem bestehenden System noch nicht nach diesem System umgebaut wurde, hilft der Befehl &lt;code&gt;apt modernize-sources&lt;/code&gt;. Mehr Details gibt es auf &lt;a href=&#34;https://linuxnews.de/debian-vereinfacht-umstellung-auf-deb822/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Linuxnews&lt;/a&gt;
 dazu.&lt;/p&gt;
&lt;p&gt;Meine Debian-Quellen liegen in der Datei &lt;code&gt;/etc/apt/sources.list.d/debian.sources&lt;/code&gt; und haben folgenden Aufbau:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Types: deb deb-src
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;URIs: http://deb.debian.org/debian/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suites: trixie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Components: main contrib non-free non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Types: deb deb-src
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;URIs: http://security.debian.org/debian-security/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suites: trixie-security
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Components: main contrib non-free non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Types: deb deb-src
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;URIs: http://deb.debian.org/debian/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suites: trixie-updates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Components: main contrib non-free non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Types: deb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;URIs: http://deb.debian.org/debian/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suites: trixie-backports
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Components: main contrib non-free non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Enabled: yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Types: deb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;URIs: http://deb.debian.org/debian/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suites: testing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Components: main contrib non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Enabled: yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Neben den Backports (im vierten Code-Block) liegen im nachfolgenden Block die Testing Quellen. Dieser Block überschreibt allerdings die Einstellungen des ersten Blocks (Stable-Quellen). Würde jetzt das System aktualisiert werden, zieht es den Rechner komplett auf Debian Testing hoch. Und genau das soll vermieden werden.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;feinjustierung-mit-apt-pinning&#34;
    &gt;
        Feinjustierung mit Apt Pinning
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/package-from-testing/#feinjustierung-mit-apt-pinning&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Feinjustierung mit Apt Pinning&#34; href=&#34;#feinjustierung-mit-apt-pinning&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Mit der zusätzlichen Datei &lt;code&gt;/etc/apt/preferences&lt;/code&gt; können nun Einstellungen vorgenommen werden, welche Pakete aus welchen Quellen kommen sollen. Für meinen Verwendungszweck hier, soll nur Das Paket &lt;code&gt;fwupd&lt;/code&gt; aus testing installiert werden. Da es hier noch die Abhängikeiten auf zwei weitere Pakete gibt (&lt;code&gt;libfwupd3&lt;/code&gt; und &lt;code&gt;libflashrom1&lt;/code&gt;), sind diese ebenfalls aus testing zu beziehen. Die Datei hat folgenden Aufbau:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Package: *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin: release n=trixie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin-Priority: 900
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Package: *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin: release a=testing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin-Priority: 50
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Package: fwupd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin: release a=testing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin-Priority: 950
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Package: libfwupd3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin: release a=testing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin-Priority: 950
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Package: libflashrom1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin: release a=testing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Pin-Priority: 950
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Im Prinzip steht hier, dass alle Pakete(&lt;code&gt;Package: *&lt;/code&gt;) mit einer Priorität von 900 von der aktuellen stabilen Debian Version &lt;code&gt;trixie&lt;/code&gt; installiert werden sollen. Testing hat hingegen eine kleine Priorität bekommen. Die drei genannten Ausnahmen haben hingegen eine höhere Priorität als die üblichen Pakete und werden daher aus dem Testing-Repo genommen.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint important&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa important&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Angaben zu Trixie-Backports sind hier nicht enthalten. Dieses Repo erhält standardmäßig eine Prioriät von 100 und kann mit dem Befehl &lt;code&gt;apt install -t trixie-backports &amp;lt;paket&amp;gt;&lt;/code&gt; verwendet werden.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Damit ist die Einstellung fertig. Das Programm &lt;code&gt;fwupd&lt;/code&gt; steht nun über beide Repos (Trixie und Testing) zu Verfügung. Dies kann mit dem Befehl &lt;code&gt;apt show -a fwupd&lt;/code&gt; eingesehen werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash-session&#34; data-lang=&#34;bash-session&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Package: fwupd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Version: 2.0.17-6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Priority: optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Section: admin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Maintainer: Debian EFI &amp;lt;debian-efi@lists.debian.org&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Installed-Size: 11,7 MB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Provides: fwupdate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Depends: systemd-sysusers, libarchive13t64 (&amp;gt;= 3.2.1), libblkid1 (&amp;gt;= 2.17.2), libc6 (&amp;gt;= 2.38), libcbor0.10 (&amp;gt;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Recommends: python3, bolt, default-dbus-system-bus | dbus-system-bus, udisks2, fwupd-signed, jq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suggests: gir1.2-fwupd-2.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Conflicts: fwupdate-amd64-signed, fwupdate-arm64-signed, fwupdate-armhf-signed, fwupdate-i386-signed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Breaks: fwupdate (&amp;lt;&amp;lt; 12-7), libdfu-dev (&amp;lt;&amp;lt; 0.9.7-1), libdfu1 (&amp;lt;&amp;lt; 0.9.7-1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Replaces: fwupdate (&amp;lt;&amp;lt; 12-7), gir1.2-dfu-1.0 (&amp;lt;&amp;lt; 0.9.7-1), libdfu-dev (&amp;lt;&amp;lt; 0.9.7-1), libdfu1 (&amp;lt;&amp;lt; 0.9.7-1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Homepage: https://github.com/fwupd/fwupd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Download-Size: 4.729 kB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;APT-Manual-Installed: yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;APT-Sources: http://deb.debian.org/debian testing/main amd64 Packages
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Description: Daemon für Firmware-Updates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Der Daemon fwupd ermöglicht Sitzungs-Software die Aktualisierung von
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Geräte-Firmware. Sie können entweder eine GUI-Softwareverwaltung wie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; GNOME Software verwenden, um Updates anzusehen und anzuwenden, oder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; das Kommandozeilenwerkzeug oder direkt die D-Bus-Systemschnittstelle.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Firmware-Updates werden für eine Vielzahl von Technologien unterstützt.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Siehe &amp;lt;https://github.com/fwupd/fwupd&amp;gt; für Details.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;go&#34;&gt;Package: fwupd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Version: 2.0.8-3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Priority: optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Section: admin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Maintainer: Debian EFI &amp;lt;debian-efi@lists.debian.org&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Installed-Size: 10,5 MB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Provides: fwupdate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Depends: systemd-sysusers, libarchive13t64 (&amp;gt;= 3.2.1), libblkid1 (&amp;gt;= 2.17.2), libc6 (&amp;gt;= 2.38), libcbor0.10 (&amp;gt;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Recommends: python3, bolt, default-dbus-system-bus | dbus-system-bus, udisks2, fwupd-signed, jq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Suggests: gir1.2-fwupd-2.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Conflicts: fwupdate-amd64-signed, fwupdate-arm64-signed, fwupdate-armhf-signed, fwupdate-i386-signed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Breaks: fwupdate (&amp;lt;&amp;lt; 12-7), gir1.2-dfu-1.0 (&amp;lt;&amp;lt; 0.9.7-1), libdfu-dev (&amp;lt;&amp;lt; 0.9.7-1), libdfu1 (&amp;lt;&amp;lt; 0.9.7-1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Replaces: fwupdate (&amp;lt;&amp;lt; 12-7), gir1.2-dfu-1.0 (&amp;lt;&amp;lt; 0.9.7-1), libdfu-dev (&amp;lt;&amp;lt; 0.9.7-1), libdfu1 (&amp;lt;&amp;lt; 0.9.7-1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Homepage: https://github.com/fwupd/fwupd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Download-Size: 4.409 kB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;APT-Sources: http://deb.debian.org/debian trixie/main amd64 Packages
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Description: Daemon für Firmware-Updates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Der Daemon fwupd ermöglicht Sitzungs-Software die Aktualisierung von
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Geräte-Firmware. Sie können entweder eine GUI-Softwareverwaltung wie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; GNOME Software verwenden, um Updates anzusehen und anzuwenden, oder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; das Kommandozeilenwerkzeug oder direkt die D-Bus-Systemschnittstelle.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Firmware-Updates werden für eine Vielzahl von Technologien unterstützt.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt; Siehe &amp;lt;https://github.com/fwupd/fwupd&amp;gt; für Details.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Durch die höher gesetzte Priorität in der &lt;code&gt;/etc/apt/preferences&lt;/code&gt; wird die neueste Version (hier 2.0.17-6) über den regulären Befehl installiert:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install fwupd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/package-from-testing/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Damit bin ich glücklich. Mein Paket ist in der gewünschten (aktuelleren) Version installiert, ich bleibe auf dem Stable-Release (Trixie) und hab trotzdem eine vertrauenswürdige Art und Weise der Installation über die Paket-Quellen von Debian.&lt;/p&gt;
&lt;p&gt;Der Grund für den Wunsch nach der höheren Version ist übrigens ein Bug in der über Trixie bereit gestellten Version 2.0.8-3, die ein &lt;a href=&#34;https://github.com/fwupd/fwupd/issues/8890&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Firmware-Update meines Thunderbold Host Controllers verhindert&lt;/a&gt;
.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/package-from-testing/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://backports.debian.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://backports.debian.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.debian.org/DebianTesting&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://wiki.debian.org/DebianTesting&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxnews.de/debian-13-backports-und-testing-aktivieren/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://linuxnews.de/debian-13-backports-und-testing-aktivieren/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/trixie/apt/sources.list.5.de.html#FORMAT_IM_DEB822-STIL&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://manpages.debian.org/trixie/apt/sources.list.5.de.html#FORMAT_IM_DEB822-STIL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxnews.de/debian-vereinfacht-umstellung-auf-deb822/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://linuxnews.de/debian-vereinfacht-umstellung-auf-deb822/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/fwupd/fwupd/issues/8890&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/fwupd/fwupd/issues/8890&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/Debian" term="Debian" label="Debian" />
        </entry>
        <entry>
            <title>Archiv-Seite bereit gestellt</title>
            <link href="https://toheine.net/posts/2025/implement-archive/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/implement-archive/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-11-16T10:49:35+01:00</published>
            <updated>2025-11-19T13:03:46+01:00</updated>
            <content type="html">
                &lt;p&gt;Nach etwas über 2 Jahren dieses Blog-Betriebs, muss ich immer mehr herum klicken, um bestimmte Artikel zu finden. Es ist ja nicht so, dass hier wöchentlich was passiert. Aber einige wichtige Artikel rutschen nach hinten. Es gibt zwar deutlich mächtigere Hugo-Themes, wie das von mir verwendete Theme &lt;a href=&#34;https://github.com/thegeeklab/hugo-geekblog&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hugo-geekblog&lt;/a&gt;
, aber die sind mir häufig zu überladen und ich hab schlichtweg nicht die Zeit und Lust mich in ein neues System einzudenken. Außerdem finde ich das Theme echt gut.&lt;/p&gt;
&lt;p&gt;Erfreulicherweise ist Hugo aber sehr anpassungsfähig. Ich benötige mit meinen wenigen Beiträgen pro Jahr keine Suchfunktion. Eine einfache Archivseite sollte reichen und diese war in einer Sonntag-Morgen-Aktion auch schnell bereit gestellt. Das Ergebnis findet sich oben in der Navigation bzw. über nachfolgenden Link: &lt;a href=&#34;/archive&#34;&gt;Archive&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;umsetzung&#34;
    &gt;
        Umsetzung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/implement-archive/#umsetzung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Umsetzung&#34; href=&#34;#umsetzung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Ganz ehrlich: Ich bin absolut kein Hugo-Profi. Aber mit der vorhandenen Doku und der Communtity, wird man schnell fündig. Die relevanten Links befinden sich unten in den Quellen-Angaben. Ich habe mich hauptsächlich an &lt;a href=&#34;https://www.thedroneely.com/posts/generating-archive-pages-with-hugo&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;diesem Beitrag&lt;/a&gt;
 orientiert. Damit konnte ich arbeiten und eine Anpassung für meinen Verwendungszweck vornehmen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schritt 1&lt;/strong&gt; ist die Bereitstellung einer Seite unter &lt;code&gt;content/archive.md&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-YAML&#34; data-lang=&#34;YAML&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Posts Archive&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;layout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;archive&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Schritt 2&lt;/strong&gt;: Die Inhalte werden dynamisch erzeugt und kommmen aus der Datei &lt;code&gt;layouts/archive.html&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Go HTML Template&#34; data-lang=&#34;Go HTML Template&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;define&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;section&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gblog-markdown&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cm&#34;&gt;{{/* List all usesd tags */}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Tags&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Site.Taxonomies.tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;gt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$tags&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$taxonomy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$tags&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;$.Site.GetPage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/tags/%s&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gblog-post__tag gblog-button gblog-button--regular&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;margin: 5px&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gblog-button__link&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.RelPermalink&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Title&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Title&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cm&#34;&gt;{{/* List all blog posts grouped by year */}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;posts&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;$.Store.Set&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Site.RegularPages.GroupByDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;2006&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;gt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;where&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Pages&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;where&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Pages&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;eq&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;$.Store.Get&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Date.Format&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;2006&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;$.Store.Set&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;$.Store.Set&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ul&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;where&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Pages&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Date.Format&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;02.01.&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.RelPermalink&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Title&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ul&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;section&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ein paar Anmerkungen dazu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zeile 2 und 10: Formatierung mit meinem Theme-CSS&lt;/li&gt;
&lt;li&gt;Zeile 4 bis 19: Übersicht der verwendeten Tags. Formatiert als Button des eingesetzten Hugo-Themes&lt;/li&gt;
&lt;li&gt;Zeile 22: Nur der Typ &amp;ldquo;Posts&amp;rdquo; erscheint in den Archiv-Einträgen&lt;/li&gt;
&lt;li&gt;Zeile 23 bis 42: Die eigentliche, nach Jahr gruppierte Auflistung aller Posts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/implement-archive/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;In den Zeilen sind noch ein paar Altlasten enthalten. Diese werden im Nachgang entfernt. Evtl. bekomme ich noch einen Input von den Hugo-Profis aus meiner Communtiy. Ansonsten finde ich das erste Ergebnis hier recht hilfreich. Die Aktion hatte darüber hinaus noch den Nebeneffekt, dass ich mal in meinen verwendeten Tags etwas ausgemistet habe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update am 19.11.2025&lt;/strong&gt;: Die genannten Altlasten wurden soeben entfernt. Die Codeblöcke in diesem Beitrag sind entsprechend angepasst.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/implement-archive/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.thedroneely.com/posts/generating-archive-pages-with-hugo/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.thedroneely.com/posts/generating-archive-pages-with-hugo/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://discourse.gohugo.io/t/adding-list-of-tags-to-my-homepage/41741&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://discourse.gohugo.io/t/adding-list-of-tags-to-my-homepage/41741&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/templates/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gohugo.io/templates/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://0xrommel.dev/posts/customizing-hugo-taglist-widget/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://0xrommel.dev/posts/customizing-hugo-taglist-widget/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/templates/new-templatesystem-overview/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gohugo.io/templates/new-templatesystem-overview/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Hugo" term="Hugo" label="Hugo" />
        </entry>
        <entry>
            <title>Wordle mit Regex lösen</title>
            <link href="https://toheine.net/posts/2025/wordle-mit-regex/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/wordle-mit-regex/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-11-11T09:12:24+01:00</published>
            <updated>2025-11-11T09:12:24+01:00</updated>
            <content type="html">
                &lt;p&gt;Reguläre Ausdrücke (Regex oder RegExp) sind hilfreich, wenn relevante Informationen aus Texten heraus gefiltert werden müssen. In der Praxis ist das total hilfreich aber im Unterricht kann das Thema eine trockene Sache sein. Hier hilft es das Thema spielerisch anzugehen. Eine Idee ist das Lösen des Wortsuche-Spiels &lt;strong&gt;Wordle&lt;/strong&gt; mit einer vorhandenen Wortliste und unter Verwendung von Regulären Ausdrücken.&lt;/p&gt;
&lt;p&gt;Das originale Spiel ist auf den Seiten der &lt;a href=&#34;https://www.nytimes.com/games/wordle/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;New York Times&lt;/a&gt;
. Allerdings gibt es hier nur ein Spiel pro Tag. Wer immer wieder neue Rätsel zum üben haben möchte, findet hier sein Glück:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://wordlegame.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://wordlegame.org/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Inhalt&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#die-idee&#34;&gt;Die Idee&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#beispielvorgehen&#34;&gt;Beispielvorgehen&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#varianten&#34;&gt;Varianten&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#abschließende-hinweise&#34;&gt;Abschließende Hinweise&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;die-idee&#34;
    &gt;
        Die Idee
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/wordle-mit-regex/#die-idee&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Die Idee&#34; href=&#34;#die-idee&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Sinn des Spiels ist es eigentlich, das jeweilige Wort ohne Cheating zu finden. Allerdings ist die Intention hier im Blog-Beitrag, nicht das Spiel an sich, sondern Lernende an Regex zu gewöhnen. Daher ist das Ziel, das Spiel mit Hilfe von Regex und einer Wortliste sicher zu lösen.&lt;/p&gt;
&lt;p&gt;Unter Debian gibt es das bereits installierte Paket &lt;code&gt;wamerican&lt;/code&gt;. Falls ein deutschsprachiges Wordle gelöst werden soll, kann das ebenfalls schon vorhandene Paket &lt;code&gt;wngerman&lt;/code&gt; verwendet werden. Die beiden Pakete stellen im Verzeichnis &lt;br&gt;&lt;code&gt;/usr/share/dict&lt;/code&gt; entweder eine englische (&lt;code&gt;american-englisch&lt;/code&gt;) oder deutsche (&lt;code&gt;ngerman&lt;/code&gt;) Wortliste bereit.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;beispielvorgehen&#34;
    &gt;
        Beispielvorgehen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/wordle-mit-regex/#beispielvorgehen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Beispielvorgehen&#34; href=&#34;#beispielvorgehen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Zu Spielbeginn gibt man ein beliebigesi, fünfstelliges, Wort ein. Wenn keine oder wenige Treffer erzielt werden, verwendet man ein weiteres Wort, das möglichst keine Buchstaben aus dem ersten Versuch enthält. Im folgenden Beispiel kann das wie folgt aussehen.&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle001.png&#34;&gt;
        &lt;picture&gt;
            &lt;source
                srcset=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle001_hu_3d8a498a89b8833e.png&#34;
            /&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle001_hu_a8ab757184745001.png&#34;
              alt=&#34;Eingabe 1 und 2 in Wordle&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Eingabe 1 und 2 in Wordle
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Bei dem Versuch aus der Abbildung ist zu erkennen, dass die Buchstaben &lt;code&gt;G&lt;/code&gt; und &lt;code&gt;T&lt;/code&gt; an der korrekten Stelle stehen. Die Buchstaben &lt;code&gt;I&lt;/code&gt; und &lt;code&gt;L&lt;/code&gt; hingegen, sind zwar im Wort enthalten, aber stehen der falschen Stelle. Mit Regex kann jetzt gefiltert werden. Die englischsprachige Wortliste besteht aus 104.334 Wörtern:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /usr/share/dict/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wc -l american-english
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In dem Spiel sind jedoch nur fünfstellige Wörter verlangt. Das heißt, zwischen Zeilenanfang &lt;code&gt;^&lt;/code&gt; und Zeilenende &lt;code&gt;$&lt;/code&gt; müssen genau fünf Zeichen stehen (jeweils repräsentiert durch einen Punkt):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep ^.....$ american-english
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es sind in der hier verwendeten Liste 7.044 fünfstellige Wörter enthalten. Das reduziert die verbleibende Anzahl der Lösungsmöglichkeiten erheblich, aber bringt hier noch keinen Mehrwert. Es verbleiben nur noch vier Versuche. Wenn im regulären Ausruck die Buchstaben &lt;code&gt;G&lt;/code&gt; und &lt;code&gt;T&lt;/code&gt; schon gesetzt werden, reduziert sich die Liste weiter. Zusätzlich wird über die Option &lt;code&gt;-i&lt;/code&gt; die Unterscheidung zwischen Groß- und Kleinschreibung ignoriert:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -i ^..g.t$ american-english
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es verbleiben 24 Wörter. Das ist deutlich besser, aber immer noch schwer zu erraten. Es ist zu erkennen, dass die Buchstaben &lt;code&gt;E&lt;/code&gt;, &lt;code&gt;O&lt;/code&gt;, &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;V&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt; und &lt;code&gt;M&lt;/code&gt; überhaupt nicht enthalten sind. Also können diese an den noch nicht fest stehenden Stellen ausgeschlossen werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -i ^&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;g&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;t$ american-english 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es verbleiben nur noch 8 Wörter. Weiterhin ist zus sehen, dass der Buchstabe &lt;code&gt;I&lt;/code&gt; nicht an Stelle 4 sein kann. Der Filterausdruck wird somit entsprechend erweitert:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -i ^&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;g&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^ieoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;t$ american-english 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;-&amp;gt; Es verbleiben 7 Wörter:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bight
fight
light
right
sight
tight
wight
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit kann es weiter gehen. In der Folge wird ein weiteres Wort probiert:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle002.png&#34;&gt;
        &lt;picture&gt;
            &lt;source
                srcset=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle002_hu_6b301fd3ac988338.png&#34;
            /&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle002_hu_644cadc3328d89a.png&#34;
              alt=&#34;Eingabe 3 in Wordle&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Eingabe 3 in Wordle
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Das Wort ist zwar nicht erraten, aber es ist zu sehen dass uns unser Vorgehen weiter bringt. Die Wortliste hat sich nicht weiter reduziert, was der angepasste reguläre Ausdruck verrät:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -i ^&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;ight$ american-english
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Liste hat die gleiche Länge wie zuvor:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bight
fight
light
right
sight
tight
wight
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Es ist jedoch auch zu sehen, dass der Bustabe &lt;code&gt;L&lt;/code&gt; enthalten sein muss. Das hätte auch schon im Schritt vorher auffallen können. Damit bleibt nur noch das letzte mögliche Wort &lt;code&gt;Light&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle003.png&#34;&gt;
        &lt;picture&gt;
            &lt;source
                srcset=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle003_hu_619f4e5b7cf3cf85.png&#34;
            /&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/wordle-mit-regex/images/wordle003_hu_9a98e0e26c74047f.png&#34;
              alt=&#34;Eingabe 4 in Wordle&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Eingabe 4 in Wordle
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;varianten&#34;
    &gt;
        Varianten
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/wordle-mit-regex/#varianten&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Varianten&#34; href=&#34;#varianten&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Ausgabe kann auch via Pipelines weiter gefiltert werden. Im nachfolgenden Beispiel wird nach den ersten beiden Eingabe-Versuchen im Spiel definiert, an welcher Stelle welcher Buchstabe nicht stehen kann und dann erneut gefilter, was als Buchstabe enthalten sein muss (egal an welcher Stelle). Damit wären wir schon nach drei Versuchen offensichtlich zum Ziel gekommen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -i ^&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;][&lt;/span&gt;^eoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;g&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;^ieoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;t$ american-english &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Viele Wege führen nach Rom: Die Verwendung oben ist nicht sehr elegant aber sie ist eine Art Herleitung wie man sich Schritt für Schritt zum Zielwort filtert. Mit folgender Eingabe kann man die Durchführung etwas effizienter durchführen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -vi &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;eoavnm&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; american-english &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -i ^..g.t$ &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;abschließende-hinweise&#34;
    &gt;
        Abschließende Hinweise
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/wordle-mit-regex/#abschließende-hinweise&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Abschließende Hinweise&#34; href=&#34;#abschlie%c3%9fende-hinweise&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Je nach verwendeter Wortliste verbleiben bei der Filterung mehr oder weniger Wörter als hier im Beispiel gezeigt.&lt;/li&gt;
&lt;li&gt;Es empfiehlt sich bei Wordle in den ersten beiden Versuchen möglichst alle Vokale auszuschließen&lt;/li&gt;
&lt;li&gt;In den Online verfügbaren Spielen können auch Wörter gesucht sein, die in den verwendeten Wortlisten nicht stehen. Dann kann das Spiel natürlich nicht auf die hier beschriebene Weise gelöst werden. Das ist aber eine sehr seltene Ausnahme.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/wordle-mit-regex/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Mit diesem Ansatz zur Lösung eines Spiels ist die Hürde zur Nutzung von Regulären Ausdrücken etwas weniger hoch und es wird schnell ersichtlich, dass mir das Werkzeug helfen kann. Darüber hinaus gibt es aber noch viele weitere Ideen. Witzig finde ich die Idee von &lt;a href=&#34;https://chaos.social/@blinry&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@blinry&lt;/a&gt;
, der auf seiner Webseite (vor vielen Jahren schon) einen kleinen &lt;a href=&#34;https://blinry.org/kernel-flueche/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Blogpost&lt;/a&gt;
 mit einem Hinweis hinterlegt hat, dass in den Kommentaren des Linux-Kernels zahlreiche Kraftausdrücke enthalten sind. Beispielhaftes vorgehen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.12.tar.xz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xJvf linux-5.19.12.tar.xz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; linux-5.19.12
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;egrep -ir &lt;span class=&#34;s2&#34;&gt;&amp;#34;(fuck|sucks|shit|bloody|crap)&amp;#34;&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/wordle-mit-regex/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nytimes.com/games/wordle/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nytimes.com/games/wordle/index.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wordlegame.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://wordlegame.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blinry.org/kernel-flueche/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://blinry.org/kernel-flueche/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/Regex" term="Regex" label="Regex" /> 
                                <category scheme="https://toheine.net/tags/Unterricht" term="Unterricht" label="Unterricht" />
        </entry>
        <entry>
            <title>DNS-Cleanup bei Hetzner</title>
            <link href="https://toheine.net/posts/2025/hetzner-dns-reg/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/hetzner-dns-reg/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-11-06T15:30:26+01:00</published>
            <updated>2025-11-06T15:30:26+01:00</updated>
            <content type="html">
                &lt;p&gt;Ich bin seit vielen Jahren Kunde bei Hetzner (beruflich wie privat). Und wie oft gehe ich in die WebUI von Hetzner Robot, die DNS-Konsole oder in die Hetzner Console (ehemals Hetzner Cloud)? Antwort: Nicht so oft. Es läuft ja alles und selbst neue VMs kann ich über die API erzeugen. Warum soll ich mir das dann zusammen klicken. Das ist aber genau so lange voll OK, bis es eine wesentliche Änderung gibt, die mir dann über die Bubble zugespielt wird: Ey &amp;hellip; haste mitbekommen &amp;hellip; die schalten die &lt;strong&gt;DNS Console&lt;/strong&gt; ab. &lt;span class=&#34;emoji&#34;&gt;😳&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;Inhalt:&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#dns-console-zieht-um&#34;&gt;DNS Console zieht um&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#domain-erwerb-und-zonen-datei&#34;&gt;Domain-Erwerb und Zonen-Datei&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;dns-console-zieht-um&#34;
    &gt;
        DNS Console zieht um
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/#dns-console-zieht-um&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor DNS Console zieht um&#34; href=&#34;#dns-console-zieht-um&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Dann muss ich mich halt mal wieder einloggen. In der DNS-Console fällt mir dann sofort das Banner auf:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/banner_warning_dns_console.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/banner_warning_dns_console.png&#34;
              alt=&#34;Info-Banner: DNS Console zieht in die Hetzner Console&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Info-Banner: DNS Console zieht in die Hetzner Console
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Umgezogen war das wirklich einfach. Wie gewohnt ist in den &lt;a href=&#34;https://docs.hetzner.com/de/networking/dns/migration-to-hetzner-console/process/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Docs&lt;/a&gt;
 alles vorbildlich beschrieben. Kann nichts schief gehen.&lt;/p&gt;
&lt;p&gt;In einem meiner Projekte, mit denen ich zu tun habe, gab es dann aber doch einen Impact: Dort werden via API die &lt;code&gt;_acme-challenge&lt;/code&gt;-Einträge für die &lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DNS-01-Challenge&lt;/a&gt;
 gesetzt. Das bisher verwendete Ansbile-Modul &lt;a href=&#34;https://docs.ansible.com/ansible/latest/collections/community/dns/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Community.Dns&lt;/a&gt;
 ist aber nach der durchgeführten Migration nicht mehr kompatibel. Ein wenig weitere Recherche führte mich zu dem &lt;strong&gt;zone_rrset-Modul&lt;/strong&gt; von &lt;a href=&#34;https://docs.ansible.com/ansible/latest/collections/hetzner/hcloud/zone_rrset_module.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hetzner.Hcloud&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Das Modul wird gerade aktiv entwickelt und erst vor wenigen Tagen wurde die &lt;a href=&#34;https://github.com/ansible-collections/hetzner.hcloud/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Version 6.0.0&lt;/a&gt;
 veröffentlicht. Daher musste ich das Modul auf meinem Ansible-Host erstmal aktualisieren:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ansible-galaxy collection install hetzner.hcloud --force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit konnte ich nun relativ schnell erfolgreich testen und die notwendigen Resource Records setzen. Aber &amp;hellip; und das ist meine komplett individuelle und subjektive Erkenntnis: Das Vorgehen via API die DNS-Einträge zu setzen ist gut und schön. Das funktioniert auch. Aber wenn der DNS-Server-Betreiber seinen Zugriff über die API ändert, muss man halt selbst nacharbeiten. Mir ist das jetzt zum zweiten Mal auf die Füße gefallen (das erste Mal war ich aber bei einem anderen DNS-Registrar).&lt;/p&gt;
&lt;p&gt;Dieses Szenario ist genau der Grund, warum ich bevorzugt auf einen eigenen DNS-Server setze und dann darüber die Let&amp;rsquo;s-Encrypt-Zertifikate via DNS-01-Challenge erzeuge. Ich hab das Vorgehen &lt;a href=&#34;/posts/2024/dehydrated-bind&#34;&gt;hier&lt;/a&gt;
 im Blog bereits beschrieben.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;domain-erwerb-und-zonen-datei&#34;
    &gt;
        Domain-Erwerb und Zonen-Datei
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/#domain-erwerb-und-zonen-datei&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Domain-Erwerb und Zonen-Datei&#34; href=&#34;#domain-erwerb-und-zonen-datei&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Bei meinen Tests ist mir noch ein weiterer Sachverhalt aufgefallen. Und das schreibe ich hier nur, damit ich in ferner Zukunft wieder in meinem eigenen Notizen nachlesen kann, was der Stolperstein ist. Es geht um die Schritte die bei Domain-Kauf durchzuführen sind.&lt;/p&gt;
&lt;p&gt;Bei den meisten mir bekannten DNS-Registraren wird bei Kauf einer Domain sofort und automatisch eine entsprechende Zonen-Datei angelegt auf die ich über eine WebUI zugreifen kann. Bei Hetzner ist das nicht so. Wenn ich via Hetzner Robot eine Domain kaufe und ich nicht im Vorfeld eine entsprechende Zonen-Datei mit den notwendigen authoritativen DNS-Servern und einem SOA-Eintrag eingestellt habe, erfolgt eine Warnung bei Kauf, die ich bestätigen muss &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/checkbox_buy_domain.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/checkbox_buy_domain.png&#34;
              alt=&#34;Warnung bei Kauf der Domain dass noch kein DNS-Eintrag hinterlegt wurde&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Warnung bei Kauf der Domain dass noch kein DNS-Eintrag hinterlegt wurde
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;&amp;hellip; und eine Fehlermeldung (per Mail und in der GUI) wenn ich dann die Domain &amp;ldquo;zahlungspflichtig registriert&amp;rdquo; habe. Im Robot wird das auch schön dargestellt (Weißes Kreuz auf rotem Grund rechts im Bild):&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/warn_sign_missed_zonefile.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/warn_sign_missed_zonefile.png&#34;
              alt=&#34;Hinweis auf unvollständig registrierte Domain&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Hinweis auf unvollständig registrierte Domain
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Die Fehlermeldung kann in den Domainmeldungen nachgelesen werden (Auszug):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;response:
  result:
    code: &amp;#39;2305&amp;#39;
    msg: &amp;#39;Object association prohibits operation&amp;#39;
    extValue:
      -
        value: ERROR
        reason: &amp;#39;Nameserver error [ERROR: 133 Answer must be authoritative \
                 (nameserver, ip, proto, record) \
                 (oxygen.ns.hetzner.com, 2a01:4f8:0:1::add:2992, udp, NS)]&amp;#39;
      -
        value: ERROR
        reason: &amp;#39;Nameserver error [ERROR: 901 Unexpected RCODE \
                 (nameserver, ip, proto, record) \
                 (oxygen.ns.hetzner.com, 2a01:4f8:0:1::add:2992, udp, NS)]&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Korrektur ist dann kein Hexenwerk, wenn man weiß wie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schritt 1 - Zonen-Datei anlegen:&lt;/strong&gt; In der Hetzner-Console muss in dem entsprechenden Projekt unter &lt;strong&gt;DNS&lt;/strong&gt; (1) eine DNS-Zone mit der neu erworbenen Domain hinzu gefügt werden (2). Im Formular trägt man den gewünschten Domainnamen (3) ein. Für den Test reicht eine leere Zone (4):&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/create_dns_zone.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/create_dns_zone.png&#34;
              alt=&#34;DNS-Zone anlegen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          DNS-Zone anlegen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Im Anschluss kann ich in die eben angelegte Zonen-Datei klicken und mir die dort hinterlegten NS- und SOA-Einträge anschauen, sowie weitere eigene Records anlegen. Oben erscheint eine kleine Warnmeldung mit einem Button daneben, der auf eine fehlerhafte Zonen-Delegierung hinweist:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/failed_zone_delegation.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/images/failed_zone_delegation.png&#34;
              alt=&#34;Hinweis auf fehlerhafte Zonen-Delegierung&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Hinweis auf fehlerhafte Zonen-Delegierung
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Schritt 2 - Fehler beseitigen:&lt;/strong&gt; Ein reiner Klick auf &amp;ldquo;Nameserver überprüfen&amp;rdquo; bringt hier nichts. Es muss noch im Hetzner Robot, bei den Domains 1x auf &amp;ldquo;Domain ändern&amp;rdquo; geklickt werden. Aktualisiere ich dann die Seite, ist die oben erwähnte rote Fehlermeldung weg. Zudem wird die Korrektur via Mail bestätigt. Erst im Anschluss führt der Klick in der Hetzner Console &amp;ldquo;Nameserver überprüfen&amp;rdquo; das gewünschte Ergebnis und die Meldung verschwindet.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Migration und das Troubleshooting meiner unvollständigen Domain-Registrierung hat mich gestern überhaupt nicht gestört. Es war alles irgendwie plausibel, nachvollziehbar und super dokumentiert. Zeit gekostet hat es dennoch. Wenn ich aber erneut über so ne Migration stolpere oder mich beim nächsten Domainkauf über Fehlermeldungen wundere, dann lese ich halt meinen eigenen Blog-Artikel. &lt;span class=&#34;emoji&#34;&gt;😎&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/hetzner-dns-reg/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.hetzner.cloud/reference/cloud&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.hetzner.cloud/reference/cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.hetzner.com/de/networking/dns/migration-to-hetzner-console/process/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.hetzner.com/de/networking/dns/migration-to-hetzner-console/process/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ansible-collections/hetzner.hcloud&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/ansible-collections/hetzner.hcloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.ansible.com/ansible/latest/collections/hetzner/hcloud/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.ansible.com/ansible/latest/collections/hetzner/hcloud/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.ansible.com/ansible/latest/collections/hetzner/hcloud/zone_rrset_module.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.ansible.com/ansible/latest/collections/hetzner/hcloud/zone_rrset_module.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.hetzner.com/de/cloud/api&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.hetzner.com/de/cloud/api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://toheine.net/posts/2024/dehydrated-bind/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://toheine.net/posts/2024/dehydrated-bind/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/DNS" term="DNS" label="DNS" /> 
                                <category scheme="https://toheine.net/tags/Hetzner" term="Hetzner" label="Hetzner" /> 
                                <category scheme="https://toheine.net/tags/Server" term="Server" label="Server" /> 
                                <category scheme="https://toheine.net/tags/Ansible" term="Ansible" label="Ansible" />
        </entry>
        <entry>
            <title>Hello GrapheneOS</title>
            <link href="https://toheine.net/posts/2025/hello-graphenos/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/hello-graphenos/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-10-02T15:16:38+02:00</published>
            <updated>2025-10-02T15:16:38+02:00</updated>
            <content type="html">
                &lt;p&gt;Ich hatte jetzt lange Jahre auf &lt;a href=&#34;https://calyxos.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CalyxOS&lt;/a&gt;
 gestzt. Das war für mich total gut. Zumal ich wirklich kein Custom-ROM-Experte bin. Ich lese mich ein, höre mich um und entscheide. Da muss es schon gewichtige Gründe geben von einem funktionierenden System zu wechseln.  Und den gab es jetzt. Aufgrund den (vorbildlich transparenten) Informationen von CalyxOS in einem &lt;a href=&#34;https://calyxos.org/news/2025/08/01/a-letter-to-our-community/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Letter to the CalyxOS community&lt;/a&gt;
 wurde über den aktuellen Stand mit dem Hinweis informiert, das das Projekt in den kommenden Monaten pausiert und daher auch keine Updates erhält. Für mich der Grund auf meinem Smartphone ein anderes, interessantes System zu installieren.&lt;/p&gt;
&lt;p&gt;Entschieden habe ich mich für &lt;a href=&#34;https://grapheneos.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GrapheneOS&lt;/a&gt;
. Dieses System wird in dem Kreis meiner Techie-Kollegen häufig eingesetzt und für mich enstand die Gelegenheit das zu testen. Die Installation war denkbar einfach und ist &lt;a href=&#34;https://grapheneos.org/install/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
 Schritt-für-Schritt dokumentiert. Ich habe mich dabei für die Installation via CLI entschieden und das hat auf anhieb geklappt. Wenn ich denke was für ein Krampf das noch vor Jahren war, ist das ganze Prozess in 60 Minuten erledigt. Die meiste Zeit ging für das Einlesen drauf. Die eigentliche Installation ist in wenigen Minuten erledigt.&lt;/p&gt;
&lt;p&gt;Jetzt gilt es in den nächsten Tagen die ganzen Messenger und Konten auf dem neuen Gerät einzurichten. Wer mehr zu GrapheneOS wissen will &amp;hellip; ich kann den folgenden Artikel von Mike Kuketz (2023) empfehlen: &lt;a href=&#34;https://www.kuketz-blog.de/grapheneos-der-goldstandard-unter-den-android-roms-custom-roms-teil7/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.kuketz-blog.de/grapheneos-der-goldstandard-unter-den-android-roms-custom-roms-teil7/&lt;/a&gt;
&lt;/p&gt;

            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Android" term="Android" label="Android" /> 
                                <category scheme="https://toheine.net/tags/CustomRom" term="CustomRom" label="CustomRom" /> 
                                <category scheme="https://toheine.net/tags/GrapheneOS" term="GrapheneOS" label="GrapheneOS" />
        </entry>
        <entry>
            <title>Toolbox aktualisiert</title>
            <link href="https://toheine.net/posts/2025/toolbox-aktualisiert/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/toolbox-aktualisiert/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-06-03T10:27:13+02:00</published>
            <updated>2025-09-05T13:57:27+02:00</updated>
            <content type="html">
                &lt;p&gt;Ich hatte mir schon länger vorgenommen die &lt;a href=&#34;/toolbox/overview&#34;&gt;Toolbox&lt;/a&gt;
 dieser Webseite etwas zu überarbeiten. Ziel ist es, für verschiedene Bereiche, die jeweiligen Werkzeuge aufzuführen. Daher gibt es nun die folgenden Abschnitte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/toolbox/overview/&#34;&gt;Allgemeine Hinweise&lt;/a&gt;
 zur Software-Auswahl&lt;/li&gt;
&lt;li&gt;Werkzeuge für den &lt;a href=&#34;/toolbox/pc&#34;&gt;PC bzw. für das Notebook&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Empfehlungen (vorwiegend Apps) für &lt;a href=&#34;/toolbox/smartphone&#34;&gt;Smartphones/Tablets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kleine Werkzeuge die &lt;a href=&#34;/toolbox/online-tools&#34;&gt;online&lt;/a&gt;
 zu Verfügung stehen&lt;/li&gt;
&lt;li&gt;Tools die ich ich auf der &lt;a href=&#34;/toolbox/cli&#34;&gt;Kommandozeile&lt;/a&gt;
 empfehlen kann&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Insbesondere die letzten beiden Kategorien sind jetzt nur initial gefüllt. Es fehlen noch weitere Apps/Online-Tools, ein paar Beschreibungen und weitere Quellen. Da wird noch einiges folgen.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Tools" term="Tools" label="Tools" />
        </entry>
        <entry>
            <title>Nationaler Akademietag 2025 in Weilburg</title>
            <link href="https://toheine.net/posts/2025/akademietag25/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/akademietag25/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-05-25T08:21:21+01:00</published>
            <updated>2025-05-25T08:21:21+01:00</updated>
            <content type="html">
                &lt;p&gt;Ein kleiner Beitrag für das Archiv hier. am 23./24.05.2025 fand an der Technikakademie Weilburg der Nationale Akademietag des Vereins IT-Bildungsnetz statt. Infos dazu gibt es unter &lt;a href=&#34;https://www.it-bildungsnetz.de/akademietage/2025-weilburg.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.it-bildungsnetz.de&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Es waren spannende Vorträge dabei, die ich in den kommenden Wochen unbedingt nacharbeiten möchte. Das Material zu den Vorträgen, gibt es unter dem eben genannten Link. Die Folien zu meinem Vortrag &lt;strong&gt;Praktische Prüfungen in CCNA-Modulen unter Verwendung eines Instruktoren-Servers&lt;/strong&gt; stelle ich direkt hier ein: &lt;a href=&#34;/posts/2025/akademietag25/ressources/ccna-final-skills-exam-infra-ansible-akademietag25-heine.pdf&#34;&gt;Foliendownload&lt;/a&gt;
&lt;/p&gt;

            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/CCNA" term="CCNA" label="CCNA" /> 
                                <category scheme="https://toheine.net/tags/Event" term="Event" label="Event" />
        </entry>
        <entry>
            <title>Festplatten auf Rootserver sicher löschen</title>
            <link href="https://toheine.net/posts/2025/platten-auf-rooti-shreddern/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/platten-auf-rooti-shreddern/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-05-03T07:15:24+02:00</published>
            <updated>2025-05-03T07:15:24+02:00</updated>
            <content type="html">
                &lt;p&gt;Heute habe ich einen Root-Server bei Hetzner gekündigt. Das Ding war ein Proxmox-Backup-Server und hat knapp 4 Jahre seinen Dienst getan. Ich hab den Service auf einen anderen Rooti umgezogen. Nun wollte ich allerdings sicher stellen, dass die Platten auch garantiert keine Daten mehr enthalten und dazu habe ich das Tool &lt;code&gt;shred&lt;/code&gt; verwendet.&lt;/p&gt;
&lt;p&gt;Zu Beginn musste ich im Hetzner Robot das &lt;strong&gt;Rescue-System&lt;/strong&gt; aktivieren und den Server neu starten. Nach einem SSH-Login erscheint der Prompt &lt;code&gt;root@rescue ~ #&lt;/code&gt; und ich konnte direkt los legen. Das Software-RAID und das LVM sind im Rescue-Modus aktiv (wenn auch nicht gemountet). Beides musste ich vorab entfernen.&lt;/p&gt;
&lt;p&gt;Mit dem Kommando &lt;code&gt;lsblk&lt;/code&gt; werden mir alle Block-Devices deren Partitionsschema gezeigt. Die für diesen Beitrag leicht veränderte Ausgabe, sah wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NAME              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;loop0               7:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  3.4G  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; loop  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sda                 8:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.7T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda1              8:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  512M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ └─md0             9:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; 1022M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; raid1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda2              8:2    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.7T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ └─md1             9:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.7T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; raid1 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─vg0-root    253:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   20G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; lvm   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─vg0-swap    253:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;    4G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; lvm   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └─vg0-data    253:2    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.5T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; lvm   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sda3              8:3    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;    1M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sdb                 8:16   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.7T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; disk  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sdb1              8:17   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  512M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ └─md0             9:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; 1022M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; raid1  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sdb2              8:18   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.7T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ └─md1             9:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.7T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; raid1 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─vg0-root    253:0    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;   20G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; lvm   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─vg0-swap    253:1    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;    4G  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; lvm   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └─vg0-data    253:2    &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  2.5T  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; lvm   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sdb3              8:19   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;    1M  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; part  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Um das Schreddern sauber durchzuführen, hab ich alle Logical Volumes, die Volumengruppe &lt;code&gt;vg0&lt;/code&gt; und das Physical Volume &lt;code&gt;/dev/md1&lt;/code&gt; gelöscht &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lvremove /dev/vg0/swap 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lvremove /dev/vg0/root 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lvremove /dev/vg0/home
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lvremove /dev/vg0/data
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vgremove vg0 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pvremove /dev/md1 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; und auch das Software-RAID gestoppt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mdadm --stop /dev/md0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mdadm --stop /dev/md1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das notwendige Tool &lt;code&gt;shred&lt;/code&gt; ist schon im Rescue-System bereits installiert. Allerdings dauert der Durchlauf ja einige Stunden bzw. Tage. Damit ich etwas flexibler in der Handhabung bin, hab ich noch &lt;code&gt;tmux&lt;/code&gt; installiert:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install tmux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nun konnte ich das Tool in einer tmux-Session starten:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shred -v /dev/sda /dev/sdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Möchte ich die Verbindung detachen, so dass der Prozess in der tmux-Session weiterläuft, erreiche ich das mit &lt;code&gt;STRG+B D&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Das war es auch schon. Während des Schredderns, hab ich alle paar Stunden nach dem aktuellen Sand geschaut. Sobald ich eingeloggt war, konnte ich mit &lt;code&gt;tmux a&lt;/code&gt; den Fortschritt beobachten. Nach etwa 34 Stunden war der Prozess beendet und ich konnte den Server kündigen.
Wenn ich mich nicht täusche, hätte ich mir das Löschen des LVMs und das Stoppen des Software-Raids sparen können, wenn ich &lt;code&gt;shred&lt;/code&gt; mit der Option &lt;code&gt;-f&lt;/code&gt; (force) gestartet hätte. Das teste ich dann das nächste Mal.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/Server" term="Server" label="Server" /> 
                                <category scheme="https://toheine.net/tags/Proxmox" term="Proxmox" label="Proxmox" /> 
                                <category scheme="https://toheine.net/tags/Hetzner" term="Hetzner" label="Hetzner" />
        </entry>
        <entry>
            <title>Chemnitzer Linux-Tage 2025</title>
            <link href="https://toheine.net/posts/2025/clt25/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/clt25/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-03-23T11:30:16+01:00</published>
            <updated>2025-03-23T11:30:16+01:00</updated>
            <content type="html">
                &lt;p&gt;Seit langem war ich endlich wieder, zusammen mit &lt;a href=&#34;https://social.tchncs.de/@and1bm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@and1bm&lt;/a&gt;
, &lt;a href=&#34;https://social.tchncs.de/@angry&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@angry&lt;/a&gt;
, &lt;a href=&#34;https://social.tchncs.de/@frank@moessingen.social&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@frank&lt;/a&gt;
, Jürgen und Flori, auf den Chemnitzern Linux-Tagen. Irgendwie ist in den letzten Jahren immer wieder was dazwischen gekommen. Um so größer war die Vorfreude. Das ist schon ein ganz besonderes Event.&lt;/p&gt;
&lt;p&gt;Ich muss sagen, es war wieder super: Das ist eine so große Veranstaltung und die ist hervorragend organisiert. Vom Catering, der Technik, der Security, dem Essen in der Mensa, bis hin zur Get-Together-Party am Samstag Abend. Ich hab keine Ahnung wie viele 1000 Stunden da im Vorfeld reingeflossen sind. Das ist der Wahnsinn. Sofern das hier irgend jemand vom CLT-Team liest: &lt;strong&gt;DAAAANKKEEE!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dazu gab es an der Veranstaltung selbst zahlreiche freiwillige Helfer, ansprechende Stände, interessante Vorträge und ein unheimlich tolles Publikum. Die Begegnungen sind so wichtig und geben mir wieder genug Energie für den Alltag.&lt;/p&gt;
&lt;p&gt;Abgesehen davon hab ich nen Sack voller Ideen im Gepäck, die ich mir in den nächsten Tagen ansehen werde. &lt;strong&gt;Chezmoi&lt;/strong&gt; und &lt;strong&gt;Incus&lt;/strong&gt; stehen ganz oben auf der Liste. Und ich werde mir noch die zahlreichen Videos von Vorträgen rein ziehen, die ich verpasst hab.&lt;/p&gt;
&lt;p&gt;Ich hatte selbst einen Vortrag zum Thema &lt;strong&gt;Kleine Bash Tricks&lt;/strong&gt; eingereicht und gehalten. Das dazugehörige Material findet Ihr hier:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;ressources/kleine_bash_tricks.pdf&#34;&gt;Foliendownload&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chemnitzer.linux-tage.de/2025/de/programm/beitrag/296&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Link zum Programmpunkt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://media.ccc.de/v/clt25-296-kleine-bash-tricks&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Video-Aufzeichnung&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich musste zwar etwas vorzeitig abreisen, aber ich bin insgesamt total zufrieden. Nun sitze ich im Zug, genieße die Landschaft und hoffe das ich nächstes Jahr wieder dabei sein werde.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weitere Infos&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webseite der Veranstaltung: &lt;br&gt;
&lt;a href=&#34;https://chemnitzer.linux-tage.de/2025/de/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://chemnitzer.linux-tage.de/2025/de/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video-Aufzeichnungen der Vorträge: &lt;br&gt;
&lt;a href=&#34;https://media.ccc.de/b/conferences/clt/2025&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://media.ccc.de/b/conferences/clt/2025&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/CLT" term="CLT" label="CLT" /> 
                                <category scheme="https://toheine.net/tags/Event" term="Event" label="Event" />
        </entry>
        <entry>
            <title>SSH-Grundlagen</title>
            <link href="https://toheine.net/posts/2025/ssh-grundlagen/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/ssh-grundlagen/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-02-20T13:58:05+01:00</published>
            <updated>2025-02-21T21:15:31+01:00</updated>
            <content type="html">
                &lt;p&gt;Sofern wir Dienste im Netz bereitstellen wollen, brauchen wir in der Regel auch einen sicheren Zugriff auf die entsprechenden Server. Das Protokoll der Wahl dafür ist &lt;code&gt;ssh&lt;/code&gt;, das in wenigen Schritten auf einem System installiert ist und sofort seine Arbeit aufnimmt. Die Verbindung zwischen einem Admin-PC/-Notebook und der Remote-Maschine läuft ab diesem Zeitpunkt verschlüsselt.&lt;/p&gt;
&lt;p&gt;Es müssen jedoch noch einige weitere Konfigurationen vorgenommen werden, um einen wirklich sicheren Zugriff zu gewährleisten. Im folgenden Beitrag, beschreibe ich die (aus meiner Sicht) dafür notwendigen Schritte, um einen OpenSSH-Server auf einem Linux-System zu betreiben.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#arbeitsweise-von-ssh&#34;&gt;Arbeitsweise von SSH&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#absicherung-eines-ssh-server-dienstes&#34;&gt;Absicherung eines SSH-Server-Dienstes&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#verwendung-von-public-key-auth&#34;&gt;Verwendung von Public-Key-Auth&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#mehr-komfort-mit-dem-ssh-agent&#34;&gt;Mehr Komfort mit dem SSH-Agent&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#anpassungen-am-ssh-client&#34;&gt;Anpassungen am SSH-Client&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazitausblick&#34;&gt;Fazit/Ausblick&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;arbeitsweise-von-ssh&#34;
    &gt;
        Arbeitsweise von SSH
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#arbeitsweise-von-ssh&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Arbeitsweise von SSH&#34; href=&#34;#arbeitsweise-von-ssh&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;SSH steht für &lt;strong&gt;Secure Shell&lt;/strong&gt; und arbeitet nach dem Client-Server-Prinzip. Der Zweck des Protokolls ist, dass sich ein User von einer lokalen Maschine auf einen entfernten Rechner &lt;strong&gt;verschlüsselt&lt;/strong&gt; (secure) und &lt;strong&gt;konsolenbasiert&lt;/strong&gt; (shell) verbinden kann. Nach Verbindungsaufbau können auf der Remote-Maschine entweder Befehle ausgeführt oder Konfigurationen vorgenommen werden.&lt;/p&gt;
&lt;p&gt;Auf einem Debian-System kann der Server-Dienst mit dem Befehl &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install openssh-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; installiert werden. Die Konfiguration findet in der Datei &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; statt. Um sich mit einem SSH-Server zu verbinden, wird ein SSH-Client benötigt, der in der Regel schon auf den unterschiedlichen Betriebssystemen zu Verfügung steht. Seit dem Update 1709 gilt das auch für Windows 10/11-Systeme. Der Weg über manuell installierte Clients (z. B. Putty) ist somit nicht mehr zwingend notwendig.&lt;/p&gt;
&lt;p&gt;Bei Verbindungsaufbau, authentfiziert sich &amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;der Server bei dem verwendeten SSH-Client mit einem seiner SSH-Host-Keys aus dem Verzeichnis &lt;code&gt;/etc/ssh/&lt;/code&gt; und&lt;/li&gt;
&lt;li&gt;der User beim Server via Passwort oder via Public-Key-Authentifizierung.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bei einer ersten Verbindung von einer lokalen Maschine zu einem Benutzerkonto &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; auf einem SSH-Server &lt;code&gt;&amp;lt;ziel&amp;gt;&lt;/code&gt; (kann eine IP-Adresse oder ein DNS-auflösbarer Name sein) via &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;ziel&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip;  erfolgt in der Regel eine Warnmeldung, in der ein Fingerprint des verwendeten (öffentlichen) SSH-Host-Keys angezeigt wird. Beispiel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The authenticity of host &lt;span class=&#34;s1&#34;&gt;&amp;#39;192.168.56.114 (192.168.56.114)&amp;#39;&lt;/span&gt; can&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;t be established.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ED25519 key fingerprint is SHA256:a8Uj2qFtWnW2ujoj6A3lZOh6WiqxmfcmqINS/2ttiIE.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;This key is not known by any other names.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Are you sure you want to &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt; connecting &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;yes/no/&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;fingerprint&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt;? &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Man sollte sich hier grundsätzlich die Zeit nehmen und diese Meldung nicht einfach ignorieren. Die Frage die sich hier stellt ist, ob der Fingerprint aus Zeile 2 (&lt;code&gt;SHA256:a8Uj2qFtWnW2ujoj6A3lZOh6WiqxmfcmqINS/2ttiIE&lt;/code&gt;) auch wirklich unseren SSH-Server, mit dem wir uns verbinden wollen, identifiziert.&lt;/p&gt;
&lt;p&gt;Bei Installation des SSH-Servers werden die SSH-Host-Keys generiert und die dazugehörigen Fingerprints auf der Konsole ausgegeben. Auszug:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Creating SSH2 RSA key&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; this may take some &lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;3072&lt;/span&gt; SHA256:uxqATqHB5yuIhFM5ntHR4c/plCzgDd0U7ceHDeOlFE8 root@srwe2501 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;RSA&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Creating SSH2 ECDSA key&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; this may take some &lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;256&lt;/span&gt; SHA256:DkZKa/n5YgxHHMsFEaFrNodFVybNrCCw9EMq9+Mqc88 root@srwe2501 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ECDSA&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Creating SSH2 ED25519 key&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; this may take some &lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;256&lt;/span&gt; SHA256:a8Uj2qFtWnW2ujoj6A3lZOh6WiqxmfcmqINS/2ttiIE root@srwe2501 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ED25519&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rescue-ssh.target is a disabled or a static unit not running, not starting it.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh.socket is a disabled or a static unit not running, not starting it.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In diesem Beispiel wurden insgesammt drei verschiedene SSH-Host-Key-Typen erstellt. Wir können sehen, dass der angzeigte Fingerprint vom Typ &lt;strong&gt;ED25519&lt;/strong&gt; (Zeile 6) unserer oben genannten Warnmeldung entspricht. Daher ist davon auszugehen, dass unser Zielserver tatsächlich das Gerät ist, mit dem wir uns verbinden wollen. In diesem Fall bestätigen wir die Frage oben mit &lt;strong&gt;yes&lt;/strong&gt;. Sind die Fingerprints unterschiedlich, haben wir entweder bei Verbindungsaufbau einen Fehler gemacht oder wir laufen in einen MITM-Angriff (Machine in the Middle).&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint tip&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa tip&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Tipp&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Sofern man später nochmal die Fingerprints der SSH-Host-Keys benötigt, können diese mit dem folgenden Befehl ausgegeben werden: &lt;code&gt;for i in /etc/ssh/*pub; do ssh-keygen -lf $i; done&lt;/code&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sobald die Warnmeldung akzeptiert wurde, wird der öffentliche Schlüssel in der Datei &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; auf dem lokalen Client gespeichert. Dadurch &amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;erfolgt keine erneute Warnmeldung bei erneuter Verbindung.&lt;/li&gt;
&lt;li&gt;eine andere Warnmeldung, die nicht einfach ignoriert werden kann, sobald sich der Host-Key ändert.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Falls wir den Server bei einem Service-Provider bestellen, haben wir keinen Einblick in die SSH-Host-Key-Erzeugung bei der Installation. Je nach Anbieter bekommen wir i. d. R. die Fingerprints der SSH-Host-Keys via Mail oder können sie über ein Portal einsehen.&lt;/div&gt;
&lt;/blockquote&gt;




&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
    
&lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
Zum Seitenanfang

  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;absicherung-eines-ssh-server-dienstes&#34;
    &gt;
        Absicherung eines SSH-Server-Dienstes
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#absicherung-eines-ssh-server-dienstes&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Absicherung eines SSH-Server-Dienstes&#34; href=&#34;#absicherung-eines-ssh-server-dienstes&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Nach der Installation des SSH-Servers, nimmt dieser sofort seinen Betrieb auf und lauscht auf TCP-Port 22. Alle lokal angelegten Benutzerinnen und Benutzer, die auf dem SSH-Server existieren, können sich mit Ihrem Passowort anmelden. Ausnahme: Der Benutzer &lt;strong&gt;root&lt;/strong&gt; darf sich i.d.R. nicht mit einem Passwort anmelden.&lt;/p&gt;
&lt;p&gt;Der Verbindungsaufbau von einem SSH-Client erfolgt mit dem folgenden Kommando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -l &amp;lt;username&amp;gt; &amp;lt;ziel&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Häufig verwendet ist auch der folgende Aufruf, der zum gleichen Ergebnis führt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;ziel&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wollen wir nun das Verhalten des SSH-Servers anpassen, müssen wir die notwendige Konfigurationsdatei unter &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; anpassen.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Bitte beachte das &lt;strong&gt;d&lt;/strong&gt; in &lt;code&gt;sshd_config&lt;/code&gt;. Es handelt sich dabei um die Konfigurationsdatei für den SSH-Server (d = Daemon). Bei der im selben Verzeichnis befindlichen Datei &lt;code&gt;ssh_config&lt;/code&gt;, handelt es sich um die Client-Konfiguration.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Die Konfigurationsdatei &lt;code&gt;sshd_config&lt;/code&gt; ist übersichtlich aufgebaut. Es gibt zahlreiche Einstellungsparameter, die bereits auskommentiert mit ihrem Default-Wert hinterlegt sind. Ich empfehle an dieser Stelle folgende Anpassung:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;root-Login komplett verbieten: &lt;br&gt;
&lt;code&gt;PermitRootLogin no&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SSH-Port auf einen anderen Port im Bereich von  49152 und 65535 (dynamische Ports) legen. Im weiteren Verlauf dieses Artikels verwende ich exemplarisch den Port 54321: &lt;br&gt;
&lt;code&gt;Port 54321&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SSH-Agent-Forwarding abschalten: &lt;br&gt;
&lt;code&gt;AllowAgentForwarding no&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Banner-Nachricht vor Authentifizierung hinterlegen: &lt;br&gt;
&lt;code&gt;Banner /etc/issue.net&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Die Banner-Mitteilung wird vor der Authentifizierung angezeigt. Um internationaler Rechtsprechung zu genügen, wäre hier ein Text ähnlich dem folgenden Beispiel zu empfehlen, der in der Datei &lt;code&gt;/etc/issue.net&lt;/code&gt; hinterlegt wird:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;===============================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                !!!Authorized Access Only!!! 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      This server is under the control of Tobias Heine
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         All connections are monitored and recorded!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Disconnect IMMEDIATELY &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; you are not an authorized user!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;===============================================================&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Änderungen in der &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; werden erst wirksam, nachdem die Konfiguration neu geladen bzw. der Serverdienst neu gestartet wurde:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Darüber hinaus sollte noch eine Firewall installiert/aktiviert werden. Setzen wir an dieser Stelle auf &lt;code&gt;ufw&lt;/code&gt;, brauchen wir zu Beginn nur wenige Befehle:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install ufw
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ufw allow &lt;span class=&#34;m&#34;&gt;54321&lt;/span&gt; comment &lt;span class=&#34;s2&#34;&gt;&amp;#34;Allow SSH from everywhere&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ufw &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dass die Firewall korrekt konfiguriert ist, sehen wir mit dem Befehl &lt;code&gt;ufw status verbose&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ufw_status_verbose.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ufw_status_verbose.png&#34;
              alt=&#34;Aktive UFW Firewall die derzeit nur Port 54321 erlaubt&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Aktive UFW Firewall die derzeit nur Port 54321 erlaubt
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Im weiteren Verlauf, werden wir den Zugriff auf SSH noch weiter einschränken. Für den Anfang kann man auf unserem Server nur den konfigurierten Port für eine SSH-Verbindung verwenden. Möchten wir den Server nach unserer SSH-Konfiguration z. B. als Webserver verwenden, müssen wir für dieses Einsatzszenario noch die &lt;strong&gt;TCP-Ports 80 und 443&lt;/strong&gt; öffnen.&lt;/p&gt;
&lt;p&gt;Im letzten Schritt der Absicherung installieren wir noch &lt;code&gt;fail2ban&lt;/code&gt;. Dieses Tool sperrt direkt nach der Installation alle IP-Adressen, die wiederholt Authentifizierungs-Fehler verursachen. Unter Debian 12 installiere ich zusätzlich &lt;code&gt;rsyslog&lt;/code&gt;, damit fail2ban gleich problemlos arbeitet.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install fail2ban rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Service &lt;code&gt;fail2ban&lt;/code&gt; übernimmt sofort seine Arbeit und sperrt alle IP-Adressen für eine definierte Zeit (Default = 1 Stunde) aus, die sich mehr als drei Mal falsch an unserem Server authentifizeren.&lt;/p&gt;
&lt;p&gt;Bei Bedarf können wir hier restriktiver konfigurieren oder auch die Login-Versuche für weitere Services überwachen.&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
    
&lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
Zum Seitenanfang

  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;verwendung-von-public-key-auth&#34;
    &gt;
        Verwendung von Public-Key-Auth
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#verwendung-von-public-key-auth&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Verwendung von Public-Key-Auth&#34; href=&#34;#verwendung-von-public-key-auth&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Verwendung von Passwörtern bei SSH-Verbindungen ist aus folgenden Gründen nicht zu empfehlen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Passwörter sind entweder unsicher oder so sicher, dass die wiederholte Eingabe zeitraubend und fehleranfällig ist.&lt;/li&gt;
&lt;li&gt;Jeder Login-Vorgang benötigt immer ein Passwort. Das geht eleganter.&lt;/li&gt;
&lt;li&gt;Wenn auf dem Zielserver mehrere Admins mit Funktions-Accounts arbeiten (z. B. admin), dann muss das Passwort für den SSH-Zugriff im Team geteilt werden. Das führt dazu, dass die Sicherheit weiter aufgegeben wird und dass bei Ausscheiden von Mitarbeitern die Passwörter geändert werden müssen. Das ist nicht praktikabel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Alternative ist, dass statt eines Passworts, jeder user auf dem jeweiligen Arbeitsgerät, ein eigenes SSH-Key-Pärchen für die Authentifizierung erstellt und auf dem SSH-Server die öffentlichen Schlüssel der berechtigen Personen hinterlegt werden.&lt;/p&gt;
&lt;p&gt;Für die Erzeugung der Key-Pärchen nutzen wir &lt;code&gt;ssh-keygen&lt;/code&gt; auf unserem &lt;strong&gt;persönlichen Arbeits-Gerät (PC oder Notebook)&lt;/strong&gt;. Der reine Aufruf des Befehls startet einen Assistenten und erzeugt einen &lt;strong&gt;RSA-Key&lt;/strong&gt;. Wir wollen (sofern vom Server unterstützt) jedoch den etwas moderneren Algorithmus &lt;strong&gt;ed25519&lt;/strong&gt; verwenden.&lt;/p&gt;
&lt;p&gt;Das erreichen wir mit folgendem Kommando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t ed25519
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Assistent fragt uns nach dem Speicherort und einer Passphrase. Lassen wir den Dateinamen unverändert liegen die beiden erzeugten Dateien (das Keypärchen) unter &lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt; und &lt;code&gt;~/.ssh/id_ed25519.pub&lt;/code&gt;. Handelt es sich bei meinem Arbeitsgerät um ein Windows-System, sind die beiden Dateien vss. unter &lt;code&gt;C:\Users\&amp;lt;username&amp;gt;\.ssh&lt;/code&gt; zu finden.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Bitte an dieser Stelle unbedingt ein solides Passwort bzw. eine Passphrase vergeben.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Der Aufruf der Key-Erzeugung kann noch mit weiteren Optionen erfolgen. Für mich hat sich bewährt, dass ich den Speicherpfad via Option übergebe und das Kommentarfeld anpasse. Der Aufruf sieht dann wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t ed25519 -a &lt;span class=&#34;m&#34;&gt;100&lt;/span&gt; -f ~/.ssh/id_ed25519_sshlab -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;mailadresse&amp;gt;:&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;hostname&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mit der Option &lt;code&gt;-a 100&lt;/code&gt; wird die Passphrasebestätigung in die länge gezogen. Damit fällt es schwerer das Passwort zu knacken, sollte der Key Mal von meinem Arbeitsgerät gestohlen werden. Mit der Verwendung von &lt;code&gt;-C &amp;quot;&amp;lt;mailadresse&amp;gt;:$(hostname)&amp;quot;&lt;/code&gt; wird das übliche Muster &lt;code&gt;&amp;lt;username&amp;gt;@&amp;lt;client-hostname&amp;gt;&lt;/code&gt; überschrieben. Das erleichtert im Team die Identifizierung.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint tip&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa tip&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Tipp&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Aus meiner Sicht ist es ratsam, wenn jede Arbeitsstation (z. B. PC und Notebook) ihr eigenes SSH-Key-Pärchen bereit stellt. Wird das Notebook mit einem der beiden SSH-Keys gestohlen, ist es dadurch einfacher, die betroffenen Keys von den SSH-Servern zu löschen und gleichzeitig mit dem PC sorgenfrei weiter zu arbeiten.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sobald die Keypärchen erstellt wurden, sind nach dem Aufruf oben unter &lt;code&gt;~/.ssh/&lt;/code&gt; die folgenden beiden Dateien zu finden:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/listed_ssh_key_pair.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/listed_ssh_key_pair.png&#34;
              alt=&#34;Erzeugtes SSH-Keypärchen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Erzeugtes SSH-Keypärchen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Die Datei mit der Endung &lt;code&gt;.pub&lt;/code&gt; enthält den öffentlichen SSH-Schlüssel (1) sowie den Kommentar (2), den wir bei Erzeugung mit der Option &lt;code&gt;-C&lt;/code&gt; übergeben haben:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ssh_pub_key.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ssh_pub_key.png&#34;
              alt=&#34;Inhalt der Datei `~/.ssh/id_ed25519_sshlab.pub`&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Inhalt der Datei `~/.ssh/id_ed25519_sshlab.pub`
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Diese Datei werden wir im weiteren Verlauf auf den oder die SSH-Server schieben. Die zweite Datei beinhaltet den privaten Schlüssel. &lt;strong&gt;Diesen hüten wir wie unseren Augapfel und geben ihn niemals raus&lt;/strong&gt;. Die Dateizugriffsberechtigungen sind hier mit &lt;code&gt;-rw-------&lt;/code&gt; entsprechend gesetzt worden.&lt;/p&gt;
&lt;p&gt;Der Public-Key muss nun auf den Ziel-Servern in der Datei &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; des Users hinterlegt werden, mit dem wir uns auf dem Zielhost verbinden. Das kann mit dem Befehl &lt;code&gt;ssh-copy-id&lt;/code&gt; erfolgen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-copy-id -i ~/.ssh/id_ed25519_sshlab.pub &amp;lt;username&amp;gt;@&amp;lt;IP-Adresse oder FQDN&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im Anschluss muss man sich via Passwort authentifizieren und der Key wird in die &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; von &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt;, auf dem SSH-Server eingetragen. Sobald das erledigt ist, kann mit dem Befehl &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -i ~/.ssh/id_ed25519_sshlab &amp;lt;username&amp;gt;@&amp;lt;ziel&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; die Verbindung aufgebaut werden. Es muss bei jedem Verbindungsaufbau die PASSPHRASE des Keys mit übergeben werden.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Hätten wir den Standard-Pfad bei Ausführung von &lt;code&gt;ssh-keygen&lt;/code&gt; unverändert gelassen, wäre das Keypärchen unter den Namen &lt;code&gt;id_ed25519&lt;/code&gt; und &lt;code&gt;id_ed25519.pub&lt;/code&gt; erzeugt worden. In diesem Fall brauchen wir bei Verbindungsaufruf die Option &lt;code&gt;-i&lt;/code&gt; nicht mit angeben. Es reicht dann ein &lt;code&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;ziel&amp;gt;&lt;/code&gt;, da der SSH-Client automatisch diese Default-Schlüssel verwendet.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Im Anschluss ist es sinnvoll den Zugriff zu testen und dann den SSH-Server so zu konfigurieren, dass eine Authentifizierung nur noch über Public-Key-Authentifizierung erlaubt ist. Daher setzen wir auf der Remote-Maschine die entsprechenden Zeilen in der &lt;code&gt;/etc/sshd_config&lt;/code&gt; auf &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PasswordAuthentication no
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip;  und starten den SSH-Service neu:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sytemctl restart sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sofern man sich nun mit einem Passwort auf unserem SSH-Server anmelden möchte, erfolgt folgende Warnung und der Verbindungsaufbau wird abgebrochen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;username&amp;gt;@&amp;lt;ziel&amp;gt;: Permission denied (publickey).
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Perfekt: Damit kommt man nur noch via Public-Key-Authentifizierung auf unseren SSH-Server.&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
    
&lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
Zum Seitenanfang

  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;mehr-komfort-mit-dem-ssh-agent&#34;
    &gt;
        Mehr Komfort mit dem SSH-Agent
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#mehr-komfort-mit-dem-ssh-agent&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Mehr Komfort mit dem SSH-Agent&#34; href=&#34;#mehr-komfort-mit-dem-ssh-agent&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Je nach Betriebssystem oder eingesetzer Desktopumgebung unterscheidet sich die Handhabung des SSH-Agents. Die nachfolgenden Zeilen beschreiben die Verwendung auf einer Linux Shell (bash).&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Die Verwendung der Public-Key-Authentifizierung erhöht die Sicherheit deutlich. Aber das Handling ist für uns noch etwas schwierig. Grund: Jeder Login erfordert eine Eingabe der oben gesetzten Passphrase.&lt;/p&gt;
&lt;p&gt;Das kann auf dem Arbeitsgerät mit der Verwendung von &lt;code&gt;ssh-agent&lt;/code&gt; optimiert werden. Den Agent starten wir mit folgendem Aufruf:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;ssh-agent -s&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nun können wir einen oder mehrere Keys in den &lt;code&gt;ssh-agent&lt;/code&gt; laden. Das machen wir &lt;strong&gt;VOR&lt;/strong&gt; einem Verbidnungsaufbau mit unseren SSH-Servern:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-add ~/.ssh/id_ed25519_sshlab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wir werden (1) nach der entsprechenden PASSPHRASE gefragt, die wir eingeben und erhalten im Anschluss die Meldung (2), dass der Key (die Identität) hinzugefügt wurde:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/using_ssh_agent.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/using_ssh_agent.png&#34;
              alt=&#34;SSH-Key an SSH-Agent übergeben&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          SSH-Key an SSH-Agent übergeben
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Wenn wir im späteren Verlauf kontrollieren wollen, welche Keys zum SSH-Agent hinzugefügt wurden, können wir das mit folgendem Befehl kontrollieren:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-add -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das war es. Der Verbindungsaufbau erfolgt wie gehabt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -i ~/.ssh/id_ed25519_sshlab &amp;lt;username&amp;gt;@&amp;lt;ziel&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im Gegensatz zum Verfahren ohne &lt;code&gt;ssh-agent&lt;/code&gt; ist zu beobachten, dass wir nun die Passphrase bei Login nicht mehr übergeben mussten. Das übernimmt der &lt;code&gt;ssh-agent&lt;/code&gt; ab jetzt und funktioniert so lange ich mich nicht aus der Sitzung am Arbeitsgerät abmelde. Will ich mich auf 10 Servern verbinden, muss ich meine Identität (meinen Key) nur einemal mit der PASSPHRASE an den &lt;code&gt;ssh-agent&lt;/code&gt; übergeben und komme für den Rest der Zeit ohne Passwort auf meine Systeme. Auch Entwickler die ihre Projekte auf einer &lt;strong&gt;git-Instanz&lt;/strong&gt; lagern und via SSH clonen, fetchen, pushen oder pullen, werden diesen Vorteil zu schätzen wissen.&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
    
&lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
Zum Seitenanfang

  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;anpassungen-am-ssh-client&#34;
    &gt;
        Anpassungen am SSH-Client
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#anpassungen-am-ssh-client&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Anpassungen am SSH-Client&#34; href=&#34;#anpassungen-am-ssh-client&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Der Zugriff auf entfernte Systeme kann noch weiter vereinfacht werden. Hierzu wird die Client-Konfiguration auf dem Arbeitsgerät angepasst. Wie schon oben erwähnt, liegt die dazu notwendige Konfig-Datei unter &lt;code&gt;/etc/ssh/ssh_config&lt;/code&gt; (diesmal ohne &lt;em&gt;d&lt;/em&gt;) und ist global für alle Benutzerinnen und Benutzer eines Systems gültig.&lt;/p&gt;
&lt;p&gt;Zudem gibt es im eigenen Verzeichnis unter &lt;code&gt;~/.ssh/config&lt;/code&gt; die Möglichkeit eine Konfigurationsdatei zu hinterlegen. Diese ist nur für den jeweiligen User gültig und der Ort der Wahl für unseren weiteren Anpassungen.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint tip&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa tip&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Tipp&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Windows-User erstellen die erwähnte Datei ebenfalls in ihrem Homeverzeichnis:
&lt;br&gt;(z. B. unter &lt;code&gt;C:\Users\&amp;lt;username&amp;gt;\.ssh\config&lt;/code&gt;)&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;In dieser Datei werden pro Host entsprechende Verbindungsparameter hinterlegt. Ein Beispiel für den Zugriff auf zwei verschiedene SSH-Server könnte wie folgt aussehen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Host yodasvm
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Hostname 192.168.56.101
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  User yoda
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Port &lt;span class=&#34;m&#34;&gt;54321&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  IdentityFile ~/.ssh/id_ed25519_sshlab
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Host vadersvm
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Hostname 192.168.56.102
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  User vader
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Port &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  IdentityFile ~/.ssh/id_ed25519_sshlab&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Der Verbindungsaufruf ist somit massiv verkürzt. Wollen wir uns mit dem SSH-Server &lt;strong&gt;vadersvm&lt;/strong&gt; verbinden, erfolgt der Aufruf via:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh vadersvm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es können auf diese Weise zahlreiche Zielhosts angegeben und einfach aufgerufen werden. Hier hat es sich übrigens für mich bewährt, dass ich pro Projekt eine eigene Config-Datei vorhalte. Dazu hab ich in meiner &lt;code&gt;~/.ssh/config&lt;/code&gt; die Anweisung &lt;code&gt;Include config.d/*&lt;/code&gt; hinterlegt &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ssh_config.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ssh_config.png&#34;
              alt=&#34;SSH-Konfiguration mit Verweis auf weitere Dateien in einem Unterordner&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          SSH-Konfiguration mit Verweis auf weitere Dateien in einem Unterordner
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;&amp;hellip; und dann im angegebenen Ordner &lt;code&gt;config.d&lt;/code&gt; die einzelnen Dateien abgespeichert:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ssh_configd.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/ssh_configd.png&#34;
              alt=&#34;SSH-Client-Konfigurationen nach Projekten geteilt&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          SSH-Client-Konfigurationen nach Projekten geteilt
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Der Vorteil von diesem Verfahren ist, dass ich dadurch etwas aufgeräumter arbeite und zudem die Dateien bei meinen jeweiligen Kollegen schnell austauschen kann.&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
    
&lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
Zum Seitenanfang

  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazitausblick&#34;
    &gt;
        Fazit/Ausblick
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#fazitausblick&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit/Ausblick&#34; href=&#34;#fazitausblick&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Das ist jetzt ein relativ großer Beitrag geworden (für meine Verhältnisse). Und es wurden so viele Dinge noch nicht angesprochen, die einen weiteren Beitrag verlangen. Im Admin-Alltag nützlich sind z. B. die &lt;code&gt;proxyjump&lt;/code&gt;-Verbindungsparamter und eigentlich gehört auch noch erwähnt, dass &lt;code&gt;SSH-Agent-Forwarding&lt;/code&gt; eine kritische Funktion ist. Professionelle Umgebungen setzen zudem auf Zertifikate um ein Vertrauen zu einem SSH-Server herzustellen. Darüber hinaus gibt es noch weitere Möglichkeiten, wie man SSH in Arbeitsgruppen optimiert einsetzt.&lt;/p&gt;
&lt;p&gt;Aber dieser Artikel sollte ein erster SSH-Grundlagen-Beitrag werden, der einen Überblick über das Protokoll, den sichern Zugriff auf Remote-Hosts und ein paar Tipps für das Handling zu Verfügung stellt. Ich hoffe dass ist mir halbwegs gelungen. Sofern ich hier zwischen den Zeilen irgend einen Quatsch fabriziert habe, freue ich mich über eine Rückmeldung auf den üblichen Kanälen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apropos Überblick&lt;/strong&gt;: Eine schöne Übersicht, welche Dateien bei einer Public-Key-Authentifizierung relevant sind, findet man auf folgender Grafik:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/Pubkey_Secure_Shell_login.svg&#34;&gt;
        &lt;picture&gt;
          &lt;img
              src=&#34;https://toheine.net/posts/2025/ssh-grundlagen/images/Pubkey_Secure_Shell_login.svg&#34; width=&#34;600&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Arbeitsweise SSH
            (And1mu, &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/4.0&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CC BY-SA 4.0&lt;/a&gt;
, via &lt;a href=&#34;https://commons.wikimedia.org/wiki/File:Pubkey_Secure_Shell_login.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wikimedia Commons&lt;/a&gt;
)
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;




&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
    
&lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
Zum Seitenanfang

  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/ssh-grundlagen/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/bookworm/openssh-server/sshd_config.5.en.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;man 5 sshd_config&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/bookworm/openssh-client/ssh_config.5.en.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;man 5 ssh_config&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/bookworm/openssh-client/ssh-keygen.1.en.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;man 1 ssh-keygen&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/bookworm/openssh-client/ssh-add.1.en.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;man 1 ssh-add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/risan/upgrade-your-ssh-key-to-ed25519-c6e8d60d3c54&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Upgrade your SSH key to ed25519&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://de.wikipedia.org/wiki/Secure_Shell&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wikipedia: Secure Shell&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/Server" term="Server" label="Server" /> 
                                <category scheme="https://toheine.net/tags/Security" term="Security" label="Security" /> 
                                <category scheme="https://toheine.net/tags/SSH" term="SSH" label="SSH" />
        </entry>
        <entry>
            <title>Blog umgezogen</title>
            <link href="https://toheine.net/posts/2025/moved_blog/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/moved_blog/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-01-23T19:36:58+01:00</published>
            <updated>2025-01-23T19:36:58+01:00</updated>
            <content type="html">
                &lt;p&gt;Dieser Blog hier läuft nun seit etwa 18 Monaten. Gleich zu Beginn hatte ich &lt;a href=&#34;/posts/2023/website-deployment&#34;&gt;hier&lt;/a&gt;
 dokumentiert, wie ich das mit Hilfe von  &lt;a href=&#34;https://ci.codeberg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codeberg CI&lt;/a&gt;
 und &lt;a href=&#34;https://docs.codeberg.org/codeberg-pages/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codeberg Pages&lt;/a&gt;
 umgesetzt habe. Im Prinzip hat das auch super funktioniert und ich war mit dem Setting grundsätzlich zufrieden.&lt;/p&gt;
&lt;p&gt;Allerdings sind die Seiten von &lt;a href=&#34;https://codeberg.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org&lt;/a&gt;
 ziemlich unter Last und ich hatte fast täglich kleine Downtimes. Dieser Blog hat wirklich keine besonders große Reichweite und von daher hat mich das bisher wenig gestört. Allerdings war die Seite diese Woche zum zweiten Mal in einer Veranstaltung offline, in der ich als Referent auf Inhalte verweisen wollte.&lt;/p&gt;
&lt;p&gt;Aus diesem Grund habe ich beschlossen, den Blog auf einen eigenen Webserver umzuziehen. Falls das hier irgendwann Mal jemand von Codeberg e. V. lesen sollte: Bitte nicht falsch verstehen &amp;hellip; Ihr macht einen super Job. Ich bin und bleibe ein großer Codeberg-Fan und werde weiterhin alle meine öffentlichen Git-Repos unter &lt;a href=&#34;https://codeberg.org/toheine&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine&lt;/a&gt;
 ablegen.&lt;/p&gt;
&lt;p&gt;Das Deployment funktioniert ab jetzt wie folgt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Hugo Sourcen liegen auf einer &lt;a href=&#34;https://forgejo.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Forgejo&lt;/a&gt;
-Instanz unter &lt;a href=&#34;https://git.toheine.net&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://git.toheine.net&lt;/a&gt;
 in einem privaten Repo. Das hat den Vorteil, dass ich dort meine eigenen Notizen in den Issues hinterlegen kann, die ich nicht veröffentlichen will (Ideen, Verbesserungen, sonstige Notizen).&lt;/li&gt;
&lt;li&gt;Zusätzlich werden von dort die Quelldateien auf &lt;a href=&#34;https://codeberg.org/toheine/toheine_sources&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/toheine_sources&lt;/a&gt;
 gespiegelt. Jedes einzelne &lt;code&gt;git push&lt;/code&gt;-Kommando führt zu einer Synchronisation.&lt;/li&gt;
&lt;li&gt;Die Bereitstellung der gebauten Seiten auf meinem Webserver erfolgt in einer leicht veränderten Pipeline (vergleiche Zeile 30 bis 38 in &lt;a href=&#34;https://codeberg.org/toheine/toheine_sources/src/commit/87e9072dd536875995b6c2e00ba3aa3cc85d5f29/.woodpecker.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;.woodpecker.yml&lt;/a&gt;
) nach dem ähnlichen Prinzip wie bisher.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Letztendlich sind Verfahrensweise und die verwendeten Tools die gleichen. Die eigene &lt;strong&gt;Forgjo&lt;/strong&gt;-Instanz (Ein Gitea-Fork der durch Codeberg e. V. entwickelt wird) und &lt;strong&gt;Woodpecker CI&lt;/strong&gt; waren auch im vorherigen Setting im Einsatz. Nur das Ziel ist nun kein Git-Repo-Pages-Branch, sondern ein Webroot-Verzeichnis auf einem herkömmlichen Webserver.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Hugo" term="Hugo" label="Hugo" /> 
                                <category scheme="https://toheine.net/tags/Git" term="Git" label="Git" /> 
                                <category scheme="https://toheine.net/tags/Forgejo" term="Forgejo" label="Forgejo" />
        </entry>
        <entry>
            <title>Shell-Session-Recordings mit asciinema via Skript</title>
            <link href="https://toheine.net/posts/2025/autotype-commands/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2025/autotype-commands/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2025-01-05T11:11:07+01:00</published>
            <updated>2026-03-02T10:54:42+01:00</updated>
            <content type="html">
                &lt;p&gt;Ich hab mir in der Adventszeit mit meinen Kollegen Gedanken darüber gemacht, wie wir Linux-Befehle für unsere Schülerinnen und Schüler besser zugänglich machen. Die Lebenswelt unserer Lernenden fordert an dieser Stelle häufig &amp;hellip; Videos. Das ist aber so überhaupt nicht meine Art der Unterrichtsgestaltung. Ich hab zwar schon das ein oder andere Video erstellt, aber das skaliert nicht im Alltag für dutzende Themen.&lt;/p&gt;
&lt;p&gt;Dabei fiel mir ein, dass ich schon vor drei Jahren mit &lt;a href=&#34;https://asciinema.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;asciinema&lt;/a&gt;
 experimentiert hatte. Allerdings ist das damals für mich eingeschlafen. Nun nahm ich gestern einen neuen Anlauf und hab drei Bash-Sessions aufgenommen. Das ist relativ einfach. Allerdings vertippte ich mich häufig bei der Eingabe und musste die Befehls-Sequenzen wiederholt aufnehmen. Und mit dem Endergebnis war ich immer noch nicht zufrieden.&lt;/p&gt;
&lt;p&gt;Das war etwas frustrierend und ich dachte mir &amp;hellip; das kann ich doch mit einem kleinen Bash-Skript lösen. Die Umsetzung und das Ergebnis beschreibe ich im folgenden Beitrag.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#ausgangslage&#34;&gt;Ausgangslage&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#das-skript&#34;&gt;Das Skript&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#verwendung-mit-asciinema&#34;&gt;Verwendung mit asciinema&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#ergebnis&#34;&gt;Ergebnis&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#einschränkungen&#34;&gt;Einschränkungen&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#update-vom-01032026&#34;&gt;Update vom 01.03.2026&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;ausgangslage&#34;
    &gt;
        Ausgangslage
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#ausgangslage&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Ausgangslage&#34; href=&#34;#ausgangslage&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Zu Beginn hab ich die &lt;a href=&#34;https://docs.asciinema.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Doku von asciinema&lt;/a&gt;
, die &lt;a href=&#34;https://github.com/asciinema/asciinema/issues&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Issues auf dem entsprechenden Git-Repo&lt;/a&gt;
 und die Suchmaschine meines Vertrauens benutzt um zu schauen, was für Möglichkeiten ich habe und ob nicht doch schon jemand das Problem gelöst hatte. Letzteres war auch so. Aber die Skripte haben entweder nicht so funktioniert wie ich das wollte oder ich kam nicht damit klar.&lt;/p&gt;
&lt;p&gt;Wenn die Tools mehr als 20 Zeilen Code hatten, hab ich auch nicht verstanden warum das so sein muss. Ich will ja nur einfaches Skript, das eine Textdatei mit Befehlen ausliest und dann bei der Aufnahme eine User-Eingabe simuliert. Für letzteres gibt es ein kleines Tool &lt;code&gt;pv&lt;/code&gt; (Pipe Viewer) mit dem man genau das einfach machen kann. So erzeugt der Aufruf &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; Hallo Welt &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; pv -qL &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; eine solche gewünschte simulierte Eingabe: Die Zeichenkette &lt;code&gt;Hallo Welt&lt;/code&gt; wird Zeichen für Zeichen verzögert ausgegeben. Die Geschwindigkeit (-L = Rate Limit) ist auf 10 Zeichen pro Sekunde begrenzt und es werden keine Zeitangaben dargestellt (-q = quiet). Mein Gedanke: Kann also nicht so schwer sein.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;das-skript&#34;
    &gt;
        Das Skript
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#das-skript&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Das Skript&#34; href=&#34;#das-skript&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Nach einigen Versuchen, kam dann das folgende Skript aus meinen Fingern (Korrigierter Stand vom : 01.03.2026). Dieses liegt auch auf Codeberg unter &lt;a href=&#34;https://codeberg.org/toheine/autotype_commands&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/autotype_commands&lt;/a&gt;
:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# January 2025&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Tobias Heine &amp;lt;toheine@posteo.de&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# GPLv3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Usage: &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#   asciinema rec &amp;lt;filename&amp;gt; -c &amp;#34;./autotype_commands.sh &amp;lt;commands-file&amp;gt; [&amp;lt;directory&amp;gt;]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Design prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Set commands&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;realpath &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Change directory if $2 is set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;IFS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; -r line&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Collect continuation lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;joined&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$line&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; *&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;IFS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; -r next_line
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;$&amp;#39;\n&amp;gt; &amp;#39;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;next_line&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;joined&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;joined&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;next_line&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$next_line&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Build prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PS1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;@P&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Sleep a few secs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    sleep &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Simulate user input (typed with \ and line breaks as written)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$display&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; pv -qL &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Comments are not executed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$joined&lt;/span&gt; !&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;#&amp;#34;&lt;/span&gt;* &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$joined&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt; &amp;lt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$commands&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Vernachlässigt man die Leerzeilen und die Kommentare sind das knapp 20 Zeilen Code. Dabei werden &amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einen Standardprompt simuliert,&lt;/li&gt;
&lt;li&gt;die notwendigen Befehle von einer Datei eingelesen ($1)&lt;/li&gt;
&lt;li&gt;eine verzögerte Usereingabe simuliert und&lt;/li&gt;
&lt;li&gt;bei Bedarf die Ausführung in einem andern Ordner vorgenommen (Optionales $2).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Befehle schreibt man in eine Textdatei. Hierzu habe ich im entsprechenden Git-Repo eine &lt;a href=&#34;https://codeberg.org/toheine/autotype_commands/src/branch/main/demo.txt&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;demo.txt&lt;/a&gt;
 hinterlegt, die wie folgt aufgebaut ist:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Shell&#34; data-lang=&#34;Shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# A simple echo command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; Hello world
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# A simple ls command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Go to the home directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Go back to the old working directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Die Idee: Kommentare (Zeilen die mit &amp;ldquo;#&amp;rdquo; beginnen), sind die Anweisungen. Die übrigen Zeilen entsprechen den jeweiligen Befehlen.&lt;/p&gt;
&lt;p&gt;Damit ist das Skript fertig und es kann mit folgendem Aufruf gestartet werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./autotype_commands.sh demo.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Soll ein anderes Verzeichnis als Start-Ordner verwendet werden, muss dieses vorher angelegt sein. Evtl. ist es sinnvoll darin dann ein paar Beispieldateien zu hinterlegen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir ~/workdir
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~/workdir
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch file1 file2 file3 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im Anschluss erfolgt der Aufruf mit einem weiteren Argument. Beispiel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./autotype_commands.sh demo.txt ~/workdir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;verwendung-mit-asciinema&#34;
    &gt;
        Verwendung mit asciinema
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#verwendung-mit-asciinema&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Verwendung mit asciinema&#34; href=&#34;#verwendung-mit-asciinema&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Aufnahme erfolgt mit dem Programm &lt;strong&gt;asciinema&lt;/strong&gt; [as-kee-nuh-muh] das aus den Paketquellen installiert werden kann (siehe hierzu: &lt;a href=&#34;https://docs.asciinema.org/getting-started%29&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.asciinema.org/getting-started)&lt;/a&gt;
. Mit dem folgenden Aufruf wird eine Aufnahme mit &lt;code&gt;rec&lt;/code&gt; gestartet, diese in die Datei &lt;code&gt;demo.cast&lt;/code&gt; gespeichert und und als Kommando &lt;code&gt;-c&lt;/code&gt; mein autotype-Skript übergeben.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;asciinema rec demo.cast -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;./autotype_commands.sh demo.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sofern man wiederholt die gleiche cast-Datei erstellen will (z. B. beim Feintuning der Befehle), wirft asscinema einen Fehler. Dieser kann mit der &lt;code&gt;overwrite&lt;/code&gt;-Option vermieden werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;asciinema rec demo.cast --overwrite -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;./autotype_commands.sh demo.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wie bereits oben erwähnt &amp;hellip; Ausführung von einem anderen Startverzeichnis aus, geht ebenfalls:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;asciinema rec demo.cast --overwrite -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;./autotype_commands.sh demo.txt ~/workdir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Ergebnis kann man direkt auf der Konsole anschauen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;asciinema play demo.cast
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bei Bedarf kann diese Aufnahme noch auf den asciinema-Server oder eine eigene Serverinstanz hoch geladen werden. Hierzu empfiehlt es sich die Doku von &lt;code&gt;asciinema&lt;/code&gt; zu sichten.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;ergebnis&#34;
    &gt;
        Ergebnis
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#ergebnis&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Ergebnis&#34; href=&#34;#ergebnis&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Der Aufruf oben führt zu folgendem Ergebnis:&lt;/p&gt;
&lt;script src=&#34;https://asciinema.org/a/mlR6Ghu49IsyYaLNrhkzMsKxH.js&#34; id=&#34;asciicast-mlR6Ghu49IsyYaLNrhkzMsKxH&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;p&gt;Ich bin damit zufrieden. Bash-Screen-Recordings zu erstellen, bedeutet für mich in Zukunft, kleine Textdateien zu verfassen und diese via Skript an &lt;code&gt;asciinema&lt;/code&gt; zu übergeben. So ist das für mich jetzt gut handlebar. Nun müssen nur noch meine Lernenden diese Videos auch nutzen und einen Mehrwert daraus ziehen.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;einschränkungen&#34;
    &gt;
        Einschränkungen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#einschränkungen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Einschränkungen&#34; href=&#34;#einschr%c3%a4nkungen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Mit dem Skript wird ein Pseudo-Prompt generiert. Ursprünglich war das nur zu Testzwecken enthalten. Ich finde das aber eigentlich eine gute Idee, da ich meinen Prompt immer stark anpasse und ich auf diese Weise meine Schülerinnen und Schülern einen Standardprompt biete. Das bedeutet aber auch, dass Recordings von anderen Shells mit meinem Skript fehlerhaft dargestellt werden.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;update-vom-01032026&#34;
    &gt;
        Update vom 01.03.2026
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#update-vom-01032026&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Update vom 01.03.2026&#34; href=&#34;#update-vom-01032026&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Nach einem Pull-Request von &lt;a href=&#34;https://social.tchncs.de/@stoeps@infosec.exchange&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@stoeps&lt;/a&gt;
 ist das Tool nun auch in der Lage, Multi-Line-Befehle mit der Konsole &lt;code&gt;PS2&lt;/code&gt; korrekt darzustellen. Infos dazu sind auf Codeberg im entsprechenden PR zu finden:&lt;br&gt;&lt;a href=&#34;https://codeberg.org/toheine/autotype_commands/pulls/1&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/autotype_commands/pulls/1&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2025/autotype-commands/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/toheine/autotype_commands&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/autotype_commands&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/asciinema/asciinema&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/asciinema/asciinema&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://asciinema.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://asciinema.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.asciinema.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://blog.asciinema.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.asciinema.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.asciinema.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.man7.org/linux/man-pages/man1/pv.1.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.man7.org/linux/man-pages/man1/pv.1.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Bash" term="Bash" label="Bash" /> 
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" /> 
                                <category scheme="https://toheine.net/tags/Tools" term="Tools" label="Tools" /> 
                                <category scheme="https://toheine.net/tags/Unterricht" term="Unterricht" label="Unterricht" />
        </entry>
        <entry>
            <title>Linux-Distris veröffentlicht</title>
            <link href="https://toheine.net/posts/2024/linux-distris-published/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2024/linux-distris-published/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2024-10-24T15:26:51+02:00</published>
            <updated>2024-10-24T15:26:51+02:00</updated>
            <content type="html">
                &lt;p&gt;Seit heute gibt es auf dieser Seite eine (derzeit noch) kleine Info zu ausgewählten Linux-Distributionen die ich unter dem Menü-Punkt &lt;a href=&#34;/linux&#34;&gt;Linux-Distris&lt;/a&gt;
 verortet habe. Dort werden Linux-Distributionen vorgestellt, mit denen ich arbeite UND die ich empfehlen kann. Ich hab mit &lt;strong&gt;Debian GNU/Linux&lt;/strong&gt;, &lt;strong&gt;Arch Linux&lt;/strong&gt; und &lt;strong&gt;Linux Mint&lt;/strong&gt; begonnen. Weitere Distributionen werden folgen.&lt;/p&gt;
&lt;p&gt;Die in der Seite erwähnten Aspekte bleiben ziemlich an der Oberfläche und beleuchten kurz die Zielgruppe, Kernaspekte der jeweiligen Distribution, warum ich diese einsetze und wo es weitere Infos gibt. Ich hoffe dadurch ein wenig Licht in den dichten Wald der vielen Distributionen zu bekommen.&lt;/p&gt;
&lt;p&gt;Wer das liest, dem muss klar sein, dass ich das durch meine Brille beurteile. Andere Distributionen sind bestimmt auch gut!&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" />
        </entry>
        <entry>
            <title>Git-Branch im Bash-Prompt anzeigen</title>
            <link href="https://toheine.net/posts/2024/customized-prompt/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2024/customized-prompt/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2024-09-14T20:39:14+02:00</published>
            <updated>2024-09-14T20:39:14+02:00</updated>
            <content type="html">
                &lt;p&gt;Meine kleinen Coding-Projekte setze ich meistens, direkt auf der Kommandozeile, mit dem Editor &lt;code&gt;vim&lt;/code&gt; um. Ich arbeite eher selten in dem grafischen Editor &lt;code&gt;VSCodium&lt;/code&gt; und noch weniger in einer Entwicklungsumgebung (IDE) wie Eclipse, Netbeans oder IntelliJ. Gerade die grafischen Tools integrieren die Versionsverwaltung &lt;strong&gt;git&lt;/strong&gt; sehr gut und man hat als Entwickler jederzeit den Einblick, wie es um die Versionierung steht. Auf der Kommandozeile sehe ich das nur, wenn ich die jeweiligen Befehle wie z. B. &lt;code&gt;git branch&lt;/code&gt; oder &lt;code&gt;git log&lt;/code&gt; eingebe.&lt;/p&gt;
&lt;p&gt;Vor ein paar Wochen ist es dann zum wiederholten Mal passiert: Ich hatte im falschen Branch gearbeitet (genervter Blick).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mein Gedanke:&lt;/strong&gt; Das passiert mir nicht nochmal &amp;hellip; ich will den jeweiligen Branch im Shell-Prompt sehen, sofern ich in einem git-Repo arbeite. Wie ich das umgesetzt hab, dokumentiere ich im folgenden Beitrag.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#vorab-gedanken&#34;&gt;Vorab-Gedanken&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#grundlage-die-variable-ps1&#34;&gt;Grundlage: Die Variable PS1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#farbiger-prompt&#34;&gt;Farbiger Prompt&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#branch-im-prompt-darstellen&#34;&gt;Branch im Prompt darstellen&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;vorab-gedanken&#34;
    &gt;
        Vorab-Gedanken
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/customized-prompt/#vorab-gedanken&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Vorab-Gedanken&#34; href=&#34;#vorab-gedanken&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Mir ist bekannt dass es für meinen Bedarf schon komplett fertige Lösungen gibt. Mit Projekten wie &lt;a href=&#34;https://ohmyposh.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ohmyposh.dev&lt;/a&gt;
 (Bash) oder &lt;a href=&#34;https://ohmyz.sh/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ohmyz.sh/&lt;/a&gt;
 (zsh) bekommt man schöne Prompts vor&amp;rsquo;s Auge gezaubert, die den jeweiligen Status im Branch anzeigen.&lt;/p&gt;
&lt;p&gt;Diese Lösungen kommen für mich jedoch nicht in Frage, weil es entweder zu bunt oder zu überladen ist. Ich will einfach nur meinen Editor auf der Konsole bedienen und mit wenigen Zeilen Code einen kleinen Hinweis erhalten, auf welchem git Branch ich mich gerade befinde. Den Prompt auf meinen Clients hatte ich sowieso schon (in Anlehnung an den Bash-Prompt von Kali-Linux) angepasst. Daher dachte ich mir, diese kleine Optimierung kann nicht so schwer sein. Das Ergebnis soll dann wie folgt aussehen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/ps1_git_branch_preview.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/ps1_git_branch_preview.png&#34;
              alt=&#34;Mein Wunsch-Prompt&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Mein Wunsch-Prompt
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;grundlage-die-variable-ps1&#34;
    &gt;
        Grundlage: Die Variable PS1
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/customized-prompt/#grundlage-die-variable-ps1&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Grundlage: Die Variable PS1&#34; href=&#34;#grundlage-die-variable-ps1&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Konfiguration des Standard-Prompts (primary prompt) der &lt;strong&gt;bash&lt;/strong&gt; erfolgt über die Variable &lt;code&gt;PS1&lt;/code&gt; die man entweder systemweit in der &lt;code&gt;/etc/profile&lt;/code&gt; hinterlegt oder User-spezifisch im Verzeichnis &lt;code&gt;~/.bashrc&lt;/code&gt;. Da auf einem Multiuser-System, jeder User seinen eigenen Prompt generieren dürfen soll, wähle ich die Option mit der &lt;code&gt;~/.bashrc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Bei der Erstellung des Prompts können &amp;ldquo;special characters&amp;rdquo; verwendet werden (eben auch Variablen), die je nach Hostname, Username oder aktuellem Verzeichnis den Prompt generieren. Ein Debian-System (und viele andere Distros) hat initial folgenden Prompt:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/default_ps1.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/default_ps1.png&#34;
              alt=&#34;Standard-Bash-Prompt auf einem Debian-System&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Standard-Bash-Prompt auf einem Debian-System
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Mein Test-Benutzer &lt;strong&gt;yoda&lt;/strong&gt; auf der Maschine &lt;strong&gt;debvm&lt;/strong&gt; befindet sich derzeit im &lt;strong&gt;Homeverzeichnis (~)&lt;/strong&gt;. Möchte man die Darstellung nun anpassen, hinterlegt man eine passende Zeichenkette in der Variable &lt;code&gt;PS1&lt;/code&gt;. Für Testzwecke kann das direkt auf der Kommandozeile eingegeben werden:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/fancy_ps1.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/fancy_ps1.png&#34;
              alt=&#34;Erster eigener Prompt&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Erster eigener Prompt
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Möchte ich den Standard-Prompt nachbilden, können die eben genannten &amp;ldquo;special characters&amp;rdquo; (Begriff aus der &lt;a href=&#34;https://www.man7.org/linux/man-pages/man1/bash.1.html#PROMPTING&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Man-Page&lt;/a&gt;
) genutzt werden. Eine erneute Zuweisung zur Variable &lt;code&gt;PS1&lt;/code&gt; sieht wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\u@\h:\w\$ &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Geben wir das auf der Konsole ein, sieht das Ergebnis dem Standardprompt schon recht ähnlich:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/simple_ps1_uncolored.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/simple_ps1_uncolored.png&#34;
              alt=&#34;Standard-Prompt (etwas farblos)&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Standard-Prompt (etwas farblos)
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Bedeutung der Variablen:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Zeichen&lt;/th&gt;
          &lt;th&gt;Bedeutung&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;\u&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Username&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Normales Zeichen, das im Prompt dargestellt wird&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;\h&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Hostname&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;:&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Normales Zeichen, das im Prompt dargestellt wird&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;\w&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Aktuelles Arbeitsverzeichnis&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;\$&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Indikator für einen eingeschränkten User, der als Zeichen im Prompt dargestellt wird&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;farbiger-prompt&#34;
    &gt;
        Farbiger Prompt
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/customized-prompt/#farbiger-prompt&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Farbiger Prompt&#34; href=&#34;#farbiger-prompt&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die farbliche Gestaltung ist darüber hinaus etwas komplizierter. Farben werden mit einer Art Tag (ähnich HTML) eingeleitet. Der korrekte Begriff lautet &lt;strong&gt;&amp;ldquo;Escape-Sequenz&amp;rdquo;&lt;/strong&gt;. &lt;code&gt;\[\033&lt;/code&gt; oder &lt;code&gt;\[\e&lt;/code&gt; leitet die Zeichenformatierung ein, gefolgt von einer Zeichenkette &lt;code&gt;[&amp;lt;ZAHL&amp;gt;m\]&lt;/code&gt;¸ die beispielsweise den Text oder den Hintergrund farbig darstellt.&lt;/p&gt;
&lt;p&gt;Das kann ziemlich &amp;ldquo;frickelig&amp;rdquo; sein. Soll der komplette Prompt in grün erscheinen, kann das wie folgt umgesetzt werden:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/simple_ps1_colored.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/simple_ps1_colored.png&#34;
              alt=&#34;Standard-Prompt in Farbe&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Standard-Prompt in Farbe
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Man kann erkennen, dass schon ein einfacher Prompt sehr schnell recht unübersichtlich werden kann. Letztendlich instruiert &lt;code&gt;\[\e[32m\]&lt;/code&gt;, dass alle nachfolgenden Zeichen in grüner Farbe dargestellt werden. Am Ende der Zeile sorgt die Sequenz &lt;code&gt;\[\e[m\]&lt;/code&gt; dafür, dass an dieser Stelle der Farbverlauf endet. Alles danach wird wieder wie gewohnt dargestellt.&lt;/p&gt;
&lt;p&gt;Die Zeichenfolge &lt;code&gt;32m&lt;/code&gt; steht dabei für &lt;strong&gt;grün&lt;/strong&gt;. Weitere Farben sind möglich. Ich benötige später gelb (33m),  grau (37m) und rot (31m). Nicht weil diese Farben besonders schön sind, sondern weil mir die farbig hinterlegten Bestandteile gut ins Auge fallen.&lt;/p&gt;
&lt;p&gt;Eine etwas ausführlichere Erklärung zu den Farbcodes hab ich &lt;a href=&#34;https://docs.datenschmutz.dev/de/cheat-sheets/linux-bash-coloring&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
 gefunden. Eine entsprechende Man-Page &lt;a href=&#34;https://www.man7.org/linux/man-pages/man4/console_codes.4.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;man console_codes&lt;/code&gt;&lt;/a&gt;
 gibt es ebenfalls. Wer hier zusätzliche Unterstützung möchte, sucht sich im Netz einen Bash-Prompt-Generator. Die können häufig ebenfalls farbige Prompts generieren.&lt;/p&gt;
&lt;p&gt;Mit den genannten Möglichkeiten, hatte meine Variable &lt;code&gt;PS1&lt;/code&gt; bisher folgenden Aufbau:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\n┌── \[\e[33m\]\A \[\e[m\]- \[\e[37m\]\u@\h\[\e[m\]: \[\e[33m\][ \w ]\[\e[m\]\n└─\$ &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Prompt stellt sich wie folgt dar:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/favorite_ps1_old.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/favorite_ps1_old.png&#34;
              alt=&#34;Mein bisheriger Prompt&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Mein bisheriger Prompt
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Der Aufbau hat sich aus folgenden Gründen bewährt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uhrzeit vorne: Manchmal führe ich ein Skript aus, das längere Zeit läuft. Da schau ich nicht zu und drehe Däumchen. Wenn das Skript fertig ist, sehe ich anhand des neuen Prompts, wie lange das Ding gelaufen ist.&lt;/li&gt;
&lt;li&gt;Angabe von Usernamen und Host (wie im Standard-Prompt)&lt;/li&gt;
&lt;li&gt;Arbeitsverzeichnis (wie im Standard-Prompt)&lt;/li&gt;
&lt;li&gt;Kommando-Eingabe in der zweiten Zeile: Der gesamte Pfad des aktuellen Arbeitsverzeichnisses kann sehr lang sein. Dann brechen die Befehle im Standardprompt hässlich um. Durch die Eingabe meines Kommandos in der zweiten Zeile umgehe ich das. Wie oben beschrieben: Das ist jetzt keine geniale Eigenleistung. Ich hatte das in der Distro Kali-Linux aufgeschnappt und empfand diese Darstellung praktisch.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;branch-im-prompt-darstellen&#34;
    &gt;
        Branch im Prompt darstellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/customized-prompt/#branch-im-prompt-darstellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Branch im Prompt darstellen&#34; href=&#34;#branch-im-prompt-darstellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Um meinem eigentlichen Ziel näher zu kommen, brauche ich eine Funktion in der Datei &lt;code&gt;~/.bashrc&lt;/code&gt;. Diese soll prüfen ob ich in einem Branch bin:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; check_branch &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; git status &amp;gt; /dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;1&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;branch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;&amp;lt;&amp;lt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;\uE0A0&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;git branch --show current&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &amp;gt;&amp;gt;&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;branch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es wird in der Bedingungsprüfung der Befehl &lt;code&gt;git status&lt;/code&gt; ausgeführt, jedoch sämtliche Ausgaben nach &lt;code&gt;/dev/null&lt;/code&gt; geschoben. Das System registriert dabei jedoch, ob der Return-Wert des letzten Befehls 0 (=wahr) ist oder nicht. Ist das der Fall wird eine Zeichenkette gebaut die ein kleines Symbol &lt;code&gt;\uE0A0&lt;/code&gt; (dieser abzweigende Pfeil) und den aktuellen Branch zurück gibt. Andernfalls ist die Zeichenkette leer.&lt;/p&gt;
&lt;p&gt;Bleibt die Frage, wann die Funktion aufgerufen wird? Im Prinzip möchte ich bei jedem Bestätigen mit der Eingabetaste checken, ob ich derzeit in einem git-Repo arbeite. Hierfür gibt es eine Variable &lt;code&gt;PROMPT_COMMAND&lt;/code&gt;. Deren Inhalt wird ausgeführt, bevor ein neuer Prompt in der Kommandozeile angezeigt wird. Daher erfolgt der Funktionsaufruf per Zuweisung an diese Variable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;check_branch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zuletzt muss noch der Variable &lt;code&gt;PS1&lt;/code&gt; die Prompt-Struktur in leicht abgewandelter Form (mit zusätzlicher Variable &lt;code&gt;$branch&lt;/code&gt;) zugewiesen werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\n┌── \[\e[33m\]\A \[\e[m\]- \[\e[37m\]\u@\h\[\e[m\]: \[\e[33m\][ \w ]\[\e[m\] \[\e[31m\]\$branch \[\e[m\]\n└─\$ &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die drei Bausteine liegen hintereinander in der erwähnten &lt;code&gt;~/.bashrc&lt;/code&gt;. Jedes Mal wenn ich nach einer Eingabe die Enter-Taste drücke, wird die Variable &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; ausgelesen und die Funktion &lt;code&gt;check_branch&lt;/code&gt; aufgerufen, die mir eine Zeichenkette baut (entsprechender Branch oder leere Zeichenkette). Das Ergebnis sieht dann wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/customized-prompt/images/ps1_with_git_branch.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/customized-prompt/images/ps1_with_git_branch.png&#34;
              alt=&#34;Mein neuer Prompt mit Hinweis auf aktuellen git Branch&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Mein neuer Prompt mit Hinweis auf aktuellen git Branch
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Ich bin mit dem Ergebnis erstmal zufrieden. Klar &amp;hellip; es können noch weitere nützliche Infos hinterlegt werden. Aber das reicht mir für&amp;rsquo;s Erste. Die Variable &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; benötige ich noch für ein weiteres Szenario. Das beschreibe ich in einem folgenden Beitrag hier.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/customized-prompt/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Ich hatte die Möglichkeit mit einem 32MB großen Fertig-Gericht (&lt;a href=&#34;https://ohmyposh.dev/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ohmyposh.dev/&lt;/a&gt;
) oder mit 8 Zeilen Code mein Ziel zu erreichen. Der Zeitaufwand hier, ist eher in den Blog-Beitrag als in die reine Umsetzung geflossen. Hätte ich mich für ohmyposh entschieden, hätte ich wahrscheinlich meine Zeit mit der Auswahl von Themes und deren Anpassung verbraten (siehe: &lt;a href=&#34;https://ohmyposh.dev/docs/themes&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ohmyposh themes&lt;/a&gt;
).&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/customized-prompt/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.man7.org/linux/man-pages/man1/bash.1.html#PROMPTING&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.man7.org/linux/man-pages/man1/bash.1.html#PROMPTING&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.man7.org/linux/man-pages/man4/console_codes.4.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.man7.org/linux/man-pages/man4/console_codes.4.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.datenschmutz.dev/de/cheat-sheets/linux-bash-coloring&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.datenschmutz.dev/de/cheat-sheets/linux-bash-coloring&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Bash" term="Bash" label="Bash" /> 
                                <category scheme="https://toheine.net/tags/Linux" term="Linux" label="Linux" />
        </entry>
        <entry>
            <title>Screenshots mit Flameshot</title>
            <link href="https://toheine.net/posts/2024/flameshot/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2024/flameshot/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2024-07-31T15:11:49+02:00</published>
            <updated>2025-02-20T16:41:09+01:00</updated>
            <content type="html">
                &lt;p&gt;Es gibt einige Tools, die uns die Arbeit erleichtern. Eine Anwendung, die ich täglich verwende ist &lt;strong&gt;Flameshot&lt;/strong&gt;, um Screenshots zu erstellen und direkt zu bearbeiten. Im Gegensatz zu den üblichen Screenshot-Tools, die von Seiten des Betriebssystems bzw. der jeweiligen Linux-Distribution vorinstalliert sind, bietet Flameshot einen größeren Funktionsumfang und ist ziemlich eingängig zu bedienen. Screenshots für Anleitungen sind so im Handumdrehen erstellt.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#installation&#34;&gt;Installation&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#einrichtung&#34;&gt;Einrichtung&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#bedienung&#34;&gt;Bedienung&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#optimierung&#34;&gt;Optimierung&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#tipp-verzögerter-screenshot&#34;&gt;Tipp: verzögerter Screenshot&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;installation&#34;
    &gt;
        Installation
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/flameshot/#installation&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Installation&#34; href=&#34;#installation&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Wie beinahe alle Tools, die ich auf diesem Blog empfehle, ist auch Flameshot eine Open-Source-Anwendung, die für alle gängingen Desktop-Betriebssysteme verfügbar ist (Windows, macOS, Linux). Infos zu den jeweiligen Systemen gibt es unter &lt;a href=&#34;https://flameshot.org/#download&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://flameshot.org/#download&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Unter Debian installiere ich Flameshot direkt über die Paketverwaltung:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install flameshot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;einrichtung&#34;
    &gt;
        Einrichtung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/flameshot/#einrichtung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Einrichtung&#34; href=&#34;#einrichtung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Auf Windows ist Flameshot direkt nach Installation einsatzbereit. Mit der Taste &lt;kbd&gt;[Druck]&lt;/kbd&gt;, kann ein Screenshot erstellt und direkt bearbeitet werden. In einer Linux-Distro wird mit dieser Taste nach wie vor das Screenshot-Tool verwendet, das der jeweilige Distributor zu Verfügung stellt. Daher muss die Tastenbelegung noch angepasst werden. Unter KDE erreiche ich das unter &lt;strong&gt;Systemeinstellungen &amp;gt; Kurzbefehle &amp;gt; + Anwendung hinzfügen&lt;/strong&gt;. Im nachfolgenden Dialog sucht man nach &lt;strong&gt;flameshot&lt;/strong&gt; und bestätigt die Eingabe mit &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Anschließend muss noch mindestens der Kurzbefehl für &lt;strong&gt;&amp;ldquo;Bildschirmfoto aufnehmen&amp;rdquo;&lt;/strong&gt; gewählt werden. Hier klickt man auf auf das Drop-Downmenü hinter dem genannten Eintrag, wählt &lt;strong&gt;&amp;quot;+ Eigenen Kurzbefehl hinzufügen&amp;quot;&lt;/strong&gt;, drückt die gewünschte Taste (in meinem Fall &lt;kbd&gt;[Druck]&lt;/kbd&gt;) und bestätigt die Auswahl mit &lt;strong&gt;&amp;ldquo;Anwenden&amp;rdquo;&lt;/strong&gt;. In meinem Fall ist die &lt;kbd&gt;[Druck]&lt;/kbd&gt;-Taste schon belegt. Die daraus resultierende Warnung bestätige ich mit &lt;strong&gt;&amp;ldquo;Ja&amp;rdquo;&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/kurzbefehl_hinzufuegen.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/kurzbefehl_hinzufuegen.png&#34;
              alt=&#34;Tastenkombination für &amp;#34;Bildschirmfoto aufnehmen&amp;#34; hinterlegen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Tastenkombination für &amp;#34;Bildschirmfoto aufnehmen&amp;#34; hinterlegen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;bedienung&#34;
    &gt;
        Bedienung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/flameshot/#bedienung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Bedienung&#34; href=&#34;#bedienung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Sobald Flameshot über den gesetzten Kurzbefehl aufgerufen wird, verändert sich der Cursor und es erscheint ein Hinweis-Fenster:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_aufnehmen.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_aufnehmen.png&#34;
              alt=&#34;Hinweisfenster bei Screenshot-Erstellung&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Hinweisfenster bei Screenshot-Erstellung
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Es können nun die gewünschten Bildschirminhalte ausgewählt werden (Cursor über Bereich ziehen und dabei linke Maustaste festhalten). Im Anschluss erscheint der Bearbeitungsmodus:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_bearbeiten01.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_bearbeiten01.png&#34;
              alt=&#34;Zahlreiche Möglichkeiten den Screenshot zu bearbeiten&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Zahlreiche Möglichkeiten den Screenshot zu bearbeiten
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Jede der hier abgebildeten lila-farbigen Schaltflächen steht für eine Aktion. So können (1) zahlreiche Formen hinterlegt, (2) Text hinzugefügt oder auch (3) verpixelt werden. Um die Aktion auszuführen, muss die jeweilige Schaltfläche ausgewählt und im Auswahlbereich des Screenshots hinterlegt werden:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_bearbeiten02.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_bearbeiten02.png&#34;
              alt=&#34;Ein bearbeiteter Beispiel-Screenshot&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Ein bearbeiteter Beispiel-Screenshot
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Die Nummerierung erfolgt automatisch. Möchte man, dass die Nummer auf einen bestimmten Breich zeigt (im Beispiel 2 und 3), dann hält man die linke Maustaste nach dem Setzen der jeweiligen Nummer fest und zieht diese in den Bereich auf den gezeigt werden soll.&lt;/p&gt;
&lt;p&gt;Sollen die hinterlegten Markierungen im Screenshot in verschiedenen Farben dargestellt werden, so kann mit einem rechten Mausklick einen Farbkreis aufrufen und eine andere Farbe auswählen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_bearbeiten03.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_bearbeiten03.png&#34;
              alt=&#34;Markierungen im Screenshots können verschiedene Farben haben&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Markierungen im Screenshots können verschiedene Farben haben
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Sobald der Screenshot den eigenen Vorstellungen entspricht, kann dieser in die Zwischenablage kopiert oder gespeichert werden. Hierzu einfach die gewünschte Schaltfläche auswählen (Kopie- oder Diskettensymbol).&lt;/p&gt;
&lt;p&gt;Im Detail sind noch weitere Bearbeitungsmöglichkeiten enthalten. Hier empfiehlt es sich das Tool in einer ruhigen Minute auf seinen Funktionsumfang hin abzuklopfen und bei Bedarf die Doku zu lesen &lt;a href=&#34;https://flameshot.org/docs/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://flameshot.org/docs/&lt;/a&gt;
. Einen ersten (animierten) Eindruck bietet folgendes gif-File:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://flameshot.org/img/flameshot-demo.gif&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://flameshot.org/img/flameshot-demo.gif&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;optimierung&#34;
    &gt;
        Optimierung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/flameshot/#optimierung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Optimierung&#34; href=&#34;#optimierung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Flameshot kann in einem gewissen Rahmen auf die eigenen Bedürfnisse hin angepasst werden. Mit einem Rechtsklick auf den Starter, erscheinen die dazu notwendigen Einstellungen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/einstellungen_oeffnen.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/einstellungen_oeffnen.png&#34;
              alt=&#34;Flameshot Einstellungen öffnen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Flameshot Einstellungen öffnen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Hier können das grundsätzliche Design angepasst, Schaltflächen ausgeblendet, Speicherpfade vorgegeben und Shortcuts eingesehen werden. In der Regel lasse ich das unverändert &amp;hellip; mit einer Ausnahme: Unter &lt;strong&gt;&amp;ldquo;Filename Editor&amp;rdquo;&lt;/strong&gt; passe ich den Default-Name für einen zu speichernden Screenshot wie folgt an:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_standard_name.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/flameshot/images/screenshot_standard_name.png&#34;
              alt=&#34;Default-Dateiname für Screenshot konfigurieren&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Default-Dateiname für Screenshot konfigurieren
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;tipp-verzögerter-screenshot&#34;
    &gt;
        Tipp: verzögerter Screenshot
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/flameshot/#tipp-verzögerter-screenshot&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Tipp: verzögerter Screenshot&#34; href=&#34;#tipp-verz%c3%b6gerter-screenshot&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;In Einzelfällen kann es notwendig sein, den Screenshot mit einer Verzögerung aufzurufen. Diese Funktion benötige ich, sofern ich Kontextmenüs aufnehme möchte, die verschwinden, sobald ich die &lt;kbd&gt;[Druck]&lt;/kbd&gt;-Taste betätige. Unter Linux erreiche ich das, sofern ich auf der Konsole&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flameshot gui -d 5000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;eingebe. Ich hab dann fünf Sekunden Zeit, mein Menü so vorzubereiten, dass der Screenshot diesen aufnimmt. Soweit ich das korrekt verstanden habe, funktioniert das auch unter macOS, jedoch nicht unter Windows.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/flameshot/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://flameshot.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://flameshot.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flameshot-org/flameshot/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/flameshot-org/flameshot/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Tools" term="Tools" label="Tools" />
        </entry>
        <entry>
            <title>Codeberg-CI - pipeline definition not found</title>
            <link href="https://toheine.net/posts/2024/codeberg-ci-pipline-error/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2024/codeberg-ci-pipline-error/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2024-07-31T10:47:49+02:00</published>
            <updated>2024-09-15T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Heute wollte ich nach langer Zeit meinen Blog hier wieder mit Inhalten füllen. Nach dem &lt;code&gt;git push&lt;/code&gt; auf Codeberg, hat Woodpecker einen Fehler beim build gemeldet: &lt;strong&gt;&amp;ldquo;pipeline definition not found&amp;rdquo;&lt;/strong&gt;. Das hat mich doch sehr gewundert, da ich weder an der &lt;code&gt;.woodpecker.yml&lt;/code&gt; im Codeberg-Repo noch in Woodpecker selbst Änderungen vorgenommen hatte.&lt;/p&gt;
&lt;p&gt;Scheinbar bin ich nicht die erste Person, die darüber stolpert (siehe &lt;a href=&#34;https://codeberg.org/Codeberg-CI/feedback/issues/132&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
). Letztendlich hat das komplette Löschen des Repos in Woodpecker und das neue Anlegen geholfen.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h2 id=&#34;update-15092024&#34;
    &gt;
        Update 15.09.2024
    &lt;/h2&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/codeberg-ci-pipline-error/#update-15092024&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Update 15.09.2024&#34; href=&#34;#update-15092024&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Gestern ist der Fehler wieder aufgeschlagen. Ich hab mir nochmals das obige Issue näher angeschaut. Das komplette Löschen des Repos auf der Codeberg-CI wollte ich vermeiden. Und tatsächlich hat das &amp;ldquo;Repository deaktivieren&amp;rdquo; und eine anschließendes &amp;ldquo;aktivieren&amp;rdquo; ausgereicht. Merke ich mir für die Zukunft.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Hugo" term="Hugo" label="Hugo" /> 
                                <category scheme="https://toheine.net/tags/Git" term="Git" label="Git" /> 
                                <category scheme="https://toheine.net/tags/Codeberg" term="Codeberg" label="Codeberg" />
        </entry>
        <entry>
            <title>DNS-01 challenge mit dehydrated und bind9</title>
            <link href="https://toheine.net/posts/2024/dehydrated-bind/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2024/dehydrated-bind/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2024-04-17T00:00:00+00:00</published>
            <updated>2024-04-17T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Es gibt viele Wege zu einem gültigen SSL/-TLS-Zertifikat für die eigene Server-Landschaft. In zahlreichen Anleitungen beschrieben ist die Möglichkeit, eine &lt;strong&gt;HTTP-01 challenge&lt;/strong&gt; auf dem jeweiligen Webserver durchzuführen. Dieses Verfahren ist gut und solide. Spätestens wenn Zertifikate für Server benötigt werden, die nicht über das Internet erreichbar sind/sein sollen, scheitert diese Vorgehensweise jedoch. Zudem können Wildcard-Zertifikate nur über die &lt;strong&gt;DNS-01 Challenge&lt;/strong&gt; austgestellt werden.&lt;/p&gt;
&lt;p&gt;Diese Anleitung beschreibt eine Einrichtung eines eigenen DNS-Servers mit &lt;strong&gt;bind9&lt;/strong&gt;, der Einrichtung des ACME-Clients &lt;strong&gt;dehydrated&lt;/strong&gt; und dem anschließenden automatischen Erzeugen von Let&amp;rsquo;s-Encrypt-Zertifikaten via &lt;strong&gt;DNS-01 challenge&lt;/strong&gt;. Diese werden im Anschluss via &lt;strong&gt;ansible&lt;/strong&gt; auf die Zielserver verteilt&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#konzept&#34;&gt;Konzept&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#basisinstallation-eines-debian-servers&#34;&gt;Basisinstallation eines Debian-Servers&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#installation-und-einrichtung-von-bind9&#34;&gt;Installation und Einrichtung von bind9&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&#34;#konfiguration-des-dns-servers&#34;&gt;Konfiguration des DNS-Servers&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&#34;#zonen-definieren&#34;&gt;Zonen definieren&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&#34;#zoneneinträge-erzeugenvorbereiten&#34;&gt;Zoneneinträge erzeugen/vorbereiten&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&#34;#bei-dns-registrar-die-zonen-delegation-eintragen&#34;&gt;Bei DNS-Registrar die Zonen-Delegation eintragen&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#dynamisches-eintragen-von-dns-records-via-nsupdate&#34;&gt;Dynamisches Eintragen von DNS-Records via nsupdate&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#einrichtung-von-dehydrated&#34;&gt;Einrichtung von dehydrated&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#verteilung-der-zertifikate-auf-die-server-via-ansible&#34;&gt;Verteilung der Zertifikate auf die Server via ansible&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;konzept&#34;
    &gt;
        Konzept
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#konzept&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Konzept&#34; href=&#34;#konzept&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;rsquo;s Encrypt unterstützt (derzeit aktiv) drei verschiedene &lt;a href=&#34;https://letsencrypt.org/de/docs/challenge-types/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Challenge-Arten&lt;/a&gt;
. Bei der nachfolgend beschriebenen &lt;strong&gt;DNS-01 challenge&lt;/strong&gt; erfolgt der Beweis der Domänen-Inhaberschaft über einen besonderen DNS-Eintrag, der bei der Challenge im DNS-System hinterlegt werden muss. Nur der Eigener der Domän kann dies tun (zumindest sollte das so sein ;-)). Ist der Eintrag erfolgt, prüft Let&amp;rsquo;s encrpyt (= CA: Certificate Authority), ob der Eintrag an Ort und Stelle ist. Ist das der Fall, wird das Zertifikat ausgestellt.&lt;/p&gt;
&lt;p&gt;Das Vorgehen kann mit einem ACME-Client (certbot, dehydrated, etc.) manuell durchgeführt, aber eben auch automatisiert werden. Der Ablauf von der DNS-01 challegene bis zur Verteilung der Zertifikate (wie ich sie hier beschreibe) wird durch folgende Abbildung verdeutlicht:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/dehydrated-bind/images/LE-DNS-01-challenge.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/dehydrated-bind/images/LE-DNS-01-challenge.png&#34;
              alt=&#34;Mögliche Struktur zur Erzeugung von Let&amp;#39;s encrypt-Zertifikaten via DNS-01 challenge&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Mögliche Struktur zur Erzeugung von Let&amp;#39;s encrypt-Zertifikaten via DNS-01 challenge
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;blockquote class=&#34;gblog-hint tip&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa tip&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Legende&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;&lt;ol&gt;
&lt;li&gt;Im Vorfeld werden Zonen vom DNS-Registrar an eigenen DNS-Server delegiert.&lt;/li&gt;
&lt;li&gt;Auf dem DNS-Server ist ein ACME-Client installiert der die DNS-Challegene initiiert.&lt;/li&gt;
&lt;li&gt;Let&amp;rsquo;s Encrypt gibt Token vor, prüft ob dieser im DNS hinterlegt wurde und stellt Zertifikate aus.&lt;/li&gt;
&lt;li&gt;Die Zertifikate werden dann an die jeweilgen Stellen via ansible verteilt.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/blockquote&gt;




&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;basisinstallation-eines-debian-servers&#34;
    &gt;
        Basisinstallation eines Debian-Servers
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#basisinstallation-eines-debian-servers&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Basisinstallation eines Debian-Servers&#34; href=&#34;#basisinstallation-eines-debian-servers&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Bei der Erstellung dieses Beitrags, habe ich die nachfolgenden Codezeilen auf einem Server durchgeführt, der unter der IP-Adresse &lt;strong&gt;128.140.114.17&lt;/strong&gt; lief. Dieser wurde nur kurzfristig durch einen Cloud-Provider bereit gestellt. Wer die Anleitung durcharbeitet, muss die Adresse des eigenen DNS-Servers verwenden.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Die Installation wird auf einem Debian-Server (zum Zeitpunkt dieses Beitrags Debian 12) durchgeführt. Nach der Basisinstallation sollte eine Minimalabsicherung erfolgen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH aktivieren&lt;/li&gt;
&lt;li&gt;[evtl. einen alternativen Port für SSH verwenden]&lt;/li&gt;
&lt;li&gt;Public-Key-Auth einrichten&lt;/li&gt;
&lt;li&gt;fail2ban installieren, so dass fehlerhafte Logins zu einem BAN führen&lt;/li&gt;
&lt;li&gt;Firewall installieren und nur Port für SSH und Port 53 freigeben.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Könnte in der Kürze wie folgt aussehen:&lt;/p&gt;
&lt;p&gt;SSH-Key von meinem Client hochladen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-copy-id -i ~/.ssh/&amp;lt;mein-ssh-key&amp;gt;.pub &amp;lt;user&amp;gt;@&amp;lt;server&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Auf dem Server &lt;code&gt;ufw&lt;/code&gt; und &lt;code&gt;fail2ban&lt;/code&gt; installieren, SSH-Port umziehen (Mach ich so, müsst Ihr nicht) und passende UFW-Regeln erstellen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install ufw fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/#Port 22/Port 42042/&amp;#39;&lt;/span&gt; /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ufw allow &lt;span class=&#34;m&#34;&gt;42042&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ufw allow &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ufw &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#34;gblog-hint warning&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa warning&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Aufgepasst&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Vorsicht bei der Port-Änderung von SSH und der anschließenden Einrichtung der Firewall. Man kann sich ganz schön aussperren, wenn man hier nur abtippt.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bei Debian 12 muss bzgl. fail2ban noch an einer Stelle nachgearbeitet werden. Nach der Installation läuft der Service nicht korrekt. Die Anpassung erfolgt in der &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt;. Ich löse das Problem in dem ich die Zeile &lt;code&gt;backend = %(sshd_backend)s&lt;/code&gt; durch &lt;code&gt;backend = systemd&lt;/code&gt; tausche und dann fail2ban neu starte:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install python3-systemd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/backend = %(sshd_backend)s/backend = systemd/&amp;#39;&lt;/span&gt; /etc/fail2ban/jail.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Siehe hierzu auch: &lt;a href=&#34;https://github.com/fail2ban/fail2ban/issues/3292#issuecomment-1678844644&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/fail2ban/fail2ban/issues/3292&lt;/a&gt;
&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;installation-und-einrichtung-von-bind9&#34;
    &gt;
        Installation und Einrichtung von bind9
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#installation-und-einrichtung-von-bind9&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Installation und Einrichtung von bind9&#34; href=&#34;#installation-und-einrichtung-von-bind9&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Nun beginnt die eigentliche Einrichtung und wir beginnen mit der Installation eines DNS-Servers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install bind9 bind9-dnsutils
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h2 id=&#34;konfiguration-des-dns-servers&#34;
    &gt;
        Konfiguration des DNS-Servers
    &lt;/h2&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#konfiguration-des-dns-servers&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Konfiguration des DNS-Servers&#34; href=&#34;#konfiguration-des-dns-servers&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Die Konfigurationsdateien liegen unter &lt;code&gt;/etc/bind/&lt;/code&gt;. Die Hauptkonfiugrationsdatei &lt;code&gt;/etc/bind/named.conf&lt;/code&gt; lassen wir in Ruhe. Diese Datei beinhaltet nur die Includes auf die anderen Dateien die uns wichtig sind.&lt;/p&gt;
&lt;p&gt;Die eigentliche Konfiguration (außerhalb der Zonendefinitionen) erfolgt in der &lt;code&gt;/etc/bind/named.conf.options&lt;/code&gt;. Im Beispiel hier habe ich folgende Konfiguration hinzugefügt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;options &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        directory &lt;span class=&#34;s2&#34;&gt;&amp;#34;/var/cache/bind&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        listen-on port &lt;span class=&#34;m&#34;&gt;53&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; any&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        allow-query &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; any&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        allow-transfer &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        allow-recursion &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        recursion no&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        rate-limit &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            responses-per-second 5&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            window 5&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        // Weiterer Inhalt gekürzt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit darf weltweit jedes Gerät diesen DNS-Server verwenden. Allerdings ist eine rekursive Anfrage nicht erlaubt. Somit kann der DNS-Server nur für die eigenen (delegierten) Domains verwendet werden. Zusätzlich sorgt das &lt;code&gt;rate-limit&lt;/code&gt; dafür, dass der Server nur eine gewisse Anzahl an DNS-Anfragen pro Zeiteinheit zulässt. Somit wird ein Missbrauch vermieden wie z. B. hier beschrieben: &lt;a href=&#34;https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Cyber-Sicherheitslage/Reaktion/CERT-Bund/CERT-Bund-Reports/HowTo/Offene-DNS-Resolver/Offene-DNS-Resolver.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;BSI-Hinweise zu offenen DNS-Resolvern&lt;/a&gt;
.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h2 id=&#34;zonen-definieren&#34;
    &gt;
        Zonen definieren
    &lt;/h2&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#zonen-definieren&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Zonen definieren&#34; href=&#34;#zonen-definieren&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;In der &lt;code&gt;/etc/bind/named.conf.local&lt;/code&gt; werden die einzelnen Zonen definiert:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;include &lt;span class=&#34;s2&#34;&gt;&amp;#34;/etc/bind/nsupdate.key&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone &lt;span class=&#34;s2&#34;&gt;&amp;#34;lab.toheine.net&amp;#34;&lt;/span&gt; IN &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; master&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  allow-update &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; key &lt;span class=&#34;s2&#34;&gt;&amp;#34;nsupdate-key&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  file &lt;span class=&#34;s2&#34;&gt;&amp;#34;db.lab.toheine.net&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  notify yes&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone &lt;span class=&#34;s2&#34;&gt;&amp;#34;_acme-challenge.toheine.net&amp;#34;&lt;/span&gt; IN &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; master&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  allow-update &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; key &lt;span class=&#34;s2&#34;&gt;&amp;#34;nsupdate-key&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  file &lt;span class=&#34;s2&#34;&gt;&amp;#34;db._acme-challenge.toheine.net&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  notify yes&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im Beispiel wurden zwei Zonen definiert. Die erste Zone ist für die Subdomain &lt;code&gt;lab.toheine.net&lt;/code&gt; komplett zuständig. Diese Form verwende ich, wenn ich neben der &lt;strong&gt;DNS-01 challenge&lt;/strong&gt; auch weitere Records erstellen will. Die zweite Zone &lt;code&gt;_acme-challenge.toheine.net&lt;/code&gt; wird später ausschließlich für die Zertifikats-Erstellung verwendet. Alle anderen Records die unter der &lt;code&gt;toheine.net&lt;/code&gt; Domain laufen, werden direkt bei meinem Registrar eingegeben.&lt;/p&gt;
&lt;p&gt;Innerhalb der Zone verraten die Zuweisungen für &lt;code&gt;file&lt;/code&gt;, wo die einzelnen Records tatsächlich liegen und &lt;code&gt;allow-update&lt;/code&gt; ermöglicht das dynamische Eintragen von Resource Records, sofern der korrekte Key verwendet wird. Über dieses Verfahren trägt der ACME-Client ein Token als TXT-Record ein. Den Key brauchen wir erst später &amp;hellip; aber weil wir gerade dabei sind, erzeugen wir diesen gleich und verpassen der Datei die minimalen Rechte:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tsig-keygen -a sha512 nsupdate-key &amp;gt; /etc/bind/nsupdate.key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; /etc/bind/nsupdate.key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown bind: /etc/bind/nsupdate.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h2 id=&#34;zoneneinträge-erzeugenvorbereiten&#34;
    &gt;
        Zoneneinträge erzeugen/vorbereiten
    &lt;/h2&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#zoneneinträge-erzeugenvorbereiten&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Zoneneinträge erzeugen/vorbereiten&#34; href=&#34;#zoneneintr%c3%a4ge-erzeugenvorbereiten&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Wenn wir bind9 konfiguriert haben, werden die einzelnen Zonen-Dateien unter &lt;code&gt;/var/cache/bind/&lt;/code&gt; erwartet. Für jede Zone erstellen wir eine eigene Datei, die wir im Anschluss mit Inhalten füllen:&lt;/p&gt;
&lt;p&gt;Die Zonendatei &lt;code&gt;/var/cache/bind/db.lab.toheine.net&lt;/code&gt; hat nachfolgenden exemplarischen Aufbau:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$TTL&lt;/span&gt; 300	  &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; minutes 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@   IN SOA	dns.lab.toheine.net. mail.toheine.net. &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;2024041701&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; serial
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;86400&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; refresh &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; day&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;7200&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; retry &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; hours&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;604800&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; expire &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; week&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;172800&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; minimum &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; days&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@      NS    dns             
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dns    A     128.140.114.17  &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; produktive IP meines DNS-Servers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;www    A     192.0.2.1       &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; Test-Net-IP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;   CNAME www             &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; Alias auf www
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cloud  CNAME www             &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; Alias auf www
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Kommentar-Zeichen der Zonendatei ist das Semikolon. Gerade wenn man neu in der DNS-Welt unterwegs ist, hilft das für die Zuordnung der vielen Werte oder DNS-Typen. Wichtig ist der &lt;code&gt;SOA&lt;/code&gt;-Eintrag (Start of Authority), der einige Parameter enthält, die für die Eröffnung der Zone notwendig sind. Der Aufbau der Datei ist auf &lt;a href=&#34;https://de.wikipedia.org/wiki/SOA_Resource_Record&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wikipedia&lt;/a&gt;
 gut erklärt.&lt;/p&gt;
&lt;p&gt;Die weiteren Einträge dienen erstmal nur dazu, um später zu sehen, ob der DNS-Server tatsächlich die Anfragen korrekt auflöst. Hier können beliebige, gültige Einträge vorgenommen werden. Analog dazu erstelle ich eine leere Zonen-Datei unter &lt;code&gt;/var/cache/bind/db._acme-challenge.toheine.net&lt;/code&gt; die allerdings neben dem &lt;code&gt;SOA&lt;/code&gt;- und &lt;code&gt;NS&lt;/code&gt;-Eintrag keine weiteren Records enthält:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$TTL&lt;/span&gt; 300	&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; minutes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@  IN   SOA dns.lab.toheine.net. mail.toheine.net. &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;2024041701&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; serial
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;86400&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; refresh &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; day&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;7200&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; retry &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; hours&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;604800&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; expire &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; week&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;m&#34;&gt;172800&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; minimum &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; days&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@      NS   dns.lab.toheine.net.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nun sind wir fertig und wir können bind9 neu starten, damit die geänderten Konfigurationen neu eingelesen werden. Vorab ist es allerdings absolut empfehlenswert, die Konfiguration mit folgendem Befehl zu überprüfen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;named-checkconf -z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Ausgabe sollte wie folgt aussehen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone lab.toheine.net/IN: loaded serial &lt;span class=&#34;m&#34;&gt;2024041701&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone _acme-challenge.toheine.net/IN: loaded serial &lt;span class=&#34;m&#34;&gt;2024041701&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone localhost/IN: loaded serial &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone 127.in-addr.arpa/IN: loaded serial &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone 0.in-addr.arpa/IN: loaded serial &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone 255.in-addr.arpa/IN: loaded serial &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wenn hier Fehler enthalten sind, müssen diese vor einem Nameserver-Neustart bereinigt werden. Ansonsten wird bind9 nicht starten. Ist alles korrekt, kann der named-service neu gestartet werden:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart named.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit ist die DNS-Konfiguration fertig. Um von einem lokalen Client zu testen, ob der DNS-Server seine Arbeit korrekt erledigt, können wir mit dem Kommando &lt;code&gt;dig @128.140.114.17 test.lab.toheine.net&lt;/code&gt; einen DNS-Lookup durchführen. Wichtig ist zum jetzigen Zeitpunkt, dass wir den DNS-Server (hinter dem &lt;code&gt;@&lt;/code&gt;-Zeichen) angeben. Die Ausgabe sollte wie folgt aussehen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.18.24-1-Debian &amp;lt;&amp;lt;&amp;gt;&amp;gt; @128.140.114.17 test.lab.toheine.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 45885
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: def4386d4f9e1e0f010000006620039ac691052a8e61c70f (good)
;; QUESTION SECTION:
;test.lab.toheine.net.		IN	A

;; ANSWER SECTION:
test.lab.toheine.net.	300	IN	CNAME	www.lab.toheine.net.
www.lab.toheine.net.	300	IN	A	192.0.2.1

;; Query time: 4 msec
;; SERVER: 128.140.114.17#53(128.140.114.17) (UDP)
;; WHEN: Wed Apr 17 19:15:06 CEST 2024
;; MSG SIZE  rcvd: 111
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h2 id=&#34;bei-dns-registrar-die-zonen-delegation-eintragen&#34;
    &gt;
        Bei DNS-Registrar die Zonen-Delegation eintragen
    &lt;/h2&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#bei-dns-registrar-die-zonen-delegation-eintragen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Bei DNS-Registrar die Zonen-Delegation eintragen&#34; href=&#34;#bei-dns-registrar-die-zonen-delegation-eintragen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Im letzten Schritt der DNS-Konfiguration, müssen wir bei unserem DNS-Registrar noch die Zonen-Delegation hinterlegen. Hier sind die Einträge je nach Anbieter recht ähnlich und kann wie folgt aussehen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/dehydrated-bind/images/dns-entries-reg.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/dehydrated-bind/images/dns-entries-reg.png&#34;
              alt=&#34;Einträge beim DNS-Registrar&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Einträge beim DNS-Registrar
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Legende&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;&lt;ol&gt;
&lt;li&gt;IPv4- und IPv6- Eintrag, um den eingerichteten DNS-Server mit Namen aufzulösen&lt;/li&gt;
&lt;li&gt;Zonen-Delegation ausschließlich für die DNS-01 challenge.&lt;/li&gt;
&lt;li&gt;Zonen-Delegation für eine komplette Suddomain (DNS-01 challengenge und sonstige Records)&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/blockquote&gt;




&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;dynamisches-eintragen-von-dns-records-via-nsupdate&#34;
    &gt;
        Dynamisches Eintragen von DNS-Records via nsupdate
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#dynamisches-eintragen-von-dns-records-via-nsupdate&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Dynamisches Eintragen von DNS-Records via nsupdate&#34; href=&#34;#dynamisches-eintragen-von-dns-records-via-nsupdate&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Sobald man eigene Konfigurations-Dateien auf einem eigenen Server hat, kann man grundsätzlich mit Hilfe von Skripten (bash-Skripte, python, etc.) die Dateien anpassen. Für das dynamische Einspielen von DNS-Records sind aber solche Skripte nicht wirklich geeignet, da u. a. der DNS-Server nach einem Resource-Eintrag seine Konfiguration jedes Mal neu laden müsste.&lt;/p&gt;
&lt;p&gt;Für &lt;strong&gt;dynamische DNS-Updates&lt;/strong&gt; ist das Tool &lt;code&gt;nsupdate&lt;/code&gt; vorgesehen, das wir im Rahmen von &lt;code&gt;bind9-dnsutils&lt;/code&gt; oben installiert haben. Unser ACME-Client soll später über dieses Tool die DNS-Einträge vornehmen. Sofern man &lt;code&gt;nsupdate&lt;/code&gt; ohne Angabe von Optionen oder Argumenten aufruft, befindet man sich in einem interaktiven nsupdate-Modus von wo aus verschiedene nsupdate-Befehle übergeben werden können. Mit &lt;code&gt;help&lt;/code&gt; sieht man die Möglichkeiten vor Ort und mit &lt;code&gt;quit&lt;/code&gt; beendet man den interaktiven Modus wieder.&lt;/p&gt;
&lt;p&gt;Sehr komfortabel ist die Verwendung einer Textdatei um die Funktion von &lt;code&gt;nsupdate&lt;/code&gt; zu prüfen. Diese enthält die Befehlsfolge, die wir bei Aufruf von &lt;code&gt;nsupdate&lt;/code&gt; übergeben. Im Beispiel schreibe ich folgenden Inhalt in eine &lt;code&gt;~/nsupdate.txt&lt;/code&gt;-Datei:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zone lab.lfb-linux.de
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;update add botschaft.lfb-linux.de. &lt;span class=&#34;m&#34;&gt;300&lt;/span&gt; in TXT &lt;span class=&#34;s2&#34;&gt;&amp;#34;HeyYoda&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;show
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;send
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sinn und Zweck ist das Testen des dynamischen Eintrags. Später brauchen wir die Datei nicht mehr. Das übernimmt dann der ACME-Client. Daher ist der RRecord (Resource Record) im Beispiel eben, mit &lt;strong&gt;HeyYoda&lt;/strong&gt; relativ sinnfrei. Wenn wir den Eintrag vornehmen wollen, rufen wir &lt;code&gt;nsupdate&lt;/code&gt; mit folgendem Befehl auf:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nsupdate -k /etc/bind/nsupdate.key -v nsupdate.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es erfolgt folgende Ausgabe:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Outgoing update query:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;lab.toheine.net.		IN	SOA

;; UPDATE SECTION:
botschaft.lab.toheine.net. 300	IN	TXT	&amp;#34;HeyYoda&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Um zu prüfen, ob der dynamische Eintrag funktioniert hat, führen wir auf &lt;strong&gt;dem Client&lt;/strong&gt; ein DNS-Lookup durch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dig -t TXT botschaft.lab.toheine.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Ausgabe sollte dann (gekürzt wie folgt aussehen):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;;; ANSWER SECTION:
botschaft.lab.toheine.net. 300	IN	TXT	&amp;#34;HeyYoda&amp;#34;

;; AUTHORITY SECTION:
lab.toheine.net.	300	IN	NS	dns.lab.toheine.net.

;; ADDITIONAL SECTION:
dns.lab.toheine.net.	300	IN	A	128.140.114.17
&lt;/code&gt;&lt;/pre&gt;


&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;einrichtung-von-dehydrated&#34;
    &gt;
        Einrichtung von dehydrated
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#einrichtung-von-dehydrated&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Einrichtung von dehydrated&#34; href=&#34;#einrichtung-von-dehydrated&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Die Installation von &lt;code&gt;dehydrated&lt;/code&gt; auf dem DNS-Server kann man diskutieren. Die DNS-01 Challenge und damit verbundenen dynamischen Updates können auch von jedem anderen Host aus angestoßen werden, sofern dieser über den oben erzeugten &lt;code&gt;nsupdate-key&lt;/code&gt; verfügt.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nun kommen wir zur Einrichtung von dehydrated, das wir via &lt;code&gt;apt install dehydrated&lt;/code&gt; installieren. Die Konfiguration erfolgt im Verzeichnis &lt;code&gt;/etc/dehydrated&lt;/code&gt;. Eine gute Doku mit Beispielen findet sich bei Debian unter &lt;code&gt;/usr/share/doc/dehydrated/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Die Hauptkonfigurationsdatei ist die &lt;code&gt;/etc/dehydrated/config&lt;/code&gt;, die folgenden Aufbau besitzt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONFIG_D&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/etc/dehydrated/conf.d
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BASEDIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/etc/dehydrated
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOMAINS_TXT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;BASEDIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/domains.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CERTDIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;BASEDIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/certs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CHALLENGETYPE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dns-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CA&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://acme-staging-v02.api.letsencrypt.org/directory&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#CA=&amp;#34;letsencrypt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;HOOK&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;BASEDIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/hook.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;AUTO_CLEANUP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CONTACT_EMAIL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mail@toheine.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vieles erklärt sich von selbst. Bei Ersteinrichtung von dehydrated, nehme ich vorab die Staging-CA, die verhindert, dass ich bei Konfigurationsfehlern gegen das Rate Limit von Let&amp;rsquo;s encrypt laufe (siehe dazu: &lt;a href=&#34;https://letsencrypt.org/de/docs/staging-environment/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;staging-environment&lt;/a&gt;
). Produktiv verwendet wird später die korrekte CA (&lt;code&gt;CA=&amp;quot;letsencrypt&amp;quot;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Die einzelnen Domains, für die ein Zertifikat ausgestellt werden sollen, liegen in einer eigenen Datei unter &lt;code&gt;/etc/dehydrated/domains.txt&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lab.toheine.net *.lab.toheine.net &amp;gt; lab.toheine.net
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;toheine.net                       &amp;gt; toheine.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jede Domain, die hier pro Zeile eingetragen wird, enthält ein eigenes Zertifikat. Möchte man ein Zertifikat für mehrere Domains haben, werden diese Leerzeichen-getrennt in eine Zeile geschrieben. Hinter dem &lt;code&gt;&amp;gt;&lt;/code&gt;-Zeichen ist dann der für dehydrated hinterlegte &lt;strong&gt;Alias&lt;/strong&gt; eingetragen. Unter diesem Namen werden die Zertifikate dann unter &lt;code&gt;/etc/dehydrated/certs&lt;/code&gt; abgelegt.&lt;/p&gt;
&lt;p&gt;Im Anschluss brauchen wir das Hook-Skript, das während der Challenge aufgerufen wird und den dynamischen Eintrag erzeugt. Darin enthalten:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Example how to deploy a DNS challenge using nsupdate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# https://github.com/dehydrated-io/dehydrated/wiki/example-dns-01-nsupdate-script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -u
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -o pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;NSUPDATE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nsupdate -k /etc/dehydrated/nsupdate.key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DNSSERVER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TTL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;deploy_challenge&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;server %s\nupdate add _acme-challenge.%s. %d in TXT \&amp;#34;%s\&amp;#34;\nsend\n&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DNSSERVER&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TTL&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$NSUPDATE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;clean_challenge&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;server %s\nupdate delete _acme-challenge.%s. %d in TXT \&amp;#34;%s\&amp;#34;\nsend\n&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DNSSERVER&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TTL&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$NSUPDATE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;deploy_cert&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# optional:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# /path/to/deploy_cert.sh &amp;#34;$@&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;unchanged_cert&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# do nothing for now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;startup_hook&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# do nothing for now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;exit_hook&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# do nothing for now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dieses Skript muss zur Ausführung berechtigt sein &lt;code&gt;chmod +x hook.sh&lt;/code&gt;. Zuletzt kopieren wir noch den nsupdate.key an Ort und Stelle:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp ../bind/nsupdate.key .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im Anschluss an die Einrichtung von &lt;code&gt;dehydrated&lt;/code&gt;, muss man sich (pro CA) einmal regisitrieren &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dehydrated --register --accept-terms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; und kann im Anschluss dehydrated manuell ausführen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dehydrated -c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hat alles geklappt sollte die Ausgabe wie folgt aussehen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# INFO: Using main config file /etc/dehydrated/config
 + Creating chain cache directory /etc/dehydrated/chains
Processing lab.toheine.net with alternative names: *.lab.toheine.net 
 + Creating new directory /etc/dehydrated/certs/lab.toheine.net ...
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting new certificate order from CA...
 + Received 2 authorizations URLs from the CA
 + Handling authorization for lab.toheine.net
 + Handling authorization for lab.toheine.net
 + 2 pending challenge(s)
 + Deploying challenge tokens...
 + Responding to challenge for lab.toheine.net authorization...
 + Challenge is valid!
 + Responding to challenge for lab.toheine.net authorization...
 + Challenge is valid!
 + Cleaning challenge tokens...
 + Requesting certificate...
 + Order is processing...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
Processing toheine.net
 + Creating new directory /etc/dehydrated/certs/toheine.net ...
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting new certificate order from CA...
 + Received 1 authorizations URLs from the CA
 + Handling authorization for toheine.net
 + 1 pending challenge(s)
 + Deploying challenge tokens...
 + Responding to challenge for toheine.net authorization...
 + Challenge is valid!
 + Cleaning challenge tokens...
 + Requesting certificate...
 + Order is processing...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
 + Running automatic cleanup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die notwendigen Zertifikate liegen nun in unter &lt;code&gt;/etc/dehydrated/certs&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class=&#34;gblog-hint note&#34;&gt;
  &lt;div class=&#34;gblog-hint__title flex gap-8 align-center&#34;&gt;&lt;i class=&#34;fa note&#34;&gt;&lt;/i&gt;
      &lt;span&gt;Hinweis&lt;/span&gt;&lt;/div&gt;
  &lt;div class=&#34;gblog-hint__text&#34;&gt;Haben wir mit der Staging-CA begonnen, muss in der &lt;code&gt;/etc/dehydrated/config&lt;/code&gt; noch die korrekte CA hinterlegt werden und wir müssen uns für diese ebenfalls einmalig mit &lt;code&gt;dehydrated --register --accept-terms&lt;/code&gt; regisitrieren.&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Damit die Zertifikate in regelmäßigen Abständen neu gezogen werden, richten wir &lt;code&gt;cron&lt;/code&gt; mit dem Aufruf &lt;code&gt;crontab -e&lt;/code&gt; ein und hinterlegen folgende Zeile:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;25&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; * * &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; /usr/bin/dehydrated -c &amp;gt;&amp;gt; /var/log/dehydrated.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Challenge wird nun 1x pro Woche initiiert. Sofern sich das Zertifikat dem Verfallsdatum nährt, wird ein neues ausgestellt. Ob ich das loggen muss, mir eine Mail zu sende oder die Ausgabe nach &lt;code&gt;/dev/null&lt;/code&gt; schiebe, ist Geschmackssache.&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;verteilung-der-zertifikate-auf-die-server-via-ansible&#34;
    &gt;
        Verteilung der Zertifikate auf die Server via ansible
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#verteilung-der-zertifikate-auf-die-server-via-ansible&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Verteilung der Zertifikate auf die Server via ansible&#34; href=&#34;#verteilung-der-zertifikate-auf-die-server-via-ansible&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Nun werden die notwendigen Zertifikate automatisch und regelmäßig erstellt. Die Verteilung läuft via &lt;strong&gt;ansible&lt;/strong&gt;. Klar &amp;hellip; auch das kann man automatisieren. Dieses letzte Stück manuelle Ausführung behalte ich mir jedoch vor, da ich dann auch wirklich weiß, das die Zertifikate an Ort und Stelle sind und die notwendigen Dienste diese auch tatsächlich geladen haben.&lt;/p&gt;
&lt;p&gt;Ich stelle hier nur kurz die entsprechende &lt;strong&gt;Rolle&lt;/strong&gt; und ein exemplarisches &lt;strong&gt;Playbook&lt;/strong&gt; vor. Wer mit ansible arbeitet, wird vorab einen ansible-Host einrichten, von wo aus die Playbooks auf die zu orchestrierenden Server losgelassen werden: ansible installieren, ansible.cfg anlegen, gewisse Ordnerstruktur erstellen. Einfache Beispiele dazu sind hier zu finden: &lt;a href=&#34;https://codeberg.org/toheine/linadv_infra/src/branch/Main/ansible&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/linadv_infra&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Wir benötigen auf dem &lt;strong&gt;ansible-host&lt;/strong&gt; eine eigene Rolle &lt;strong&gt;update-certs&lt;/strong&gt;. Diese liegt unter &lt;code&gt;{{ roles_path }}/update-certs/tasks/main.yml&lt;/code&gt; und hat in meinem Fall folgenden Aufbau:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Copy fullchain.pem to local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/dehydrated/certs/{{ certname }}/fullchain.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/tmp/{{ certname }}/fullchain.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;flat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0644&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run_once&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;delegate_to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ acmehost }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Copy privkey.pem to local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/dehydrated/certs/{{ certname }}/privkey.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/tmp/{{ certname }}/privkey.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;flat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0640&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run_once&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;delegate_to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ acmehost }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Create /etc/ssl/{{ certname }} directory&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/ssl/{{ certname }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;directory&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;recurse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Copy {{ certname }}-wildcard-certificates&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/tmp/{{ certname }}/fullchain.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/ssl/{{ certname }}/fullchain.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0644&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;crt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Copy {{ certname }}-wildcard-key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/tmp/{{ certname }}/privkey.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/ssl/{{ certname }}/privkey.pem&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0600&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;check if restart-services.sh exists&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.stat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/usr/local/sbin/restart-services.sh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;resfile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restart services&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/usr/local/sbin/restart-services.sh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;when&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;resfile.stat.exists and crt.changed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der letzte Task aus der Rolle, führt ein Bashskript auf dem Zielsystem aus, das alle Services neu startet, die das Zertifikat verwenden. Das kann exemplarisch wie folgt aussehen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-SHELL&#34; data-lang=&#34;SHELL&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;systemctl restart nginx.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pro Zielsystem muss die entsprechende Datei einmalig unter &lt;code&gt;/usr/local/sbin/&lt;/code&gt;restart-services.sh` abgelegt werden.&lt;/p&gt;
&lt;p&gt;Zu der Rolle gibt es pro Zertifikat ein eigenes Playbook, das dann&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;die Gruppe der Ziel-Hosts,&lt;/li&gt;
&lt;li&gt;den Zeritifkats-Namen (alias der dehydrated-domains.txt),&lt;/li&gt;
&lt;li&gt;den Namen des acme-hosts auf dem die Zertifikate ausgestellt werden&lt;/li&gt;
&lt;li&gt;und den Rollenaufruf enthält.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Am Beispiel von lab.toheine.net sieht das playbook &lt;code&gt;update-certs-lab-toheine.yml&lt;/code&gt; wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;update SSL/TLS certs &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hosts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;certs_lab_toheine&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;become&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;vars&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;certname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lab.toheine.net&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;acmehost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;heidns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;roles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;update-certs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das dazugehörige Inventory enthält eine Zuordnung zu einer Gruppe &lt;code&gt;certs_lab_toheine&lt;/code&gt;, der ein oder mehrere Hosts zugeordnet werden. In meinem Fall sind das zwei Host mit dem Namen &lt;strong&gt;web01&lt;/strong&gt; und &lt;strong&gt;web02&lt;/strong&gt;. Ist alles an Ort und Stelle, kann das Playbook via &lt;code&gt;ansible-playbook update-certs-toheine-net.yml&lt;/code&gt; ausgeführt werden. In meinem Fall erfolgt folgende Ausgabe:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PLAY [update SSL/TLS certs] *******************************************************

TASK [Gathering Facts] ************************************************************
ok: [web02]
ok: [web01]

TASK [update-certs : Copy fullchain.pem to local] *********************************
ok: [web01 -&amp;gt; heidns(128.140.114.17)]

TASK [update-certs : Copy privkey.pem to local] ***********************************
ok: [web01 -&amp;gt; heidns(128.140.114.17)]

TASK [update-certs : Create /etc/ssl/lab.toheine.net directory] *******************
changed: [web02]
changed: [web01]

TASK [update-certs : Copy lab.toheine.net-wildcard-certificates] ******************
changed: [web02]
changed: [web01]

TASK [update-certs : Copy lab.toheine.net-wildcard-key] ***************************
changed: [web02]
changed: [web01]

TASK [update-certs : check if restart-services.sh exists] *************************
ok: [web01]
ok: [web02]

TASK [update-certs : restart services] ********************************************
skipping: [web01]
skipping: [web02]

PLAY RECAP ************************************************************************
web01                      : ok=7    changed=3    unreachable=0    failed=0    skipped=1
web02                      : ok=5    changed=3    unreachable=0    failed=0    skipped=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit sind die SSL-Zertifikate an eingestellten Ort und Stelle. Der jeweilige Service (Apache, nginx, Postifx, etc.) muss in der Folge eben noch dieses Zertifikat nutzen.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Dieses Setting umzusetzen, ist nicht in fünf Minuten erledigt. Darüber hinaus gibt es zahlreiche andere Wege zu einem gültigen Zertifikat. Wer allerdings sowieso einen DNS-Server betreibt und eine große Farm an vielen Servern vorhält, kann über die DNS-01 Challenge saubere (Wildcard-)-Zertifikate für alle Services ausstellen.&lt;/p&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/dehydrated-bind/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://letsencrypt.org/de/docs/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://letsencrypt.org/de/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/fail2ban/fail2ban/issues/3292#issuecomment-1678844644&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/fail2ban/fail2ban/issues/3292#issuecomment-1678844644&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cymru.com/Documents/secure-bind-template.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.cymru.com/Documents/secure-bind-template.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cisa.gov/news-events/alerts/2013/03/29/dns-amplification-attacks&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.cisa.gov/news-events/alerts/2013/03/29/dns-amplification-attacks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://de.wikipedia.org/wiki/SOA_Resource_Record&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://de.wikipedia.org/wiki/SOA_Resource_Record&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://dehydrated.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://dehydrated.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dehydrated-io/dehydrated&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/dehydrated-io/dehydrated&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rfc-editor.org/rfc/rfc2136.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.rfc-editor.org/rfc/rfc2136.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rtfm-sarl.ch/articles/using-nsupdate.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.rtfm-sarl.ch/articles/using-nsupdate.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;span class=&#34;gblog-button gblog-button--regular&#34;&gt;
  &lt;a
    class=&#34;gblog-button__link&#34; href=&#34;#&#34;
  &gt;
     &lt;svg class=&#34;gblog-icon gblog_keyboard_arrow_up&#34;&gt;&lt;use xlink:href=&#34;#gblog_keyboard_arrow_up&#34;&gt;&lt;/use&gt;&lt;/svg&gt; Zum Seitenanfang 
  &lt;/a&gt;
&lt;/span&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Server" term="Server" label="Server" /> 
                                <category scheme="https://toheine.net/tags/Ansible" term="Ansible" label="Ansible" /> 
                                <category scheme="https://toheine.net/tags/DNS" term="DNS" label="DNS" /> 
                                <category scheme="https://toheine.net/tags/Lets-Encrypt" term="Lets-Encrypt" label="Lets Encrypt" />
        </entry>
        <entry>
            <title>ASN Lookup Tool</title>
            <link href="https://toheine.net/posts/2024/asn-tool/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2024/asn-tool/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2024-01-31T00:00:00+00:00</published>
            <updated>2024-01-31T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Die &lt;a href=&#34;https://de.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IANA&lt;/a&gt;
 vergibt in Europa IP-Adressen über die &lt;strong&gt;Regional Internet Registry&lt;/strong&gt; &lt;a href=&#34;https://de.wikipedia.org/wiki/RIPE_Network_Coordination_Centre&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RIPE NCC&lt;/a&gt;
. Die öffentlichen IPv4-Adressen bzw. Global-Unicast-IPv6-Adressen werden Organisationen zugeordnet, die eine &amp;ldquo;&lt;a href=&#34;https://de.wikipedia.org/wiki/Autonomes_System&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Autonomous System&lt;/a&gt;
 Number (ASN)&amp;rdquo; besitzen. Um die IP-Adressen und Peeringpartner eines AS abzurufen, bietet sich das Tool &lt;strong&gt;asn&lt;/strong&gt; an.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#installation&#34;&gt;Installation&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#aufruf&#34;&gt;Aufruf&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;installation&#34;
    &gt;
        Installation
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/asn-tool/#installation&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Installation&#34; href=&#34;#installation&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Bei dem Tool &lt;strong&gt;asn&lt;/strong&gt; handelt es sich um ein Bash-Skript. Es ist unter &lt;a href=&#34;https://github.com/nitefood/asn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/nitefood/asn&lt;/a&gt;
 zu bekommen. Auf (m)einem Debian werden die notwendigen Pakete installiert, das Tool herunter geladen und zur Ausführung vorbereitet:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install curl whois bind9-host mtr-tiny jq ipcalc grepcidr nmap ncat aha
wget https://raw.githubusercontent.com/nitefood/asn/master/asn
chmod u+x asn
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;aufruf&#34;
    &gt;
        Aufruf
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/asn-tool/#aufruf&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Aufruf&#34; href=&#34;#aufruf&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Möchte ich ASN-Informationen zu einer IP-Adresse, wird das Skript mit der Adresse als Argument aufgerufen &amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./asn 129.143.76.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; und ich erhalte folgende Ausgabe (Auszug):&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/asn-tool/images/image01.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/asn-tool/images/image01.png&#34;
              alt=&#34;Bildschirmforto: asn Informationen zur IP-Adresse 129.143.76.1&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Bildschirmforto: asn Informationen zur IP-Adresse 129.143.76.1
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Die IP-Adresse gehört zur &lt;strong&gt;ASN 553 (Belwue)&lt;/strong&gt;. Daneben erhalten wir traceroute-Informationen und können der Spur folgen, welche AS wir auf dem Weg zu unserem Ziel passieren:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/asn-tool/images/image02.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/asn-tool/images/image02.png&#34;
              alt=&#34;Bildschirmforto: Auszug asn Informationen zu AS Pfad&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Bildschirmforto: Auszug asn Informationen zu AS Pfad
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Interessant ist ein Lookup des kompletten AS. Sofern das Tool mit einer ASN als Argument aufgerufen wird, die zu der eben verwendeten IP-Adresse gehört, &amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./asn 553
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; können alle dazugehörigen IPv4-/IPv6-Adressbereiche und Peeringpartner eingesehen werden.Der Abruf dauert je nach ASN etwas länger. Die Gegenüberstellung der Treffer für IPv4 zu IPv6 sieht bei Belwue auszugsweise wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2024/asn-tool/images/image03.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2024/asn-tool/images/image03.png&#34;
              alt=&#34;Bildschirmforto: Auszug asn Informationen zu ASN 553.&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Bildschirmforto: Auszug asn Informationen zu ASN 553.
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Schön zu erkennen ist das Verhältnis der zahlreichen IPv4-Netzbereiche zu den IPv6-Netzbereichen (hier 42:3). Der oft genannte Vorteil, dass IPv6-Routing-Tabellen deutlich kleiner ausfallen, kann hiermit examplarisch nachvollzogen werden. Je nach AS fällt der Unterschied noch deutlicher ins Gewicht: Bei einem asn Lookup mit Netcup war das Verhältnis etwa 3000:4.&lt;/p&gt;
&lt;p&gt;Die Idee dieses Tool zu verwenden, ist nicht auf meinem Mist gewachsen. Ich hab das aus einem &lt;a href=&#34;https://www.linux-magazin.de/ausgaben/2021/11/einfuehrung-2/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Linux-Magazin-Artikel&lt;/a&gt;
, in dem &lt;a href=&#34;https://chaos.social/@charlykuehnast&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@charlykuehnast&lt;/a&gt;
 &lt;strong&gt;&amp;ldquo;Aus dem Alltag eines Sysadmin&amp;rdquo;&lt;/strong&gt; das Werkzeug beschreibt.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2024/asn-tool/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nitefood/asn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/nitefood/asn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linux-magazin.de/ausgaben/2021/11/einfuehrung-2/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.linux-magazin.de/ausgaben/2021/11/einfuehrung-2/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://de.wikipedia.org/wiki/RIPE_Network_Coordination_Centre&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://de.wikipedia.org/wiki/RIPE_Network_Coordination_Centre&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://de.wikipedia.org/wiki/Autonomes_System&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://de.wikipedia.org/wiki/Autonomes_System&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ripe.net/manage-ips-and-asns/as-numbers/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.ripe.net/manage-ips-and-asns/as-numbers/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Admin-Tools" term="Admin-Tools" label="Admin-Tools" />
        </entry>
        <entry>
            <title>Multi-Boot USB-Stick mit Ventoy</title>
            <link href="https://toheine.net/posts/2023/ventoy/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2023/ventoy/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2023-11-24T00:00:00+00:00</published>
            <updated>2023-11-24T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Für den Betrieb des Server-Parks werden allerlei verschiedene Betriebssysteme bzw. Linux-Distributionen benötigt. Sei es zur Installation eines neuen Systems, zur Analyse, zur Fehlerbehebung oder einfach nur für Testzwecke. Die dazu benötigten Installationsdateien liegen normalerweise in so genannten iso-Abbildern vor. Diese wurden früher auf CDs/DVDs gebrannt, während heutzutage eher bootbare USB-Sticks verwendet werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Das Problem&lt;/strong&gt;: Sofern man den Anweisungen der jeweiligen Dokus folgt, installiert man mit Tools wie DiskDump oder einer grafischen Lösung die Installationsdateien EINES Systems auf EINEN USB-Stick.&lt;/p&gt;
&lt;p&gt;Viel praktischer ist jedoch die Nutzung eines &lt;strong&gt;Multi-Boot-USB-Sticks&lt;/strong&gt; um auf diesem möglichst viele Betriebssysteme/Distributionen zu hinterlegen. Bei Bedarf wählt man aus einem Bootmenü das gewünschte System aus, das gestartet werden soll. Eine sehr charmante Lösung hierfür ist das Tool &lt;a href=&#34;https://www.ventoy.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Ventoy&lt;/a&gt;
. Die Vorbereitung eines USB-Sticks mit Ventoy ist schnell erledigt und erleichtert den Admin-Alltag.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#installation&#34;&gt;Installation&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#usb-stick-einrichten&#34;&gt;USB-Stick einrichten&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#ventoy-aktualisieren&#34;&gt;Ventoy aktualisieren&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;installation&#34;
    &gt;
        Installation
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/ventoy/#installation&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Installation&#34; href=&#34;#installation&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Um den Multi-USB-Stick zu erzeugen, müssen wir &amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;die Ventoy-Software auf einem PC/Notebook (irgend ein verfügbares Arbeitsgerät) installieren.&lt;/li&gt;
&lt;li&gt;mit Ventoy einmalig einen USB-Stick vorbereiten (Ich würde einen Stick &amp;gt;= 32GB empfehlen).&lt;/li&gt;
&lt;li&gt;mindestens ein iso-File im Anschluss auf den Stick schieben (und bei Bedarf nach und nach mehr ;-))&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ventoy wird für Windows und Linux bereit gestellt. Die Software kann über die Webseite, Github oder Sourceforge herunter geladen werden. Die Installation auf meinem Debian-Notebook ist mit zwei Befehlen erledigt:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ wget https://github.com/ventoy/Ventoy/releases/download/v1.0.96/ventoy-1.0.96-linux.tar.gz
$ tar -xzvf ventoy-1.0.96-linux.tar.gz 
$ cd ventoy-1.0.96/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im eben entpackten Verzeichnis liegen verschiedene Skripte bereit:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ls
boot                    README           VentoyGUI.aarch64   VentoyVlnk.sh
CreatePersistentImg.sh  tool             VentoyGUI.i386      VentoyWeb.sh
ExtendPersistentImg.sh  ventoy           VentoyGUI.mips64el  WebUI
log.txt                 Ventoy2Disk.ini  VentoyGUI.x86_64
plugin                  Ventoy2Disk.sh   VentoyPlugson.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sofern wir das Tool konsolenbasiert nutzen wollen, ist &lt;code&gt;Ventoy2Disk.sh&lt;/code&gt; das Skript der Wahl. Mit folgendem Aufruf sehen wir die vorhandenen Möglichkeiten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./Ventoy2Disk.sh --help

**********************************************
      Ventoy: 1.0.96  x86_64
      longpanda admin@ventoy.net
      https://www.ventoy.net
**********************************************

Usage:  Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
  CMD:
   -i  install Ventoy to sdX (fails if disk already installed with Ventoy)
   -I  force install Ventoy to sdX (no matter if installed or not)
   -u  update Ventoy in sdX
   -l  list Ventoy information in sdX

  OPTION: (optional)
   -r SIZE_MB  preserve some space at the bottom of the disk (only for install)
   -s/-S       enable/disable secure boot support (default is enabled)
   -g          use GPT partition style, default is MBR (only for install)
   -L          Label of the 1st exfat partition (default is Ventoy)
   -n          try non-destructive installation (only for install)
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;usb-stick-einrichten&#34;
    &gt;
        USB-Stick einrichten
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/ventoy/#usb-stick-einrichten&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor USB-Stick einrichten&#34; href=&#34;#usb-stick-einrichten&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Mit der eben angezeigten Ausgabe kann man eigentlich schon arbeiten. Für uns relevant wäre bei der Erstinstallation &lt;code&gt;./Ventoy2Disk.sh -i /dev/sdX&lt;/code&gt;. Die entsprechende Gerätedatei können wir mit Programm &lt;code&gt;lsblk&lt;/code&gt; identifizieren:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ lsblk
NAME                    MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
sda                       8:0    1    0B  0 disk  
sdb                       8:16   1 57,3G  0 disk  
└─sdb1                    8:17   1 57,3G  0 part  
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In diesem Fall also &lt;code&gt;/dev/sdb&lt;/code&gt;. Achtung: Das System sollte im Folgenden nicht gemountet sein. Der Aufruf erfolgt mit Super-User-Rechten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo ./Ventoy2Disk.sh -i /dev/sdb

**********************************************
      Ventoy: 1.0.96  x86_64
      longpanda admin@ventoy.net
      https://www.ventoy.net
**********************************************

Disk : /dev/sdb
Model:  USB  SanDisk 3.2Gen1 (scsi)
Size : 57 GB
Style: MBR


Attention:
You will install Ventoy to /dev/sdb.
All the data on the disk /dev/sdb will be lost!!!

Continue? (y/n) 

All the data on the disk /dev/sdb will be lost!!!
Double-check. Continue? (y/n) 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wir können nochmal kontrollieren, ob es sich wirklich um unseren USB-Stick handelt und mit 2x &lt;code&gt;y&lt;/code&gt; fahren wir fort. Ventoy erstellt nun eigenständig zwei Partitionen, kopiert die notwendigen Daten an Ort und Stelle und schließt die Installation ab:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Create partitions on /dev/sdb by parted in MBR style ...
Done
Wait for partitions ...
partition exist OK
create efi fat fs /dev/sdb2 ...
mkfs.fat 4.2 (2021-01-31)
success
Wait for partitions ...
/dev/sdb1 exist OK
/dev/sdb2 exist OK
partition exist OK
Format partition 1 /dev/sdb1 ...
mkexfatfs 1.3.0
Creating... done.
Flushing... done.
File system created successfully.
mkexfatfs success
writing data to disk ...
sync data ...
esp partition processing ...

Install Ventoy to /dev/sdb successfully finished.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Für uns relevant ist die größere, bootbare Partition:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo fdisk -l /dev/sdb
[...]
Device     Boot     Start       End   Sectors  Size Id Type
/dev/sdb1  *         2048 120111103 120109056 57,3G  7 HPFS/NTFS/exFAT
/dev/sdb2       120111104 120176639     65536   32M ef EFI (FAT-12/16/32)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit ist die Installation beendet. Wenn &lt;code&gt;/dev/sdb1&lt;/code&gt; gemountet ist, können iso-Dateien von Betriebssystemen/Linux-Distributionen auf den USB-Stick kopiert werden.&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/ventoy/images/image01.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/ventoy/images/image01.png&#34;
              alt=&#34;Bildschirmfoto: Ventoy-Stick mit fünf verschiedenen Linux-Distributionen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Bildschirmfoto: Ventoy-Stick mit fünf verschiedenen Linux-Distributionen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Ein Gerät, das von unserem Ventoy-Stick bootet, schlägt via Grub2 die einzelnen hinterlegten Systeme vor. Je nach Auswahl startet der Installationsprozess oder das Live-System des jeweiligen Eintrags:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/ventoy/images/image02.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/ventoy/images/image02.png&#34;
              alt=&#34;Bildschirmforto: Die einzelnen iso-Dateien werden im Grub2-Menü aufgeführt.&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Bildschirmforto: Die einzelnen iso-Dateien werden im Grub2-Menü aufgeführt.
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;ventoy-aktualisieren&#34;
    &gt;
        Ventoy aktualisieren
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/ventoy/#ventoy-aktualisieren&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Ventoy aktualisieren&#34; href=&#34;#ventoy-aktualisieren&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Ventoy wird aktiv weiter entwickelt. Sofern es Updates gibt, lädt man die Software wie oben beschrieben herunter und steckt seinen USB-Stick ein. Die Ventoy-Version kann nun ausgelesen werden:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo ./Ventoy2Disk.sh -l /dev/sdb

**********************************************
      Ventoy: 1.0.96  x86_64
      longpanda admin@ventoy.net
      https://www.ventoy.net
**********************************************

Ventoy Version in Disk: 1.0.93
Disk Partition Style  : MBR
Secure Boot Support   : YES
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bei dem eben angezeigten Gerät, handelt es sich um meinen derzeitigen produktiv genutzten Ventoy-Multi-Boot-Stick der mit der Version 1.0.93 nicht die neueste Version besitzt. Mit folgendem Befehl führen wir ein Update durch:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./Ventoy2Disk.sh -u /dev/sdb

**********************************************
      Ventoy: 1.0.96  x86_64
      longpanda admin@ventoy.net
      https://www.ventoy.net
**********************************************

Upgrade operation is safe, all the data in the 1st partition (iso files and other) will be unchanged!

Update Ventoy  1.0.93 ===&amp;gt; 1.0.96   Continue? (y/n) 
esp partition processing ...

Update Ventoy on /dev/sdb successfully finished.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sobald wir die die Abfrage mit &lt;code&gt;y&lt;/code&gt; bestätigen, wird das Update durchgeführt.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/ventoy/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Im Vergleich zu den früheren Lösungen ist die Einrichtung eines Multi-Boot-Sticks ziemlich einfach. Ein paar Eingaben auf der Kommandozeile und der Stick ist fertig. Wer es grafisch möchte, kann z. B. mit &lt;code&gt;VentoyGUI.x86_64&lt;/code&gt; über ein GUI die Einrichtung vornehmen&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/ventoy/images/image03.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/ventoy/images/image03.png&#34;
              alt=&#34;Bildschirmfoto: Die Einrichtung des Ventoy-Sticks kann auch via GUI vorgenommen werden.&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Bildschirmfoto: Die Einrichtung des Ventoy-Sticks kann auch via GUI vorgenommen werden.
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Einmal eingerichtet, können je nach Belieben iso-Dateien auf den Stick gezogen oder wieder entfernt werden. Begrenzt ist man halt hier durch die Größe des USB-Sticks. Mein hier verwendeter 64G-Stick, reicht mir locker.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/ventoy/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ventoy/Ventoy/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/ventoy/Ventoy/&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://www.ventoy.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.ventoy.net/&lt;/a&gt;
&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Admin-Tools" term="Admin-Tools" label="Admin-Tools" />
        </entry>
        <entry>
            <title>Toolbox veröffentlicht</title>
            <link href="https://toheine.net/posts/2023/toolbox-published/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2023/toolbox-published/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2023-10-03T00:00:00+00:00</published>
            <updated>2023-10-03T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Seit gestern gibt es auf dieser Seite eine (derzeit noch) kleine &lt;a href=&#34;/toolbox&#34;&gt;Toolbox&lt;/a&gt;
. Dort werden Anwendungen, Plugins, Dienste im Netz, etc. aufgeführt, die in meinen Augen &lt;strong&gt;gute/bessere Alternativen&lt;/strong&gt; zu proprietären oder datensammelwüttigen Angeboten darstellen.&lt;/p&gt;
&lt;p&gt;In diesem Zusammenhang wurde auch die Navigation etwas umgebaut. Das hier eingesetzte Theme &lt;a href=&#34;https://github.com/thegeeklab/hugo-geekblog&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hugo-geekblog&lt;/a&gt;
 erstellt im Standard pro vergebenem Schlagwort einen Navigationseintrag. Mir erschien dieses Feature anfangs als sehr nützlich. Ich habe aber schnell gemerkt, dass es mir die Navigation unnötig aufbläht, sofern ich Beiträge mit zwei oder mehr Tags versehe.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Tools" term="Tools" label="Tools" />
        </entry>
        <entry>
            <title>Erste Gehversuche mit FreeBSD</title>
            <link href="https://toheine.net/posts/2023/install-freebsd/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2023/install-freebsd/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2023-09-15T00:00:00+00:00</published>
            <updated>2023-09-15T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Ich bin ein großer &lt;strong&gt;GNU/Linux-Fan&lt;/strong&gt; und im Besonderen mit Debian und Arch Linux sehr zufrieden. Dennoch hatte ich schon länger den Plan, in das FreeBSD-Universum zu schnuppern. Bisher ist mir das System bei der Firewall-Lösung &lt;strong&gt;OPNsense&lt;/strong&gt; begegenet, die jedoch (im Normalfall) über die WebUI konfiguriert wird. Mit den Spezifika von FreeBSD setzt man sich dort eher weniger auseinander. Nun kam ich dazu, über den Tellerrand zu schauen und hab mich initial mit FreeBSD auseinander gesetzt. Mein erster Installationsversuch ist im Folgenden dokumentiert.&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#installation&#34;&gt;Installation&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#ersteinrichtung&#34;&gt;Ersteinrichtung&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#ssh-einrichten&#34;&gt;SSH einrichten&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#grafische-benutzeroberfläche&#34;&gt;Grafische Benutzeroberfläche&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;installation&#34;
    &gt;
        Installation
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/install-freebsd/#installation&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Installation&#34; href=&#34;#installation&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Der erste Blick fiel in die offizielle Dokumentation, die mir sehr ausführlich erscheint und die in &lt;a href=&#34;https://docs.freebsd.org/de/books/handbook/basics/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;deutscher Sprache&lt;/a&gt;
 vorliegt. Nachdem ich mir einen Überblick verschafft hatte, wurde das entsprechende ISO-File &lt;a href=&#34;https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
 herunter geladen, auf einen &lt;a href=&#34;https://www.ventoy.net&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Ventoy-Multiboot-Stick&lt;/a&gt;
 gezogen und davon gebootet.&lt;/p&gt;
&lt;p&gt;Es öffnet sich sofort der Installer. Die vorgeschlagenen Einstellungen wurden weitgehend übernommen. &lt;strong&gt;Einzige wesentliche Änderung&lt;/strong&gt;: Der zusätzlich angelegte User &lt;code&gt;tobi&lt;/code&gt; wurde der Gruppe &lt;code&gt;wheel&lt;/code&gt; zugeordnet. Dadurch kann mit dem Befehl &lt;code&gt;su - root&lt;/code&gt; von meinem eigenen User zu &lt;code&gt;root&lt;/code&gt; gewechselt werden. Sonst hätte ich das &lt;a href=&#34;https://cstan.io/post/2011/12/freebsd-su-sorry/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;su: Sorry-Problem&lt;/a&gt;
. Zudem wurde SSH aktiviert.&lt;/p&gt;
&lt;p&gt;Der Installations-Assistent war schnell durchlaufen. Doch beim darauf folgenden Neustart lief mir folgende Fehlermeldung über den Weg:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sdhci_pci0-slot0: Controller timeout
sdhci_pci0-slot0: ============== REGISTER DUMP ==============
sdhci_pci0-slot0: Sys addr: 0x00000000 | Version:  0x00001002
sdhci_pci0-slot0: Blk size: 0x00000000 | Blk cnt:  0x00000000
sdhci_pci0-slot0: Argument: 0x000001aa | Trn mode: 0x00000000
sdhci_pci0-slot0: Present:  0x00020001 | Host ctl: 0x00000001
sdhci_pci0-slot0: Power:    0x0000000e | Blk gap:  0x00000080
sdhci_pci0-slot0: Wake-up:  0x00000000 | Clock:    0x0000fa07
sdhci_pci0-slot0: Timeout:  0x00000000 | Int stat: 0x00000000
sdhci_pci0-slot0: Int enab: 0x01ff003b | Sig enab: 0x01ff003b
sdhci_pci0-slot0: AC12 err: 0x00000000 | Host ctl2:0x00000000
sdhci_pci0-slot0: Caps:     0x7568c881 | Caps2:    0x00000807
sdhci_pci0-slot0: Max curr: 0x00000000 | ADMA err: 0x00000000
sdhci_pci0-slot0: ADMA addr:0x00000000 | Slot int: 0x00000000
sdhci_pci0-slot0: ===========================================
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Diese Meldung erscheint etwa 2 bis 3 Minuten im Sekunden-Takt. Die Maschine bootet jedoch im Anschluss ordentlich durch. Die genannte Fehlermeldung konnte im Kernel-Ring-Buffer mit &lt;code&gt;dmesg&lt;/code&gt; nachvollzogen werden. Weitere Infos zu &lt;code&gt;sdhci_pci0&lt;/code&gt; können wie folgt ausgegeben werden:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@fbsd:~ # pciconf -lv sdhci_pci0
sdhci_pci0@pci0:0:30:6: class=0x080501 rev=0x21 hdr=0x00 vendor=0x8086 [...] 
    vendor     = &amp;#39;Intel Corporation&amp;#39;
    device     = &amp;#39;Sunrise Point-LP Secure Digital IO Controller&amp;#39;
    class      = base peripheral
    subclass   = SD host controller
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Der in meinem NUC eingebaute SD-Kartenleser schien das Problem zu sein. Der Hinweis &lt;a href=&#34;https://forums.freebsd.org/threads/sdhci_pci0_slot0-controller-timeout.59077/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
 hat mir auf die Sprünge geholfen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@fbsd:~ # echo hint.sdhci_pci.0.disabled=&amp;#34;1&amp;#34; &amp;gt;&amp;gt; /boot/loader.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Warnungen und die Verzögerung beim Boot-Prozess sind somit weg. Ich kann mich anmelden, Das System scheint zu laufen.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;ersteinrichtung&#34;
    &gt;
        Ersteinrichtung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/install-freebsd/#ersteinrichtung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Ersteinrichtung&#34; href=&#34;#ersteinrichtung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Im Anschluss an die Basis-Installation hab ich mich umgesehen. Neben den bekannten Befehlen wie &lt;code&gt;uname -a&lt;/code&gt; oder dem FreeBSD-typischen Kommando &lt;code&gt;freebsd-version -kru&lt;/code&gt; ist vor allem die Datei &lt;code&gt;/etc/os-release&lt;/code&gt; aufschlussreich:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@fbsd:~ # cat /etc/os-release
NAME=FreeBSD
VERSION=&amp;#34;13.2-RELEASE&amp;#34;
VERSION_ID=&amp;#34;13.2&amp;#34;
ID=freebsd
ANSI_COLOR=&amp;#34;0;31&amp;#34;
PRETTY_NAME=&amp;#34;FreeBSD 13.2-RELEASE&amp;#34;
CPE_NAME=&amp;#34;cpe:/o:freebsd:freebsd:13.2&amp;#34;
HOME_URL=&amp;#34;https://FreeBSD.org/&amp;#34;
BUG_REPORT_URL=&amp;#34;https://bugs.FreeBSD.org/&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Es wird empfohlen, nach einer Installation das System zu aktualisieren (Auszug):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@fbsd:~ # freebsd-update fetch install
src component not installed, skipped
Looking up update.FreeBSD.org mirrors... 2 mirrors found.
Fetching public key from update1.freebsd.org... done.
Fetching metadata signature for 13.2-RELEASE from update1.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 42 patches.....10....20....30....40. done.
Applying patches... done.
Fetching 20 files... ....10....20 done.
The following files will be added as part of updating to
13.2-RELEASE-p3:
/etc/ssl/certs/0179095f.0
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im Anschluss, war mir nicht so ganz klar, in welcher Umgebung ich nach dem Login unterwegs bin. Die erste Verwunderung: Nach einem Logout bzw. Neustart ist die &lt;code&gt;history&lt;/code&gt; leer. Eine Untersuchung der Shell ergab &amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@fbsd:~ # echo $SHELL
/bin/csh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Ausgabe verrät mir, dass ich DAS nicht haben will. Daher wurden im Anschluss erstmal ein paar Basis-Tools installiert und den beiden Usern, die ich verwende (tobi und root), in der Folge die &lt;code&gt;bash&lt;/code&gt; als Standard-Shell untergejubelt (Ja &amp;hellip; genau &amp;hellip; ich mag die BASH).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@fbsd:~ # pkg install vim sudo tmux bash 
chsh -s /usr/local/bin/bash tobi
chsh -s /usr/local/bin/bash root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Danach ist alles wie gewohnt: Die eingegebenen Befehle werden beim Logout-Vorgang in die &lt;code&gt;~/.bash_history&lt;/code&gt; geschrieben und sind somit nach einem Reboot oder neuem Login verfügbar.&lt;/p&gt;
&lt;p&gt;Im Anschluss wurde noch &lt;code&gt;sudo&lt;/code&gt; eingerichtet. Oh &amp;hellip; sieh an &amp;hellip; &lt;code&gt;visudo&lt;/code&gt; funktioniert. Wie gewohnt sind schon zahlreiche auskommentierte Konfigurationsanweisungen enthalten. Die folgende Zeile wurde auskommentiert:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;%wheel ALL=(ALL:ALL) NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Somit kann ich mit mit meinem User &lt;code&gt;tobi&lt;/code&gt; via &lt;code&gt;sudo -i&lt;/code&gt; ohne die Eingabe eines Passwortes in den User &lt;code&gt;root&lt;/code&gt; wechseln. Wie oben beschrieben funktioniert das nur, wenn der entsprechende User ein Mitglied der Gruppe &lt;code&gt;wheel&lt;/code&gt; ist:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[tobi@fbsd ~]$ sudo -i
[root@fbsd ~]# 
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;ssh-einrichten&#34;
    &gt;
        SSH einrichten
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/install-freebsd/#ssh-einrichten&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor SSH einrichten&#34; href=&#34;#ssh-einrichten&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Der SSH-Server wurde bei der Installation schon installiert und aktiviert. Ein Blick in die &lt;code&gt;/etc/rc.conf&lt;/code&gt; verrät, dass dieser aktiviert ist &amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[root@fbsd ~]# cat /etc/rc.conf | grep ssh
sshd_enable=&amp;#34;YES&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; der Service läuft &amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[root@fbsd ~]# service sshd status
sshd is running as pid 4336.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip; und laut &lt;code&gt;sockstat&lt;/code&gt; lauscht der SSH-Server korrekt auf Port 22:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[root@fbsd ~]# sockstat -4| grep ssh
root     sshd       4336  5  tcp4   *:22                  *:*
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Authentifizierung des Users bei Anmeldung soll via PubKey-Auth erfolgen. Typischerweise liegt die Konfigurationsdatei für SSH, wie gewohnt unter &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;. Für den Testlauf lasse ich diese unverändert. Auf produktiven Maschinen, die über das Internet erreichbar sind, würde ich Anpassungen zur Absicherung vornehmen (SSH-Port wechseln, Passwort-Login verbieten, etc.).&lt;/p&gt;
&lt;p&gt;Von meinem Debian-Notebook aus kopiere ich den entsprechenden Public-Key mit &lt;code&gt;ssh-copy-id&lt;/code&gt; auf die FreeBSD-Maschine:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ssh-copy-id -i ~/.ssh/id_ed25519.pub tobi@&amp;lt;FreeBSD-PC-IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Klappt wie erwartet: Der Pub-Key liegt jetzt in der Datei &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; mit den korrekten Berechtigungen.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;grafische-benutzeroberfläche&#34;
    &gt;
        Grafische Benutzeroberfläche
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/install-freebsd/#grafische-benutzeroberfläche&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Grafische Benutzeroberfläche&#34; href=&#34;#grafische-benutzeroberfl%c3%a4che&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Zuletzt wurde auf der Test-Maschine noch die grafische Benutzeroberfläche &lt;code&gt;KDE&lt;/code&gt; und der Display-Manager &lt;code&gt;SDDM&lt;/code&gt; installiert. Hierzu gibt es verschiedene Wege. Unter Debian bietet sich hier der Weg über &lt;code&gt;tasksel&lt;/code&gt; an. Daher hab ich nach einem Pendant unter FreeBSD gesucht und ein ähnliches Tool gefunden: `&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[root@fbsd ~]# pkg install desktop-installer
[root@fbsd ~]# desktop-installer
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hierbei handelt es sich um einen Assistenten, der durch die Installation führt und neben einer Auswahl von Desktop-Umgebungen wie KDE, Gnome, LXQT, etc., auch die notwendigen grafischen Treiber und Anwendungen installiert bzw. konfiguriert. Bei der Ausführung von &lt;code&gt;desktop-installer&lt;/code&gt;, gibt es allerlei Fragen zu beantworten. In der Regel wurde die jeweils vorgeschlagene Option gewählt.&lt;/p&gt;
&lt;p&gt;Allerdings habe ich drei Anläufe gebraucht, bis es dann lief. Meine Erkenntnisse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn man den &lt;code&gt;desktop-installer&lt;/code&gt; z. B. durch einen Reboot unterbricht, kann man diesen erneut aufrufen und die bisherigen gewählten Einstellungen sind vorausgewählt.&lt;/li&gt;
&lt;li&gt;Es gibt nach der Treiber-Konfiguration der Grafikkarte die Möglichkeit KDE anzutesten. In diesem Zustand ist die Installation noch nicht fertig. Man kann jedoch sehen, ob die gewählten Einstellungen zu einer korrekten Darstellung führen.&lt;/li&gt;
&lt;li&gt;SDDM begrüßte mich nach der Installation mit einem &amp;ldquo;Black-Screen&amp;rdquo;. Ursache war ein ausgewähltes SDDM-Theme, das nicht installiert war.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/install-freebsd/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Damit ist die Installation abgeschlossen. Die aufkommenden Hürden waren für mich durch die Doku, die Community und meinen eigenen Lösungsansätzen gut zu bewältigen. Ich werde in den kommenden Monaten diesen Rechner in meinem kleinen Heim-Labor verwenden und schauen, ob ich damit arbeiten kann. Ich bin gespannt wie sich die Kiste so macht und welche Erkenntnisse ich gewinnen kann.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/install-freebsd/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.freebsd.org/de/books/handbook/basics/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.freebsd.org/de/books/handbook/basics/&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://docs.freebsd.org/en/articles/linux-users/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.freebsd.org/en/articles/linux-users/&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://forums.freebsd.org/threads/sdhci_pci0_slot0-controller-timeout.59077&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://forums.freebsd.org/threads/sdhci_pci0_slot0-controller-timeout.59077&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://ostechnix.com/install-freebsd/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ostechnix.com/install-freebsd/&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://cstan.io/post/2011/12/freebsd-su-sorry/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://cstan.io/post/2011/12/freebsd-su-sorry/&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://www.cyberciti.biz/faq/freebsd-bash-installation/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.cyberciti.biz/faq/freebsd-bash-installation/&lt;/a&gt;
 &lt;br&gt;
&lt;a href=&#34;https://nudesystems.com/install-freebsd-with-kde/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://nudesystems.com/install-freebsd-with-kde/&lt;/a&gt;
&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/FreeBSD" term="FreeBSD" label="FreeBSD" />
        </entry>
        <entry>
            <title>Website Deployment mit Codeberg Pages und CI</title>
            <link href="https://toheine.net/posts/2023/website-deployment/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2023/website-deployment/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2023-08-15T00:00:00+00:00</published>
            <updated>2023-08-15T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Wer mit dem Static-Site-Generator Hugo seine Webauftritt erstellt, will die generierten Webseiten auf einem Server bereitstellen: Irgendwo einen Webspace besitzen, Markdown-Dateien bearbeiten, &lt;code&gt;hugo&lt;/code&gt; ausführen und im Anschluss per &lt;code&gt;scp&lt;/code&gt; die Dateien im Hugo-Projekt aus dem Unter-Verzeichnis &lt;code&gt;public&lt;/code&gt; hochladen. Das ist kein Hexenwerk, aber von der Bearbeitung des Inhaltes bis zur Bereitstellung auf dem Webspace sind einige Schritte notwendig. Insbesondere bei kleinen Änderungen kann das nervig sein.&lt;/p&gt;
&lt;p&gt;Da ich für meinen Teil sehr gerne mit &lt;code&gt;git&lt;/code&gt; arbeite und meine Quellen in der Regel auf irgendwelchen gitea-/forgejo-Instanzen verteile, habe ich mich bei dieser Website dafür entschieden, &lt;a href=&#34;https://docs.codeberg.org/codeberg-pages/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codeberg Pages&lt;/a&gt;
 für das Hosting zu verwenden. Darüber hinaus automatisiere ich den Build- und Deploy-Prozess mit Hilfe von &lt;a href=&#34;https://ci.codeberg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codeberg CI&lt;/a&gt;
. Wie das im Detail geht, beschreibe ich im Folgenden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inhalt&lt;/strong&gt;:&lt;/p&gt;



  &lt;div class=&#34;gblog-toc gblog-toc__level--6&#34;&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#die-idee&#34;&gt;Die Idee&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#repos-vorbereiten-und-pages-server-nutzen&#34;&gt;Repos vorbereiten und Pages-Server nutzen&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#codeberg-ci-einrichten&#34;&gt;Codeberg CI einrichten&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#abschließende-anpassung-und-nutzung&#34;&gt;Abschließende Anpassung und Nutzung&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#fazit&#34;&gt;Fazit&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#quellen&#34;&gt;Quellen&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
    &lt;hr /&gt;
  &lt;/div&gt;


&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;die-idee&#34;
    &gt;
        Die Idee
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/website-deployment/#die-idee&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Die Idee&#34; href=&#34;#die-idee&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Es gibt zwei Repos auf Codeberg:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/toheine/toheine_sources&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;toheine_sources&lt;/a&gt;
 enthält das Hugo-Projekt. (Quellen-Repo)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/toheine/toheine&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;toheine&lt;/a&gt;
 enthält die durch Hugo generierten Dateien für den Webserver. (Pages-Repo)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Hugo-Projekt ist wie folgt aufgebaut:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;. -&amp;gt; Quellen-Repo
├── archetypes
├── assets
├── content
├── data
├── layouts
├── public -&amp;gt; Pages-Repo
├── resources
├── static
└── themes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit liegt ein Repo in einem Repo. Das ist kein Problem, da &lt;code&gt;git&lt;/code&gt; hierfür eine Lösung gleich liefert: &lt;code&gt;git submodule&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Jedes Mal, wenn Änderungen im Hugo-Projekt (im Quellen-Repo) durchgeführt werden, wird im Anschluss ein Commit erzeugt und in mein Codeberg-Repo gepusht &lt;a href=&#34;https://codeberg.org/toheine/toheine_sources&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;toheine_sources&lt;/a&gt;
. Dieses Event wird von der Codeberg CI registriert, der dort verwendete Woodpecker beginnt die Hugo-Files zu bauen und hinterlegt die so erzeugten Dateien im Pages-Repo &lt;a href=&#34;https://codeberg.org/toheine/toheine&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;toheine&lt;/a&gt;
. Letzteres nutzt Codeberg Pages, der die Dateien unter einer Domain als Webseite bereitstellt.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;repos-vorbereiten-und-pages-server-nutzen&#34;
    &gt;
        Repos vorbereiten und Pages-Server nutzen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/website-deployment/#repos-vorbereiten-und-pages-server-nutzen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Repos vorbereiten und Pages-Server nutzen&#34; href=&#34;#repos-vorbereiten-und-pages-server-nutzen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;In einem ersten Schritt habe ich auf Codeberg die beiden öffentlichen, leeren Repos erstellt. &lt;strong&gt;Wichtig&lt;/strong&gt;: Damit die Webseite von Codeberg Pages später korrekt dargestellt wird, lautet der Name des einzigen Branches im Webseiten-Repo &amp;ldquo;&lt;strong&gt;pages&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image01.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image01.png&#34;
              alt=&#34;Branch-Name im Pages-Repo lautet &amp;#34;pages&amp;#34;&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Branch-Name im Pages-Repo lautet &amp;#34;pages&amp;#34;
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Beim Quellen-Repo ist der Name des/der verwendeten Branches egal. Auf dem Rechner habe ich dann das Quellen-Repo heruntergeladen und mein (bereits vorhandenes) Hugoprojekt dort hinein kopiert:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone git@codeberg.org:toheine/toheine_sources.git
cd toheine_sources
cp -r /Quelle/meines/Hugo-Projektes/* .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im Anschluss hab ich das Public-Verzeichnis entfernt und das Submodul hinzugefügt:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm -rf public
git submodule add git@codeberg.org:toheine/toheine.git public
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Struktur meiner Git-Repos ist somit fertig und die Webseite kann via &lt;a href=&#34;https://toheine.codeberg.page/toheine/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://toheine.codeberg.page/toheine/&lt;/a&gt;
 aufgerufen werden (Aufbau: &lt;code&gt;https://&amp;lt;user&amp;gt;.codeberg.page/repo&lt;/code&gt;). Ich will allerdings meine eigene Domain verwenden. Das ist &lt;a href=&#34;https://docs.codeberg.org/codeberg-pages/using-custom-domain/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
 auch gut dokumentiert. Ich habe mich für Option 2 (via ALIAS record) entschieden und folgende DNS-Einträge vorgenommen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Domain 	         Type 	Data
toheine.net      ALIAS	codeberg.page
toheine.net      TXT    toheine.toheine.codeberg.page
www.toheine.net	 CNAME	toheine.net
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im letzten Schritt brauche ich in meinem pages-Repo noch eine Datei &lt;code&gt;.domains&lt;/code&gt;, die pro Zeile einen Eintrag mit allen Adressen enthält, über die ich meine Seite aufrufen will. Diese hat in meinem Fall folgenden Aufbau:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;toheine.net
www.toheine.net
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Der Pages-Server von Codeberg sorgt jetzt dafür, dass die Seiten korrekt angezeigt werden und hinterlegt ein passendes Lets-Encrypt-Zertifikat:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image02.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image02.png&#34;
              alt=&#34;LetsEncrypt schon implementiert&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          LetsEncrypt schon implementiert
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Ab jetzt kann ich manuell (ohne CI) neue Seiten veröffentlichen, in dem ich nach einer Änderung an meinem Hugo-Projekt lokal &lt;code&gt;hugo&lt;/code&gt; ausführe, dann in das Verzeichnis &lt;code&gt;public&lt;/code&gt; navigiere und die dortigen Änderungen in mein Pages-Repo auf Codeberg pushe:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hugo
cd public
git add *
git commit -m &amp;#34;Manuelle Änderung meiner Hugo-Seite&amp;#34;
git push
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;codeberg-ci-einrichten&#34;
    &gt;
        Codeberg CI einrichten
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/website-deployment/#codeberg-ci-einrichten&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Codeberg CI einrichten&#34; href=&#34;#codeberg-ci-einrichten&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Es fehlt noch der Schritt zur Automatisierung via Codeberg CI. Dieses System kann allerdings nicht ohne Anmeldung benutzt werden. Es muss vorab ein Request gestellt werden. Das Verfahren ist unter folgender Adresse beschrieben: &lt;a href=&#34;https://codeberg.org/Codeberg-e.V./requests&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/Codeberg-e.V./requests&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Nachdem ich das Issue erstellt hatte (siehe &lt;a href=&#34;https://codeberg.org/Codeberg-e.V./requests/issues/38&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
), erfolgte wenige Stunden später eine Freigabe und damit Zugriff auf Codeberg CI via &lt;a href=&#34;https://ci.codeberg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ci.codeberg.org/&lt;/a&gt;
. Der Login erfolgt via SSO: Wer auf Codeberg angemeldet ist, klickt auf &amp;ldquo;Anmelden&amp;rdquo; und kann loslegen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image03.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image03.png&#34;
              alt=&#34;Woodpecker mit Repo verbinden&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Woodpecker mit Repo verbinden
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Über den Button &amp;ldquo;Repository hinzufügen&amp;rdquo; wählt man das Quellen-Repo aus und klickt auf &amp;ldquo;Aktivieren&amp;rdquo;. Wenn das hinterlegt ist, brauchen wir noch eine Pipeline im Quellen-Repo, dass den Namen &lt;code&gt;.woodpecker.yml&lt;/code&gt; trägt. Letztendlich ist das die Abfolge an Befehlen, die von der Codeberg CI (Woodpecker) ausgeführt wird, sobald eine Änderung auf Codeberg erfolgt. Freundlicherweise, liegen für viele erdenkliche Szenarien schon Beispiele bereit (siehe &lt;a href=&#34;https://codeberg.org/Codeberg-CI/examples&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
).&lt;/p&gt;
&lt;p&gt;Ich hab die Datei für meine Verwendung leicht angepasst, aber im Wesentlichen so beibehalten (siehe &lt;a href=&#34;https://codeberg.org/toheine/toheine_sources/src/branch/main/.woodpecker.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hier&lt;/a&gt;
). Wichtig ist allerdings, dass bei Verwendung die Codeberg CI die beiden Variablen &lt;code&gt;mail&lt;/code&gt; und &lt;code&gt;codeberg_token&lt;/code&gt; gesetzt werden. Den Token müssen wir vorab im Codeberg-Konto generieren:&lt;/p&gt;
&lt;p&gt;Hierzu muss in den Profil-Einstellungen, unter Anwendungen, ein Zugriffstoken hinzugefügt werden. Dieser bekommt einen eindeutigen Namen und entsprechende Berechtigungen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image04.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image04.png&#34;
              alt=&#34;Zugriffstoken auf Codeberg erstellen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Zugriffstoken auf Codeberg erstellen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Soblad man auf &amp;ldquo;Token generieren&amp;rdquo; klickt, erscheint der Token mit einem Hinweis, diesen jetzt zu kopieren, da er später nicht mehr angezeigt wird.&lt;/p&gt;
&lt;p&gt;Im letzten Schritt der Einrichtung hinterlegen wir die beiden oben erwähnten Secrets noch in Woodpecker. Dazu im Repo (also auf &lt;a href=&#34;https://ci.codeberg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ci.codeberg.org/&lt;/a&gt;
), in den Einstellungen &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image05.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image05.png&#34;
              alt=&#34;Woodpecker-Einstellungen öffnen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Woodpecker-Einstellungen öffnen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;&amp;hellip; unter dem Reiter &amp;ldquo;Geheimnisse&amp;rdquo; die beiden gewünschten Werte hinterlegen:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image06.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image06.png&#34;
              alt=&#34;Secrets in Woodpecker verwalten&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Secrets in Woodpecker verwalten
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Damit ist Woodpecker (Codeberg CI) fertig eingerichtet.&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;abschließende-anpassung-und-nutzung&#34;
    &gt;
        Abschließende Anpassung und Nutzung
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/website-deployment/#abschließende-anpassung-und-nutzung&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Abschließende Anpassung und Nutzung&#34; href=&#34;#abschlie%c3%9fende-anpassung-und-nutzung&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;So &amp;hellip; da in Zukunft eigentlich nur noch im Quellen-Repo gearbeitet wird und die Erzeugung nicht mehr lokal erfolgt, ist der lokale Ordner &lt;code&gt;public&lt;/code&gt; im Hugo-Projekt für die Versionierung nicht mehr relevant. Daher hab ich diesen auf die Ignore-Liste gesetzt:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo public &amp;gt;&amp;gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wenn Änderungen im Hugo-Projekt durchgeführt und versioniert werden, bekommt das Woodpecker mit. Codeberg CI erstellt die Seiten und veröfffentlicht diese auf Codeberg Pages. Wenn man nach einem commit, das Projekt in das Quellen-Repo auf Codeberg pusht, kann man den Prozess in der Woodpecker-Webui verfolgen:&lt;/p&gt;
&lt;p&gt;Sobald der Specht anfängt zu klopfen &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image07.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image07.png&#34;
              alt=&#34;Woodpecker läuft&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Woodpecker läuft
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;&amp;hellip; kann der Prozess im Detail eingesehen werden, in dem man auf die Commit-Botschaft klickt. Die einzelnen Schritte werden abgearbeitet und können in den &amp;ldquo;Step Logs&amp;rdquo; nachvollzogen werden:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image08.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image08.png&#34;
              alt=&#34;Woodpecker-Änderungen nachvollziehen&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Woodpecker-Änderungen nachvollziehen
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;p&gt;Sofern alles korrekt gelaufen ist, erscheint ein grüner Haken pro einzelnem Schritt und nach Fertigstellung für den ganzen Commit:&lt;/p&gt;
&lt;div class=&#34;flex justify-center&#34;&gt;
    &lt;figure class=&#34;gblog-post__figure&#34;&gt;
      &lt;a class=&#34;gblog-markdown__link--raw&#34; href=&#34;https://toheine.net/posts/2023/website-deployment/images/image09.png&#34;&gt;
        &lt;picture&gt;
          &lt;img
                src=&#34;https://toheine.net/posts/2023/website-deployment/images/image09.png&#34;
              alt=&#34;Rückmeldung mit grünem Haken in Woodpecker&#34;
          /&gt;
        &lt;/picture&gt;
      &lt;/a&gt;
        &lt;figcaption&gt;
          Rückmeldung mit grünem Haken in Woodpecker
        &lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/div&gt;

&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;fazit&#34;
    &gt;
        Fazit
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/website-deployment/#fazit&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Fazit&#34; href=&#34;#fazit&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Es ist ein wenig Aufwand, diese hier erwähnte Automatisierung mit Woodpecker zu realisieren. Aber &amp;hellip; wenn das System eingerichtet ist, ist die Veröffentlichung in Sekunden realisiert und auch kleinere Änderungen an der Webseite sind schnell erledigt. Daher war das IMHO eine sinnvolle Investition.&lt;/p&gt;
&lt;p&gt;Darüber hinaus hat man als Lehrkraft oder in der Fortbildung gleich ein Beispiel für einen sinnvollen Einsatz von CI/CD.&lt;/p&gt;
&lt;p&gt;Codeberg e. V. bietet neben den reinen git-Repos mit Codeberg Pages und Codeberg CI ein überragendes Angebot. Die Doku und die erwähnten Beispiele für die&lt;code&gt;.woodpecker.yml&lt;/code&gt; lassen keine Wünsche übrig. Ich finde das der absolute Hammer und Codeberg ist ein toller Verein!!!&lt;/p&gt;
&lt;div class=&#34;flex align-center gblog-post__anchorwrap&#34;&gt;
    &lt;h1 id=&#34;quellen&#34;
    &gt;
        Quellen
    &lt;/h1&gt;
    &lt;a data-clipboard-text=&#34;https://toheine.net/posts/2023/website-deployment/#quellen&#34; class=&#34;gblog-post__anchor clip flex align-center&#34; aria-label=&#34;Anchor Quellen&#34; href=&#34;#quellen&#34;&gt;
        &lt;svg class=&#34;gblog-icon gblog_link&#34;&gt;&lt;use xlink:href=&#34;#gblog_link&#34;&gt;&lt;/use&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gohugo.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.page/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.page/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.codeberg.org/codeberg-pages/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.codeberg.org/codeberg-pages/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://woodpecker-ci.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://woodpecker-ci.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/Codeberg-e.V./requests&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/Codeberg-e.V./requests&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ci.codeberg.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ci.codeberg.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/toheine/toheine&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/toheine&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/toheine/toheine_sources&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://codeberg.org/toheine/toheine_sources&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Hugo" term="Hugo" label="Hugo" /> 
                                <category scheme="https://toheine.net/tags/Git" term="Git" label="Git" /> 
                                <category scheme="https://toheine.net/tags/Codeberg" term="Codeberg" label="Codeberg" />
        </entry>
        <entry>
            <title>Hallo Welt</title>
            <link href="https://toheine.net/posts/2023/hello-world/" rel="alternate" type="text/html"  hreflang="en" />
            <id>https://toheine.net/posts/2023/hello-world/</id>
                    <author>
                        <name>toheine</name>
                    </author>
            <published>2023-08-11T00:00:00+00:00</published>
            <updated>2023-08-11T00:00:00+00:00</updated>
            <content type="html">
                &lt;p&gt;Der/das nächste (total unnötige) Blog geht an den Start. Jep &amp;hellip; aber mir ging es auf den Keks, dass ich meine Infos über zig Kanäle unter mein Umfeld streue, so dass selbst ich nicht mehr weiß, wem ich auf welchen Weg, was zu Verfügung gestellt habe. Ein Video hier, ein Link dort, eine kurze Zusammenfassung via Mail.&lt;/p&gt;
&lt;p&gt;Daher: Mein Ziel dieser Seite ist, diese Infos in Zukunft zu bündeln. Es soll sich hier um öffentliche Notizen oder Anleitungen handeln, die ich nicht für mich behalten will. Es gibt nur einen Author, die Anrede ist &amp;ldquo;Du&amp;rdquo; und wer mich kontaktieren möchte, kann dies gerne auf den hier angegebenen Kanälen tun.&lt;/p&gt;
&lt;p&gt;Die Webseite an sich soll dabei möglichst keinen zeitlichen Aufwand verschlingen. Daher setze ich hier auf &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt;
, einen Static-Site-Generator. Dadurch spare ich mir die ständige Pflege eines CMS, das offen ist wie ein Scheunentor, wenn nicht zeitnah die notwendigen Updates eingespielt werden. Die Inhalte werden mittels &lt;a href=&#34;https://www.markdownguide.org/basic-syntax/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Markdown&lt;/a&gt;
 verfasst.&lt;/p&gt;
&lt;p&gt;Als Theme kommt &lt;a href=&#34;https://github.com/thegeeklab/hugo-geekblog&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hugo-geekblog&lt;/a&gt;
 zum Einsatz. Schick, schlank, genügt meinen Anforderungen.&lt;/p&gt;
&lt;p&gt;Damit steht das Ding &amp;hellip; und ich bin mal gespannt wie häufig ich das hier mit Leben fülle und ob das bei meiner angedachten Zielgruppe ankommt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Die Bereitstellung erfolgt über &lt;a href=&#34;https://docs.codeberg.org/codeberg-pages/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codeberg Pages&lt;/a&gt;
 in Verbindung mit der &lt;a href=&#34;https://ci.codeberg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codeberg CI&lt;/a&gt;
. Wie das im Detail läuft, dokumentiere ich in den nächsten Tagen hier.&lt;/p&gt;
            </content>  
                                <category scheme="https://toheine.net/authors/toheine" term="toheine" label="toheine" />  
                                <category scheme="https://toheine.net/tags/Blog" term="Blog" label="Blog" /> 
                                <category scheme="https://toheine.net/tags/Hugo" term="Hugo" label="Hugo" />
        </entry>
</feed>
