Linux für Anwendungsentwicklung

Für die Gimp-Demo: Katzenbilder.tar und Astronaut
https://docs.gimp.org/3.0/en/gimp-tool-foreground-select.html

Hyper-V VM einrichten

Windows-Features Aktivieren / Deaktivieren

  • → [x] Hyper-V

  • Neuer Virtueller Computer

  • → Generation 2

  • → Dynamischen Speicher aus, mindestens 2048 MB Arbeitsspeicher

  • → Netzwerkverbindung über "Default Switch"

  • → Default-Einstellungen für die Festplatte sind OK

  • → Betriebssystem von einer startbaren Imagedatei: live-dvd.iso

  • Rechtsklick auf die Maschine

  • → Einstellungen

  • → Sicherheit

  • → [ ] "Sicheren Start aktivieren" ausschalten

Hyper-V Anbindung ans Netzwerk

Aufgabe

Schickt mir Screenshots folgender Ausgaben von ls:

-rw-r--r-- 1 root root 1,2K  8. Sep 07:48 /etc/passwd

-rw-r--r-- 1 root root 1,2K  8. Sep 07:48 passwd

-rw-r--r-- 1 root root 1,2K  8. Sep 07:48 ../passwd

-rw-r--r-- 1 root root 1140  8. Sep 07:48 ../etc/passwd

                       ^- Größe beachten  ^- Pfad beachten

Zusatz: alle Ausgaben in einem einzelnen Terminal

Berechtigungen:

Wie komme ich zu folgendem Verhalten? Schickt mir wieder einen Screenshot einer Terminalausgabe:

live@live:~$ echo "Ein bisschen Text" >dateiZwei
bash: dateiZwei: Keine Berechtigung

Aufgabe Ordnerstrukturen

Erstellt den Nachfolgenden Ordner- und Dateibaum Länder- und Städtenamen sind Ordner. Bahnhöfe sind Dateien.

Schickt mir dann einen Screenshot der Terminalausgabe

Hinweis: Nicht nur Leerzeichen müssen von der Shell "escaped" werden

Hinweis: Mit einzelnen Kommandos lassen sich auch mehrere Dateien / Ordner auf einmal anlegen

Hinweis: Benötigte Kommandos sind touch und mkdir. Nutzt cd, um weniger Schreibarbeit zu haben. Wenn ihr euch vertippt, müsst ihr auch rm, rmdir, oder mv nutzen

~$ tree DE/
DE/
├── Berlin
│   ├── Berlin Alexanderplatz
│   ├── Berlin Friedrichstraße
│   ├── Berlin Ostbahnhof
│   ├── Berlin Ostkreuz
│   └── Königs Wusterhausen
└── Brandenburg
    ├── Brand Tropical Island
    ├── Cottbus
    │   ├── Cottbus Hbf
    │   ├── Cottbus-Merzdorf
    │   ├── Cottbus-Sandow
    │   └── Cottbus-Wilmersdorf Nord
    ├── Lübbenau (Spreewald)
    ├── Lübben (Spreewald)
    ├── Raddusch
    └── Vetschau

Zusatz: man kann den gesamten Dateibaum mit zwei Kommandos anlegen

Shell-Session zum nachschlagen: Ordnerbaum_Shell-Session.txt

Dateisysteme

Dateisysteme_1.svg

Befehle / Programme

Dateien und Verzeichnisse

  • touch - Datei erstellen, eigentlich "Änderungszeit" aktualisieren
  • cp - Dateien kopieren "von" "nach", auch als cp -r - "rekursiv", d.h. Verzeichniss mit Unterverzeichnissen, Unterunterverzeichnissen, usw.
  • mv - Verschieben "von" "nach"
  • rm, rm -r - Entfernen von Dateien, "Rekursives" entfernen
  • rmdir - Entfernen von (leeren) Verzeichnissen
  • cat - Dateien ausgeben, eigentlich concatenate: "Aneinanderhängen"

    • head - die ersten Zeilen einer Datei ausgeben
    • tail - die letzten Zeilen einer Datei ausgeben
    • tail -f - Datei offen halten und neue Zeilen direkt anzeigen
  • mkdir - Verzeichniss(e) erstellen
  • ls - Verzeichnisinhalt auflisten, Meta-Informationen zu einer Datei/Verzeichnis anzeigen
  • chmod - "Change Modus", "Zugriffsmodus"/Berechtigungen einer Datei ändern
  • tree - Verzeichnisbaum anzeigen (fancy)
  • find - Dateien suchen, eigentlich Dateibaum rekursiv ausgeben und filtern

