CLI-Teil1-Einführung ins Command Line Interface

Aus revampedia

Vorwort

!!! Noch in Arbeit und nicht fertig !!!

Ich habe nach Ostern 2016 bei Revamp-it angefangen und hatte vorher nur ein wenig Kontakt in der Arbeitswelt mit Linux/Unix. Ich werde in mehreren Teilen probieren zuerst auf Anfängerstufe erste Schritte zu machen bis dann hin zum Systemadministrator (sofern ich selber diese Stufe selber auch erreiche).

Falls noch Fragen offen sind nach dieser Anleitung bitte oben bei "Ansichten" auf "Diskussion" gehen und Feedback hinterlassen, dass ich noch weitere Details hinzufügen kann. jr

Ich probiere mich hier auf das wichtigste zu Beschränken. Falls einen also die Geschichte von Linux interessiert folgt man am besten den eingebauten Links. Wir wollen nicht die grafische Oberfläche nutzen sondern das CLI besser kennenlernen. Für gewisse Dinge ist diese zwingend erforderlich oder einfach ein weiterer Weg Dinge zu machen.
In meiner Jugend habe ich noch ein wenig Erfahrungen mit MS-DOS gemacht und aus meiner Sicht es es sehr hilfreich, wenn man Englischkenntnisse besitzt. Bei vielem (oder vielleicht sogar alles) ist die englische Sprache die Grundlage für Abkürzungen der Befehle.

Was ich wohl kurz ansprechen sollte ist, dass es verschiedene "Familien" gibt in Linux. Die Hautgruppen sind Debian, Slackware und Red Hat. Das folgende Bild ist veraltet, doch zeigt dies ein wenig auf. Das Bild hatte ich hier gefunden.

Die Hauptfamilien in Linux
In unseren internen Schulungen arbeiten wir mit Debian. Von Debian gibt es viele Kinder. Das nächste Bild ist auch veraltet und soll lediglich zeigen, dass verschiedene Menschen verschiedene Meinungen haben und darum die Programme die standardmässig dabei sind sich unterscheiden. Quelle vom Bild ist hier

Die Kinder von Debian


Verzeichnisstruktur

Wenn wir mit der Befehlszeile anfangen wollen ist es auch notwendig ein wenig über die Verzeichnisstruktur zu erfahren.
Im Netz habe ich ein passendes Bild hier gefunden. Es ist nicht die gesammte Verzeichnisstruktur sondern nur ein Ausschnitt davon. Zu Beginn wird es noch nicht zuviel Sinn machen. Ich bin selber auch noch nicht soweit, dass was unter dem Bild folgt viel mehr ist als Notizen die ich mir zu einem Buch oder Video gemacht habe. Auf Englisch kann man unter dieser Seite noch viel mehr über die "Filesystem Hierarchy" erfahren. Die deutschsprachige Seite verweist auch dahin.

Ausschnitt eines Systems

Hier die wichtigsten Verzeichnisse auf Anfängerstufe. Wenn man den Text ausklappt gibt es noch weitere Erklärungen zu Verzeichnissen.
/ -> enthält das Wurzelverzeichnis (root directory)
/boot -> hier ist was zum aufstarten der Maschine benötigt wird. Der Kernel, die Initial Ramdisk (initrd.....) und der Bootloader GRUB
/home -> enthält die persönlichen Daten vom User. Hier findet man auch die Konfiguration von einigen Anwendungen, doch meist in versteckten Dateien (Datei fängt mit . an)
/root -> das "home" Verzeichnis vom Benutzer root
/media -> Mountpunkte für Wechseldatenträger wie Floppy, CD/DVD oder USB

Hier noch die restlichen Notizen zu Verzeichnissen:
/bin und /sbin -> hier liegen ausführbare Programme (binaries)
/usr -> enthält Systemprogramme, Dokumentationen usw.
/usr/bin -> Benutzerkommandos
/usr/lib -> Bibliotheken
/usr/share/doc -> Dokumentationen
/usr/local -> sollten Daten und Programme abgelegt werden die nicht von der Distribution direkt installiert wurden
/etc -> enthält systemweite Konfigurationsdateien
/dev -> hier sind die Gerätedateien (devices) also HD, CD/DVD USB usw.
/lib -> enthält Bibliotheken von Programmen
/lib/modules -> hier befinden sich die Kernel-Module
/opt -> hier kann ein Administrator Software installieren, die nicht im Packetformat der Distribution vorliegt
/mnt -> Mountpunkt für statische Dateisysteme, zum Beispiel Partitionen von anderen Betriebssystemen oder Network-Shares
/tmp -> Verzeichnis für temporäre Dateien oder Programme. Wird beim Systemstart aufgeräumt
/var -> bietet eine "Zwischenablage" unter anderem für Druckaufträge, Logdateien und Mails.
/proc -> Ein virtuelles Dateisystem, das eine Schnittstelle zum Kernel darstellt. Liefert unter anderem Informationen über laufende Prozesse (jeder Prozess hat ein Unterverzeichnis und Prozess-ID)
/sys -> ein virtuelles Dateisystem, das eine generische Schnittstelle zu einzelnen Treibern anbietet

