Topic 105.1

Topic 105.1: Anpassung und Einsatz von Shell-Umgebungen

Hochgewichtete Themen in der Prüfung LPI 102:

Benutzerverwaltung, Zeitsteuerung, Netzwerk, Sicherheit

Shells, Skripte und Datenverwaltung

Shellarten und Eigenschaften von Variablen

Welche Shells kennt Linux neben der 'bash'?

-> Siehe Datei /etc/shells

Hier können nach belieben andere Shells als Login-Shell definiert werden.

Wichtige Frage: Welche Features bietet meine Shell, inwieweit unterstützt Sie den Benutzer?

a) Für interaktive Nutzung: Komfortfunktionen (History, Autovervollständigung, Kommandozeileneditor)

b) Als Interpreter von Skripten: Beispielesweise kann die sh/dash nicht rechnen, so das man auf externe Befehle expr und bc zugrückgreifen muss, die bash bietet dagegen das interne Kommando let

Worin bestehen die Unterschiede bei Umgebungs- und Shellvariablen?

Umgebungsvariablen werden automatisch exportiert (vererbt), sie stehen Kindanwendungen (und damit auch Subshells) damit sogleich zur Verfügung.

Die Shellvariablen werden durch einen Benutzer oder ein Skript deklariert, diese Typfestlegung kann z.B. mit declare erfolgen:

  • Ein Variable als Zahl deklarieren: declare -i zahl

  • Ein Variable radonly markieren: declare -r wichtig=Linux

  • Darüberhinaus kann declare alle definierten Funktionen ausgeben: declare -f

ACHTUNG: Das veraltete Kommando typeset kann ebenso wie declare Werte und Eigenschaften für Variablen setzen!

Aliase (Kommandozeilen-Kürzel)

Ergebnis sind eigene Kommandos, die als eine Art Shell-Builtin dann verfügbar sind, sie erleichtern die Arbeit ungemein.

Genau wie Shell-Builtins werden sie VOR dem eigentlichen Kommando ausgeführt.

Alias = Kürzel für lange Kommandozeilen

Syntax: alias kürzel=‘Kommandozeile‘

Beispiele:

  • alias l=‘ls -ltrc‘ # Optionen: Langes Format, zeitsortierte, reverse Ausgabe

  • alias rm=‘rm -i‘

  • alias cp=‘cp -i‘

  • alias mv=‘mv -i‘

  • alias ftpmount=‘curlftpfs lpic1.example.test ~/ftpdir > /dev/null 2>&1‘

Am besten gleich in der ~/.bashrc festlegen! (Bei Debian: u.a. „force_color_prompt=yes“ aktivieren)

Nach Änderungen der Datei muss mit (‘source‘) oder (‘. ‘) der Inhalt in der elternlichen Prozessumgebung aktiv gesetzt werden.

Des weiteren:

  • Prüfung, ob es sich um einen Alias handelt: type rm

  • Alle definierte Aliasen anzeigen: alias

  • Einen Alias temporär aus der Prozessumgebung entfernen: unalias <KÜRZEL>

  • Alle Aliase temporär aus der Prozessumgebung entfernen: unalias -a

  • Einen Alias temporär für einmalige Ausführung übergehen: \KÜRZEL

BEISPIEL:

tux@deb7:~$ touch datei{1,2,3,4}-{a,b,c,d}.txt
tux@deb7:~$
tux@deb7:~$ ls -1 datei[1-4]* | wc -l

tux@deb7:~$ rm datei*
rm: reguläre Datei „datei“ entfernen? j
rm: reguläre leere Datei „datei1-a.txt“ entfernen? j
rm: reguläre leere Datei „datei1-b.txt“ entfernen? j
rm: reguläre leere Datei „datei1-c.txt“ entfernen? ^C
tux@deb7:~$
tux@deb7:~$ \rm datei*
tux@deb7:~$
tux@deb7:~$ ls -1 datei[1-4]* | wc -l
ls: Zugriff auf datei[1-4]* nicht möglich: Datei oder Verzeichnis nicht gefunden

Zum Alias "ftpmount"

Voraussetzung (als root):

  • Installiertes Paket „curlftpfs“: apt-get install curlftpfs

  • Beim ersten Mal: modprobe fuse

  • Benutzer in sekundäre Gruppe „fuse“: usermod -aG fuse tux