Sonstige

  • echo - Text ausgeben
  • less - Interaktive Dateianzeige - "pager", Tipp: drücke "/" für eine Suche
  • man - "Manual"/Handbuchseiten anzeigen

Netzwerk

  • ip address - lokale MAC- u. IP-Adressen anzeigen
  • ip route - Routen u. Gateways anzeigen
  • ip neighbor, arp - Nachbarn im lokalen Netzwerksegment anzeigen
  • netstat, netstat -tulpen - Netzwerksockets anzeigen
  • ncat -l PORT, ncat IP-ADRESSE PORT - generischer TCP-Server/Client
  • dig DOMAINNAME, nslookup DOMAINNAME - DNS-Client
  • ping IP-ADRESSE - Echo-Request an Rechner
  • traceroute IP-ADRESSE - Netzwerkpfad nachverfolgen

SSH

  • ssh user@host
  • ssh user@host KOMMANDO
  • scp user@host:DATEI LOKALER_PFAD, scp LOKALER_PFAD user@host:
  • sshfs user@host: LOKALER_MOUNTPUNKT/

Pipeline-"Atome"

  • sort - Eingabe zeilenweise sortieren
  • wc - "Word Count", zählt die Anzahl von Zeilen, Worten und Zeichen in der Standardeingabe
  • cut - extrahiert Teile aus einzelnen Textzeilen
  • tr - "translate", wandelt einzelne Buchstaben in andere um, oder entfernt sie

Jobs / Prozesse

  • fg (Builtin) Letzten Job im Vordergrund weiter ausführen
  • bg (Builtin) Letzten Job im Hintergrund weiter ausführen
  • jobs (Builtin) Prozesse anzeigen, die in der selben Shell laufen (Child-Processes/Kind-Prozesse)
  • Strg+Z - (Tastenkombination im Terminal), Aktuellen Vordergrundprozess anhalten
  • ps - "Process Snapshot", Liste von Prozessen im System
  • top, htop - Interaktiver Prozessmonitor
  • pstree - Prozesshierarchie anzeigen
  • kill - "terminiert" einen Prozess, eigentlich ein "Signal" senden

Begriffe

  • Shellumleitung

    ~$ befehl > datei (Ausgabe in Datei schreiben)

    ~$ befehl >> datei (Ausgabe an Datei anhängen)

  • Pager
    Zeigt lange Texte Seitenweise an
    more, less

  • POSIX: Standard für das Verhalten von verschiedenen UNIX-Systemen

  • Kindprozess / Elternprozess (Child/Parent)
    Jeder Prozess, außer init, wurde von einem "Elternprozess" gestartet

  • Standardeingabe / Standardausgabe / Standardfehler (STDIN, STDOUT, STDERR)

Eigenschaften von Prozessen

  • Benutzerzugehörigkeit (UID / GID)
  • Environment / Umgebungsvariablen
  • Offene Dateien (Standardeingabe / Standardausgabe / Standarderror)

Aufgabe

Wie viele Dateien und Ordner gibt es jeweils in /etc, /usr/lib, und /proc. Schickt mir die drei Zahlen als Privatnachricht.

Zusatz: wie viele Dateien, und wie viele Ordner gibt es jeweils an diesen Orten? Recherchiert in der man-Page zu find, wie sich das eingrenzen lässt.

Multitasking von Computern

CPU Interrupts Speicherschutz.svg

Aufgabe Pipelines

Berliner_Straßenverzeichnis.txt

Erzeugt aus dem Berliner Straßenverzeichnis eine Liste von Bezirksnamen.

Nutzt dazu die Programme cut, sort und tr. Schlagt in den jeweiligen man-Pages die Bedienung der Programme nach.

  • Schickt mir per Privatnachricht die Kommandozeile, die ihr zusammengestellt habt.
  • Wie viele Bezirke sind in der Datei verzeichnet?

Hinweise:

  1. Denkt daran, dass man Text durch mehrere Programme durchleiten kann. Das ist hier nötig!
  2. Ihr könnt ggf. auch das Programm uniq verwenden, braucht es aber theoretisch nicht.
  3. In diesem Datensatz kommen wir auch ohne tr aus.

