CLI - Shell


© Mai 2021, Letzte Änderung 18.09.26

Übersicht

Ich habe lange darüber nachgedacht, wie man sich diesem Thema nähert
ohne gleich jemanden abzuschrecken.
Ich denke erst mit ein wenig praktischen Grundlagen und Lösungsansätzen anzufangen.
Meiner Meinung hilft es am Meisten, wenn es nicht so läuft wie erwartet.

Da ich leider kein Experte bin, beschreibe ich teilweise Alternativen recht gleichwertig,
wo ich erst später feststelle, welche zur Geschichte werden und welche überdauern.
Auf anderen Seiten wünsche ich mir daher stets ein Datum
und eine Info zu welchen OS zugehörig und mit welchen Desktop betrieben.
z.B. DEB 13 mit Xfce.

Liste, für den Schnellzugriff

Die Liste ist mit Sicherheit nicht vollständig und ist mehr ein Index,
wo ich welchen Befehl einigermaßen beschrieben und verwendet habe.
Die Kurzbeschreibung lehnt sich häufig an die ursprüngliche Bezeichnung an,
ist teilweise aber auch "kreativ" um einen ähnlich lautenden Merker zu haben.

Dateien
pwd print working dir
mkdir make dir
rmdir remove dir
cd change dir
ls list files
cp copy
mv move
rm remove
ln link
unlink unlink
file filesystem test
du disk usage
df disk free
touch touch date
tree list tree
Remote-Zugriff
netstat net status
ssh secured shell
ping IP ping
hostnamectl local host control
fail2ban fail to ban
ssh-keygen ssh key generator
scp secured copy
Administration
su
sudo
top
htop
kill
iftop
nvtop
free free memory
Wiederholendes
watch
cron
anacron
Suchen und Filtern
find find
locate locate file
uniq uniq
wc word count
cut cut
sort sort
tr text replace
grep RegEx search
egrep extended RegEx search
tee tee
head head
tail tail
less less
column column (fehlt)
sed stream editor
nano nano
Benutzerverwaltung
id
adduser
usermod
deluser
groups
addgroup
groupmod
delgroup
members
chmod
chown
chgrp
w
who
whoami
passwd
SystemD
systemctl
journalctl
service
 
Zeit einstellen
timedatectl
date
hwclock
ntp
ntptrace
ntpstat
ntpdate
chrony
cal
Spracheinstellung
locale
locale-gen
update-locale
dpkg-reconfigure
Paketmanagement
netselect-apt
wget
apt-key
apt-get
apt-file
apt-cache
apt
Stress Tests
hardinfo
memtest86+
lm-sensors
sensors-detect
psensor
s-tui
mesa-utils
smartctl
hdparm
df
f3write
f4read
Archivierung
tar
zip
unzip
gunzip
gzip
bzip2
bunzip2
split
cat concatenate
Partition
mount
lsblk
fdisk
mkfs
blockdev
blkid
parted
print
unit
mklabel
mkpart
set
hd & dd
hd
ddrescue
sync
fstrim
dd
Netzwerk
ipconfig
ip
route
hostename
netstat
nmap
slurm
nmtui
USB
lsusb
usb-devices
Datenträger
lsblk
mkfs
parted
df
fsck
mount
unmount
dosfsck
getfacl
photorec
testdisk
ddrescue
Überprüfung
diff difference of lines
cmp compare binary
md5sum md5 checksum
sha256sum sha checksum
cfv check files
fdupes find Dupletten
freedup Dupletten → lnk
stat file status (fehlt)
Datensicherung
scp secure copy
rsync remote synchonisation
backuppc backup pc
freefilesync free file sync
urbackup ur backup
back in time Time Maschine
Virtualisierung
lsmod
lscpu
uname
leer
history & !
man & tldr
whereis
sh
xargs
env environment
export

Zum Anfang

Erste Schritte

