# Tutorial UNIX Commandline Basics ASE WS 2022/23 ## Grundkonzept: Dateisystem Das Dateisystem ist *die* zentrale Datenstruktur in UNIX-Systemen. Alle Einstellungen und Daten finden sich dort. Wichtige Verzeichnisse (Linux): * / (das Root-Verzeichnis) * /root/ (das Home-Verzeichnis des Administrator-Accounts 'root') * /home/user123/ (das Home-Verzeichnis des Nutzers 'user123') * /etc/ (systemweite Konfigurationen) * /tmp/ (temporäre Dateien) * /proc/ (Informationen zu System und Prozessen) * /sys/ (dynamische Systemkonfiguration / Systemstatus des Kernels) Wichtig: Dateien und Verzeichnisse mit einem Punkt am Anfang ('dotfiles') werden normalerweise nicht angezeigt oder bei Wildcard-Selektionen ausgewählt. `ls -a` zeigt auch solche unsichtbaren Dateien an. ## Hilfreiche Tools I Finde heraus, was folgende Befehle machen: * pwd * cd * ls * man * cat * mkdir * rmdir * cp * mv * rm * chmod * chown **Aufgaben:** * Erzeuge eine Verzeichnisstruktur in deinem Homeverzeichnis * Setze die Rechte so, dass niemand außer Dir den Ordner "secret" lesen kann * Setze die Reche so, dass nur Du und der User 'raphael' in den Ordner "shared" schreiben können ## Grundkonzept: Pipes & Filters Pipes (dargestellt durch das '|'-Zeichen) erlauben es, die Ausgabe eines Programms als Eingabe für ein anderes Programm zu verwenden. *Filter* sind Programme, die Daten von ihrer Standardeingabe lesen und modifiziert auf der Standardausgabe ausgeben. Damit lassen sich mächtige Verarbeitungspipelines bauen. ### Spezielle "Dateien": *stdin, stdout, stderr* *stdin* ist die Standardeingabe, von der ein Programm liest. Daten werden normalerweise auf *stdout* ausgegeben. In einer interaktiven Shell gehen Benutzereingaben an *stdin*; *stdout* wird auf der Konsole ausgegeben. Wenn man Fehlermeldungen oder Statusinformationen ausgeben will, ohne die reguläre Ausgabe zu unterbrechen, kann man *stderr* verwenden. Standardmäßig wird *stderr* auch auf der Konsole ausgegeben. ### *>, >>, 2>* - Ausgabe in eine Datei schreiben Beispiel: * `echo "TEST" > test.txt` - überschreibt den Inhalt von test.txt mit "TEST" * `echo "HALLO" >> test.txt` - hängt "HALLO" an das Ende von test.txt an * `cat *.txt 2> errors.txt` - gibt den Text aller Textdateien auf der Standardausgabe aus und schreibt Fehlermeldungen in die Datei errors.txt ### *<* - Daten aus einer Datei lesen Beispiel: * `grep "kuchen" < food.txt` - liest die Datei food.txt auf stdin und sucht darin nach "kuchen" ### | - Daten an ein anderes Programm übergeben Beispiel: * `cat test.txt | grep "Kuchen" | grep "Baum"` - gibt alle Zeilen von test.txt aus, in denen sowohl "Kuchen" als auch "Baum" vorkommen ## Hilfreiche Tools II Finde heraus, was folgende Befehle machen: * uniq * cut * diff * wc * grep * sed * tr * sort Write the following Bash script: **count.sh** which does the following: * download a text file from if it is not yet present in the current directory (use `wget` for this) * make all text lowercase (use `tr`) * split it into individual words per line (use `cat` and/or `sed` for this) * alphabetically sort the list of words and remove duplicates (`sort` and `uniq`, possibly also `grep`). * print out the 10 most common words in the text (without number of occurrences) on *stdout* (`uniq`, `sort`, and `head`) ## Weitere Links: * [Commandline-Tutorial auf PracticalDataScience.org](https://www.practicaldatascience.org/html/exercises/Exercise_CommandLine_1_Basics.html) * [Learn Enough Command Line to Be Dangerous](https://www.learnenough.com/command-line-tutorial) % Tutorial UNIX Command Line - Advanced % ASE WS 2022/23 # UNIX / Command-Line Basics (Teil 2) (Siehe vorheriges Tutorial) ## Startup Wir arbeiten jetzt als Nutzer `root` auf einem 'disposable root server' [via segfault.net](https://blog.thc.org/disposable-root-servers). ssh root@segfault.net # Password is 'segfault' **Achtung:** Der Server ist nicht sicher - keine vertraulichen Infos/Passwörter dort eintippen Erster Schritt auf dem Server: Informationen zu Netzwerk-Schnittstellen prophylaktisch in einen Text-Editor kopieren Zweiter Schritt: tmate installieren und ausführen. apt install tmate tmate `tmate` startet eine `tmux`-Session und gibt Pfade/Befehle aus, mit denen man der Session remote beitreten kann. Diese Infos am Besten auch in einem Texteditor speichern und 'q' drücken. ## tmux *tmux* ist eine Art *Window Manager* für die Kommandozeile: - virtuelle Desktops - `Ctrl-B c` - neuer Desktop - `Ctrl-B p` - vorheriger Desktop - `Ctrl-B n` - nächster Desktop - `Ctrl-B &` - Desktop schließen (schließt auch Shell und alle darin laufenden Programme) - Tiling / 'Fenster' - `Ctrl-B "` - Fenster vertikal splitten - `Ctrl-B %` - Fenster horizontal splitten - `Ctrl-B ` - zwischen Fenstern wechseln - Prozesse im Hintergrund laufen lassen (auch nach SSH-Logout) - `Ctrl-B d` - Verbindung zur tmux-Session trennen (detach) - `tmux ls` - laufende Sessions anzeigen - `tmux attach [name]` - wieder mit einer Session verbinden → [tmux-Cheatsheet](https://tmuxcheatsheet.com/) ### MacOS MacOS kennt keine Ctrl-Taste und tmux akzeptiert die Command-Taste nicht. Der einfachste Workaround ist, in der Datei `~/.tmux.conf` den Shortcut auf "Alt-b" (entspricht Meta-b / M-b) zu ändern: cat > ~/.tmux.conf <<__EOF__ unbind C-b set -g prefix M-b bind M-b send-prefix __EOF__ ## Hilfreiche Tools II Finde heraus, was folgende Befehle machen (Raphael stellt sie kurz vor): * tmate * tmux / screen * curl / wget * time * watch * file * grep * sed * tr * sort * ripgrep / ag / fzf Test-Dateien z.B.: https://github.com/veltman/clmystery/archive/refs/heads/master.zip (mit wget/curl herunterladen) ## Paketmanagement unter Debian/Ubuntu - `apt show ` - `apt search ` - `apt install ` - `apt update` (Paketliste aktualisieren) - `apt upgrade` (alle Pakete aktualisieren) Weiterführende Methoden: - andere Repos hinzufügen (siehe `/etc/apt/sources.list/`) - aus bestimmten Repos installieren (`apt install -t unstable youtube-dl`) - Pakete manuell installieren (`dpkg -i `) - fehlgeschlagene Installation/Konfiguration neu starten (`apt install -f` / `dpkg --configure -a`) ## Shell Scripting Finde heraus, was folgende Bash-Befehle/-Strukturen machen: * for * while * if * read * echo Siehe auch: * [Bash Cheat Sheet](https://www.pcwdld.com/bash-cheat-sheet) * [Advanced Bash-Scripting Guide](https://tldp.org/LDP/abs/html/) Write the following Bash script: **say_count.sh** which does the following: * check whether the `cowsay` command is available on the system * if not, download the Debian package from the Debian *unstable* repo and install it * download the command-line mystery (https://github.com/veltman/clmystery/archive/refs/heads/master.zip) and unpack it into a temporary directory * find all files which contain the word "Duchess" and let the cow say how many lines each file has * clean up, i.e. remove the downloaded files and uninstall `cowsay` Minimal example: #!/bin/bash if [[ ! -e /usr/games/cowsay ]] then echo "Installing cowsay" apt install -y -q cowsay fi wget https://github.com/veltman/clmystery/archive/refs/heads/master.zip unzip master.zip for f in $(grep -r --files-with-matches "Duchess" clmystery-master/*) do NUM=$(grep -o "Duchess" $f | wc -l) echo -e "Found $NUM lines in\n$(basename $f)" | /usr/games/cowsay done # cleanup apt remove -y -q cowsay rm -r clmystery-master rm master.zip ## System-Werkzeuge - which - top / htop / btop - du - df - fuser / lsof - strace ## Netzwerk-Tools - ip / ifconfig / iwconfig - route - ping - traceroute / mtr / tcptraceroute - tcpdump - ngrep - netcat / nc