Zusatz

Findet mit grep alle 634 "Plätze" in Berlin.

Zusatz Zusatz: aber nur die Plätze selbst. Z.B den Dianaplatz, aber nicht die Straße "Am Dianaplatz"

(hierzu sind keine komplexen Suchmuster nötig, grep bietet Optinonen, mit denen eine einfache Textsuche ausreicht)

Lösungen_Tag4.txt

Aufgabe Netzwerk

Mit dem Programm tar können Ordnerstrukturen in einen einzelnen Datenstrom kodiert werden.

Recherchiert dazu in der man-Page und im Internet.

Streamt mir euer /etc-Verzeichnis an Port 1024 auf 10.0.7.64. Tut das, ohne eine Datei zwischenzuspeichern.

Hinweis: einige Dateien im Ordner können vom User nicht gelesen werden, darauf kommt es hier nicht an.

Hinweis: in Online-Beispielen findet ihr häufig Optionen für Kompression, Serverseitig wird in diesem Fall aber kein komprimiertes Archiv angenommen.

Hinweis: in Online-Beispielen findet ihr häufig die Option, direkt eine Archiv-Datei zu schreiben, wir wollen aber, dass tar in die Pipeline für die Netzwerkverbindung schreibt.

Postet eure IP-Adresse im Teams-Chat, damit ich die eingegangenen Verbindungen zuordnen kann.

Auf der Serverseite läuft folgender Befehl:
~$ ncat -kl 1024 -c 'mkdir -p $NCAT_REMOTE_ADDR && tar -C $NCAT_REMOTE_ADDR -xv >&2'

Aufgabe SSH und Grafik

Das Programm zenity erlaubt es, aus dem Terminal heraus einfache Dialogfenster anzuzeigen.

Recherchiert hierzu in der man-Page und ggf. im Internet.

Lasst den Dozentenrechner (Display 12 auf 10.0.7.64) ein einfaches Text-Fenster mit eurem Namen anzeigen.

Hinweis: Dazu muss in der SSH-Session die DISPLAY-Variable gesetzt werden, sonst erscheint das Programm auf dem eigenen Display.

Hinweis: Probiert zenity erst auf dem eigenen Rechner aus.

Aufgabe Texteditor

Voaraussetzung: Ein Rechner wurde entsprechend der Anleitung "Installation zu Fuß.txt" eingerichtet.

Verändert die Datei /etc/fstab so, dass in der ersten Spalte nicht die Gerätepfade, sondern die UUIDs der entsprechenden Dateisysteme stehen.

Eine fiktive Beispielzeile lautet dann z.B.:

UUID=80b496fa-ce2d-4dcf-9afc-bcaa731a67f1 /mnt/example ext4 defaults 0 2

Hinweis:

die Ausgabe von lsblk -f zeigt die UUIDs der Laufwerke. Mit der Shellumleitung >> kann man den Text an die fstab-Datei anhängen um das spätere Editieren zu erleichtern.

Dokumentation SSH-Schlüssel

Windows bringt seit einigen Jahren einen eigenen SSH-Client mit. Hierüber kann man einen SSH-Schlüssel generieren, und auf den Linux-Host kopieren. Letzteres ist etwas umständlich, da das ssh-copy-id-Kommando unter Windows nicht zur Verfügung steht.

\> ssh-keygen
(Enter - Default-Dateiname)
(Enter - Leeres Passwort)
(Enter - PW-Bestätigung)

→ im Windows-Heimverzeichnis entsteht ein Verzeivhnis .ssh und darin eine Datei .ssh\id_ed25519 und .ssh\id_ed25519.pub.

Wichtig: Wir werden nur mit der Datei mit .pub-Endung arbeiten. Die andere Datei enthält den Private-Key und sollte den Rechner nicht verlassen.

Hinweis: Die Datei kann auch id_dsa.pub oder id_rsa.pub heißen. Es gibt verschiedene Schlüsselformate.

Jetzt muss die Datei auf den Linux-Rechner kopiert werden. Dort müssen an den richtigen Stellen die richtigen Verzeichnisse angelegt werden. An einem Linux-Client lässt sich der gleiche Prozess ;eicht via ssh-copy-id USER@HOST automatisieren.