Benutzung als Nutzer „tux“:

  • Nach dem Neueinloggen eine Datei ~/.netrc erzeugen:

    machine lpic1.example.test
    login myUsername
    password myPassword
  • Rechte anpassen: chmod 600 ~/.netrc

  • Mountpunkt erzeugen: mkdir ~/ftpdir

  • Den oben definierten Alias aufrufen: ftpmount

  • Optional: SymLink für bequemen Zugriff erzeugen:

    ln  -s  ~/ftpdir/HandOuts/Pemmann\ Axel/  LinuxKurs

Funktionen

Problemstellung: Die Shell kann Rückgabewerte ($?) nur einmal auswerten, anders sieht es Funktionen aus, hier kann mit return mehrfach auf Rückgabewerte reagiert werden. Außerdem kann man öfter verwendete, gleiche Kommandozeilen zusammenfassen und als eigenen Befehl definieren.

Syntax:

a) Langform

function NAME(){
	Kommando 1
	Kommando 2
	Kommando n
}

b) Kurzform 1

NAME(){
	Kommando 1
	Kommando 2
	Kommando n
}

c) Kurzform 2

function NAME {		# ACHTUNG: Zwischen dem Namen und der
	Kommando 1	# sich öffnenden Klammer muss eine Leerzeichen
	Kommando 2	# stehen!
	Kommando n
}

BEISPIELE:

In ein Verzeichnis wechseln und Inhalt ausgeben:

function cl () {
	cd  $1
	ls -F
}
BENUTZUNG:   cl /etc/ppp

Demonstration, dass Alias VOR Funktionen ausgeführt werden

function aliastest(){
	type cp
	type ftpmount
	rm $1
	}
BENUTZUNG:   rm datei

Für Firewallscript Befehle für das Öffnen und Schließen definieren

open(){
	iptables  -P  INPUT ACCEPT
	iptables  -P  OUTPUT ACCEPT
	iptables  -P  FORWARD ACCEPT
	iptables  -F
	iptables  -X
	iptables  -Z
}
close(){
	iptables  -P  INPUT DROP
	iptables  -P  OUTPUT DROP
	iptables  -P  FORWARD DROP
	iptables  -F
	iptables  -X
	iptables  -Z
}

AUFGABE: Suchen Sie im Internet nach dem „Shell Shock“-Bug der bash, testen Sie, ob Sie anfällige Software haben.

Weitere Funktionen finden sich in fork-Bomben.

Konfigurationsdateien für Login und bash

Je nach Shell werden unterschiedliche Dateien beim Systemstart abgearbeitet. Für was steht „rc“? Es kann "run command" oder "ressource control" bedeuten.

a) Systemweite Dateien:

  • Zur Festlegung der PATH-Variablen (evl. auch umask-Wert): /etc/profile

    --> Ziel: Nutzerprofil mit sinnvollen Mindestwerten initiieren
  • Einstellungen zu Passwortkomplexität und evl. auch umask-Wert: /etc/login.defs

  • Initiialisierung der Bash: /etc/bashrc bzw. /etc/bash.bashrc -→ wobei mehr Möglichkeiten als bei der Prompt-Initialisierung der sh via /etc/profile bestehen: PS1="Eingabe \W: "

    PROMPT-AUSSEHEN:
    Eingabe ~: cd /usr/share/doc
    Eingabe doc:
    Eingabe doc:
  • Festlegung von Tastaturkürzeln: /etc/inputrc

Welchen weiteren Unterschied gibt es bei der Abarbeitung der beiden folgenden Dateien?

  • /etc/profile: Wird nur ein Mal beim Login abgearbeitet (Bei Änderungen logout/login erforderlich)

  • /etc/bashrc: Wird mit jedem neuen bash-Aufruf (egal ob als Subshell oder durch Starten einen neuen Terminalemulators, z.B xterm)

b) User definierte Startupdateien

