Tutorial UNIX Commandline Basics

ASE WS 2022/23

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.

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

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.

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.

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

Beispiel:

  • grep "kuchen" < food.txt - liest die Datei food.txt auf stdin und sucht darin nach “kuchen”

Beispiel:

  • cat test.txt | grep "Kuchen" | grep "Baum" - gibt alle Zeilen von test.txt aus, in denen sowohl “Kuchen” als auch “Baum” vorkommen

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 http://download.nust.na/pub/gutenberg/etext98/2ws3410.txt 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)

% Tutorial UNIX Command Line - Advanced % ASE WS 2022/23

UNIX / Command-Line Basics (Teil 2)

(Siehe vorheriges Tutorial)

Wir arbeiten jetzt als Nutzer root auf einem 'disposable root server' via segfault.net.

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 ist eine Art Window Manager für die Kommandozeile:

  • virtuelle Desktops
    • Ctrl-B <und danach> 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 <Pfeiltasten> - 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

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__

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)

  • apt show <paketname>
  • apt search <begriff>
  • apt install <paketname> <paketname>
  • 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 <Dateiname>)
  • 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:

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
  • which
  • top / htop / btop
  • du
  • df
  • fuser / lsof
  • strace
  • ip / ifconfig / iwconfig
  • route
  • ping
  • traceroute / mtr / tcptraceroute
  • tcpdump
  • ngrep
  • netcat / nc