\> scp .ssh\id_ed25519.pub USER@HOST:
(Beachten: den Doppelpunkt am Ende der Zeile)
(fragt nach dem Passwort)
\> ssh USER@HOST
(fragt nach dem Passwort)

~$ mkdir .ssh/
~$ touch .ssh/authorized_keys
~$ chmod go-rwx .ssh/authorized_keys .ssh
~$ cat id_ed25519.pub >>.ssh/authorized_keys
~$ exit
\>

→ Startet man auf Windows jetzt ssh USER@HOST, wird man direkt, ohne Passwortabfrage auf dem Linux-Rechner eingeloggt.

Aufgabe Benutzerwechsel

Urzustand:

  • Auf dem Linux-Host existiert ein unprivilegierter User-Account
  • Für diesen Account ist ein Login per SSH-Schlüssel möglich
  • Der root-User kann sich nicht via SSH anmelden

Das kommando su ermöglich einem einfachen User, die Identität von root anzunehmen, dazu wird nach dem root-Passwort gefragt.

Richtet den selben SSH-Public-Key für den Root-Benutzer ein, so dass von außen ein ssh root@IP-ADRESSE möglich wird.

Aufgabe Webserver:

  • Der Webservice wurde installiert via apt-get install apache2
  • Die Apache-Default-Site wird konfiguriert in "/etc/apache2/sites-enabled/000-default.conf"
  • Im Augenblick liegt die Document-Root auf den Debian-Demo- Seiten in "/var/www/html"

Baut eine einfache Webseite (aka. M$-Word → Speichern als html, Lol ;-), und hinterlegt diese in "/srv/web/".

Konfiguriert den Apachen, um diese Seite von dem entsprechenden Ort aus auszuliefern.

Hinweis: systemctl reload apache2 bringt den Apachen dazu, seine Config-Dateien neu einzulesen.

Hinweis: Die Datei "/var/log/apache2/error.log" kann nähere Auskunft zu Fehlerzuständen geben.

Shellscripting 1

Führt das Shellscript hallo.sh aus!

#!/bin/sh
echo "Hallo Welt"

Lest hierzu das erste Kapitel zum Scripting (Seite 215).

Postet die Kommandos zur Vorbereitung und zum Ausführen in den Privatchat.

Hinweis: "MS-DOS-Stil" wäre es, einfach hallo.sh einzugeben.

Shellscript 2

Das Shellscript hallo.sh soll nicht einfach "Hallo Welt!" ausgeben. Es soll:

  • den User nach dem Namen fragen
  • den Namen einlesen
  • Eine Grußnachricht mit diesem Namen ausgeben

Postet mir als Antwort das Script.

hallo.sh

Zusatz:

macht das gleiche grafisch mit zenity (hier muss eine andere Zuweisungssyntax genutzt werden)

hallo_z.sh

Zusatz:

  • startet das gleiche Script via ncat -kl 1024 -c hallo.sh
  • Benutzt das als Netzwerkdienst: ncat localhost 1024
  • Was passiert, wenn der Webbrowser auf http://localhost:1024/ geht?
  • Schafft ihr es dem Webbrowser einen (statischen) Text zuzusenden?

hallo_http.sh

Siehe auch: https://www.sometimesredsometimesblue.com/ ;-)

Programmieren 3

In der JavaScript-Konsole im Webbrower

  • kann ich "Ausdrücke" "evaluieren" (5 + 9 ), (17 / 2), ...

Die Funktion Math.random() "evaluiert" zu einem Wert zwischen 0 und <1.

Entwerft einen Ausdruck, der einen Wert zwischen 1 und 10 liefert.

  • Math.random() * 10 + 1
  • Math.floor(Math.random() * 10 + 1) (fancy, Wow! Such Javascript!)

Übertragen auf Shellscript

  • (POSIX) Shellscript kennt nur ganze Zahlen (Integer_arithmetik)
  • Arithmetische Ausdrücke werden durch $(()) "evaluiert" ("arithmetic expansion") echo $((12 + 4))
  • Die Variable $RANDOM nimmt immer einen Wert zwischen 0 und 32767 (eingeschlossen) an.

Entwerft einen Befehl, der eine Zahl zwischen 1 und 10 ausgibt.