Wir sehen hier also dass / auch bereits ein Verzeichnis ist und alle weiteren Verzeichnisse darauf aufbauen. Ich habe mir an meinem Arbeitsplatz ein paar Ordner erstellt um dies ein wenig besser aufzuzeigen. Hier lernen wir noch ein paar weitere Zeichen kennen, die in Linux etwas bedeuten.

Ordnerbeispiel1.png

Wie man bei der letzten Zeile sieht befinde ich mich aktuell im Ordner /home/jruettimann/beispiel/. Mein "Home"-Verzeichnis ist also /home/jruettimann/. Dies kann ebenfalls mit ~ dargestellt werden wie man in hellblauer Schrift (~/beispiel) auf den Zeilen sehen kann. Über den Befehl "ls" kann ich den Inhalt eines Verzeichnis ansehen. Mit " -la" sage ich zum einen, dass ich eine lange Auflistung wünsche (also mit mehr Details) und zum anderen, dass ich alles angezeigt haben möchte (Also auch versteckte Dateien).
Die beiden ersten Zeilen der Auflistung sind mit . beziehungsweise .. beschriftet. Die Bedeutung von . ist das aktuelle Verzeichnis und .. steht für das Verzeichnis darüber.

Hier folgen noch weitere Informationen zur langen Auflistung vom Verzeichnisinhalt:

Ordnerbeispiel2.png

Hier habe ich ein gutes Beispiel für die Erklärung gefunden, welches ich übersetzt habe:

 +-Berechtigungen für den Inhaber
      |
      |     +-Berechtigungen für andere
      |     |
      |     |   +-Anzahl der harten Links
      |     |   |
      |     |   |                          +-Grösse    +-Letzte Änderung mit Datum und Zeit
     _|_   _|_  |            _             |__ ________|_______
    drwxr-xr-x  2 jruettimann jruettimann 4096 Dez  6 11:32 videos
        ___      _____ ____                       _____
         |            |           |                           |
         |            |           |                           +-Name der Datei oder des Verzeichnis
         |            |           |
         |            |           +-Gruppe auf welche die Gruppenberechtigungen angewendet werden
         |            |
         |            +-Inhaber der Datei
         |
         +-Berechtigungen für Mitglieder der Gruppe

Mehr Infos zu den Rechten

Dies sind die Möglichen Optionen bei dem ersten Zeichen dieser Reihe
d = Directory = Verzeichnis
l = (klein L) symbolic Link
b = block file
c = character device file
p = pile file oder named pipe file
s = socket file

Dies sind die Möglichkeiten bei den drei Gruppen welche ich rot , blau , gelb (gelb) umrahmt habe
r = Read = Leserecht
w = Write = Schreibrecht
x = Execute = Ausführen

Da in meinem Bild aktuell nur Verzeichnisse angezeigt werden ist es immer das Format
d|Gruppe1|Gruppe2|Gruppe3

Zur Wiederholung vom Erklärungstext von oben:
Gruppe1 = Rechte für den Datei-Inhaber
Gruppe2 = Rechte für die Gruppe
Gruppe3 = Rechte für die anderen

Es kommt immer nur eine dieser rwx 3er Gruppen zum Einsatz. Ist man der Inhaber der Datei, so gilt Gruppe1. Ist man Teil der Gruppe, so gilt Gruppe2. Ist man weder der Inhaber, doch Teil der Gruppe, so sagt Gruppe3 aus was man mit der Datei machen darf.

Statt einem x wird an einigen Orten auch ein s oder ein t gesetzt.
s steht für setuid/setgid. Eingesetzt wird es bei Programmen wie su, sudo, mount und passwd.
t steht für Sticky-bit und wird auf Verzeichnisse wie /tmp gesetzt. Sofern man nicht der Inhaber des Ordners ist kann man nur Dateien löschen die einem auch selber gehören, da mehrere Benutzer Zugriff auf /tmp haben.

Rechte ändern über CHMOD