Trotz aller Grafikoberflächen (GUI - graphical user interface) ist vieles unter Linux
im Terminal-Fenster, (also dem Command line Interface - CLI) eleganter lösbar.
Sogenannte "Headless"-Systeme, wie z.B. ein Datei- oder Web-Server
benötigen keine graphische Oberfläche, wollen aber trotzdem konfiguriert werden.
Dies geschieht häufig aus der Ferne (remote)
über eine verschlüsselte Verbindung (z.B. via ssh) mit einen Terminal.
Im Falle eines Terminals ist die Eingabe gewöhnlich die Tastatur
und die Ausgabe der Bildschirm. Das kann man aber alles nach belieben ändern.
Die Eingabe via Terminal enthält meist mehr Optionen als die Bedienung
über eine graphische Benutzeroberfläche,
welche teilweise remote, aus Sicherheitsgründen, nicht erreichbar ist.

Die Eingaben im Terminal oder Befehle eines Shell-Scripts werden
über einen als Shell bezeichneten Befehlsinterpreter abgearbeitet.
Die eine Shell gibt es im Grunde gar nicht, sondern verschiedene.
Diese Dialekte sind aber, wenn ich Debian verwende, nicht so wichtig,
da als Standard die bash-Shell eingestellt ist. Zsh, Fish, Dash und weitere haben jeweils unter 12% Verbreitung.
Über ein Terminal-Fenster kann ich im einfachsten Fall unter xfce über   Anwendungen > Terminal   aufrufen.
Es erscheint dann im Terminal-Fenster z.B. folgendes, welches aber auch beliebig geändert werden kann.

a1@desk3:~$

Der Aufbau ist z.B. wie folgt:   <Benutzername>@<Rechnername>:<Pfad>Promt
Also hier:

Mit   Ctrl-D   oder den Befehl   exit   schließe ich das Terminal-Fenster wieder.
Mit   exit   verlasse ich auch den Benutzer z.B. auf einem remote eingeloggten Rechner.

Am Anfang macht es Sinn sich ein paar Befehle zusammen zu kopieren oder
nach erfolgreicher Ausführung zu kopieren.
Bitte aber daran denke, nicht jeden Code aus dem Internet einfach zu kopieren.
Stattdessen macht es vor Verwendung Sinn, die Funktion zu verstehen und deren Konsequenzen zu kennen.
Da   Ctrl-C   in vielen Fällen für Abbruch steht, steht zum Kopieren vom Terminal   Ctrl-Shift-C  
und zum Einfügen ins Terminal   Ctrl-Shift-V   zur Verfügung.

Fast alles was ich eingebe wird gespeichert und läßt sich mit der Hoch ↑-Taste wieder hervor holen.
Beispielsweise sehen die vergangenen Eingaben wie folgt aus und
dummerweise habe ich bei der 209'ten Eingabe nicht aufgepasst und das Passwort mit eingegeben.
Da die Shell ergänzen kann, kann ich z.B.   his gefolgt von TAB   eingeben und erhalte   history.
Diese Ergänzung funktioniert z.B. auch bei Datei-Pfaden, sofern es eindeutig ist.

history 7                 zeige die letzten 7 Eingaben
  204  sudo /usr/sbin/fdisk -l
  205  sudo apt update
  206  sudo apt upgrade
  207  exit
  208  ssh -X m@n11.fritz.box
  209  su geheim
  210  history 7

history -d 209            löscht den unerwünschten Eintrag

!205                      zum gezielten Aufruf vergangenes
sudo apt update
…

!206
sudo apt upgrade
…

 ls -la                   das erste Leerzeichen vor ls bewirkt keine Aufnahme
insgesamt 680
drwx------ 11 a1   a1     4096 14. Apr 22:57 .
drwxr-xr-x  6 root root   4096  5. Okt 2025  ..
lrwxrwxrwx  1 a1   a1       12 11. Okt 2025  a0 -> /mnt/sda3/a0
-rw-------  1 a1   a1     4097 13. Apr 23:00 .bash_history
-rw-r--r--  1 a1   a1      220  5. Okt 2025  .bash_logout
-rw-r--r--  1 a1   a1     3526  5. Okt 2025  .bashrc
…