Hinweis: es ist nicht ~$ echo $(( $RANDOM - 32757 )), hat aber diese Form ;-)

  • echo $(( $RANDOM / 3276 + 1 ))
  • echo $(( $RANDOM % 10 + 1 )) (einfacher, weniger nachdenken ;-)

Aufgabe: Würfel

Bedingungsabfragen / Programmverzweigungen / if-Abfragen haben in Shellscript die Form

if TESTPROGRAMM; then
  BEFEHLE...
elif TESTPROGRAMM; then
  BEFEHLE...
elif TESTPROGRAMM; then
  BEFEHLE...
else
  BEFEHLE...
fi

Schreibt ein Programm würfel.sh, mit 6 Verzweigungen. Am Anfang wird einmal ein Zufallswert ermittelt, je nach Wert wird dann als Text ausgegeben: Eins, Zwei, Drei, Vier, Fünf oder Sechs

Die Ausgaben sollen etwa gleich verteilt vorkommen ;-)

Hinweis:

Das ganze Programm lässt sich mit der -gt Abfrage in test schreiben. test kennt aber auch andere Abfragtypen, schaut in die man-Page oder ins LPI-Handbuch ;-)

Zusatz:

Erledigt die gleiche Aufgabe ohne das if, nur mit der Programmverknüpfung &&.

Aufgabe Shellscripting Nr. ??

Eine Variable lesen:

  read VARIABLE

Bedingungen Prüfen via if und test bzw. [

  if ....; then
    ....
  fi

Zufallszahlen:

  var=$RANDOM
  var=$(( $RANDOM % .... + ... ))

1.

Schreibe ein Script "zahlenraten", das

  • eine Zufallszahl zwischen 1 und 10 (einschließlich) generiert
  • den User nach einer Zahl fragt
  • "Erfolg" verkündet, wenn die "gedachte" zahl richtig geraten wurde
  • "Game Over" wenn der User die falsche Zahl geraten hat

Zusatz:

das Script soll jeweil mit Status-Code 1 oder 0 beenden.

→ Zwischenlösung via Teams-Chat

zahlenraten1.sh

2.

Der Spieler erhält 10 Versuche

  • "Game Over" erscheint erst, wenn die Zahl zehn mal falsch geraten wurde
  • Bei einem Erfolg finden keine weiteren Abfragen statt

Hinweis:

im einfachsten Fall wiederholt man dazu die if-Abfrage zehn mal.

Hinweis:

die Schleifenkonstrukte for bzw. while erlauben es, weniger zu schreiben. Eine Internetrecherche gibt hier mehr Aufschluss, als das Kapitel im LPI-Handbuch.

zahlenraten2.sh

Zusatz:

Benuzt Shell-Funktionen um die 10 Versuche ohne Schleife, und ohne Code-Wiederholung zu implementieren. (Lisp und Haskell anyone?)

Aufgabe Berechtigungen

Erzeugt Dateien mit folgenden Berechtigungen:

~$ ls -lh
-rw-rw---- 1 paul paul 4.0K Oct  1 11:53 arf
----rw---x 1 paul paul 4.0K Oct  1 11:53 barf
-rwx--xrw- 1 paul paul 4.0K Oct  1 11:53 carf
----rw---- 1 paul paul 4.0K Oct  1 11:53 darf
-r---wx-w- 1 paul paul 4.0K Oct  1 11:53 earf

Lösung:

~$ chmod 660 arf; chmod 061 barf; chmod 716 carf; chmod 060 darf; chmod 432 earf

Aufgabe Berechtigungen ++

Erzeugt Dateien mit folgenden Berechtigungen:

~$ ls -lh
-----w---- 1 paul paul 4.0K Oct  1 11:53 arf
----r-x--- 1 paul paul 4.0K Oct  1 11:53 barf
---s---r-- 1 paul paul 4.0K Oct  1 11:53 carf
--wSrwxrw- 1 paul paul 4.0K Oct  1 11:53 darf
-----w---t 1 paul paul 4.0K Oct  1 11:53 earf

Hinweis:

es kommen ein kleines und ein großes S vor. Probiert euch aus!

chmod-Kommandos und ls-Ausgabe bitte per Teams-Chat

Zusatz:

lrwxrwxrwx 1 paul paul   10 Oct  1 11:53 farf -> kaputtlink
prwx---rwx 1 paul paul    0 Oct  1 11:53 fifo