Linux Systeme

Anpassen der Arbeitsumgebung in einer Shell-Sitzung

Hier beschäftigen wir uns mit den Möglichkeiten die Sitzungen in der Shell nach unseren Bedürfnissen anzupassen.

Umgebungsvariablen

Viele Programme arbeiten mit so genannten Umgebungsvariablen. Diese Variablen beeinflussen, bzw. überschreiben oft die Konfiguration eines Programms. Andere Variablen dienen der Information über die aktuelle Sitzung. Beispielsweise können wir auch über Variablen herausfinden welcher Benutzer derzeit angemeldet ist, in welchem Arbeitsverzeichnis man sich derzeit befindet, welche Sprache der Benutzer bevorzugt usw.

VARNAME=WERT Eine Variable kann einfach durch eingabe des Variablennamens und Zuweisung per = gesetzt werden. Diese Variablen sind dann allerdings nur in dieser geöffneten Shell verfügbar.
VARNAME=$(BEFEHL) Die können auch die Ausgabe eines Befehls als Wert für eine Variable nutzen.
echo $VARNAME Der Zugewiesene Wert einer Variable kann über den Befehl echo ausgegeben werden.

export VARNAME=WERTOft wird für die Ausführung eines Befehls eine eigene Shell gestartet. Variablen die wie oben gesetzt wurden sind dann nicht verfügbar. Um dies zu ändern kann man Variablen exportieren. So sind sind sie auch für Child-Shells verfügbar.

printenv Dieser Befehl kann dazu genutzt werden die aktuell gesetzten Umgebungsvariablen anzuzeigen. Es werden jedoch nur exportierte Variablen angezeigt!
printenv LANG Ausgabe der aktuell bevorzugten Sprache
printenv PATH Ausgabe der PATH - Variable. Diese Variable ist besonders wichtig. Hier werden durch : getrennt alle Verzeichnisse aufgelistet in denen die Shell nachsehen soll, ob ein bestimmtes Progamm vorhanden ist.