history 4                 zeige die letzten 4 Eingaben
  209  history 7
  220  sudo apt update
  221  sudo apt upgrade
  222  history 4          ls -la fehlt

!ss                       letzter Befehl der mit ss anfing ausführen
ssh -X m@n11.fritz.box

Ich persönlich kann am besten lernen, indem ich versuche konkrete Beispiele nachzuvollziehen.
Daher habe ich versucht immer Beispiele zu finden.

Wie im obigen Beispiel erkennbar, befindet sich die Geschichte aller Eingaben und der Konfiguration
in Dateien, welche im Verzeichnis des Benutzers sind.

cat ~/.bash_history       hier finde ich die letzten Eingaben 
…                         nach dem Schließen des Terminals

nano ~/.bashrc            die Konfiguration
…

Als normal sterblicher Benutzer sollte ich nicht jeden Befehl aufrufen und nicht auf jeden Bereich zugreifen.
Das ist dafür um mich selbst vor Schaden zu bewahren.
Der Benutzer   root   darf jedoch alles und ist Systemadministratoren vorbehalten.
Entsprechend ist bei dem Passwort und bei der Benutzung Vorsicht geboten.
Um den "Super user" Status zu erhalten sind die Befehle   su   und   sudo   gedacht.

Weiterführendes

wilivm.com   Linux-History-Befehl
alexhost.com   Der Befehl history in Linux (Bash History)
debian-handbook.info   8.6. Shell-Umgebung

Zum Anfang

Pipelines

Ein- Ausgabe-Umleitung

Anbei ein paar konkrete Beispiele wie Datenströme umgeleitet werden können
oder wie Befehle aneinandergereiht werden können.

cd nichtVorhanden/ || cd Downloads/       cd - change directory mit alternativen Befehl 
bash: cd: nichtVorhanden/: No such file or directory

pwd                                       pwd - print working directory zur Überprüfung
/home/a1/Downloads ~/Downloads war der richtige Ordner

ls -la                                   ls - listet Dateien mit extra Parameter "la" = long-list + all
total 20
drwxr-xr-x 2 a1 a 4096 May 13 17:59 .
drwxr-xr-x 4 a1 a 16384 May 13 17:59 ..   zuzeit leerer Ordner, input.txt existiert noch nicht

sha256sum input.txt 2> check.txt         Fehlermeldungen in die Datei check.txt schreiben.

md5sum input.txt 2>> check.txt           weil input.txt noch nicht existiert

cat check.txt                           Ausgabe der Fehlermeldungen
sha256sum: input.txt: Datei oder Verzeichnis nicht gefunden
md5sum: input.txt: Datei oder Verzeichnis nicht gefunden

ls > input.txt                         Bildschirmausgabe umleiten, dabei Datei input.txt neu erzeugen.
                                      interessanterweise wird input.txt angelegt und dann ls ausgeführt
cat input.txt                         cat - concatenate; Inhalt der Datei ausgeben
check.txt
input.txt
                                      Dateiliste erzeugen | filtern > Ausgabe überschreibend in Datei input.txt
ls -la | grep "txt" > input.txt       aus Dateiliste Zeilen raussuchen, welche "txt" enthalten

cat input.txt                         vorheriger Inhalt ist überschrieben
-rw-r--r-- 1 a1 a 48 May 13 21:45 check.txt
-rw-r--r-- 1 a1 a 0 May 14 02:06 input.txt

md5sum input.txt 2> check.txt           da input.txt existiert, gibt nun eine Checksumme auf dem Bildschirm
177727ddd4b735ec4f43cc601433812a input.txt

cat check.txt                         da der 2. Fall fehlerfrei ist, ist check.txt nun leer

echo "ls -l" > input.txt; ls -l >> input.txt

cat input.txt
ls -l                               erst den Befehl
insgesamt 4                         dann das Ergebnis angehängt
-rw-r--r-- 1 m m 0 6. Apr 20:21 check.txt
-rw-r--r-- 1 m m 6 6. Apr 20:27 input.txt

sort < input.txt                     sortiert die Zeilen aus input.txt
insgesamt 4
ls -l
-rw-r--r-- 1 m m 0 6. Apr 20:21 check.txt
-rw-r--r-- 1 m m 6 6. Apr 20:27 input.txt
 