Dieser Befehl dient dazu die Rechte von Dateien oder Verzeichnissen zu ändern.
Zum einen kann man sagen welche der drei Gruppen man ändern möchte über u(user), g (group) und o (other) und über + oder - Rechte hinzufügen oder entfernen. Also wie man im ls -l gesehen hat gibt es hier r (read), w (write) und x (execute).

Alternativ kann man dies auch über eine dreistellige Zahl darstellen. Für jede Gruppe muss man sich zusammenzählen welche Rechte man geben will.
4 = Read
2 = Write
1 = Execute
Setzt man zum Beispiel 777 so haben alle drei Gruppen die Rechte zum Lesen, Schreiben sowie ausführen. Dies sollte man nur in wenigen Fällen setzen, weil sonst jeder Person die Zugriff auf die Maschine hat diese ändern oder ausführen darf.
Sinnvoller wäre stattdessen für eine ausführbare Datei 751 zu setzen und für etwas das man nicht ausführen kann 640.

Es gibt auch noch eine Variante wo man bei chmod eine 4-stellige Zahl eingibt. Doch dazu weiss ich selber nur was ich mir als Notiz aufgeschrieben habe und ist wohl auf Anfängerstufe nicht notwendig

Hat man bei chmod eine 4-stellige Zahl, so ist dies um die Spezial-Flags zu setzen
4 = s-bit für Inhaber
2 = s-bit für Gruppe
1 = t-bit = Sticky-bit

Hier gibt es mehr dazu zum Nachlesen auf Englisch

Erste Befehle

Zu Anfang müssen wir noch lernen, dass es interne Befehle gibt und externe Befehle. Die internen Befehle sind Teil des Kernels und werden automatisch geladen, wenn man den Computer startet. Externe Befehle haben ihren eigenen Prozess, wenn sie ausgeführt werden und sind meistens in /bin untergebracht. Über $PATH kann man sehen welche Ordner für Programme vorgemerkt sind und welche der Computer dann direkt ausführen kann. Ist der Pfad zum Programm nicht bekannt muss man den ganzen Pfad angeben um das Programm auszuführen oder die $PATH Variable anpassen. Quelle

Mit dem folgenden Befehl kriegt man alle interen Befehle:

enable -a | cut -d " " -f 2,3

Wenn man den Befehl ausführt listet es direkt die folgenden Befehle auf:

.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
compopt
continue
declare
dirs
disown
echo
enable
eval
exec
exit
export
false
fc
fg
getopts
hash
help
history
jobs
kill
let
local
logout
mapfile
popd
printf
pushd
pwd
read
readarray
readonly
return
set
shift
shopt
source
suspend
test
times
trap
true
type
typeset
ulimit
umask
unalias
unset
wait

Um mehr Informationen zu all diesen internen Befehlen zu kriegen gibt man davor "help" ein. Um also zum Beispiel mehr Infos zu dem Befehl "cd" zu erhalten gibt man auf der Befehlszeile das folgende ein:

help cd

Alle anderen Befehle welche man in Linux nutzt sind externe Befehle. Die externen Befehle befinden sich im Normalfall in den Ordnern /bin, /sbin, /usr/bin/, /usr/sbin/, /usr/local/bin und /usr/local/sbin. Falls ich noch weitere Stellen vergessen habe, bitte melden, dass ich diese auch auflisten kann. Um mehr Informationen zu diesen Befehlen zu erhalten nutzt man den Befehl "man" davor. Man kann zum Beispiel auch den folgenden Befehl eingeben um zusätzliche Informationen zu den Handbüchern (Manuals) zu kriegen:

man man

Um eine "man-Page" zu verlassen muss man "q" drücken. Man kann auch mit den Pfeilen darin hoch und runter scrollen sofern mehr Text ist als direkt angezeigt werden kann. Für mehr allgemeine Informationen zu Manpages kann man diesem Link folgen. Ich hoffe diese Details reichen aus um jetzt in die Befehle einsteigen zu können.

pwd - Print Working Directory

Für Leute die der englischen Sprache nicht mächtig sind, ist die Übersetzung sinngemäss "aktuelles Verzeichnis". Es kann hilfreich sein sich zu orientieren wo man gerade befindet. Es reicht also völlig aus auf der Befehlszeile einfach pwd einzugeben.

pwd -L

Mit dem zusätzlichen Parameter -L kann man sich den logischen Pfad anzeigen lassen. Dies ist was auch bei pwd angezeigt wird.

pwd -P

Mit dem Parameter -P kann man den physichen Pfad anzeigen. Bei vielen Verzeichnissen wird der logische Pfad und der physiche Pfad der gleiche sein. Falls man sich einen symbolischen Link zwischen zwei Verzeichnissen macht, kann sich der logische und der physiche Pfad unterscheiden. Ich habe hier ein gutes Beispiel dazu gefunden.