Alle diese Variablen können Sie auch in der Arbeit mit der Shell nutzen:
SRC=/usr/share/doc/vim
DST=$HOME/vim-doc
echo "Kopiere Daten von $SRC nach $DST"
mkdir $DST
cp --verbose $SRC/* $DST
Weitere Infos auch unter https://wiki.ubuntuusers.de/Umgebungsvariable/typische_Anwendungsf%C3%A4lle/
Aufgabe 1.1
  • Erstellen Sie ein Verzeichnis mit dem Namen scripts in Ihrem Homeverzeichnis
  • Erstellen Sie eine neue Datei ~/scripts/lshome mit vi
  • Die Datei lshome soll ein Shell-Script sein, dass immer ein Long-Listing ihres Homeverzeichnisses durch den Befehl ls ausführt und alle Dateien und Verzeichnisse nach Änderungsdatum sortiert auflistet. Die Ausgabe soll jedoch mit head auf die ersten 10 Zeilen gefiltert werden.
  • Die neue Datei muss natürlich ausführbar sein!
  • Erweitern Sie nun die Variable PATH, dass auch das Verzeichnis für ~/scripts nach Befehlen durchsucht wird.
  • Wechseln Sie in Ihr Homeverzeichnis und geben Sie den Befehl lshome ein.
Mögliche Lösung
	cat ~/scripts/lshome
	#!/bin/bash
	ls -lt $HOME | head
	
	export $PATH="$PATH:~/scripts"
	lshome
	insgesamt 184
drwxr-xr-x  2 zaunerj zaunerj  4096 21. Aug 14:56 scripts
drwxr-xr-x  2 zaunerj zaunerj  4096 21. Aug 13:32 backup
drwxr-xr-x  2 zaunerj zaunerj  4096 21. Aug 13:32 bin
drwx------  7 zaunerj zaunerj  4096 21. Aug 13:30 example-data
drwxr-xr-x  2 zaunerj zaunerj  4096 21. Aug 13:16 demo-condition
drwxr-xr-x  4 zaunerj zaunerj  4096 13. Aug 08:15 Videos
drwxr-xr-x  8 zaunerj zaunerj  4096 12. Aug 15:57 Downloads
drwxr-xr-x  4 zaunerj zaunerj  4096 24. Jul 06:57 tmp
drwxr-xr-x  2 zaunerj zaunerj  4096  9. Jul 09:42 vim-doc	
	
Aufgabe 1.2
  • Erzeugen Sie eine Variable mit dem Namen D aus der Ausgabe von date. Die Ausgabe muss so formatiert sein, dass das Datum im Format JJJJMMDD ausgegeben wird.
  • Erstellen Sie - falls nicht vorhanden - in Ihrem Homeverzeichnis die Verzeichnisse backup und log
  • Mit tar können Sie eine Sicherung eines Verzeichnisses machen. Erstellen Sie so eine Sicherung aus dem Verzeichnis /etc in das Backup-Verzeichnis mit einem sinnvollen Dateinamen wie etwa etc-JJJJMMDD.tar unter der Verwendung der Variable D
  • Erweitern Sie den Befehl damit Standard-Ausgabe in eine Logdatei in das Log-Verzeichnis mit dem Namen JJJJMMDD.log geschrieben wird und eventuelle Fehler in die Datei JJJJMMDD.err im Log-Verzeichnis. Durch die Option -v für tar können Sie auch eine ausführliche Information ausgeben welche Dateien in das Sicherungsarchiv aufgenommen werden.
Mögliche Lösung
D=$(date +"%Y%m%d")
echo "Datum: $D"

cd 
if ! [ -d backup ]; then mkdir -v backup; fi
if ! [ -d log ]; then mkdir -v log; fi

tar -cf backup/etc-$D.tar /etc

tar -cfv backup/etc-$D.tar /etc > log/$D.log 2> log/$D.err
	
Aufgabe 1.3
  • Wenn eine entsprechende Übersetzung vorliegt, geben Befehle ihre Meldungen oder auch die Kurzhilfe in der vom Benutzer bevorzugten Sprache aus.
    Prüfen Sie ihre aktuell konfigurierte Sprache durch Ausgabe der Umgebungsvariable LANGUAGE
  • Lassen Sie sich die Kurzhilfe von ls ausgeben.
  • Überschreiben Sie die Sprache mit einem gültigen Sprachcode (z.B. fr=französisch, es=spanisch usw)
  • Geben Sie nun die Kurzhilfe erneut aus.
    Beachten Sie bitte dass nicht für jede Sprache der Hilfetext komplett übersetzt ist. Fehlende Übersetzungen werden gewöhnlich englisch dargestellt.
Mögliche Lösung
echo $LANGUAGE
de_AT:de

ls --help | tail -12
ist. Die Umgebungsvariable LS_COLORS kann die Einstellungen verändern.
Verwenden Sie den Befehl dircolors(1), um sie zu setzen.

Rückgabewert:
 0  wenn alles in Ordnung,
 1  bei kleineren Problemen (z. B. kein Zugriff auf Unterverzeichnis),
 2  bei großem Ärger (z. B. kein Zugriff auf Kommandozeilenargument).

Onlinehilfe für GNU coreutils: 
Melden Sie Übersetzungsfehler für %s an 
Die vollständige Dokumentation ist hier: 
oder auch lokal mittels „info '(coreutils) ls invocation'“


LANGUAGE=fr
zaunerj@deb-nb-jz:~$ ls --help | tail -12
modifier les paramètres. Utilisez la commande dircolors(1) pour la définir.

État de sortie :
 0  en cas de succès,
 1  en cas de problème mineur (comme impossible d'accéder à un sous-répertoire),
 2  en cas de problème majeur (comme impossible d'accéder à un argument de ligne
                               de commande).

Aide en ligne de GNU coreutils : 
Signalez les problèmes de traduction à : 
Documentation complète 
ou disponible localement via: info '(coreutils) ls invocation'

	

Prompt

Der Prompt (die Eingabeaufforderung) wird bei der Arbeit mit der Shell verwendet. Häufig wird hier der Benutzername gefolgt von einem @ und dem Namen des Systems verwendet.
Auch hierfür wird einfach eine Umgebungsvariable verwendet, und zwar die Variable PS1.
Überschreiben Sie in einer Sitzung die Variable PS1 (verwenden Sie am Besten immer die "):
PS1="Befehl eingeben: "
Dieser nun eingestellte Prompt ist jedoch nicht sehr sinnvoll :-)
Besser ist es, wenn wir den Prompt auch für Informationen nutzen, die wir benötigen (könnten). Daher ist das aktuelle Arbeitsverzeichnis und der aktuelle Benutzer meist im Prompt enthalten. Dies wird durch spezielle Steuercodes welche als Variablen dienen erreicht: >
Variable Ausgabe
\a das ASCII bell Zeichen (07)
\A Uhrzeit im 24-Stunden Format (hh:mm)
\d Datum in "Wochentag Monat Tag" z.B., "Mit Mai 26")
\e ASCII escape Zeichen (033)
\h Hostname auf dem die Shell läuft bis zum ersten "."
\H Hostname komplett
\j Anzahl der Jobs in der Shell
\l Das tty, auf dem die Shell läuft
\n Neue Zeile
\t Uhrzeit im 24-Stunden Format (hh:mm:ss)
\T Uhrzeit im 12-Stunden Format (hh:mm:ss)
\r carriage return
\s Name der verwendeten Shell (sh, bash, ..)
\u Name des Nutzers, der die Shell gestartet hat
\v Version der bash (z.B. 2.00)
\V Release der bash, Version, Patchlevel
\w momentanes Arbeitsverzeichnis
\W letzte Komponente des Arbeitsverzeichnisses
\! Aktuelle History-Nummer
\# Aktuelle Befehls-Nummer
\$ Wenn root ein "#", sonst ein "$"
\\ Backslash
\nnn Zeichen entsprechend der oktalen Zahl nnn
\[ Beginn einer Sequenz von nicht-darstellbaren Zeichen
\] Ende einer Sequenz von nicht-darstellbaren Zeichen
\@ Aktuelle Zeit im 12-Stunden am/pm Format
PS1="\@ auf \h: "
Aufgabe 2.1
Erstellen Sie sich ein beliebiges individuelles Prompt.
Dokumentieren Sie den verwendeten Formatstring.
Aufgabe 2.2
Melden Sie sich als User root an.
Passen Sie das Prompt des Users an, damit die Farbe im Prompt rot wird.
Wie Farben verwendet werden können und welche Codes für die Farben notwendig sind finden Sie unter https://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/

Alias

Manchmal kommt es vor, dass man Befehle immer wieder mit den selben Parametern aufruft. Um sich dies etwas einfacher machen zu können gibt es so genannte Aliase.
Man erstellt sich dabei einfach einen neuen Namen (oder manchmal verwendet man auch den bestehenden) und fügt diesem beliebige Optionen an. Beim nächsten Aufruf wird dann genau dieses Set an Befehl/Optionen verwendet und um die weiteren möglichen Optionen und Argumente des Befehls ergänzt.

alias Mit diesem Shellinternen Befehl können wir gesetzte Aliase anzeigen und neue erstellen.
alias
alias lsl="ls -lh"
lsl
Mit dem Befehl unalias können wir einen gesetzten Alias wieder entfernen
unalias lsl
lsl # führt jetzt zu einem Fehler
Aufgabe 3.1
Erstellen Sie einen Alias mit dem Namen ... Bei Eingabe dieses Alias soll cd .. ausgeführt werden.
Aufgabe 3.2
Erstellen Sie einen Alias mit dem Namen .... Bei Eingabe dieses Alias soll cd ../.. ausgeführt werden.
Aufgabe 3.3
Erstellen Sie einen Alias mit dem Namen l. Bei Eingabe dieses Alias soll ls -laH ausgeführt werden.
Aufgabe 3.4
journalctl wird verwendet um auf die Systemlogs zuzugreifen.
Als normaler User können Sie nur auf Ihre eigenen Logs zugreifen. Damit Sie Zugriff auf die Systemlogs bekommen müssen Sie Mitglied der Gruppe systemd-journal sein.
Fügen Sie Ihren User dieser Gruppe hinzu und starten Sie anschließend Ihre Desktop Sitzung neu.
journalctl verwendet per Default den Pager less um die Ausgaben Seitenweise anzuzeigen. Wenn wir das nicht möchten, könnten wir immer das Argument --no-pager mit angeben.
Damit dies immer geschieht können wir einen erstellen Sie einen Alias mit dem Namen journalctl. Bei Eingabe dieses Alias soll journalctl --no-pager ausgeführt werden.
Aufgabe 3.5
Erstellen Sie einen Alias mit dem Namen grep. Bei Eingabe dieses Alias soll grep --color=auto ausgeführt werden.
Dadurch werden die Treffer in der Zeile immer hervorgehoben.

History

Mit Hilfe der History kann man sich die Arbeit in der Konsole erheblich erleichtern. Meist wird die History automatisch für Sie gespeichert. Dies geschieht immer dann wenn Sie eine Sitzung beendet wird. Wird diese also nicht "sauber" - beispielsweise nur durch schließen eines Terminalfensters - beendet, kann auch die History nicht für spätere Sitzungen gesichert werden.
Die häufigste Nutzung der History ist durch die Pfeiltasten. Durch drücken von Pfeil-Auf/Pfeil-Ab kann durch die zuletzt eingegebenen Befehle geblättert werden. Die Befehle können dann eventuell angepasst und erneut ausgeführt werden.
Die History ist auf eine gewisse Anzahl an Einträgen begrenzt. Wie dies bei Ihnen konfiguriert ist können Sie mit der Umgebungsvariable HISTSIZE prüfen bzw. einen neuen Wert vergeben.

history - Mit diesem Befehl können Sie sich die zuletzt eingegebenen Befehle ausgeben lassen.
history | grep ls - Die History lässt sich natürlich auch mit Hilfe des Piping-Konzeptes einfach per grep filtern.

Eine weitere nützliche Funktion ist auch die Möglichkeit den Zeitpunkt der Ausführung mit in die History aufzunhemen. Auch dies kann wieder mit einer Umgebungsvariable geschehen. Nämlich mit HISTTIMEFORMAT.
HISTTIMEFORMAT="%F %T "
history

Mit Hilfe von !? SUCHSTRING wird in der History nach dem Begriff SUCHSTRING gesucht und bei einem Treffer der letzte so eingegebene Befehl erneut ausgeführt.
Mit Hilfe von !nnn (nnn steht für die Zeilennummer) wird der Befehl aus dieser Zeile erneut ausgeführt.

Weitere Informationen finden Sie mit history --help, man history oder Online unter https://wiki.ubuntuusers.de/Bash/.
Aufgabe 4.1
Finden Sie die Option heraus, mit der man die aktuelle Sitzungshistory sofort abspeichern kann.
Testen Sie dies indem sie ein weiteres Terminal öffnen und prüfen ob die letzten Befehle vorhanden sind.
Aufgabe 4.2
Aktivieren sie die Zeitangabe für Ihre History
Aufgabe 4.3
Setzen Sie die Größe der History auf 5000 Befehle
Aufgabe 4.4
Ermitteln Sie aus der History wie oft Sie den Befehl vi verwendet haben.

Login und Shell-Initialisierung

Die oben vorgestellten Konzepte werden meist nicht nur für eine Sitzung angewendet sondern man möchte beispielsweise gesetzte Aliase oder eingestellte Umgebungsvariablen immer automatisch in jeder Sitzung verfügbar haben. Dies kann mit einem Eintrag in den entsprechenden Dateien erreicht werden.

Man unterscheidet grundsätzlich Login-Shells, Interaktive Shells und Batch-Shells.
Login Shell: wird gestartet wenn man sich in der Text-Konsole anmeldet, mit einem grafischen Login-Manager anmeldet oder beispielsweise mit su -l explizit eine Login-Shell anfordert.
Interaktive Shell: eine Shell ist dann interaktiv wenn ein Benutzer direkt diese für die Ein- und Ausgabe nutzt. Eine Login-Shell über eine Text-Konsole ist auch eine interaktive Shell.
Batch Shell: Shells die aufgrund eines Scripts oder über eine grafische Konsole gestartet wurden.

Je nachdem welcher Shell-Typ aufgerufen wurde werden automatisch verschiedene Scripts abgearbeitet um für den User die Umgebung entsprechend vorzubereiten. In diesen Scripts wird beispielsweise der Pfad gesetzt in dem definiert wird wo nach ausführbaren Befehlen zu suchen ist, es wird der Prompt gesetzt, Aliase definiert und vieles mehr.

Initialisierung der Benutzerumgebung
Aufgabe 5.1
Tragen Sie die oben angebenen Aliase in Ihre persönliche .bashrc
Aufgabe 5.2
Aktivieren Sie die Zeitstempel für die History in ihrer persönlichen .bashrc
Aufgabe 5.3
Aktivieren Sie den Wert für die History-Größe auf 3000 für alle User in einer neuen Datei /etc/profile.d/history.sh
Aufgabe 5.4
Prüfen Sie durch Start einer neuen Sitzung ob die Konfiguration übernommen wurde
Aufgabe 5.5
Setzen Sie den Prompt des Users root auf rot über die .bashrc des Users root.
Aufgabe 5.6
Mit dem Befehl df (Disk free) kann man sich die aktuelle Festplattenbelegung ansehen.
Die Größe wird dabei in Blöcken ausgegeben. Mit der Option -h kann man dies auf "Human Readable" umstellen. Damit wird die Größe in KB, MB, GB usw angezeigt.
Setzen Sie einen Alias über die persönliche .bashrc des Users root mit dem Namen df. Dieser soll df -h ausführen.
Aufgabe 5.7
Prüfen Sie durch Start einer neuen root-Sitzung ob die Konfiguration übernommen wurde