Und noch weitere Beispiele:

su
apt update && apt upgrade             wenn update Fehlerfrei, dann Fortsetzung mit upgrade

zip zipped.zip check.txt & nano       während er zippt, wird der Editor geöffnet

dd if=/dev/urand of=/dev/null & top   parallele Ausführung

chown a:a input.txt ; chmod 664 check.txt   sequentielle Ausführung

Zum Anfang

man - Manual

Wenn man eine Beschreibung benötigt, hilft in den meisten Fällen man weiter.
Einen Einstieg (zum Paket Ersteller ;-) findet man auch auf   debian.org
Dem Rest ist wahrscheinlich schon das   debiananwenderhandbuch.de   harte Kost.
Ein paar Grundlagen zur Konsole findet man unter   debian.org

Da Debian häufig Grundlage von anderen Linux-Derivaten ist, kann ich auf eine Fülle von Hilfen zugreifen.
Hier nur eine kleine Auswahl in alphabetischer Reihenfolge.

Als Ergänzung kann man noch  tldr  installieren und steht für 'Too Long; Didn’t Read'.
Hier findet man konkrete Beispiele. Siehe  tldr.sh.

sudo apt search tldr
tealdeer/stable 1.7.2-1+deb13u1 amd64
  simplified, example based and community-driven man pages…

sudo apt install tealdeer

tldr -v                           welche Version?
tealdeer 1.7.2
tldr --update
Successfully created cache directory path `/home/a1/.cache/tealdeer`.
Successfully updated cache.

tldr -l > list                    Erstellt Liste der beschriebenen Befehle

tldr apt search
Warning: Page `apt-search` not found in cache.
Try updating with `tldr --update`, or submit a pull request to:
https://github.com/tldr-pages/tldr

Da es unter DEB 13 allerdings noch eine ältere Version ist und es ein relativ junges Projekt ist,
ist es zur Zeit noch lange nicht vollständig.
Alternativ gibt es noch eine Web-basierte Version  tldr.inbrowser.app.
Und Mitarbeit ist natürlich stets willkommen auf dem von Microsoft gekauften  github.com.

Zum Anfang

whereis - wo befindet sich die Funktion?

Manchmal kann es vorkommen dass man einen Befehl eingibt, er aber nicht gefunden wird.
Dann ist es nötig den kompletten Pfad einzugeben, den man wie folgt heraus bekommt.

fdisk
bash: fdisk: Kommando nicht gefunden.
whereis fdisk
fdisk: /usr/sbin/fdisk /usr/share/man/man8/fdisk.8.gz
sudo /usr/sbin/fdisk -l
…

Zum Anfang

xargs - excecute commands

xargs  eigent sich besonders wenn man einen bestimmten Befehl mehrere Male (je Zeile) aufrufen möchte.
In diesem Beispiel suche ich in jeder  .html-Datei den Text  id="mm (sollte class="" sein).

find ~/sc/ -name '*.html' | xargs grep -E 'id="mm' > id_list
/home/m/sc/virt/vbridge/bridge.html:	<hr id="mm130">
…

Zum Anfang

env - environment Variablen anzeigen

env variablen ausgeben


Zum Anfang

export - setzen, durch Export von Umgebungs-Variablen

export VAR=value variable setzen


Zum Anfang

echo - oder fprint


Zum Anfang

sh - shell

Die Befehle, welche ich direkt ins Terminal eingebe, kann ich auch in eine Text-Datei schreiben.
Zum starten der Textdatei kann ich den Befehl  sh  für die Bourne shell verwenden.
Bei DEB hat man den Uralt-Standard Bourne shell ersetzt durch die  dash  Debain Almquist Shell.
Je nach shell ist der Befehlsvorrat und die Interpretation unterschiedlich.

nano cnt.sh                     kleines Programm schreiben

echo "ich kann bis 3 zählen"
for (( x=1 ; x<4 ; x++ ))
do
  echo $x
  müll
done

