Inhaltsverzeichnis

Tutorial 1: Shell Basics

ASE WS 2024/25

Dieses Dokument ist kein eigenständiges Tutorial sondern unterstützt die Übung. Die grundlegenden Konzepte werden vorgestellt, hilfreiche Links erleichtern die selbständige Vertiefung.

Vorbereitung: wir brauchen eine Shell

Wir brauchen heute für die Beispiele eine simple Linux-Shell und ein paar Linux-Programme.

Option 1: Shell auf dem lokalen Rechner öffnen

Option 2: SSH nach Segfault.net

Anmelden über SSH als Nutzer root auf einem 'disposable root server' via segfault.net. Entweder über Putty oder über das ssh-Programm (seit kurzem auch unter Windows verfügbar).

ssh root@segfault.net # Password is 'segfault'

Hinweis: wenn man das Passwort eingibt, werden keine Zeichen angezeigt.

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.

Tipp: um Text aus der Shell zu kopieren: Text markieren und dann Rechtsklick (Putty) bzw. Ctrl-Shift-C unter Linux/macos.

Grundkonzept: Dateisystem

Das Dateisystem ist die zentrale Datenstruktur in UNIX-Systemen. Alle Einstellungen und Daten finden sich dort.

Wichtige Verzeichnisse (Linux):

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:

Tipp: man pwd zeigt eine Anleitung für pwd an. Mit drücken der Taste 'q' beendet man diese wieder.

Aufgaben:

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:

< - Daten aus einer Datei lesen

Beispiel:

| - Daten an ein anderes Programm übergeben

Beispiel:

Hilfreiche Tools II

Finde heraus, was folgende Befehle machen:

Write a Bash oneliner which does the following:

Beispiellösung:

cat 2ws3410.txt | sed -e 's/[ ,.!?-]/\n/g' | tr [:lower:] [:upper:] | sort | uniq -c | sort -rn | head -n 22 | tail -n 20 | cut -b 9-

Terminal Multiplexing

tmux ist eine Art Window Manager für die Kommandozeile:

tmux-Cheatsheet

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 einige kurz vor):

Test-Dateien z.B.: https://github.com/veltman/clmystery/archive/refs/heads/master.zip (mit wget/curl herunterladen)

Paketmanagement unter Debian/Ubuntu

Befehle, die den Paketindex oder installierte Pakete modifizieren, müssen als Nutzer 'root' oder mit sudo ausgeführt werden.

Weiterführende Methoden:

Shell Scripting

Finde heraus, was folgende Bash-Befehle/-Strukturen machen:

Shell-Scripts sind Textdateien, die Befehle beinhalten, die von der Shell ausgeführt werden. In der ersten Zeile des Scripts steht nach einem speziellen Marker ('Shebang', #!) das Programm, das die Befehle in der Datei ausführen sein. Das kann eine normale Shell (z.B. Bash oder Zsh) sein oder auch z.B. ein Python-Interpreter. Da die einzelnen Shells nicht perfekt untereinander kompatibel sind, ist es sinnvoll, Scripte explizit für die Bash-Shell zu schreiben, welche am weitesten verbreitet ist:

#!/bin/bash
echo "Hallo Welt"
rm /tmp/test.txt

Verbreitete Texteditoren auf der Kommandozeile sind:

Siehe auch:

Ausführen von Shell-Scripts

Wenn das Script nicht in einem der Verzeichnis liegt, die für ausführbare Programme verwendet werden (siehe PATH-Umgebungsvariable), muss man den vollen relativen oder absoluten Pfad verwenden ($ steht für den Prompt, nicht für eine Eingabe):

$ pwd
/home/test/

$ ls
test.sh

$ test.sh
command not found: test.sh

$ ./test.sh
Hello World!

$ /home/test/test.sh
Hello World!

Damit ein Script ausgeführt werden kann, muss auch das 'Executable-Bit' gesetzt sein. Sonst kommt die Fehlermeldung 'Permission Denied'.

$ ./test.sh
permission denied: ./test.sh

$ chmod +x test.sh
$ ./test.sh
Hello World

Aufgabe

Write the following Bash script:

say_count.sh which does the following:

Tipp: Beim Command-Line Murder Mystery trainiert man spielerisch Shell-Befehle und Pipelines.