MERKTIPP: Von historischer Entwicklung der Shells ausgehen:

  • Die Parallele der /etc/profile: ~/.profile → Handelt es sich um einen moderneres System mit einer bash, dann werden andere Dateien VORHER abgearbeitet (siehe unten bei "bash-spezifische Konfigdateien")!

  • Die Parallele der /etc/iniputrc: ~/.inputrc → Wird diese Datei jedesmal oder nur beim Login ausgewertet? ANTWORT: Jedesmal mit Öffnen einer neuen Shell

    Zur Bildung der Tastenkürzel siehe auch
    http://www.pro-linux.de/kurztipps/2/1256/tasten-mit-kommandos-belegen.html
    Beispiel:
    	cat ~/.inputrc
    		"\e[11~": "ls -ltrc\n"
    		Control-h: "cd ~"
    Nach dem Abspeichern aktiv setzen:  bind -f ~/.inputrc
    Benutzung:
    	- Zeile 1: Taste F1 drücken, um ‚ls -ltrc‘ sofort auszuführen
    	- Zeile 2: Strg + g drücken, um ‚cd ~‘ auf den Prompt zu legen
    Siehe dazu auch „help bind“ sowie  „man  readline“
  • bash-spezifische Konfigdateien

    • ~/.bash_profile (wird falls vorhanden beim Login NACH der /etc/profile abgearbeitet) → Was bedeutet: Nutzer-definiert Konfigs gehen systemweiten vor!

    • ~/.bash_login (wird nur beim Login)

    • ~/.bash_logout (falls sie existiert, wird sie beim Logout ausgeführt)

Weitere Unterscheidungen von Shell-Arten sind möglich:

  • interactive

  • non-interactive

  • login

  • non-login

Fragen zur Wiederholung

  1. Schreiben Sie Aliase für die folgenden Kommandos:

    • apt-get update → Kürzel: au alias au='apt-get update'

    • apt-cache search → Kürzel: as alias as='apt-cache search'

    • apt-get install → Kürzel: ai alias ai='apt-get install'

  2. Fasssen Sie die beiden folgenden Kommandozeilen zusammen, so dass sie ähnlich einen Shellbuiltin-Befehl in der Bash-Umgebung (kein Skript) zur Verfügung stehen. Geben Sie dem neuen Befehl den Namen 'backup.etc'.

    tar czvf /root/etc-backup-`date +%F`.tar.gz  /etc
    md5sum /root/etc-backup-`date +%F`.tar.gz  >> /root/md5sums.txt
    LÖSUNG:
     backup.etc(){
    tar czvf /root/etc-backup-`date +%F`.tar.gz  /etc
    md5sum /root/etc-backup-`date +%F`.tar.gz  >> /root/md5sums.txt
    }
  3. Setzen Sie der Variablen "zahl1" den Wert 3, der Variablen "zahl2" den Wert 5, berechnen Sie danach mit Hilfe von 'let' das Produkt, wobei Sie das Ergebnis bitte in eine Variable namens "produkt" speichern.

    LÖSUNG:
    zahl1=3	alternativ:	declare -i zahl1=3
    zahl2=5	alternativ:	declare -i zahl2=5
    let produkt=$zahl1*$zahl2    alternativ:       let produkt=zahl1*zahl2
    echo $produkt
  4. Starten Sie mit 'sh' eine Subshell. Steht die Variable 'produkt' hier zur Verfügung?

    --> Nein
  5. Wenn nicht, warum? Sorgen Sie in dem Falle dafür, dass sie auch hier vorhanden ist.

    --> Die Variable wurde ja nicht exportiert.
    --> export produkt
  6. Entfernen Sie die Variable 'produkt' komplett.

    LÖSUNG:
    unset produkt
    (ein "export -n produkt" würde ja nur den Export zurücknehmen, so
    so dass es sich nicht mehr um eine Umgebungsvariable handelt)
  7. Entfernen Sie temorär den Alias 'ai' aus Ihrer Shellumgebung

    unalias ai
  8. Beachten Sie: Das Shellbuiltin 'builtin' arbeitet nicht mit Aliasen, sondern Funtionen:

    function cd(){
        cd /tmp
        echo "Nach /tmp gewechselt."
     }
    Die eben definierte Funktion umgehen:
    builtin cd /usr/share/doc
  9. Wie kann einmalig umgangen werden, dass mit 'rm' der Alias 'rm -i' ausgeführt wird?

    LÖSUNG: Einen Backslash voranstellen:   \rm
  10. Welche Aufgabe hat die Datei '/etc/inputrc' bzw. '~/.inputrc'?

    => Eigene Hotkeys festlegen