sh cnt.sh                      diese Shell versteht noch nicht 
ich kann bis 3 zählen
cnt.sh: 2: Syntax error: Bad for loop variable

dash cnt.sh                    die For-Schleife in dieser Form
ich kann bis 3 zählen
cnt.sh: 2: Syntax error: Bad for loop variable

bash cnt.sh                    die Bash, kann das aber!
ich kann bis 3 zählen
1
cnt.sh: Zeile 5: müll: Kommando nicht gefunden.
2
cnt.sh: Zeile 5: müll: Kommando nicht gefunden.
3
cnt.sh: Zeile 5: müll: Kommando nicht gefunden.

Um Tipparbeit zu sparen, kann ich die Textdatei ausführbar machen
Damit die Datei der richtigen Shell zugeordnet wird, schreibe ich in die erste Zeile einen bestimmtem Kommentar.
Um aus der Text-Datei einen ausführbaren Befehl zu generieren kann ich ein bestimmtes Flag setzen.

cat b.sh                      Inhalt der Test-Datei
#!/bin/sh
DATUM=`date "+%F %T"`
echo "ich wurde gestartet um\n $DATUM "

sh b.sh                       start über sh 
ich wurde gestartet um
 2026-06-06 17:09:35

ls -la b*                     noch keine Ausführungsrechte
-rw-rw-r-- 1 a1 a1 73  6. Jun 17:09 b.sh

chmod u+x b.sh                gibt Benutzer der Datei das Recht zum Ausführen

ls -la b*
-rwxrw-r-- 1 a1 a1 73  6. Jun 17:09 b.sh

./b.sh                        Aufruf ohne sh
ich wurde gestartet um
 2026-06-06 17:16:07 

Um bei Fehler das Programm zu beenden, kann ich folgendes in die Kopfzeile schreiben.

nano cnt.sh
#! /bin/bash -e
echo "ich kann bis 3 zählen"
for (( x=1 ; x<4 ; x++ ))        # ab Version 
do
  echo $x
  müll
done

./cnt.sh
ich kann bis 3 zählen
1
./cnt.sh: Zeile 6: müll: Kommando nicht gefunden.

bash --version
GNU bash, Version 5.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger 

Dies ist freie Software. Sie darf verändert und verteilt werden.
Es wird keine Garantie gewährt, soweit das Gesetz es zulässt.

Bin ich im Thunar, kann ich auch mit rechter Maustaste   Eigenschaften > Zugriffrechte   wählen.
Über eine Checkbox kann ich dann die Ausführung erlauben. Die Ausführung an sich, ist via Thunar nicht möglich.
Ein Doppelklick öffnet aus Sicherheitsgründen nur den Editor Mousepad.
Wer dennoch eine riskante Lösung sucht, findet sie unter  xfce.org.

make file excecutable

Zum Anfang

                                       

li -la < input.txt


dd if=~/Downloadds/debian.iso count=512 >> check.txt

smartctl -i /dev/sda                   bis deb 9
bash: smartctl: command not found      ab deb 10

whereis smartctl                       ab deb 10
smartctl: /usr/sbin/smartctl /usr/share/man/man8/smartctl.8.gz


apt-file search "/netstat "
munin-plugins-core: /usr/share/munin/plugins/netstat  
net-tools: /bin/netstat                               das scheint das Gesuchte zu sein
recap: /usr/lib/recap/core/netstat

apt-get install net-tools

Zum Anfang

Quellen

helmbold.de   Linux auf einem Blatt
archlinux.de   Shell-Spickzettel
bitblokes.de   Bash: Zeichen aus Zeichenkette (String)
bitblokes.de   Malware: Befehle von Websites kopieren und dann im Terminal einfügen ist keine gute Idee
profi-tutorials.de   Eingabe- / Ausgabe-Umleitungen (I/O-Redirections)
manurevah.com   basic commands
rheinwerk-verlag.de   Shell-Programmierung: Einführung, Praxis, Referenz   von Jürgen Wolf
otremba.net   Matts Wiki - Benutzerverwaltung (Linux)

Zum Anfang