Cover
Aloita nyt ilmaiseksi LSS - Lecture II - shells.pdf
Summary
# Terminal en shell concepten
Dit onderwerp verklaart het fundamentele verschil tussen een terminal emulator en een shell, introduceert de concepten van virtuele en pseudo-terminal sessies, en beschrijft tools voor terminal multiplexing [3](#page=3).
### 1.1 Terminal emulator versus shell
#### 1.1.1 De terminal emulator
Een terminal emulator is de interface die tekstinvoer en -uitvoer mogelijk maakt. Het fungeert als een venster of scherm waarmee een gebruiker communiceert met de computer. Historisch gezien emuleren deze moderne terminal programma's fysieke terminals die bestonden uit een toetsenbord en scherm, rechtstreeks verbonden met een mainframe computer. Er zijn verschillende terminal emulators beschikbaar die dezelfde shell kunnen draaien, wat illustreert dat de emulator slechts de weergave is, terwijl de shell de actieve command-line interpreter is [3](#page=3) [4](#page=4) [5](#page=5) [6](#page=6).
#### 1.1.2 De shell
De shell is een programma dat fungeert als tussenpersoon tussen de gebruiker en de kernel van het besturingssysteem. Het is verantwoordelijk voor het vertalen van commando's die door de gebruiker worden ingevoerd naar acties die het systeem kan uitvoeren. Concreet is de terminal de interface (het venster), terwijl de shell het programma is dat de ingevoerde commando's uitvoert [3](#page=3).
### 1.2 Virtuele en pseudo-terminal sessies
#### 1.2.1 Virtuele terminals
Een virtuele terminal (ook wel bekend als TTY) wordt gebruikt om meerdere tekstgebaseerde interface sessies te beheren zonder gebruik te maken van een grafische gebruikersinterface (GUI). Deze virtuele terminals zijn altijd beschikbaar en worden vaak aangeduid als 'tty1', 'tty2', enzovoort. Ze kunnen doorgaans worden benaderd via sneltoetsen zoals ALT+F1, ALT+F2, etc. [7](#page=7).
#### 1.2.2 Pseudo-terminals
Pseudo-terminals (of PTY's) worden dynamisch aangemaakt wanneer een nieuwe terminal emulator wordt geopend binnen een grafische omgeving of wanneer er een netwerkverbinding wordt gemaakt, zoals via SSH. Ze bieden een interface die lijkt op een echte terminal, maar zijn niet direct gekoppeld aan de fysieke hardware [7](#page=7).
### 1.3 Tools voor terminal multiplexing
Terminal multiplexers zijn programma's die geavanceerde functionaliteit bieden binnen één terminalvenster, zoals het beheren van meerdere vensters en gesplitste weergaven (panes). Een belangrijk kenmerk is dat ze sessies kunnen behouden, waardoor gebruikers een sessie kunnen verlaten (detacheren) en later kunnen hervatten (opnieuw koppelen) [8](#page=8) [9](#page=9).
#### 1.3.1 tmux
`tmux` (Terminal Multiplexer) is een populaire tool voor terminal multiplexing. Met `tmux` kun je binnen één terminalvenster meerdere vensters en gesplitste weergaven (panes) openen. Het belangrijkste voordeel is de mogelijkheid om sessies te detacheren en opnieuw te koppelen, zodat je werk behouden blijft, zelfs als je de terminal sluit of de verbinding verliest [8](#page=8) [9](#page=9).
**Veelgebruikte `tmux` commando's:**
* `tmux new -s myname`: Start een nieuwe `tmux` sessie met de naam `myname` [11](#page=11).
* `ctrl-b d`: Koppel los van de huidige `tmux` sessie (detach) [11](#page=11).
* `tmux ls`: Toon een lijst van beschikbare `tmux` sessies [11](#page=11).
* `tmux attach -t myname`: Hernieuw de koppeling aan een specifieke `tmux` sessie [11](#page=11).
* `ctrl-b %`: Verdeel het huidige paneel verticaal [11](#page=11).
* `ctrl-b "`: Verdeel het huidige paneel horizontaal [11](#page=11).
* `ctrl-b c`: Creëer een nieuw venster [11](#page=11).
* `ctrl-b p`: Ga naar het vorige venster [11](#page=11).
* `ctrl-b n`: Ga naar het volgende venster [11](#page=11).
> **Tip:** `tmux` commando's worden vaak voorafgegaan door een "prefix key" (standaard `ctrl-b`). Na het indrukken van de prefix key, druk je de daaropvolgende toets in voor de actie [11](#page=11).
#### 1.3.2 Zellij
Zellij is een andere moderne terminal multiplexer die wordt vergeleken met `vim` en `nano` in de context van het ecosysteem van tekstgebaseerde tools. Het biedt vergelijkbare functies voor venster- en paneelbeheer en sessiebehoud [8](#page=8).
> **Voorbeeld:** Zellij kan direct worden uitgeprobeerd zonder installatie door de volgende commando uit te voeren: `bash <(curl -L zellij.dev/launch)` .
Andere genoemde tools voor multiplexing of geavanceerd terminalgebruik zijn `screen`, `tmate`, `terminator` en `tilix` [8](#page=8).
---
# Shell commando's en expansie
De shell speelt een cruciale rol in het verwerken van commando's door verschillende expansiemechanismen toe te passen voordat het uiteindelijke commando wordt uitgevoerd. Deze expansies, zoals bestandsnaamexpansie, brace expansie, command substitution en rekenkundige expansie, stellen gebruikers in staat om flexibele en krachtige commando's te construeren [15](#page=15) [16](#page=16) [17](#page=17) [19](#page=19) [20](#page=20).
### 2.1 Bestandsnaamexpansie (filename expansion)
Bestandsnaamexpansie, ook wel globbing genoemd, wordt gebruikt om patronen in bestandsnamen te matchen. De shell zoekt naar bestaande bestanden die overeenkomen met het opgegeven patroon. Als er geen overeenkomst wordt gevonden, wordt het patroon behandeld als een gewone string [16](#page=16).
#### 2.1.1 Symbolen voor bestandsnaamexpansie
* `*`: Komt overeen met nul of meer tekens [16](#page=16).
* `?`: Komt overeen met exact één teken [16](#page=16).
* `[abcd]`: Komt overeen met exact één teken dat voorkomt in de lijst (hier: 'a', 'b', 'c' of 'd') [16](#page=16).
* `[a-d]`: Komt overeen met exact één teken dat binnen het opgegeven bereik valt (hier: 'a' tot 'd') [16](#page=16).
* `[^ab]` of `[!ab]`: Komt overeen met exact één teken dat *niet* voorkomt in de lijst (hier: niet 'a' of 'b') [16](#page=16).
> **Voorbeeld:** Het commando `find. -name h*` zoekt naar alle bestanden in de huidige directory (`.`) en subdirectories waarvan de naam begint met de letter 'h' [14](#page=14).
### 2.2 Brace expansie (brace expansion)
Brace expansie biedt een manier om reeksen van strings te genereren zonder afhankelijk te zijn van bestaande bestandsnamen [17](#page=17).
#### 2.2.1 Symbolen voor brace expansie
* `{a,b,c}`: Genereert elke opgegeven string (hier: 'a', 'b', 'c') [17](#page=17).
* `{0..6}`: Genereert een reeks getallen binnen het opgegeven bereik (hier: '0', '1', '2', '3', '4', '5', '6') [17](#page=17).
* `{0..6..2}`: Genereert een reeks getallen binnen het opgegeven bereik met een specifieke stapgrootte (hier: '0', '2', '4', '6') [17](#page=17).
### 2.3 Command substitution
Command substitution maakt het mogelijk om de uitvoer van een commando te gebruiken als een argument voor een ander commando. De moderne en aanbevolen methode hiervoor is het gebruik van `USD( )`. De oudere methode met backticks (`` ` ``) is verouderd [19](#page=19).
> **Voorbeeld:** Het commando `du /usr/bin > log-USD(date +%Y-%m-%d)` maakt een bestand aan genaamd `log-YYYY-MM-DD` (waarbij YYYY, MM, DD de huidige datum zijn) en schrijft de schijfgebruiksstatistieken van `/usr/bin` naar dit bestand [19](#page=19).
### 2.4 Rekenkundige expansie (arithmetic expansion)
Rekenkundige expansie stelt de shell in staat om rekenkundige bewerkingen uit te voeren met behulp van `$(($expression))` [20](#page=20).
> **Voorbeeld:** Als variabelen `a` is ingesteld op 5 en `b` op 4, zal `echo De som is USD((a+b))` de output "De som is 9" produceren [20](#page=20).
### 2.5 Andere stappen in commando-verwerking
Naast de hierboven genoemde expansies doorloopt de shell nog andere stappen bij het verwerken van commando's:
* **Splitsen in tokens (Word splitting)**: De input wordt opgesplitst in tokens op basis van meta-karakters zoals spatie, tab, newline, `;`, `(`, `)`, `<`, `>`, `|`, en `&`. De uiteindelijke woordopsplitsing is gebaseerd op de waarde van de variabele `USDIFS` (Internal Field Separator) [21](#page=21).
* **Parameter expansie**: Dit omvat het uitbreiden van variabelen (ook wel parameters genoemd) [21](#page=21).
> **Tip:** Het commando `info bash` biedt uitgebreide documentatie over de bash shell, inclusief details over expansiemechanismen. Het installeren van `info` en `bash-doc` kan hierbij helpen [18](#page=18).
>
> Een handige online tool om de werking van shell commando's te analyseren is [https://explainshell.com/](https://explainshell.com/) [26](#page=26).
---
# Verschillende shells en hun gebruik
Dit hoofdstuk biedt een overzicht van diverse command-line shells, hun kenmerken en hoe ze worden ingezet in zowel interactieve als niet-interactieve sessies.
### 3.1 Overzicht van gangbare shells
Verschillende shells bieden unieke functionaliteiten en worden gebruikt afhankelijk van de vereisten van de gebruiker of het systeem. De belangrijkste hiervan zijn:
* **sh (Bourne shell)**: Ontwikkeld door Stephen Bourne in de jaren '70 bij AT&T Bell Labs.
* **bash (Bourne-Again Shell)**: Uitgebracht in 1989 als een uitbreiding op `sh`, met extra functies zoals command completion en geschiedenisbeheer [28](#page=28).
* **tcsh**: Heeft een syntax die meer lijkt op de C-programmeertaal en is een afgeleide van de originele C shell (csh) van Berkeley Unix [28](#page=28).
* **dash (Debian Almquist Shell)**: Ontworpen om zo klein mogelijk te zijn, wat resulteert in hogere snelheden. Het is de standaard non-interactieve shell in Ubuntu en Debian [28](#page=28).
* **zsh (Z shell)**: Een uitgebreide Bourne shell en de standaard shell in macOS Catalina en Kali 2020.4 [28](#page=28).
* **ksh (Korn shell)**: Een andere variant die geavanceerde functies biedt.
* **fish (Friendly Interactive Shell)**: Bekend om zijn gebruiksvriendelijke interface en interactieve functies.
### 3.2 Shells in niet-interactieve sessies
In niet-interactieve sessies worden commando's uitgevoerd die uit een bestand worden gelezen, zoals scripts [29](#page=29).
* **Shebang (`#!`)**: In scripts verwijst de shebang vaak naar `/bin/sh` of `/usr/bin/sh` om aan te geven welke shell gebruikt moet worden voor de uitvoering van het script [29](#page=29).
* **`/bin/sh` als symlink**: Op moderne Linux-distributies, zoals Debian, is `/bin/sh` vaak een symbolische link naar een andere shell, zoals `dash`, om de compatibiliteit te waarborgen [30](#page=30).
> **Tip:** Het gebruik van `/bin/sh` in scripts is een gangbare praktijk voor maximale compatibiliteit, omdat veel shells hiernaar linken.
### 3.3 Shells in interactieve login sessies
Een interactieve login shell is de shell waarmee een gebruiker direct communiceert na het inloggen op een systeem.
* **Beschikbare shells**: Een overzicht van geïnstalleerde shells die als login shell kunnen dienen, is te vinden in het bestand `/etc/shells` [31](#page=31).
* Voorbeelden van inhoud van `/etc/shells`: `/bin/sh`, `/bin/bash`, `/usr/bin/bash`, `/bin/rbash`, `/usr/bin/rbash`, `/bin/dash`, `/usr/bin/dash` [31](#page=31).
* **Standaard login shell**:
* Voor nieuwe gebruikers wordt de standaard login shell ingesteld via configuratiebestanden zoals `/etc/adduser.conf` (bij het `adduser` commando in Debian) of `/etc/default/useradd` (bij het `useradd` commando in Debian/RHEL) [32](#page=32).
* De login shell van elke specifieke gebruiker wordt gedefinieerd in het `/etc/passwd` bestand [32](#page=32).
* **Wijzigen van de login shell**: De login shell van een gebruiker kan worden gewijzigd met het `chsh` commando of via `usermod --shell ` [32](#page=32).
> **Voorbeeld:** Een gebruiker kan zijn shell wijzigen door `chsh` uit te voeren en na te vragen naar de nieuwe login shell, waarna de gewenste shell (bijvoorbeeld `/bin/zsh`) wordt ingevoerd [32](#page=32).
### 3.4 Bepalen van de actieve shell
Om te achterhalen welke shell momenteel actief is, kunnen de volgende methoden worden gebruikt:
* **`ps -p $$`**: Dit commando toont de proces-ID (PID) van de huidige shell, aangezien `$$` de PID van het lopende proces vertegenwoordigt [33](#page=33).
* **`echo $0`**: De variabele `$0` bevat de naam van het commando dat is uitgevoerd, wat in dit geval de shell zelf is (mogelijk met een streepje ervoor, zoals `-bash`) [33](#page=33).
* **`USDSHELL` variabele**: Deze variabele verwijst naar de *standaard* login shell van de gebruiker, niet noodzakelijk naar de shell die momenteel actief is [33](#page=33).
> **Voorbeeld:** Na het uitvoeren van `ps -p $$` en `echo $0` kan duidelijk worden dat de huidige shell `bash` is, zelfs als `$SHELL` ook naar `/bin/bash` verwijst [33](#page=33).
### 3.5 Demo: Installeren en wisselen van shell
Het installeren en testen van een nieuwe shell zoals `zsh` kan als volgt worden uitgevoerd:
1. Installeer `zsh` met de pakketbeheerder (bijvoorbeeld `apt install zsh`) [34](#page=34).
2. Controleer de lijst van geldige shells in `/etc/shells` [34](#page=34).
3. Bepaal de actieve shell met `ps -p $$` en `echo USD 0` [34](#page=34).
4. Wissel naar `zsh` en controleer opnieuw met `ps -p USDUSD` en `echo USD 0` [34](#page=34).
5. Vergelijk de output van `echo USDSHELL` [34](#page=34).
### 3.6 Restricted shells: `rbash`
`rbash` (Restricted Bash) is een beperkte versie van `bash`, die kan worden gestart met de optie `-r` of als een aparte link `rbash` [35](#page=35).
* **Doel**: `rbash` beperkt de mogelijkheden van de gebruiker, bijvoorbeeld door het uitvoeren van commando's in bepaalde directories te verbieden of het wijzigen van bepaalde omgevingsvariabelen te blokkeren [35](#page=35).
* **Lijst in `/etc/shells`**: `rbash` staat vaak geregistreerd in `/etc/shells` als een geldige login shell [35](#page=35).
* **Kwetsbaarheid**: Het is belangrijk te weten dat `rbash` relatief eenvoudig te omzeilen is, met bekende technieken voor bypasses beschikbaar [37](#page=37).
> **Tip:** Restricted shells zijn nuttig voor het bieden van beperkte toegang aan gebruikers die specifieke taken moeten uitvoeren zonder het volledige systeem te kunnen benaderen.
### 3.7 `/usr/sbin/nologin`
Het commando `/usr/sbin/nologin` wordt gebruikt om gebruikers te verhinderen een interactieve shell sessie te starten.
* **Functionaliteit**: Wanneer dit als standaard shell is ingesteld voor een gebruiker, kan deze geen interactieve sessie starten. Dit is nuttig voor gebruikersaccounts die wel een wachtwoord moeten hebben (bijvoorbeeld voor FTP/SFTP toegang) maar geen directe shelltoegang nodig hebben [38](#page=38).
* **Verschil met `/etc/nologin`**: `/usr/sbin/nologin` is een commando dat een gebruiker afsluit. Het bestand `/etc/nologin` (of `/var/run/nologin`) heeft een andere functie: indien dit bestand bestaat en leesbaar is, wordt alleen root-toegang toegestaan en krijgen andere gebruikers een melding, wat dient om tijdelijk alle niet-bevoegde logins te deactiveren [39](#page=39).
---
# Superuser-rechten en shell tools
Dit onderwerp behandelt strategieën voor het verkrijgen van root-toegang via de shell en introduceert essentiële shell commando's en hulpprogramma's voor systeembeheer en probleemoplossing.
### 4.1 Superuser-rechten: su en sudo
Het verkrijgen van superuser-rechten, vaak aangeduid als "root" of "superuser", is cruciaal voor het uitvoeren van systeemwijzigingen, het installeren van software en het beheren van gebruikersrechten. De shell biedt twee primaire methoden om dit te doen: `su` en `sudo` [41](#page=41).
#### 4.1.1 su (substitute user)
Het `su`-commando stelt gebruikers in staat om als een andere gebruiker te handelen, standaard als de root-gebruiker. Dit vereist het root-wachtwoord.
* **`su`**: Schakelt over naar de root-gebruiker, maar behoudt de omgeving van de huidige gebruiker [42](#page=42).
* **`su -`** of **`su --login`**: Schakelt over naar de root-gebruiker en laadt de root-omgeving volledig, inclusief paden en omgevingsvariabelen. Dit wordt vaak beschouwd als de veiligste methode om tijdelijk root-rechten te verkrijgen met `su` [42](#page=42).
#### 4.1.2 sudo (superuser do)
Het `sudo`-commando biedt een meer gedetailleerde en veilige manier om commando's als een andere gebruiker (standaard root) uit te voeren zonder dat het root-wachtwoord direct nodig is; het gebruikt het wachtwoord van de huidige gebruiker na authenticatie. `sudo` kan worden geconfigureerd om specifieke commando's toe te staan aan specifieke gebruikers [42](#page=42).
* **`sudo -s`** of **`sudo --shell`**: Start een nieuwe shell als de root-gebruiker, maar behoudt de omgeving van de huidige gebruiker. Dit vereist geen root-wachtwoord, maar het wachtwoord van de huidige gebruiker [42](#page=42).
* **`sudo su -`** of **`sudo su --login`**: Start een nieuwe shell als de root-gebruiker en laadt de root-omgeving volledig. Net als `sudo -s` gebruikt dit het wachtwoord van de huidige gebruiker voor authenticatie [42](#page=42).
* **`sudo -i`** of **`sudo --login`**: Gedraagt zich als `su -` en start een interactieve login-shell als root, waarbij de root-omgeving volledig wordt geladen. Dit is een zeer gebruikelijke en veilige methode om tijdelijk root-rechten te verkrijgen [42](#page=42).
> **Tip:** `sudo` is over het algemeen de voorkeursmethode voor het uitvoeren van beheerderstaken omdat het betere audittrails biedt en minder kans geeft op het per ongeluk achterlaten van een root-shell open.
### 4.2 Shell commando's en hulpprogramma's
De shell (zoals bash) biedt een breed scala aan commando's en hulpprogramma's voor systeembeheer, bestandsmanipulatie en informatieverzameling.
#### 4.2.1 Nuttige shell commando's
Hieronder volgt een niet-limitatieve lijst van veelgebruikte commando's [45](#page=45):
* **Bestandsbeheer:**
* `pwd`: Toon de huidige werkdirectory [45](#page=45).
* `cd`: Verander van directory [45](#page=45).
* `ls`: List directory contents [45](#page=45).
* `rm`: Verwijder bestanden of directories [45](#page=45).
* `cp`: Kopieer bestanden of directories [45](#page=45).
* `mv`: Verplaats of hernoem bestanden of directories [45](#page=45).
* **Tekstverwerking en zoeken:**
* `cat`: Concateneer en toon bestandsinhoud [45](#page=45).
* `less`, `more`: Pagina-voor-pagina bekijken van bestandsinhoud [45](#page=45).
* `grep`: Zoek naar patronen in tekst [45](#page=45).
* `wc`: Tel regels, woorden en karakters [45](#page=45).
* `cut`: Verwijder secties van regels [45](#page=45).
* `sort`: Sorteer regels van tekstbestanden [45](#page=45).
* `head`: Toon het begin van een bestand [45](#page=45).
* `tail`: Toon het einde van een bestand [45](#page=45).
* **Procesbeheer:**
* `ps`: Toon lopende processen [45](#page=45).
* `kill`: Stuur signalen naar processen (vaak om ze te beëindigen) [45](#page=45).
* `bg`: Zet een gestopt proces voort op de achtergrond [45](#page=45).
* `fg`: Breng een proces van de achtergrond naar de voorgrond [45](#page=45).
* `jobs`: Toon lopende jobs in de huidige shell [45](#page=45).
* **Netwerk en schijfruimte:**
* `wget`: Download bestanden van het web [45](#page=45).
* `netstat` / `ss`: Toon netwerkverbindingen en statistieken [45](#page=45).
* `df`: Rapporteer schijfruimtegebruik [45](#page=45).
* `du`: Schat schijfgebruik van bestanden en directories [45](#page=45).
* **Zoeken in bestanden:**
* `find`: Zoek bestanden in een directoryhiërarchie. Dit commando is zeer krachtig en kan zoeken op naam, tijdstempel, permissies, bestandsgrootte en meer [45](#page=45) [49](#page=49).
* `locate`: Zoek bestanden snel via een geïndexeerde database (vereist `updatedb` om te updaten) [45](#page=45) [49](#page=49).
* **Bestandspermissies en eigendom:**
* `chmod`: Wijzig bestandspermissies [45](#page=45).
* `chown`: Wijzig de eigenaar van bestanden [45](#page=45).
#### 4.2.2 Shell shortcuts
Efficiënt gebruik van de shell wordt sterk verbeterd door het kennen van toetsenbord-shortcuts. Deze werken vaak in meerdere command-line programma's [44](#page=44).
* `CTRL + A`: Ga naar het begin van de regel [44](#page=44).
* `CTRL + E`: Ga naar het einde van de regel [44](#page=44).
* `CTRL + L`: Wis het scherm (vergelijkbaar met `clear` of `cls`, maar behoudt de huidige regel) [44](#page=44).
* `CTRL + W`: Wis het vorige woord [44](#page=44).
* `CTRL + left/right`: Spring over woorden (werkt in de meeste programma's) [44](#page=44).
* `CTRL + R`: Omgekeerd zoeken in de commando-geschiedenis. Dit is een zeer nuttige functie om eerder gebruikte commando's snel terug te vinden [44](#page=44).
> **Tip:** Oefen deze shortcuts regelmatig. Ze kunnen je productiviteit aanzienlijk verhogen bij het werken in de terminal.
#### 4.2.3 Man- en info-pagina's
Om de functionaliteit en syntaxis van commando's te begrijpen, zijn de `man`- (manual) en `info`-pagina's onmisbare hulpmiddelen.
* **`man`**: De primaire bron voor documentatie in Unix-achtige systemen [46](#page=46).
* `man `: Toont de handleiding voor een specifiek commando [48](#page=48).
* `man -k ` of `apropos `: Zoekt naar commando's die overeenkomen met een bepaalde zoekterm in hun beschrijving [46](#page=46).
* `man -f ` of `whatis `: Geeft een korte beschrijving van een commando [46](#page=46).
* De `man`-pagina's zijn opgedeeld in secties. Bijvoorbeeld, `man 1 passwd` documenteert het `passwd`-commando als een gebruikerscommando, terwijl `man 5 passwd` de `passwd`-bestandsindeling documenteert [47](#page=47).
* **`info`**: Een ander documentatiesysteem dat vaak gedetailleerdere en meer gestructureerde informatie biedt dan `man`-pagina's. De navigatie in `info` is anders dan in `man` en maakt gebruik van hyperlinks [45](#page=45).
> **Tip:** Als een commando een `permission denied`-fout geeft, kan het zijn dat je `sudo` ervoor moet plaatsen, zoals in `sudo apt update` [46](#page=46).
#### 4.2.4 Shell geschiedenis en timestamping
De shell houdt een geschiedenis bij van de uitgevoerde commando's. Met `HISTTIMEFORMAT` kan de shell worden geconfigureerd om timestamps toe te voegen aan de geschiedenis, wat zeer nuttig kan zijn voor het traceren van activiteiten [40](#page=40).
* `HISTTIMEFORMAT` is een omgevingsvariabele die kan worden ingesteld om het formaat van de timestamp te bepalen. Een veelgebruikte instelling is bijvoorbeeld `export HISTTIMEFORMAT='%F %T '` [40](#page=40).
#### 4.2.5 Shell fun
Naast de functionele commando's zijn er ook diverse "leuke" commando's die voor vermaak kunnen zorgen of visueel aantrekkelijke output genereren. Voorbeelden zijn [50](#page=50):
* `sl`: Een ASCII-trein die over het scherm rijdt.
* `lolcat`: Kleurt de output van andere commando's in regenboogkleuren.
* `cowsay`: Genereert een ASCII-koe (of ander dier) die tekst uitspreekt.
* `hollywood`: Verandert de terminal in een "hacker"-achtige interface.
* `curl wttr.in/Bruges`: Toont een weersvoorspelling voor de opgegeven locatie [50](#page=50).
* `telnet mapscii.me`: Toont ASCII-kaarten [50](#page=50).
---
# Secure Shell (SSH) en tunneling
Secure Shell (SSH) is een protocol dat is ontworpen om veilige netwerkdiensten te bieden over onbeveiligde netwerken, waaronder veilige externe login en bestandsoverdrachten [53](#page=53).
### 5.1 Het SSH-protocol
SSH is in de eerste plaats een applicatie- en transportprotocol, gedefinieerd in RFC 4251. Het primaire doel is het beveiligen van netwerkcommunicatie, wat onder andere het mogelijk maakt voor [53](#page=53):
* Veilige externe logins [53](#page=53).
* Veilige bestandsoverdrachten via het Secure Copy Protocol (SCP) en het SSH File Transfer Protocol (SFTP) [53](#page=53).
Er zijn twee belangrijke versies van het protocol:
* **SSH-1**: Sinds 1995, wordt niet meer ondersteund in veel implementaties [53](#page=53).
* **SSH-2**: Sinds 2006, is de momenteel gebruikte versie en is niet compatibel met SSH-1 [53](#page=53).
#### 5.1.1 Implementaties en configuratie
OpenSSH is een veelgebruikte implementatie van het SSH-protocol. Hoewel SSH de naam van het protocol is, wordt `ssh` ook gebruikt als de naam van het OpenSSH clientprogramma [54](#page=54).
De belangrijkste pakketten voor OpenSSH op Linux zijn:
* `openssh-client`
* `openssh-server`
De configuratiebestanden bevinden zich op de volgende locaties:
* Clientconfiguratie: `/etc/ssh/ssh_config` [54](#page=54).
* Serverconfiguratie (daemon): `/etc/ssh/sshd_config` [54](#page=54).
Op Windows worden de executables, inclusief het `sshd_config`-bestand indien de server is geïnstalleerd, doorgaans opgeslagen in `C:\Windows\System32\OpenSSH` [55](#page=55).
### 5.2 SSH-sleutels voor authenticatie
SSH maakt gebruik van sleutelparen voor authenticatie, wat een veiligere methode is dan wachtwoordgebaseerde logins, vooral omdat het minder vatbaar is voor man-in-the-middle (MITM) aanvallen bij correct gebruik [59](#page=59).
#### 5.2.1 Server host keys
Om de identiteit van de server te verifiëren, worden server host keys gebruikt. Deze bevinden zich meestal in `/etc/ssh/ssh_host_*_key` en komen in verschillende formaten, zoals RSA, ECDSA en ED25519 [56](#page=56).
Wanneer een client voor het eerst verbinding maakt met een server, stuurt de server zijn host key naar de client. De client onthoudt deze servers die hij vertrouwt in het `known_hosts`-bestand. Op Linux is dit het `~/.ssh/known_hosts`-bestand, en op Windows is het `%UserProfile%\.ssh\known_hosts` [57](#page=57).
Bij volgende verbindingen controleert de client of de server bekend is aan de hand van de publieke sleutelfingerprint van de server (een unieke checksum). Als deze gegevens niet overeenkomen, weigert de client de verbinding, wat aangeeft dat de verbinding mogelijk niet met de bedoelde host is [57](#page=57) [58](#page=58).
#### 5.2.2 Client login keys
Voor client logins kunnen SSH-sleutels handmatig worden gegenereerd, wat automatische logins mogelijk maakt. De publieke sleutels van vertrouwde clients om in te loggen worden opgeslagen in het `~/.ssh/authorized_keys`-bestand op de server [56](#page=56) [59](#page=59).
> **Tip:** Bij SSH-sleutels wordt aangeraden om de server fingerprint waarschuwingen niet te negeren om MITM aanvallen te voorkomen [59](#page=59).
### 5.3 SSH tunneling (port forwarding)
SSH tunneling, ook wel port forwarding genoemd, is een krachtige techniek om netwerkverkeer veilig te leiden over een bestaande SSH-verbinding. Dit kan worden gebruikt om onbeveiligde protocollen te beveiligen of om toegang te krijgen tot diensten die anders niet direct bereikbaar zouden zijn [60](#page=60).
#### 5.3.1 Local port forwarding
Met lokale port forwarding wordt een poort op de lokale machine doorgestuurd naar een specifieke host en poort aan de remote kant. Verkeer dat naar de lokale poort wordt gestuurd, wordt via de SSH-verbinding naar de opgegeven remote host en poort getunneld [61](#page=61).
De syntaxis is:
`ssh -L :: @` [61](#page=61).
**Voorbeeld:**
`ssh -L 8080:reddit.com:80 sshuser@172.21.18.53`
Dit stuurt al het verkeer dat naar `localhost:8080` op de lokale machine gaat, door de SSH-verbinding naar `reddit.com` op poort 80 [61](#page=61).
> **Tip:** Lokale port forwarding werkt doorgaans "out of the box" [61](#page=61).
#### 5.3.2 Reverse port forwarding
Bij reverse port forwarding wordt een poort op de remote machine doorgestuurd naar een specifieke host en poort op de lokale machine. Dit is nuttig wanneer je vanaf een externe locatie toegang wilt krijgen tot een dienst die lokaal draait, bijvoorbeeld achter een NAT-router [62](#page=62).
De syntaxis is:
`ssh -R :: @` [62](#page=62).
**Voorbeeld:**
`ssh -R 8888:localhost:8000 sshuser@172.21.18.53`
Dit zorgt ervoor dat verkeer dat naar poort 8888 op de SSH-server (IP 172.21.18.53) gaat, wordt doorgestuurd naar `localhost:8000` op de machine waar de SSH-client draait [62](#page=62).
> **Nadeel:** Voor reverse port forwarding moet mogelijk de `GatewayPorts yes` optie worden ingesteld in `/etc/ssh/sshd_config` en moet de `sshd`-daemon worden herstart [62](#page=62).
#### 5.3.3 Gebruik en onthouden van opties
De opties `-L` en `-R` kunnen als volgt worden onthouden:
* `ssh -L` → "local to remote" [63](#page=63).
* `ssh -R` → "remote to local" [63](#page=63).
Een veelvoorkomend gebruiksscenario voor port forwarding is toegang krijgen tot een database die beveiligingsredenen enkel lokale verbindingen toestaat. Als je via SSH verbinding hebt met de server en de database draait op poort 5432, kun je lokale port forwarding gebruiken:
`ssh -L 9000:localhost:5432 user@IP`
Je kunt dan vanaf je lokale machine verbinden met `localhost:9000` om de database te bereiken [64](#page=64).
Een ander scenario is wanneer je thuis achter NAT werkt en een applicatie op poort 8000 draait, en collega's hiermee willen testen. Je kunt reverse port forwarding gebruiken:
`ssh -R 8888:localhost:8000 user@IP`
Je collega's kunnen dan verbinden met `IP:8888` om toegang te krijgen tot jouw lokale applicatie [65](#page=65).
### 5.4 Andere SSH-functies
Naast beveiligde toegang en tunneling biedt SSH nog diverse andere handige functionaliteiten:
#### 5.4.1 Commando's uitvoeren zonder login
Het is mogelijk om een commando uit te voeren op een remote machine zonder een interactieve shell-sessie te starten [67](#page=67).
**Voorbeeld:**
`ssh student@172.21.19.1 cat /home/student/file.txt`
Dit commando haalt de inhoud van `file.txt` op van de remote machine en toont deze op de lokale console [67](#page=67).
Een ander voorbeeld met root privileges (indien toegestaan):
`ssh root@192.168.32.136 tcpdump -i ens33` [67](#page=67).
#### 5.4.2 GUI-programma's uitvoeren
Met X11 Forwarding (`-fX`) kunnen grafische programma's op de remote server worden uitgevoerd en lokaal worden weergegeven [67](#page=67).
**Syntaxis:**
`ssh -fX @ ` [67](#page=67).
#### 5.4.3 Remote directories mounten
Remote directories kunnen lokaal worden gemount met behulp van `sshfs`. Dit maakt het mogelijk om bestanden op de remote server te benaderen alsof ze zich op de lokale machine bevinden [67](#page=67).
**Voorbeeld:**
`sshfs user@IP:/media/data ~/server/` [67](#page=67).
#### 5.4.4 Springen via jump hosts
SSH maakt het mogelijk om via meerdere intermediate hosts (jump hosts) verbinding te maken met een eindbestemming. De verbinding van de lokale machine tot de eindhost blijft hierbij end-to-end versleuteld [68](#page=68).
**Syntaxis:**
`ssh -J host1,host2,host3 user@host4` [68](#page=68).
#### 5.4.5 Port forwarding binnen een sessie aanpassen
Binnen een actieve SSH-sessie kan via een speciale controle-escape-sequentie (`~C`) de verbinding worden aangepast, inclusief het toevoegen van nieuwe port forwards. Door op "enter" te drukken en daarna `~C` te typen, activeer je deze modus [68](#page=68).
> **Tip:** Raadpleeg de handleiding (`man ssh`) voor gedetailleerde informatie over opties zoals `-L` en `-R`. Een lab-oefening kan bijvoorbeeld bestaan uit het creëren van een SSH-tunnel naar een VM op een Howest server [63](#page=63) [69](#page=69).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| Terminal emulator | Een applicatie die een interface biedt voor tekstinvoer en -uitvoer, waardoor gebruikers kunnen communiceren met het besturingssysteem via een grafische omgeving. Het emuleert oudere fysieke terminals. |
| Shell | Een programma dat fungeert als tussenpersoon tussen de gebruiker en de kernel van het besturingssysteem. Het vertaalt commando's van de gebruiker naar acties die het systeem kan uitvoeren. |
| Command-line interface (CLI) | Een tekstgebaseerde interface voor het besturingssysteem, waarbij gebruikers commando's typen in een terminal om taken uit te voeren. |
| Virtual terminal (TTY) | Een tekstgebaseerde sessie die wordt gebruikt om meerdere systeeminteracties te beheren zonder grafische interface. Deze zijn altijd beschikbaar en toegankelijk via sneltoetsen zoals ALT+F1. |
| Pseudo-terminal | Een terminal die dynamisch wordt gecreëerd wanneer een nieuwe terminalemulator wordt geopend in een grafische omgeving of via een netwerkverbinding, zoals SSH. |
| Terminal multiplexer | Een tool die het mogelijk maakt om binnen één terminalvenster meerdere vensters en gesplitste weergaven (panes) te beheren. Het behoudt sessies, zodat deze op elk moment kunnen worden hervat (detacheren en (her)aanhaken). |
| Filename expansion (Globbing) | Het proces waarbij de shell wildcard-tekens zoals `*` en `?` vervangt door overeenkomende bestandsnamen in de huidige directory voordat het commando wordt uitgevoerd. |
| Brace expansion | Een shellfunctie die tekstpatronen genereert op basis van opgegeven reeksen of lijsten tussen accolades, zoals `{a,b,c}` of `{0..5}`. |
| Command substitution | Een functie waarbij de uitvoer van een commando wordt gebruikt als onderdeel van een ander commando. Dit wordt meestal bereikt met `$(commando)` of (verouderd) met backticks `` `commando` ``. |
| Arithmetic Expansion | Een shellfunctie die rekenkundige expressies evalueert. Dit wordt aangegeven door dubbele haakjes met een dollarteken ervoor, zoals `$((a + b))`. |
| Tokens | De basiseenheden waarin een commando wordt opgedeeld door de shell, gescheiden door spaties of andere meta-tekens, voordat verdere verwerking plaatsvindt. |
| Word splitting | Het proces waarbij de shell een regel tekst opdeelt in afzonderlijke woorden, gebaseerd op de waarde van de interne variabele `$IFS` (Internal Field Separator). |
| Parameter expansion | Het proces waarbij shellvariabelen worden uitgebreid naar hun waarden. Variabelen worden voorafgegaan door een dollarteken, zoals `$USER`. |
| Piping (|) | Een mechanisme dat de standaarduitvoer van het ene commando doorstuurt als standaardinvoer naar het volgende commando in een reeks. Dit maakt het mogelijk om commando's te combineren voor complexe taken. |
| Redirection | Het proces waarbij de standaardinvoer, standaarduitvoer of standaardfout van een commando wordt omgeleid naar of van een bestand, of naar een ander commando. Symbolen zoals `>`, `>>`, `<` en `2>` worden gebruikt. |
| Standard Output (stdout) | De standaarduitvoerstream van een commando, waar de normale resultaten van de uitvoering worden geschreven. |
| Standard Error (stderr) | De standaardfoutstream van een commando, waar foutmeldingen en diagnostische informatie worden geschreven. |
| /etc/shells | Een configuratiebestand dat een lijst bevat van alle geldige shell-programma's die als login shell kunnen worden gebruikt op een Unix-achtig systeem. |
| nologin | Een speciaal programma dat, wanneer ingesteld als de login shell van een gebruiker, voorkomt dat de gebruiker interactief kan inloggen op het systeem, terwijl het wel andere diensten (zoals SFTP) kan toestaan. |
| Shell history | Een functie van de shell die de commando's opslaat die door de gebruiker zijn ingevoerd, zodat deze opnieuw kunnen worden uitgevoerd of bewerkt. |
| su | Een commando dat wordt gebruikt om tijdelijk de identiteit van een andere gebruiker aan te nemen, meestal om root-rechten te verkrijgen (standaard de superuser). |
| sudo | Een commando dat gebruikers in staat stelt om commando's uit te voeren met de beveiligingsrechten van een andere gebruiker (standaard root), na verificatie van hun eigen wachtwoord. |
| man pages | De handleidingen van Unix/Linux commando's en functies, die informatie bevatten over hun gebruik, opties en syntax. Opgehaald met het `man` commando. |
| info pages | Een ander documentatiesysteem op Unix-achtige systemen, dat gedetailleerdere en gestructureerde informatie biedt dan man pages. Opgehaald met het `info` commando. |
| SSH (Secure Shell) | Een cryptografisch netwerkprotocol voor het veilig laten verlopen van bewerkingen tussen twee computers. Het wordt voornamelijk gebruikt voor externe login, bestandsbeheer en commando-uitvoering op afstand. |
| SCP (Secure Copy Protocol) | Een protocol en commando dat wordt gebruikt om bestanden veilig over een netwerk te kopiëren tussen computers, meestal via SSH. |
| SSH-sleutels | Een paar cryptografische sleutels (publieke en private) die worden gebruikt voor veilige authenticatie bij SSH-verbindingen, ter vervanging van wachtwoorden. |
| SSH tunneling (Port Forwarding) | Een techniek die gebruikmaakt van SSH om netwerkverkeer van een onbeveiligde verbinding te versleutelen en te transporteren via een beveiligde SSH-verbinding. |
| Local port forwarding | Het doorsturen van een lokale poort naar een specifieke poort op een externe host via een SSH-verbinding. Verkeer naar de lokale poort wordt omgeleid naar de externe poort. |
| Reverse port forwarding | Het doorsturen van een poort op een externe SSH-server naar een lokale poort op de clientmachine. Verkeer naar de externe poort wordt omgeleid naar de lokale poort. |
| Jump host | Een server die fungeert als een tussenstop om toegang te krijgen tot andere servers in een beveiligd netwerk. SSH kan worden gebruikt om "over" jump hosts te springen. |
| X11 Forwarding | Een functie van SSH die het mogelijk maakt om grafische applicaties die op een externe server draaien, lokaal weer te geven. |
| SSHFS | Een bestandssysteem gebaseerd op FUSE (Filesystem in Userspace) dat het mogelijk maakt om een externe directory via SSH te koppelen, zodat deze als een lokale map kan worden benaderd. |