Linux für Anwendungsentwicklung
- Folien: Tag 1 Tag 2 Tag 3 Tag 4 Netzwerke
- LPI Handbuch: DE EN andere Sprachen
- Installation zu Fuß.txt
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
Befehle / Programme
Dateien und Verzeichnisse
touch
- Datei erstellen, eigentlich "Änderungszeit" aktualisierencp
- Dateien kopieren "von" "nach", auch alscp -r
- "rekursiv", d.h. Verzeichniss mit Unterverzeichnissen, Unterunterverzeichnissen, usw.mv
- Verschieben "von" "nach"rm
,rm -r
- Entfernen von Dateien, "Rekursives" entfernenrmdir
- Entfernen von (leeren) Verzeichnissencat
- Dateien ausgeben, eigentlich concatenate: "Aneinanderhängen"head
- die ersten Zeilen einer Datei ausgebentail
- die letzten Zeilen einer Datei ausgebentail -f
- Datei offen halten und neue Zeilen direkt anzeigen
mkdir
- Verzeichniss(e) erstellenls
- Verzeichnisinhalt auflisten, Meta-Informationen zu einer Datei/Verzeichnis anzeigenchmod
- "Change Modus", "Zugriffsmodus"/Berechtigungen einer Datei änderntree
- Verzeichnisbaum anzeigen (fancy)find
- Dateien suchen, eigentlich Dateibaum rekursiv ausgeben und filtern
Sonstige
echo
- Text ausgebenless
- Interaktive Dateianzeige - "pager", Tipp: drücke "/" für eine Sucheman
- "Manual"/Handbuchseiten anzeigen
Netzwerk
ip address
- lokale MAC- u. IP-Adressen anzeigenip route
- Routen u. Gateways anzeigenip neighbor
,arp
- Nachbarn im lokalen Netzwerksegment anzeigennetstat
,netstat -tulpen
- Netzwerksockets anzeigenncat -l PORT
,ncat IP-ADRESSE PORT
- generischer TCP-Server/Clientdig DOMAINNAME
,nslookup DOMAINNAME
- DNS-Clientping IP-ADRESSE
- Echo-Request an Rechnertraceroute 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 sortierenwc
- "Word Count", zählt die Anzahl von Zeilen, Worten und Zeichen in der Standardeingabecut
- extrahiert Teile aus einzelnen Textzeilentr
- "translate", wandelt einzelne Buchstaben in andere um, oder entfernt sie
Jobs / Prozesse
fg
(Builtin) Letzten Job im Vordergrund weiter ausführenbg
(Builtin) Letzten Job im Hintergrund weiter ausführenjobs
(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 Systemtop
,htop
- Interaktiver Prozessmonitorpstree
- Prozesshierarchie anzeigenkill
- "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ßerinit
, wurde von einem "Elternprozess" gestartetStandardeingabe / 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
Aufgabe Pipelines
Berliner_Straßenverzeichnis.txt
- Speichert das Berliner_Straßenverzeichnis.txt auf dem Linux-Rechner.
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:
- Denkt daran, dass man Text durch mehrere Programme durchleiten kann. Das ist hier nötig!
- Ihr könnt ggf. auch das Programm
uniq
verwenden, braucht es aber theoretisch nicht. - 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)
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.
Zusatz:
macht das gleiche grafisch mit zenity (hier muss eine andere Zuweisungssyntax genutzt werden)
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?
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
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.
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