noch nicht bearbeitet:

ls - Verzeichnisinhalt auflisten

Der Befehl dient dazu den Inhalt von einem Ordner anzuzeigen. Ich habe einen Ordner beispiel erstellt und darin einige Ordner erstellt. Ohne weitere Parameter sieht das dann so aus:
Ls.png

Möchte man mehr Details zu den einzelnen Dateien sehen, so macht man dies mit "ls -l" in der Befehlszeile
Lsl.png

Falls man auch versteckte Dateien sehen möchte (versteckte Dateien beginnen mit einem Punkt)
Lsa.png

Will man eine ausführliche Anzeige mit den versteckten Dateien, so kann man die Parameter -a und -l kombinieren zu -la oder -al
Lsla.png

Weitere mögliche Parameter kann man über die manpage kriegen. Also auf der Befehlszeile folgendes eingeben:

man ls


Es ist nicht zwingend erforderlich, dass ich mich in dem Ordner befinde, den ich anschauen möchte. ich kann nach dem Befehl ls mit den gewünschten Parametern auch noch einen Pfad angeben. Im Fall der Bilder von oben ist der Pfad /home/jruettimann/beispiel/ oder ~/beispiel/. Beide Varianten zeigen den selben Ort an.
Gross- und Kleinschreiben ist in Linux relevant wichtig. Wie man in den Bildern sehen kann habe ich einen Ordner musik und einen Ordner Musik. Dabei handelt es sich um zwei verschiedene Ordner. Sie unterscheiden sich wohl nur dadurch, dass das "m" im einen Fall gross geschrieben ist und im anderen Fall klein geschrieben, doch das reicht aus, dass es in Linux zwei verschiedene Ordner sind.

cd - Change Directory

Falls man früher mal DOS genutzt hat oder in neueren Versionen von Windows cmd ist man vermutlich schon mit dem Befehl cd vertraut und dass man damit in einen anderen Ordner wechseln kann. In Linux ist der Befehl jedoch leicht anders zu nutzen. So hatte ich in Erinnerung, dass ich in den darübergeordneten Ordner mit "cd.." komme. Um dies in Linux zu machen muss ich jedoch "cd .." eingeben.
Da es sich um einen internen Befehl handelt bei cd kriegt man über "help cd" noch ein paar zusätzliche Informationen.
Um den Ordner aufzurufen welchen ich beim ls-Befehl genutzt habe kann ich dies über mehrere Wege machen.

Wenn ich eine Konsole öffne starte ich immer in meinem Home-Verzeichnis. Ich darf also direkt von meinem Ordner in den Unterordner gehen über

cd beispiel

Falls ich irgendwo sonst im System bin kann ich über den vollständigen Pfad auch dahin wechseln

cd /home/jruettimann/beispiel/

oder

cd ~/beispiel/

Die Tabulator Taste ist dabei ein guter Freund, da es eine automatische Vervollständigung macht, wenn es auf eine einzige Möglichkeit reduziert ist von was man bereits geschrieben hat.

Wie bereits erwähnt kann man einen Ordner zurückgehen, wenn man das folgende eingibt:

cd ..

Falls man sich bei ls alles anzeigen lässt sieht man auch noch den Eintrag ".". Damit ist der aktuelle Ordner gemeint. Es macht also nicht sehr viel Sinn in den aktuellen Ordner zu wechseln.

type

Mit diesem Befehl lassen sich Informationen zu einem Befehl anzeigen. Ich habe einen Screenshot zu den Befehlen gemacht welche wir mittlerweile gelernt haben. Es sind erst wenige, doch es zeigt ein wenig was an.

Type.png

Bei den externen Befehlen sieht man meistens noch wo sich das Programm befindet auf dem Computer. Da es sich bei "type" um einen internen Befehl handelt können wir zusätzliche Infos über "help type" kriegen. In meinem Bild sehen wir den Pfad zu dem Befehl ls nicht, da er mehrere Antworten dazu hat. Um also alle Informationen zu "ls" zu sehen mit type geben wir das folgende ein:

type -a ls


Das Resultat ist die bereits bekannte Zeile und die zweite Zeile gibt an wo sich das Programm befindet im System.

which

apropos

whatis


type -> kann informationen zum Ort geben wo sich ein Befehl befindet

type -a ls -> soweit ich verstehe bei mehr als einer Möglichkeit notwendig, dass man alle varianten kriegt


which -> alternative um den Pfad zu einem Befehl angezeigt zu kriegen


apropos oder man -k ->


whatis oder man -f ->