This page contains my brain dump while learning for the LPIC-1 Module 102 certificate. The notes contain German comments – please just ignore them if you don’t speak that language.
Disclaimer: This page does not contain hints about what the exam contained in my case. I won’t tell you! :-)

Sorry about the bad formatting – I just copied and pasted this stuff from my private wiki.

====== LPIC 1 - Prüfung 102 ======
===== 105 - Shells, Skripte und Datenverwaltung =====
==== 105.1 - Die Shell-Umgebung anpassen und verwenden ====
  * /etc/profile
  * env
  * export
  * set
  * unset
  * .bash_profile
  * .bash_login
  * .profile
  * .bashrc
  * .bash_logout
  * function
  * alias
  * lists
  * Eine Shell namens bash = Bourne Again Shell, die weit verbreiteste Shell
  * sh = Vorfahre der Bash
  * ksh = Korn-Shell (Kombination von sh- mit C-Shell)
  * csh = vom Syntax her an C angelehnt
  * zsh = ähnelt der ksh, bietet aber höheren Funktionsumfang
  * In der Prüfung werden nur Fragen zur Shell gestellt.
  * Umgebungs- und Shell-Variablen
  * Umgebungsvariablen gelten für alle Shells, die ein Benutzer verwendet. Beim Aufruf einer Subshell werden diese Variablen weiter vererbt. Bei Umgebungsvariablen werden i.d.R. Großbuchstaben verwendet.
  * Shell-Variablen müssen in jeder Shell neu deklariert werden. Werden meist kleingeschrieben.
  * Shell-Variable: a=5
  * b=6
  * let c=$a+$b
  * echo $c=$a+$b  -> Ausgabe: 11=5+6
  * Diese Variablen stünden in einer Sub-Shell nicht zur Verfügung.
  * Durch einen Variablenexport stünden die Variablen in untergeordneten, jedoch nie in übergeordneten Shells zur Verfügung.
  * Ein Export bewirkt NICHT, dass aus einer Shell-Variable eine Umgebungsvariable wird.
  * export c
  * sh
  * echo $c
  * Ausgabe: 11
  * Zweite Methode für den Export: export Z=1000
  * sh
  * echo $Z
  * Ausgabe: 1000
  * Variablendefinition und -export können also in einem Streich erfolgen.
  * set zeigt an, welche Umgebungs- und Shell-Variablen die aktuelle Shell verwendet.
  * Nur Umgebungsvariablen anzeigen: env
  * Umgebungsvariable definieren: export VARIABLE=bla
  * Variablen löschen: unset a (oder alternativ: ab- und anmelden, da es ja nur Shell-Variablen sind)
  * alias tx="tar -xvzf" definiert einen Alias für den angegebenen Befehl.
  * Mehrere Befehle können in einem Alias definiert werden, in dem ein Komma verwendet wird: alias frei="free; df -h"
  * Die Eingabe von alias ohne Parameter bewirkt die Auflistung aller definierten Aliase.
  * Definieren von Funktionen ist möglich:
  * function addiere ()
  * {
  * let summe=$1+$2
  * echo -e "Die Summe ist $summe"
  * }
  * addiere 3 4 ergibt als Ausgabe: Die Summe ist 7
  * In einer Zeile definiert: function addiere () { let summe=$1+$2; echo "Die Summe ist $summe"; }
  * Man könnte sogar eine Funktion nach einem Bash-Kommando benennen:
  * function ls ()
  * {
  * builtin ls -lisa
  * }
  * Damit die Funktion sich nicht versehentlich selbst aufruft, wird bei der Übergabe des Kommandos mit builtin klargestellt, dass es sich hier um ein bash-internes Kommando handelt. Es würde sonst zu einer Endlosschleife kommen, die bei jedem Aufruf an sich selbst Arbeitsspeicher anfordert.
  * Konfigurationsdateien, die für alle Anwender Gültigkeit besitzen, befinden sich im Verzeichnis /etc/ und beginnen niemals mit einem Punkt.
  * Die individuellen Konfigurationsdateien für den jeweiligen User befinden sich im entsprechenden Heimatverzeichnis und beginnen immer mit einem Punkt.
  * /etc/profile ist die erste Konfigurationsdatei, die bei der Anmeldung (für die Login-Shell) eines Benutzers eingelesen wird. Sie enthält erste Umgebungsvariablen und die erste PATH-Anweisung. Änderungen in dieser Datei erfordern eine neue Anmeldung des Benutzers.
  * /etc/bashrc kann von der .bashrc eines Benutzers geladen werden. Sie enthält systemweite Einstellungen, Aliase und Funktionen. Diese Datei wird beim Start jeder Shell neu eingelesen und erfordert deshalb nach Änderung keine Neuanmeldung des Benutzers.
  * (In Ausführungsreihenfolge:)
  * ~/.bash_profile wird, falls vorhanden, nur bei einer Neuanmeldung eingelesen und sofort nach /etc/profile ausgeführt. Sie beinhaltet zusätzliche Pfadanweisungen (z. B. das Heimatverzeichnis), den zu verwendenden Standardeditor und benutzerspefizische Umgebungsvariablen.
  * ~/.bash_login ist eine Alternative zu .bash_profile und wird auch nur dann abgearbeitet, wenn die Datei .bash_profile nicht existiert. Auch diese Datei wird nur während der Anmeldung verwendet. = vom Inhalt her wie .bash_profile
  * ~/.profile ist die ursprüngliche Konfigurationsdatei der Bash. Sie wird nur während der Anmeldung (für die Login-Shell) eingelesen, und das auch nur dann, wenn weder eine .bash_profile noch eine .bash_login-Datei im Verzeichnis des Benutzers existieren. = vom Inhalt her wie .bash_profile und .bash_login.
  * ~/.bashrc ist die andere, ursprüngliche Konfigurationsdatei der Bash. Sie wird in jedem Fall eingelesen, und zwar auch beim Aufruf einer neuen Shell. Nach Änderungen in dieser Datei ist entsprechend keine Neuanmeldung des Benutzers erforderlich. Sie beinhaltet im Wesentlichen Aliase und Funktionen.
  * ~/.bash_logout ist eine optionale Datei, die ausgeführt wird, wenn der Benutzer sich abmeldet. Sie könnte z. B. den Monitor löschen.
  * ~/.inputrc enthält Definitionen, welche die Tastatur betreffen. So wird hier auch der Verwendungszweck von Funktionstasten definiert u.Ä. Es ist auch möglich, in dieser Datei Hotkeys für häufig verwendete Befehle zu definieren. Z. B. könnte man mit [Strg] + [H] ins Heimatverzeichnis wechseln wollen. Das erreichen wir durch folgenden Eintrag:
  * Control-h: "cd ~"
  * Eine systemweite /etc/inputrc ist heutzutage eigentlich Standard bei fast allen Systemen.
  * /etc/skel dient als Skeleton-Verzeichnis als Grundgerüst/Skelett/Vorlage für das Heimatverzeichnis eines neuen Benutzers. Beim erstellen eines neuen Benutzers samt homes wird der Inhalt des Skeleton-Verzeichnisses dann nach /home/$USER kopiert und anschließend die Berechtigungen gesetzt.
==== 105.2 - Einfache Skripte anpassen oder schreiben ====
  * for
  * while
  * test
  * if
  * read
  * seq
  * Unser Beispielscript: vi add
  * let summe=$1+$2
  * echo "Die Summe aus $1 und $2 ist $summe"
  * Kommentare können mit einem vorangestellten "#" hinzugefügt werden: # blabla
  * Variante #1 der Ausführung: /bin/bash add 5 6
  * Ausgabe: Die Summe aus 5 und 6 ist 11
  * Variante #2 der Ausführung: source add 5 6
  * source ist ein Bash-internes Kommando.
  * Variante #3: chmod a+x add && Hinzufügen der ersten Zeile zum Script: #!/bin/bash
  * Diese s.g. "shebang!"-Zeile teilt der Shell mit, dass es sich um ein ausführbares Programm handelt und welche Umgebung für das Script benötigt wird.
  * /bin/bash ist der Interpreter.
  * Scripte mit administrativen Aufgaben erhalten meist die Dateirechte 700, damit ein normaler User weder lesen noch schreiben kann.
  * chmod 4700 add bewirkt, dass das Script im Sicherheitskontext des Programmbesitzesrs ausgeführt wird.
  * Somit kann ein normaler User das Script als root ausführen, wenn es denn dem root gehört.
  * In /usr/bin können Scripte abgelegt werden, die systemweit für jeden zugänglich sein sollen und oft verwendet werden.
  * Wenn ein Script ausgeführt wird, sort die shebang-Zeile (#!) dafür, dass eine neue Shell aufgerufen wird. Shell-Variablen, die zuvor nicht exportiert wurden, stehen in dieser neuen Umgebung (Sub-Shell) nicht zur Verfügung.
  * Umgekehrt bedeutet es auch, dass die Shell-Variablen, die mit Hilfe des Scripts ggf. gesetzt werden, nicht in der normalen übergeordneten Shell zur Verfügung stehen. Ein Export ist hier ja auch nicht möglich. Die Variablen müssten dann beispielsweise nach /tmp geschrieben werden, wenn diese nach Beendigung des Scripts noch zur Verfügung stehen sollen.
  * #!/bin/sh
  * echo Das Script wurde mit $0 gestartet
  * Echo Sie haben $# Parameter übergeben.
  * echo Der erste Übergabewert war $1.
  * echo Der zweite Übergabewert war $2.
  * Murks
  * echo Der aktuelle Errorlevel ist $?.
  * exit 0
  * Die Variable $0 enthält den Namen des aufrufenden Programms mit samt dem beim Start angegebenen Pfad.
  * $1 und $2 enthalten die Übergabewerte.
  * $# enthält die Anzahl der übergebenen Parameter.
  * Errorlevel 0 = alles war ok, 1 = Fehler, 127 = was spezielles.
  * #!/bin/sh
  * summe=0
  * while test $# -gt 0
  * do
  * let summe=summe+$1
  * shift
  * done
  * echo Die Summe Ihrer Eingaben ist $summe
  * unset summe
  * exit 0
  * summe = 0 setzt die Summe sicherheitshalber auf 0, falls es diese Variable schon vorher gegeben hat. Reine Sicherheitsmaßnahme.
  * shift bewirkt, dass anschließend die Werte der Übergabeparameter innerhalb Ihrer Variablen verschoben werden. Aus $2 wird somit $1, aus $3 wird $2 usw...
  * Abbruchbedingung = while test $# -gt 0 prüft, ob noch weitere Übergabeparameter vorhanden sind. Übersetzung: Solange (while) die Anzahl der verbleibenden Übergabeparameter ($#) greater than 0 ist (gt 0), tue (do)...
  * shift wird solange ausgeführt, bis diese Abbruchbedingung erreicht ist.
  * Wenn die Bedingung nicht mehr zutrifft, wird die Schleife verlassen und hinter dem done fortgesetzt.
  * gt = greater than
  * Anstatt while test.. kann man auch while [ $# -gt 0 ] schreiben. Hier wird "test" durch die eckigen Klammern ersetzt. Hier dürfen die Leerzeichen nicht fehlen! Die geöffnete eckige Klammer "[" ist ein Programm mit der Bezeichnung "[", nach dem nun mal ein Leerzeichen folgen muss. Alles, was danach kommt (also auch "]") sind nur Parameter für "[", die erwartet werden.
  * test -r <file> - Die Datei existiert ud ist lesbar (readable).
  * test -w <file> - Die Datei existiert und ist beschreibbar (writeable).
  * test -x <file> - Die Datei existiert und ist ausfüharbar (exexutable).
  * test -d <file> - Die Datei existiert und ist ein Verzeichnis (directory).
  * test -b <file> - Die Datei existiert und ist ein blockorientiertes Gerät (block).
  * test -c <file> - Die Datei existiert und ist ein zeichenorientiertes Gerät (character).
  * test -g <file> - Die Datei existiert und das SGID-Bit ist gesetzt.
  * test -k <file> - Die Datei existiert und das Sticky-Bit ist gesetzt.
  * test -u <file> - Die Datei existiert und das SUID-Bit ist gesetzt.
  * test -e <file> - Die Datei existiert (exists).
  * test -f <file> - Die Datei existiert und ist eine reguläre Datei (file).
  * test -L <file> - Die Datei existiert und ist ein symbolische rLink (link).
  * test <file1> -nt <file2> - file1 ist neuer als file2 (nt = newer than).
  * test <file1> -ot <file2> - file1 ist älter als file2 (ot = older than).
  * test <value1> -eq <value2> trifft zu, wenn value1 und value2 gleich sind (equal).
  * test <value1> -ne <value2> trifft zu, wenn die Werte unterschiedlich sind (not equal).
  * test <value1> -gt <value2> trifft zu, wenn value1 gröér als value2 ist (greater than).
  * test <value1> -ge <value2> trifft zu, wenn value1 größer oder gleich value2 ist (greater or equal).
  * test <value1> -lt <value2> trifft zu, wenn value1 kleiner ist als value2 (less than).
  * test <value1> -le <value2> trifft zu, wenn value1 kleiner oder gleich value2 ist (less or equal).
  * Befehlssubstitution: Ausgabe eines Befehls wird an einen anderen Befehl oder an eine andere Variable weiter gereicht.
  * Z. B.: for z in `find /home -name *.old` (Backquotes/Backticks!)
  * Z. B.: for z in $(find /home -name *.old) (Klammern -> Sub-Shell?)
  * Die Ausgabe des Befehls wird einzeln (also jedes einzelne Ergebnis) an die Schleife übergeben.
  * Escape-Zeichen: \
  * Escape-Zeichen: \a (alert, piept einmal)
  * \b (backspace)
  * \c (unterdrückt die Ausgabe des Newline-Zeichens)
  * \f (form feed, Leerseite)
  * \n (new line)
  * \r (carriage return)
  * \t (horizontal tabulator, entspricht 8 Leerzeichen)
  * \v (vertical tabulator, entspricht 8 Leerzeilen)
  * Text per Mail zustellen: echo "was testen" |mail -s Test root
  * if - fi, elif, else, case - esac, read, clear
  * echo -e "bla"; read operator; echo $operator; -> holt sich die eingabe des benutzers
  * case "$operator" in 
  * a)
  * let c=a+b
  * clear; echo $a + $b = $c;;
  * *)
  * clear; echo "*) ist das equivalent zu else"
  * exit1;;
  * esac
==== 105.3 - SQL-Datenverwaltung ====
  * insert
  * update
  * select
  * delete
  * from
  * where
  * group by
  * order by
  * join
  * SQL = Structured Query Language
  * SQL ist von der ISO und der ANSI standardisiert.
  * Vier Bereiche von SQL-Befehlen:
  * DQL (Data Query Language): Z. B. SELECT, ORDER BY, DISTINCT
  * DML (Data Manipulation Language): Z. B. INSERT, UPDATE, COMMIT, ROLLBACK
  * DDL (Data Definition Language): Z. B. CREATE TABLE, ALTER TABLE, DROP TABLE..
  * DCL (Data Control Language): GRANT, REVOKE
  * MySQL-Shell starten: mysql --user=root -h localhost --pasword
  * status; oder \s
  * help; oder \h
  * help contents;
  * help data types;
  * help VARCHAR;
  * show databases;
  * CREATE DATABASE kontakte;
  * USE kontakte;
  * CREATE TABLE rufnummern (
  * -> id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  * -> vorname VARCHAR(128),
  * -> nachname VARCHAR(128),
  * -> vorwahl VARCHAR(32), 
  * -> rufnummer VARCHAR(32)
  * -> );
  * INSERT INTO
  * -> rufnummern (id,vorname,nachname,vorwahl,rufnummer)
  * -> VALUES
  * -> (1,
  * -> 'Hans',
  * -> 'Panz',
  * -> '030',
  * -> '1234588'
  * );
  * Hinweis: Bei Eingabe des jeweils letzten Werts wird kein Komma gesetzt (siehe jeweils die vorletzte Zeile der beiden Beispiele).
  * Daten aus MySQL raus importieren: mysql> source e:/daten/rufnummern.sql
  * SELECT * FROM rufnummern;
  * SELECT vorname, nachname FROM rufnummern;
  * SELECT vorwahl, rufnummer FROM rufnummer WHERE vorname='Willi';
  * SELECT * FROM rufnummern WHERE id > AND id <4;
  * UPDATE rufnummern SET vorwahl = '123' WHERE vorname = 'Dieter';
  * UPDATE rufnummern SET vorwahl = '1234' WHERE id=2;
  * SELECT * FROM rufnummern ORDER BY nachname;
  * SELECT vorname, nachname FROM rufnummern ORDER BY vorwahl LIMIT 2;
  * GROUP wählt nur einen Repräsentanten pro gefundenen Datensatz aus: SELECT * FROM rufnummern GROUP BY vorwahl;
  * INSERT INTO kategorien (kategorie) VALUES ('Freunde');
  * DROP TABLE kategorien;
  * SHOW TABLES;
  * ALTER TABLE rufnummern ADD (kategirie_id INT(5));
  * CHECK TABLE rufnummern EXTENDED;
  * Beispiel für einen Subselect:
  * SELECT vorname, vorwahl, rufnummer FROM rufnummern
  * -> WHERE kategorie_ID IN
  * -> (SELECT id FROM kategorien
  * -> WHERE kategorie='Freunde'
  * -> );
  * Aliase in SQL-Befehlen gelten auch rückwirkend für den aktuellen Befehl. Allerdings kann der ausgeschriebene Tabellennamen dann nicht mehr innerhalb desselben Befehls verwendet werden. Beispiel:
  * SELECT r.vorname, r.nachname, r.vorwahl,
  * -> r.rufnummer, k.kategorie
  * -> FROM rufnummern r
  * -> LEFT JOIN kategorien k ON r.kategorie_id=k.id;
  * SELECT r.vorname, r.nachname, r.vorwahl,
  * -> r.rufnummer, k.kategorie
  * -> FROM kategorien k
  * -> RIGHT JOIN rufnummern r ON r.kategorie_id = k.id;
  * LEFT JOIN und RIGHT JOIN sind "outer joins". Es gibt daher auch "inner joins".
  * SELECT r.vorname, r.nachname, r.vorwahl,
  * -> r.rufnummer, k.kategorie
  * -> FROM rufnummer r
  * INNER JOIN kategorien k ON r.kategorie_id = k.id;
  * Einzelne Datenfelder können nur mit einem leeren UPDATE-Statement gelöscht werden.
  * Die kleine zu löschende SQL-Einheit ist eine Zeile. Beispiel:
  * DELETE FROM rufnummern
  * -> WHERE vorname='Dieter'
  * -> AND nachname='Durstig';
  * Alle Zeilen einer Tabelle löschen: DELETE FROM rufnummern;
  * Tabelle löschen: DROP TABLE kategorien;
  * Datenbank löschen: DROP DATABASE kontakte;

===== 106 - Oberflächen und Desktops =====
==== 106.1 - X11 installieren und konfigurieren ====
  * /etc/X11/xorg.conf
  * xhost
  * DISPLAY
  * xwininfo
  * xdpyinfo
  * x
  * X-Window wurde vom MIT (Massachusetts Institute of Technology), DEC (Digital Equipment Corporation) und IBM (International Business Machines Corporation) in Zusammenarbeit entwickelt, bevor es Linux gab (1984). Bereits 1987 lag X-Window in der Version 11 vor und diese Versionsnummer ist bis heute aktuell (X11).
  * Der Aufbau von X: Client-Server, Kommunikation also via Netzwerkschicht
  * X-Server: Der X-Server ist die Komponente, die über den Kernel und seine Module mit der Hardware kommuniziert. Er nimmt Eingaben von der Tastatur entgegen und ist für die Kommunikation mit der Grafikhardware zuständig. Der X-Server hat keinen Einfluss auf das Aussehen der Anwendungsprogramme, sondern ist nur für die Ausgabe zuständig.
  * X-Client: Der X-Client ist ein Programm, welches mit dem X-Server kommuniziert. Meistens handelt es sich bei einem X-Client um ein Anwendungsprogramm (wie beispielsweise ein Browser oder Mail-Client) und übernimmt die eigentliche Verarbeitung der Daten. Das Ergebnis wird dann an den X-Server gesendet, welcher die Ausgabe auf dem Bildschirm durchführt.
  * Windowmanager: Ein Windowmanager ist selbst ein X-Client, der als Schnittstelle zu allen anderen X-Clients fungiert. Zudem ist er für das Aussehen der Fenster und Schaltflächen innerhalb von X-Window verantwortlich. Beispiele für Windowmanager: KWin, Metacity, Windowmaker, FVWM95, twm, Sawfish...
  * Displaymanager: Der Displaymangaer ist hauptsächlich für die Authentifikation von Benutzern zuständig. 
  * Desktop Environment: Ein Desktop Environment ist eine Desktop-Umgebung. Hierbei handelt es sich um eine vorkonfigurierte Ansammlung von Programmen, einen Window-Manager und einen passenden Displaymanager. Die beiden bekanntesten Desltop-Umgebungen sind KDE und GNOME. KDE verwendet als Windowmanager KWin und als Displaymanager kdm. GNOME arbeitet mit dem Windowmanager Metacity und Sawfish. Als Displaymanager kommt bei GNOME gdm zum Einsatz.
  * startx ist ein Frontend für das Startskript xinit und startet den x-Server.
  * Folgende Dateien werden üblicherweise beim Start des X-Servers mit startx als Konfigurationsdateien eingezogen:
  * xinitrc - Startskript für xinit
  * xserverrc  - Startskript für den X-Server
  * .xinitrc - Benutzerspezifisches Startskript für xinit
  * .xserverrc - Benutzerspezifisches Startskript für den X-Server
  * .Xresources bzw. Xdefaults - Enthält benutzerspezifische Einstellungen
  * Die Datei xinitrc enthält u.a. Anweisungen darüber, welche X-Clients gestartet werden sollen und welcher Windowmanager zu verwenden ist. Programme, die über dieses Script gestartet werden, sollten im Hintergrund gestartet werden. Einzig der Windowmanager sollte immer im Vordergrund laufen.
  * X-Terminals: xterm ist ein Terminal-Emulator und verwendet folgende Datei: /usr/lib/X11/app-defaults/XTerm
  * Alternativen: aterm, eterm, rxvt...
  * X-Librarys: KDE verwendet bevorzugt QT-Libs, während GNOME auf GTK (GIMP Toolkit) setzt.
  * Die Konfigurationsdatei von X ist entweder die Datei xorg.conf oder XF86Config. Beide befinden sich in /etc/X11.
  * Die konfigurationsdatei vom X, xorg.conf, ist in verschiedene Sektionen unterteilt:
  * Sektion "Sektionsname"
  * Sektionseintrag
  * Sektionseintrag
  * EndSection
  * Section "Files": Definiert Pfade, die der Server für den Betrieb benötigt. 
  * Section "Files"
  * FontPath "/usr/X11R6/lib/X11/fonts/misc:unscaled"
  * FontPath "/usr/X11R6/lib/X11/fonts/local"
  * FontPath "/usr/X11R6/lib/X11/fonts/Speedo"
  * EndSection
  * Fonts können auch zentral auf einem X-Fontserver gepflegt werden. In so einem Fall sieht die entsprechende Files-Section so aus:
  * Section "Files"
  * Fontpath "Unix/:7100"
  * EndSection
  * RgbPath ist ein weiterer Eintrag in der Files-Section. In dieser Datei werden Farbbezeichnungen zu RGB-Werten übersetzt.
  * Section "Files"
  * RgbPath "/usr/X11R6/lib/X11/rgb.txt"
  * EndSection
  * Auszug aus rgb.txt:
  * 0 250 154   MediumSpringGreen
  * 255 250 240 FloralWhite
  * Es befinden sich meist knapp 800 Farben in de rgb.txt.
  * Section "Server-Flags": Globale Einstellungen für den Server, z. B. das Verhalten des Power-Managers, Hotkeys... Optionale Section.
  * Section "Input Device": Angaben über verwendete Tastatur, Maus... Häufig kommt diese Section mehrfach vor, aus Gründen der Übersicht. Bsp.:
  * Section "InputDevice"
  * Driver "kbd"
  * Identifier "Keyboard[0]"
  * Option "Protocol" "Standard"
  * Option "XkbLayout" "de"
  * Option "XkbModel" "pc105"
  * Option "XkbRules" "xfree86"
  * Option "XkbVariant" "nodeadkeys"
  * EndSEction
  * Section "InputDevice"
  * Driver "mouse"
  * Identifier "Mouse[1]"
  * Option "Buttons" "5"
  * [..]
  * EndSection
  * Der Aufbau der Einträge in dieser Section ist immer in dieser Abfolge organisiert:
  * Section "InputDevice"
  * Driver "Treiber"
  * Identifier "Name des Geräts"
  * Option
  * Option
  * [...]
  * EndSection
  * Section "Monitor" und "Modes":
  * In der Section "Monitor" sind die technischen Daten des Bildschirms (bzw. der Bildschirme) spezifiziert. Anschließend werden in der Section Modes die möglichen verwendbaren Videomodi für das Gerät aufgelistet:
  * Section "Monitor"
  * DisplaySize 300 230
  * HorizSync 30-61
  * Identifier "Monitor[0]"
  * [..]
  * EndSection
  * Section "Modes"
  * Identifier "Modes[0]"
  * Modeline "1024x768" 81.80 1024 1096 1208 1344 768 769 772 802
  * [...]
  * EndSection
  * Der aktuell eingestellte Modus kann mit xvidtune -show ermittelt werden. Das funktioniert aber nur in einer Shell, die von X-Window aus gestartet wurde. Die Section Modes ist optional, weil die verwendbaren Modi für einen Monitor auch direkt in der Section Monitor eingetragen werden können.
  * Section "Device": Diese Section enthält Angaben für die Grafikkarte(n).
  * Section "Device"
  * BoardName" Geforce 4 MX 440 with AGB8X"
  * BusID "1:0:0"
  * Driver "nv"
  * Identifier "Device[0]"
  * VendorName "NVidia"
  * EndSection
  * Section "Screen": Diese Section führt sozusagen Grafikkarten und Monitore zusammen. Daher gibt es für die Grafikkarte und den Monitor auch den eindeutigen Bezeichner "Identifier".
  * Beispiel für eine Screen-Section:
  * Section "Screen"
  * DefaultDepth 24
  * SubSection "Display"
  * Depth 24
  * Modes "1024x768" "800x600"
  * EndSubSection
  * SubSection "Display"
  * Depth 32
  * Modes "1024x768" "800x600"
  * EndSubSection
  * [...]
  * Device "Device[0]"
  * Identifier "Screen[0]"
  * Monitor "Monitor[0]"
  * EndSection
  * X-Fontserver (xfs): Dient der zentralen Verwaltung von Fonts.
  * Config-File für den X-Fontserver: /etc/X11/fs/config.
  * port=7100
  * client-limit=10 #max. 10 Clients pro xfs-Instanz
  * clonse-self=on #bei Überschreitung des Limits erstellt der xfs Klone von sich für die Bedienung weiterer clients
  * use-syslog=on
  * catalogue = /usr/x11R6/lib/X11/fonts/misc:unscaled,
  * /usr/X11R6/lib/x11/fonts/75dpi:unscaled,
  * [...]
  * default-point-size=120
  * default-resolutions=75,75,100,100
  * Starten des X-Fontservers: /etc/rc.d/xfs start
  * Testen des X-Fontservers: fslsfonts -server Unix/:7100
  * Den X-Fontserver in die Datei xorg.conf eintragen:
  * Section "Files"
  * Fontpath "Unix/:7100"
  * EndSection
  * X-display exportieren: Der Computer, an dem sich der Benutzer befindet (X-Server), muss den Zugriff auf sein Display durch den entfernten Rechner (X-Client) erlauben. Dazu kann xhost verwendet werden.
  * xhost + erlaubt den Zugriff von jeden beliebigen Computer aus.
  * xhost - verbietet pauschal den Zugriff.
  * xhost +hostname erlaubt nur "hostname" den Zugriff.
  * xhost -hostname verbietet den Zugirff für "hostname".
  * Auf dem Client muss die Variable DISPLAY so geändert werden, dass die Ausgabe der Anwendung zum X-Server umgeleitet wird. Beispiel für OpenOffice: export DISPLAY=ubuntu-desktop:0.0
  * OpenOffice.org wird dann auf dem Host A ausgeführt, die Ein- und Ausgabe erfolgt jedoch auf dem Desktop von Computer B.
  * Sollte der Ziel-Host über mehrere Displays verfügen, muss das Kommando zum Export der DISPLAY-Variable entsprechend anders lauten.
  * xwininfo kann Informationen über das einzelne Fenster herzeigen. Beispiel: xwininfo eingeben und das gewünschte Fenster einfach anklicken.
  * xdpyinfo zeigt umfangreiche Informationen über den installierten X-Server. Zeigt z. B., welche Screens von dem Server unterstützt werden.
==== 106.2 - Einen Display-Manager einrichten ====
  * /etc/inittab
  * Configs von xdm
  * Configs von kdm
  * Configs von gdm
  * Der grafische Anmeldebildschirm wird von einem Displaymanager bereit gestellt.
  * kdm, gdm, xdm sind prüfungsrelevant.
  * Die Eingabe von "xdm" in der Shell startet den Displaymanger xdm.
  * init 5 wechselt in den Runlevel 5 - Hier wird meist die grafische Darstellung angeboten. Unter Debian und Ubuntu geht das schon ab Runlevel 2 los.
  * Wenn der Runlevel 5 automatisch beim Boot geladen werden soll, muss die Datei /etc/inittab editiert werden:
  * id:5:initdefault:
  * Konfiguratsiondateien für die Displaymanager:
  * xdm - /etc/X11/xdm-config, /etc/X11/Xresources und /etc/X11/xdm/Xsetup für Hintergurnd und Farben
  * kdm - /etc/X11/kdm/kdmrc
  * gdm - /etc/X11/gdm/init/Default und /etc/opt/gnome/gdm/gdm.conf
  * Häufig befinden sich diese Configs in der Realität in einem anderen Verzeichnis.
  * gdm sollte för gewöhnlich mit gdmconfig konfiguriert werden.
  * xdm und kdm ähneln sich von der Konfiguration her.


==== 106.3 - Hilfen für Behinderte ====
  * Klebrige und Widerholungstasten
  * Langsame/Bounce/Umschalt-Tasten
  * Maustasten
  * Desktop-Themen mit hohem Kontrast und großer Schrift
  * Screen-Reader
  * Braille-Anzeige
  * Bildschirmvergrößerung
  * Tastatur auf dem Bildschirm
  * Gesten (beim Anmelden, etwa bei gdm)
  * Orca = Screenreader
  * GOK = Bildschirmtastatur (bedient mit Maus oder Eyetracker)
  * emacspeak (Screanreader vom Emacs)

===== 107 - Administrative Aufgaben =====
==== 107.1 - Benutzer- und Gruppenkonten und dazugehörige Systemdateien verwalten ====
  * /etc/passwd
  * /etc/shadow
  * /etc/group
  * /etc/skel
  * chage
  * groupadd
  * groupdel
  * groupmod
  * passwd
  * useradd
  * userdel
  * usermod
  * Es ist möglich im laufenden Betrieb die Gruppe zu wechseln, um Zugriff auf Ressourcen zu erlangen (es wird dann eine Sub-Shell gestartet).
  * /etc/passwd: <login name>:<password>:<user-id>:<Group-ID>:<gecos name>:<home path>:<login shell>  (6 Felder)
  * Ein Sternchen als Passwort dient zur Sperre des Benutzers.
  * Falls unter <password> ein x hinterlegt ist, liegt es in der /etc/shadow.
  * Der root erhält immer die ID 0.
  * Die ersten 100 IDs sind für administrative Benutzer und Programme gedacht.
  * Wenn als Login-Shell keine ausführbare Datei angegeben wird, kann sich der Benutzer nicht anmelden.
  * chfn ändert den gecos name.
  * finger fragt u.a. den gecos name eines Users ab. Gibt auch andere nützliche Info zu einem Benutzer aus.
  * /etc/shadow enthält die Kennwörter der Benutzer.
  * Der Vorteil bei Verwendung einer shadow-Datei: Dieses file muss nicht für alle als lesbar gespeichert werden. Die passwd hingegen ist für jeden lesbar.
  * /etc/shadow: <anmelde name>:<verschlüsseltes pass DES 8 Zeichen/MD5 hat mehr>:<zeitpunkt der letzten kennwortänderung, in tagen seit 1.1.1970>:<mindestanzahl von tagen zwischen kennwortänderungen>:<maximale anzahl an tagen zwischen kennwortänderungen>:<der benutzer wird vor ablauf seines kennworts gewarnt, zeigt an, wie viele tage vorher er gewarnt wird>:<wenn konto abgelaufen konto wird deaktiviert, tage bis zur deaktivierung>:<ablaufdatum>:<reserviert für zukünftige zwecke>
  * Beispiel: dominik: $2a$10$7oAMWZUt...OwK8kMhuAk:13760:1:21:1:3:::
  * /etc/group: <gname>:<passwort>:<gid>:<group members>
  * Falls ein x als Kennwort vergeben ist, steht das Passwort in der Datei /etc/gshadow.
  * Viele Distributionen erstellen beim Anlegen eines neuen Users auch eine Gruppe mit demselbigen Namen.
  * /etc/gshadow: <gname>:<g passwd>:<g verwalter>:<g members>:
  * Beispiel: sales: $2a$10$....5nvMAwrW39u1:harald:michaela,dominik,willi
  * Gruppenverwalter können die Member verwalten sowie das Kennwort ändern.
  * useradd erstellt einen neuen User, als Grundlage dient die Datei /etc/default/useradd.
  * useradd -c (comment): Beschreibungsfeld bestimmen
  * useradd -d <dir>: Gibt das Home an (default: /home/username)
  * useradd -m: Steht für make und legt das Home mit den Settings aus /etc/default/useradd an.
  * useradd -s: Stellt eine alternative Shell ein.
  * useradd -G: Legt die Mitgliedschaft in Gruppen fest, Trennung durch Kommata ohne Leerzeichen.
  * useradd -g: Legt die Initialgruppe fest.
  * useradd -p: Legt das Kennwort fest.
  * useradd -k: Spezifiziert ein alternatives Skeletonverzeichnis.
  * useradd -u: Legt die UID für den neuen Benutzer fest.
  * Bsp.: useradd -m -c "Dominit bla" -s /bin/sh dominik
  * userdel entfernt User vom System.
  * userdel -r: Löscht das Home.
  * userdel -f: Löscht das Home auch, wenn es Dateien anderer Benutzer enthält.
  * Bsp.: userdel willi -rf
  * usermod: Ändert existierende Benutzerkonten.
  * usermod -L (lock): Deaktiviert ein Konto.
  * usermod -U (unlock): Aktiviert ein Konto.
  * Bsp.: usermod -L dominik
  * Ansonsten bleiben die Optionen wie bei useradd gleich.
  * passwd: Ändert Kennwörter von Benutzern und kann auch Änderungen durchführen, die eigentlich usermod machen sollte.
  * passwd hat das SUID-Bit gesetzt und somit können auch normale User schreibend auf  /etc/passwd bzw. /etc/shadow zugreifen.
  * Bsp.: passwd dominik
  * chage: chage -m 2 dominik
  * chage -m (minimum): Legt den frühesten Zeitpunkt in Tagen fest, nach denen der Benutzer sein Kennwort ändern darf.
  * chage = change user passwort expiry information
  * chage -M (maximum): Legt fest, wie lange der Benutzer maximal dasselbe Kennwort verwenden darf. Ein Benutzer kann nicht zweimal hintereinander dasselbe Kennwort angeben.
  * chage -l <user>: l für list, zeigt Infos zum Account an.
  * groupadd: Erstellt neue Benutzergruppen und legt diese in /etc/group ab.
  * /etc/groups gibt es nicht!
  * groupadd -g, --gid: Legt die GID für die neue Gruppe fest.
  * groupadd -o, --non-unique: Erlaubt die Verwendung von nicht eindeutigen GIDs.
  * groupadd -p, --password: Gibt das Kennwort an, welches zum Wechsel in diese Gruppe notwendig ist. Die Verwendung von Gruppenpasswörtern ist allerdings eher unüblich.
  * groupadd produktion -g 4711 -p GEHEIM
  * groupdel: Löscht Gruppen.
  * groupmod: Modifiziert bestehende Gruppen, ähnlicher Syntax wie groupadd.
  * groupmod -A, --add-user: Fügt Benutzer zur Gruppe hinzu.
  * groupmod -R, --remove-user: Entfernt Benutzer von einer Gruppe.
  * groupmod -n, --new-name: Ändert den Namen der Gruppe unter Beibehaltung aller anderen Attribute.
  * Bsp.: groupmod marketing -n marketing_alt
  * gpasswd: Ändert das Gruppenkennwort.
  * gpasswd -r: Entfernt das Kennwort.
  * newgrp: Benutzer können dieses Tool ausführen, um ihre Gruppenzugehörigkeiten zu ändern.
  * pwconv: Erstellt und aktualisiert die /etc/shadow. pwconv sucht in /etc/passwd nach Kennwörtern und verschiebt diese, falls vorhanden, in die Datei /etc/shadow. 
  * pwunconv: Verschiebt verschlüsselte Kennwörter nach /etc/passwd und löscht anschließend /etc/shadow.
  * pwck: Prüft Konsistenz von /etc/passwd und /etc/shadow.
  * grpconv: Sucht in /etc/group nach Kennwärtern und verschiebt diese nach /etc/gshadow.
  * grpunconv: Schiebt die Passwörter von /etc/gshadow nach /etc/group und löscht anschließen /etc/gshadow.
  * grpck: Überprüft die Konsistenz von /etc/group und /etc/gshadow.
==== 107.2 - Systemadministrationsaufgaben durch Einplanen von Jobs automatisieren ====
  * /etc/cron.*
  * /etc/at.allow
  * /etc/crontab
  * /etc/cron.allow
  * /etc/cron.deny
  * /var/spool/cron/*
  * crontab
  * at
  * atq
  * atrm
  * Zur einmaligen Ausführung von einer Aufgabe verwendet man at.
  * at basiert auf dem Daemon atd.
  * Sollen Programme hingegen regelmäßig ausgeführt werden, greift man besser zu cron oder anacron.
  * Der Hauptunterschied zwischen cron und anaccron liegt daron ,dass anacron einkalkuliert, dass der Rechner zur geplanten Laufzeit der Jobs herunter gefahren werden könnte. Somit geht kein Job verloren.
  * Das Werkzeug, womit automatisch Programme ausgeführt werden kann, heisst cron.
  * Der Daemon, der automatisch Programme ausführt, heisst crond.
  * Informationen über den Syntax der Datei /etc/crontab erhält man mit man5 crontab, während das Kommando man 1 crontab über den Befehl zum Hinzufügen von Jobs informiert.
  * /etc/crontab: <s> <h> <d> <m> <days of the week> <user> <command> <parameter if required>
  * Bsp.:   01 * * * * root run-parts /etc/cron.hourly = Eine Minute nach jeder vollen Stunde, zu jeder Stunde zu jedem Tag im Monat, und in jedem Monat an beliebigen Wochentagen.
  * Werte:  0-59 0-23 1-31 0-12 0-7 (Sonntag ist sowohl 0 als auch 7.)
  * Bsp.: 0/30 8-16 * * 1-5 rppt /etc/virusscan: An Wochentagen zwischen 8 und 16 Uhr alle 30 Minuten den Virusscanner ausführen.
  * @yearly   = 0 0 1 1 * (einmal im Jahr)
  * @annually = 0 0 1 1 * (einmal im Jahr)
  * @monthly  = 0 0 1 * * (zum 1. jeden Monats)
  * @daily    = 0 0 * * * (jeden Sonntag um Mitternacht)
  * @hourly   = 0 * * * * (zu jeder vollen Stunde)
  * @reboot   = Einmal nach Systemstart
  * Bsp.: @reboot root run-parts /bla/bla
  * In /var/spool/cron werden die benutzerspezifischen crontab-Dateien abgelegt.
  * Das Tool crontab modifiziert nicht die Tabelle /etc/crontab.
  * Beim aufrufen des Tools crontab wird eine benutzerspezifische Crontab-Datei angelegt.
  * crontab -e editiert die crontab des angemeldeten Benutzers.
  * crontab -l listet den Inhalt einer crontab-Datei auf.
  * crontab -r löscht die crontab-Datei eines Benutzers (remove).
  * crontab -u ermöglicht es dem root, die Crontabs der anderen Benutzer einzusehen und zu bearbeiten.
  * at heisst das Tool, atd der Daemon.
  * Bei vielen Distributionen läuft der atd nicht standardmäßig.
  * at 17:00 tomorrow
  * at> /home/michaela/script
  * at> /bla
  * at>  <EOT>
  * Hier wurde interaktiv für morgen 17 Uhr ein Job hinterlegt. [Strg] + [D] = Interaktiven Modus beenden.
  * at -l listet die geplanten Jobs auf.
  * Soll eine ganze Reihe von Kommandos zeitgesteuert ausgeführt werden, dann können Sie diese zeilenweise in eine Textdatei schreiben und dann wie folgt an at übertragen:
  * at -f <file> teatime tomorrow
  * "teatime" = 16 Uhr - lulz =)
  * atq = Überprüfen der at-Warteschlange, scheint das gleiche zu sein wie at -l.
  * atrm <job-nr> oder at -d <job-nr> löscht anstehende Aufträge.
  * anacron kann nur vom root verwendet werden.
  * anacron bezieht die Konfiguration aus /etc/anacron.
  * Der Daemon von anacron heisst anacron!
  * Jeweils in /etc:
  * cron.allow: Wenn diese Datei existiert, dann dürfen nur die Benutzer cron verwenden, die in dieser Datei gelistet sind.
  * cron.deny: Wenn diese Datei existiert, aber keine cron.allow-Datei, dann dürfen alle Benutzer cron verwenden, die nicht in cron.deny aufgeführt sind.
  * at.allow: Wenn diese Datei existiert, dann dürfen nur die Benutzer den at verwendetn, die in dieser Datei gelistet sind.
  * at.deny: Wenn diese Datei existiert, aber keine at.allow-Datei, dann dürfen alle Benutzer at verwenden, die nicht in at.deny aufgeführt sind.
  * Wenn es weder die Datei cron.allow noch cron.deny gibt, dürfen alle Benutzer cron verwenden.
  * Wenn es weder die Datei at.allow noch at.deny gibt, darf nur root at verwenden. Eine leere at.deny-Datei ermöglicht den Zugriff für alle Benutzer.

==== 107.3 - Lokalisierung und Internationalisierung ====
  * /etc/timezone
  * /etc/localtime
  * /usr/share/zoneinfo
  * Umgebungsvariablen: LC_*, LC_ALL, LAG
  * /usr/bin/locale
  * tzselect
  * tzconfig
  * date
  * iconv
  * UTF-8
  * ISO-8859
  * ASCII
  * Unicode
  * tzselect: Gibt Überblick über die verfügbaren Zeitzonen. 
  * tzselect verwendet für seine Anzeige die Dateien im Verzeichnis /usr/share/zoneinfo (Binärdateien).
  * Wenn die Zeitzone des Rechners geändert werden soll, dann erstellt man einen Symlink mit der jeweiligen "Stadt-Datei" zu /etc/localtime oder man kopiert die Stadt-Datei einfach direkt nach /etc/localtime. Aus Kompatibilitätsgründen zu hwclock sollte man letztere Methode wählen.
  * In der Konfigurationsdatei /etc/zimezone muss die Zeitzone ebenfalls nach folgendem Muster festgelegt werden: <Kontinent/City>, oder auch den Verzeichnisname unterhalb von /usr/share/zoneinfo.
  * Wenn die Zeitzone nur vorübergehend oder nur für einen bestimmten Benutzer gelten soll, kann man geschickt mit der Variablen TZ (Time Zone) arbeiten, z. B. in der .profile eines Users: TZ='Europe/Berlin'
  * Oder: export TZ='Europe/Berlin'
  * date und direkt danach date -u zeigt dann das gewünschte Ergebnis.
  * date -u = UTC
  * tzconfig ist ein interkativer Zeitzonen-Konfigurator.
  * Einige Anwendungen benötigen Angabne wie die Währung, Papierformate etc.. Dafür existieren verschiedene Umgebungsvariablen:
  * LC_CTYPE = Zeichenklassifikationen
  * LC_COLLATE = Sortierreihenfolge
  * LC_TIME = Zeit- und Datumsformat
  * LC_NUMERIC = Numerische Formate außerhalb des Finanzsektors
  * LC_MONETARY = Numerische Formate innerhalb des Finanzsektors
  * LC_MESSAGES = Formate für informative und diagnostische Benachrichtigungen
  * LC_PAPER = Papierformate und Größen
  * LC_NAME = Namenformate
  * LC_ADDRESS = Adressformate
  * LC_TELEPHONE = Formate der Telefonnummern
  * LC_MEASUREMENT = Maßeinheit (metrisch oder andere)
  * LC_IDENTIFICATION = Metadaten der Lokalisation
  * Diese Umgebungsvariablen befinden sich meist in /usr/lib/locale. In meinem Beispiel existiert dort unter Debian 6 eine Datei namens locale-archive, welche die oben genannten Angaben allesamt enthält.
  * In /usr/share/i18n/SUPPORTED erfährt man, welche Sprachunterstützung grundsätzlich möglich ist.
  * Um einen schnellen Überblick zu erhalten, wie die Umgebungsvariablen in Bezug auf die Lokalisation gerade gesetzt sind, können Sie einfach das Kommando locale verwenden.
  * locale zeigt die aktuellen Einstellungen zur Sprachunterstützung.
  * Die Variable LANG hat eine Sonderstellung. Eine eine der anderen Variablen (auch LC_ALL) fehlen sollte, gilt der hier stehende Eintrag. LANG halt also eine geringe Priorität.
  * LC_LANG ist normalerweise überhaupt nicht gesetzt. Falls doch, so hat sie Priorität vor allen anderen LC-Variablen - auch vor LANG.
  * Wenn LANG manuell gesetzt und exporiert wird, werden alle anderen LC-Variablen überschrieben. Hier gilt auch die Besonderheit: LANG=C -> Alle Scripte, die auf Lokalisation reagieren, geben ihre Daten "roh" aus. Die Daten durchlaufen dann keine Zeichensatztabelle mehr. Ein US-Finanzprogramm würde dann auf deinem deutsch lokalisierten Linux ein Dollarzeichen anstatt des Eurozeichens ausgeben.
  * locale -a: Zeigt alle verfügbaren Lokalisationen (gemäß /usr/lib/local) an.
  * locale -m (charamp): Zeigt eine Liste an verfügbaren Zeichensätzen an.
  * Der Vorgänger von ASCII ist der Baudot-Code (5 Bit, 2 hoch 5 = 32 = Platz fürs gesamte Alphabet).
  * Die Maßeinheit "Baud" geht auf den Nachnamen von Jean-Maurice-Émile Baudots zurück.
  * 1260 Buchstaben pro Minuten = 21 Baud/Buchstaben pro Sekunde
  * ASCII - American Standard Code for Information Interchange
  * ASCII = 7-Bit-Zeichenkodierung, die bereits 1967 als Standard veröffentlicht wurde. Die Zeichenkodierung von ASCII umfasst 128 Zeichen (2 hoch 7 = 128).
  * 95 dieser Zeichen sind druckbar, während die übrigen 33 Zeichen Steuerzeichen sind.
  * Die Druckbaren Zeichen beginnen mit dem Space-Zeichen und enden mit der Tilde (von 32 bis 126).
  * Beispiele für nicht druchbare Steuerzeichen:
  * 00 NUL
  * 01 SOH - Start of Header
  * 02 STX - Start of Text
  * 03 EOT - End of Transmission
  * 10 LF - Line Feed
  * 12 FF - Form Feed
  * 13 CR - Carriage Return (Zeilenumbruch)
  * 27 ESC - Escape
  * Es gibt eine Erweiterung der ASCII-Tabelle für Umlaute, französische Zeichen etc...
  * Die ASCII-Tabelle ist dann auf 8 Bit erweitert = 256 Zeichen.
  * Die ZEichen 129, 143, 144 und 157 sind bisher nicht definiert.
  * Zeichen 160 ist das Leerzeichen.
  * Zeichen 173 ist der bedingte Trennstrich.
  * ISO 8859 = Normenfamilie. Jede Teilnorm der ISO 8859 ist ein 8-Bit-Zeichensatz. Die Gemeinsamkeit all dieser Normen liegt in den rsten 128 Zeichen. Diese sind nämlich identisch mit dem 7-Bit-ASCII-Code.
  * Normen:
  * 1 - Latin-1, Westeuropäisch
  * 2 - Latin-2, Mitteleuropäisch
  * 3 - Latin-3, Südeuropäisch
  * 4 - Latin-4, Baltisch
  * 5 - Kyrillisch
  * 6 - Arabisch
  * 7 - Griechisch
  * 8 - Hebräisch
  * 9 - Latin-5, Türkisch
  * 10 - Latin-6, Nordisch
  * 11 - Thai
  * 12 - nicht verwendet, abgelehnte Normvorschläge
  * 13 - Latin-7, Baltisch
  * 14 - Latin-8, Keltisch
  * 15 - Latin-9, Westeuropäisch
  * 16 - Latin-10, Südosteuroppäisch
  * Numerisch würde z. B. der Zeichensatz Latin-1, Westeuropäisch als ISO-8859-1 ausgedrückt werden.
  * Die deutschen Umlaute sind übrigens in allen zehn ISO-8859 Zeichensätzen enthalten, die jeweils mit Latin bezeichnet sind. Üblicherweise werden bei deut. Texten allerdings ISO-8859-1 oder ISO-8859-15 verwendet.
  * Unicode ist ein internationaler Standard, der irgendwann einmal alle bekannten Schriftarten enthalten soll, die es gibt. Um eine Kompatibilität zu bestehenden Zeichensätzen zu gewährleisten, entsprechen die ersten 128 Zeichen des Unicode natürlich dem ASCII-Zeichensatz.
  * Die erstne 256 Zeichen enthalten außerdem die ISO-8859-1-Kodierung.
  * UTF-8 ist die am weitesten verbreitete Form von Unicode. Die 8 im Namen weist auf einen 8-Bit-Code hin.
  * UTF8-Zeichen können aus bis zu vier Byte bestehen. 
  * Wenn man Dateien von einer Zeichenkodierung in eine andere überführen muss, kann das Tool iconv verwendet werden.
  * iconv --from-code, -f: Gibt die aktuelle Zeichenkodierung an.
  * iconv --to-code, -t: Gibt die Zeichenkodierung für die Ausgabe an.
  * iconv --list, -l: Zeigt die dem Programm bekannten Kodierungen an.
  * iconv --output, -o: Gibt die Ausgabedatei an.
  * Man kann leider nicht aus jeder Kodierung in jede beliebig andere umwandeln.
  * Bsp.: iconv -f UTF-8 -t ISO-8859-15 Quelldatei -o Zieldatei
===== 108 - Grundlegende Systemdienste =====
==== 108.1 - Die Systemzeit verwalten ====
  * /usr/share/zoneinfo
  * /etc/timezone
  * /etc/localtime
  * /etc/ntp.conf
  * date
  * hwclock
  * ntpd
  * ntpdate
  * pool.ntp.org
  * Der Aufruf von "date" bewirkt die Ausgabe des heutigen Datums und der aktuellen Uhrzeit (Systemzeit!).
  * Es gibt die Systemzeit und die Hardware-Uhr (RTC = Real-Time-Clock).
  * Die Systemzeit kann z. B. mittels date geändert werden: date -s 1755 (stellt die Uhr auf 17:55 Uhr).
  * Bsp.: date "+Heute ist der %d.%m.%Y. Das ist der %j. Tag des Jahres."
  * hwclock stellt die Hardware-Uhr ein.
  * hwclock --systohc schreibt die Systemzeit in die Echtzeituhr.
  * hwclock --show (bzw. oft auch nur hwclock) zeigt u.a. auch die Differenz zwischen System- und HW-Uhr an.
  * UTC = Coordinated Universal Time
  * UTC +1 = MEZ
  * MEZ = UTC +1
  * In /usr/share/zoneinfo und /etc/localtime finden sich die Binärdateien zu den Zeitzonen.
  * /etc/timezone ist eine textbasierte Konfigurationsdatei. Man kann hier einfach die richtige Zeitzone hinterlegen.
  * tzselect zeigt die verfügbaren Zeitzonen an.
  * NTP = Network Time Protocol
  * NTP wurde bereits 1985 in der RFC 958 definiert und nutzt den UDP-Port 123.
  * ntpdate pool.ntp.org lässt die Zeit von einem NTP-Server synchronisieren.
  * ntpd synchronisiert die Zeit automatisch (oder alternativ: ntpdate via Cron ausführen lassen).
  * Die Hauptkonfigurationsdatei für NTP lautet /etc/ntp.conf.
  * Driftfile: /etc/ntp.drif
  * Beispiel für eine minimale ntp.conf:
  * server de.pool.ntp.org
  * server ptbtime1.ptb.de
  * driftfile /var/lib/ntp/drift/ntp.drift
  * Driftdatei: Wird von ntpd verwendet, um die Ungenauigkeiten der Systemuhr festzuhalten. Ermittlung bis auf eine Millionstel Sekunde.
  * ntpq und ntpdc: Diagnose-Tools für NTP.
  * pool.ntp.org: Beliebte Quelle zur Synchronisation, großer über die Welt verteilter virtueller Cluster. Alleine in Europa stehen rund 1000 Nodes. Die Verteilung an die Clients wird über DNS mittels Round Robin abgewickelt.
==== 108.2 - Systemprotokollierung ====
  * syslog.conf
  * syslogd
  * klogd
  * logger
  * syslog-ng: Neue Variante vom syslogd.
  * /etc/syslog.conf: Regelt das Protokollierungsverhalten des syslogd.
  * Aufbau der syslog.conf: facility.level action
  * facility: Prozess, der den zu protokolliertenden Eintrag erstellt, z. B. auth (ehemals security), authpriv, cron, daemon, kern, lpr, mail, mark, news, syslog, user, uuco, local0 bis local7.
  * Ein Stern (engl. asterisk) bezeichnet alle facilities.
  * Wenn ein eigenes Programm das Syslog verwenden soll, kann man auf die facilities local0 bis local7 zurück greifen.
  * level legt den jeweiligen Protokollierungsgrad fest.
  * debug = extremer Log-Level
  * info = harmlose Infos werden geloggt
  * notice = ungefährliche Hinweise
  * warning, warn = normalerweilse harmlos, je nach facility (also Prozess)
  * err, error = z. B. bei I/O- oder Auth-Fehlern
  * crit = kritische Fehler
  * alert = Alarme, immer schwerwiegende Probleme
  * emerg panic = wird, wenn überhaupt noch, als letzter Eintrag vor dem Systemcrash geschrieben. 
  * Die Level error, warn und panic sind veraltet und es sollten stattdessen jeweils err, warning und emerg verwendet werden.
  * action bezeichnet das Ziel, in welches die facility protokollieren soll. Das Ziel ist meist eine Datei, kann aber auch ein anderer Rechner oder eine kommagetrennte Liste an Benutzern sein.
  * Beispiel für eine typische syslog.conf unter Debian:
  * auth,authpriv.*      /var/log/auth.log
  * cron.*               /var/log/cron.log
  * Viele Distributionen loggen einfach alles nach /var/log/messages.
  * Konfigurationsdatei /etc/logrotate.conf und Vereichnis /etc/logrotate.d/
  * Logrotate sollte täglich von cron ausgeführt werden.
  * tail -f <file>
  * logger hilft beim eigenen Loggen von Nachrichten, z. B. in eigenen Scripten.
  * Beispiel: logger -t Backup "Datensicherung ausgeführt"
  * klogd = Kernellog fängt die Meldungen des Kernels ab und protokolliert diese.
  * Die Ausgabe des Kernellog erfolgt meist in das Syslog oder kern.log.
  * klogd - c <n> setzt das Loglevel für Konsolenmeldungen auf <n>.
  * klogd -d aktiviert den Debugging-Modus.
  * klogd -f <file> ändert die Ausgabe des Syslog auf die angegebene Datei.
  * Als Eingabedatei verwendet klogd /proc/kmsg.
  * klogd -p <target> ändert die Eingabedatei für den klogd.
==== 108.3 - Grundlagen von Mail Transfer Agents (MTAs) ====
  * .forward
  * Sendmail-Emulationsschickt: Diverse Commands
  * newaliases
  * mail
  * mailq
  * postfix
  * sendmail
  * exim
  * qmail
  * Die Verarbeitung von Mail-Nachrichten auf einem STMP-Server wird von drei Software-Komponenten durchgeführt.
  * MUA = Mail User Agent = Mail-Client wie Outlook oder kmail
  * MDA = Mail Delivery Agent = Nimmt Mails entgegen und reicht diese beispielsweise an lokale Mail-Verzeichnisse oder MTAs weiter (z. B. cyrus, procmail)
  * MTA = Mail Transfer Agent = Zuständig für die Zustellung einer Nachricht an den richtigen Zielserver (z. B. sendmail, postfix, qmail, exim).
  * Für die endgültige Auslieferung einer Mail-Nachricht an einen Client sind diese drei Agents allerdings nicht zuständig. Dafür benötigt man noch einen Server-Dienst wie IMAP oder POP.
  * /etc/aliases: Mit Hilfe dieser Datei können Mails umgeleitet werden. Dafür gibt es vier Verfahren. Die gängiste lautet:
  * willi:    wilhelm
  * root:     wilhelm
  * Mit dem ersten Eintrag werden Mails, die an willi adressiert sind, dem real existierenden Benutzerkonto "wilhelm" zugeordnet.
  * Eine andere Methode ist die Zuweisung eines Alias zu einer Datei. So könnte man Tätigkeitsberichte, automatisch mit Datum und Uhrzeit versehen, per Mail-Programme schreiben:
  * taetigkeiten:       "/home/harald/taetigkeitsbericht"
  * Die Brichte müssen dann einfach an das Konto "taetigkeiten" gesendet werden, und die Aufzeichnung geschieht automatisch in die angegeben Datei. Fpr dieses konto muss ebenfalls kein reales Benutzerkonto auf dem Server existieren.
  * freunde:         :include:/home/harald/meinefreunde
  * Wenn eine Mail an Freunde gesendet wird, wird diese Nachricht an alle Mail-Adressen versendet, die in der Textdatei /home/harald/meinefreunde zeilensepariert aufgeführt sind.
  * Oder auch eine Übergabe an ein anderes Programm ist möglich:
  * majordomo:   "|/usr/lib/majordomo/wrapper majordomo"
  * Der Unterschied zur Umleitung in eine Datei ist das führende Pipe-Zeichen.
  * newaliases: Nach dem Anlegen eines neuen Alias in der Datei /etc/aliases muss der Befehl "newaliases" aufgerufen werden, damit Sendmail den neuen Alias auch verwendet. Alternativ kann beispielsweise sendmail -bi ausgeführt werden (übrigens ist die Antwort der beiden Kommandos identisch).
  * Mail-Weiterleitung: Datei mit dem Namen ".forward" im Heimatverzeichnis erstellen, welche die Weiterleitungsadresse in einer einzelnen Zeile enthält. Die Weiterleitung greift sofort.
  * Wichtige Verzeichnisse:
  * /var/spool/mail: Enthält Dateien mit dem Namen der Benuterkonten, die auf diesem System Mails empfangen. Der MDA liefert hier Nachrichten für die lokale User aus.
  * /var/spool/mqueue: Mail-Queue/Warteschlange. Hier holt der MDA Nachrichten ab und entscheidet dann, ob diese lokal ausgeliefert werden oder an den MTA zur weiteren Verarbeitung übergeben werden müssen.
  * /var/spool/postfix: Hier liegt die Datenverzeichnisstruktur von Postfix.
  * /var/mail ist ein typischer Link auf /var/spool/mail.
  * /etc/postfix: Beherbergt die Konfigurationsdateien von Postfix.
  * /etc/mail enthält die meisten Konfigurationsdateien für sendmail.
  * Inhalt einer Mail-Queue im laufenden Betrieb ansehen: mailq
  * sendmail.cf: Hauptkonfigurationsdatei von Sendmail. Weitere solcher Dateien finden sich i.d.R. in /etc/mail.
  * /etc/postfix/main.cf: Globale Konfigurationsdatei für postfix.
  * Beispieleinstellungen daraus:
  * myhostname = echtername.domain.tld
  * myhostname = virtuellername.domain.tld
  * mydomain = domain.tld
  * /etc/postfix/master.cf: Enthält Config für Postfix-interne Prozesse.
  * Ein Smarthost ist ein Mail-Server, der als SMTP-Relay fungiert. Normalerweise stellt man die Mails nicht direkt zu, sondern liefert diese an den SMTP-Server des Internet Service Providers (ISP) aus. Andernfalls würden viele Mail-Server die Mails nicht entgegen nehmen, da der SMTP-Server im Internet nicht bekannt ist. Daraus sclhießen die Ziel-Server, dass der Server ein mögliches Relay für Spam ist und verwerfen die Nachrichten.
  * Bsp.: Angabe eines externen Smarthosts für sendmail: Datei sendmail.cf editieren, nach "DS" am Zeilenanfang suchen und dahinter eintragen:
  * # "Smart" relay host (may be null)
  * DSmailrelay.myisp.org.
  * Sollte mein Server selbst als SMTP-Relay fungieren, so müssen die Dateien /etc/mail/access und /etc/mail/relay-domains modifiziert werden und anschließend "make" aufgerufen werden. Somit werden die korrespondierenden db-Files generiert.
  *  Smarthost mit Postfix: Wenn Postfix als MTA verwendet wird, dann muss der Smarthost entsprechend in der Datei /etc/postfix/main.cf eingetragen werden. Der eintrag sieht aus wie folgt:
  * relayhost = mail.myisp.org
  * Um Postfix selbst als Releay einzusetzen, existieren verschiedene Möglichkeiten. Eine sehr einfache, wenn auch umstrittene Methode ist es, einfach mit der Angabe der eigenen Netzwerke für bestimmte subnetze Relaying zuzulassen:
  * mynetworks = 127.0.0.0/8 92.168.50.0/24 172.16.0.0/28
  * Das setzt natürlich voraus, dass die Mitarbeiter aus diesen Subnetzen vertrauenswürdig sind und den eigenen Absender nicht fälschen.
  * Wesentlich sicherer ist eine Authentifizierung der Benutzer. Als Mechanismus kommt hier wohl am ehesten SASL (Simple Authentication and Security Layer) infrage.
  * qxim und qmail: Weniger bekannte MTAs; Exim ist weitgehend ähnlich zu konfigurieren wie sendmail, die Konfiguration ist jedoch etwas einfacher. Debian verwendet exim sogar als Standard-MTA. Der MTA qmaul wurde hauptsächlich entwickelt, um die sicherheit gegenüber sendmail zu erhöhen. Auch qmail ist erheblich leichter zu konfigurieren als sendmail.
==== 108.4 - Drucker und Druckvorgänge verwalten ====
  * CUPS configs, Tools, Hilfsprogramme
  * /etc/cups
  * lpd: lpr, lprm, lpq
  * Drucken unter Linux funktioniert praktisch genauso wie unter Unix.
  * LPRng = neu geschriebenes BSD-Drucksystem für Linux.
  * Das zweite große Drucksystem unter Linux heisst CUPS (Common Unix Printing Solution oder auch Common Unix Printing System).
  * Druckaufträge reihen sich in einer Queue (Schlange) ein oder werden gespoolt (aufgespult).
  * Druck-Client: Z. B. lpr
  * Der Druck-Client stellt einen Auftrag in die entsprechende Warteschlagen.
  * Um das genaue Verzeichnis zu ermitteln, in welches der Druckauftrag hingespoolt werden muss, wird die Konfigurationsdatei /etc/printcap ausgewertet.
  * Normalerweise befinden sich die Warteschlangen unterhalb von /var/spool.
  * Ein Druckauftrag besteht immer aus zwei Dateien, nämlich einem Control-File mit der Dateierweiterung cf und einem in der Regel erheblich größeren Data-File mit der Extension df.
  * Der Spool-Vorgang ist nun abgeschlossen, und diese beiden Dateien bleiben jetzt so lange lieben, bis sie jemand bearbeitet.
  * Diese Aufgabe übernimmt der line Printer Daemon (lpd).
  * lpd prüft zyklisch das Vorhandensein von Dateien in allen Druckerwarteschlangen. Wird er fündig, so übergibt er die momentan noch in einem sehr rohen, RAW genannten Format, vorliegenden Daten an einen Druckfilter.
  * Der Druckfilter wandelt dann die Daten in Abhängigkeiten vom verwendeten Druckermodell in einen geeigneten Datenstrom und sendet diesen an den Drucker. Wenn der auftrag ausgedruckt wurde, werden die Kontroll- und die Datendatei aus der Warteschlange gelöscht.
  * Die Verarbeitung der Dateien ist bei der Verwendung von CUPS geringfügig anders. So sind beispielsweise die Konventionen für die Benennung der Dateien innerhlab einer Warteschlange different, aber das Druckprinzip ist weitesgehend gleich.
  * Abfolge: 
  * Druck-Client legt Daten im Spool ab -> lpd holt diese Daten ab und übergibt die Daten als RAW an den Druckfilter -> Druckfilter konvertiert in Datenstrom und sendet an den Drucker
  * /etc/init.d/lpd start ODER /etc/init.d/cups start
  * lp und lpr senden Druckeruafträge an den angegebenen Drucker. lp stammt aus dem System V und versteht andere Optionen als lpr.
  * lpr -p gibt die verwendende Warteschlange an.
  * lpr -P<Drucker> <file>
  * lpq zeigt den Inhalt von Warteschlangen an. Mit lpq -p kann auch eine ganz bestimmte Warteschlange angegeben werden.
  * lprm löscht Aufträge aus der Warteschlange. Bereits im Druck befindliche Aufträge können nicht mehr entfernt werden.
  * lprm -P<Drucker> <Job-ID>
  * Ein Benutzer ohne root-Rechte kann ohne Weiteres alle eigenen Aufträge mit lprm - löschen. Wenn root diesen Befehl eintippt, werden alle Jobs aus allen Queues getilgt.
  * lpc = Line Printer Control
  * lpc kann normal oder interaktiv verwendet werden, ähnlich wie crm status.
  * Wenn lpc in Verbindung mit CUPS verwendet wird, sind nur einige wenige Befehle innerhalb von lpc verfügbar (bzw. nur einer: lpc> status = Statusabfrage).
  * Unter BSd bzw. LPRng sind mehr Optionen verfügbar.
  * lpc> up <Printer>
  * lpc> up all
  * lpc start startet den Druckprozess als solchen, so dass jetzt Aufträge aus der Warteschlange abgearbeitet und ausgedruckt werden können.
  * lpc stop beendet den Druckprozess. Ein laufender Auftrag wird noch bis zum Ende abgearbeitet. Die Druckerwarteschlange nimmt aber weiterhin Aufträge entgegen.
  * lpc enable aktiviert die Druckerwarteschlange.
  * lpc disable lässt neue Jobs für die Warteschlange ablehnen.
  * lpc up = lpc enable + lpc start
  * lpc down = lpc disable + lpc stop
  * lpc abourt = beendet den Druckprozess sofort, auch in Arbeit befindliche Jobs werden sofort gecancelt. Sollte ein Drucker seine Tätigkeit nicht sofort einstellen, ist dies auf Restdaten im Druckerspeicher zurückzuführen.
  * lpc topq stellt einen bereits gespoolten Job an die erste Position in der Queue.
  * lpc topq <Printer> <Job-ID> (Unterbricht aber keinen bereits in Arbeit befindlichen Job.)
  * lpc quit
  * CUPS wurde von Anfang an auf das Drucken im Netzwerk ausgelegt. Deshalb modifiziert CUPS auch gleich nach seiner Installation die /etc/printcap, in der er sich selbst als Netzwerkdrucker deklariert:
  * laserjet1300|laserjet1300:rm=archangel:rp=laserjet1300:
  * remote printer an einer remote machine, obwohl der Drucker lokal angeschlossen ist.
  * Config-Files für CUPS: /etc/cups
  * CUPS-Interface: http://localhost:631
  * /etc/cups/cupsd.conf
  * lpadmin = Config-Tool
===== 109 - Netz-Grundlagen =====
==== 109.1 - Grundlagen von Internet-Protokollen ====
  * /etc/services
  * ftp
  * telnet
  * host
  * ping
  * dig
  * traceroute
  * tracepath
  * TCP/IP wurde etwa Ende 1974 entwickelt.
  * Der Name des Internets leitet sich von TCP/IP ab (Internet Protocol).
  * TCP = Transmission Control Protocol, verbindungsorientiertes Protokoll; stellt die Integrität der Verbindung sicher, indem es eventuell beschädigte Datenpakete neu anfordert oder deren Reihenfolge reorganisiert;
  * UDP = User Datagram Protocol, verbindungsloses Protokoll; Z. B. Broadcasts, Multicasts, DNS, NTP sind UDP-Protokolle;
  * Port 20 (TCP, UDP):  FTP (DATA)
  * Port 21 (TCP):       FTP (wahrschein. control)
  * Port 22 (TCP, UDP):  SSH
  * Port 23 (TCP, UDP):  TELNET
  * Port 25 (TCP, UDP):  SMTP
  * Port 53 (TCP, UDP):  DNS
  * Port 80 (TCP, UDP):  HTTP
  * Port 110 (TCP, UDP): POP3
  * Port 119 (TCP, UDP): NNTP
  * Port 123 (TCP, UDP): NTP
  * Port 139 (TCP, UDP): NETBIOS-SSN
  * Port 143 (TCP, UDP): IMAP
  * Port 161 (TCP, UDP): SNMP
  * Port 443 (TCP, UDP): HTTPS
  * Insgesamt sind 65536 Ports verfügbar
  * Die ersten 1024 Ports werden als Well known Ports bezeichnet
  * /etc/services gibt Aufschluss über Dienste/Ports
  * nmap und netstat zeigen, auf welchen Ports derzeit gelauscht wird.
  * IPv4 fügt den Datenpaketen zur Adressierung IP-Header hinzu. Länge von IPv4-Adressen: 32 Bit
  * IPv6-Adressen: 128 Bit
  * RIP (Routing Information Protocol) dient zum Austausch von Informationen zwischen Routern
  * OSPF (Open Shortest Path First) = wie oben, nur für größere Netzwerke geeignet
  * ARP (Address Resolution Protocol) stellt den Zusammenhang zwischen IPs und MACs her.
  * ICMP (Internet control Message Protocol)
  * IGMP (Internet Group Management Protocol) (z. B. für Videokonferenzen oder Präsentationen, adressiert Gruppen von Hosts)
  * IPv4 wurde bereits 1981 von der Organisation ARPA fertig gestellt, bis zu 4,2 Milliarden IP-Adressen;
  * Klasse A IPv4: 1.0.0.0 bis 127.255.255.255, Subnetzmaske 255.0.0.0; Privater Anschlussbereich: 10.0.0.0-10.255.255.255
  * Klasse B IPv4: 128.0.0.0 bis 191.255.255.255, 255.255.0.0, Privat: 172.16.0.0-172.31.255.255
  * Klasse C IPv4: 192.0.0.0 - 223.255.255.255., 255.255.255.0, Privat: 192.168.0.1 - 192.168.255.255
  * Klasse D IPv4: 224.0.0.0 - 239.255.255.255, 255.255.255.255
  * Klasse E IPv4: 240.0.0 - 255.255.255.254, 255.255.255.255
  * Besonderheiten: 127.0.0.1, 169.254.0.0 (APIPA, automatische Adressierung in Heimnetzwerken)
  * Klasse A: Erstes Bit hinten gesetzt, also beginnt mit 1: 00000001.00...
  * Klasse B: Erstes Bit vorne gesetzt, also 128: 10000000.00...
  * Klasse C: Die ersten beiden Bits vorne gesetzt: 11000000.00...
  * Klasse D: Die ersten drei Bits vorne gesetzt: 11100000.000
  * Klasse E: Die ersten vier Bits vorne gesetzt: 11110000.00...
  * Es können nur Computer direkt miteinander kommunizieren, die sie sich im gleichen Subnetz befinden.
  * 9 verschiedene mögliche Werte pro Oktett der Subnetzmaske:
  * 9, 128, 192, 224, 240, 248, 252, 254, 255
  * CIDR-Notation (Classless Inter-Domain Routing):  192.168.100.0/24 (= 255.255.255.0)
  * Logische UND-Verknüpfung: Die 1er von einer IP mit der Subnetzmaske.. also z. B. 11000000 und 11111111 = passt!...
  * IPv6: 128 Bit-Adresse = über 340 Sextillionen mögliche Adressen (36 stellige Zahl);
  * IPv6: Eine Adresse besteht aus acht Segmenten zu je 16 Bit;
  * IPv6: Private Adressen werden über die ersten 10 Bit definiert: fe80-febf
  * IPv6: Integration von IPv4: Nur die letzten 32 Bit in einer IPv6-Adresse verwendet, die ersten 96 Bits bleiben frei;
  * ping und traceroute: Beide basieren auf ICMP.
  * TTL: Time to Live -> TTL = 64, jede Zwischenstation (Router) zieht 1 ab
  * ping prüft Erreichbarkeit, traceroute den Weg
  * traceroute -n <target>: Unterdrückt DNS.
  * tracepath funktioniert auch ohne root-Rechte und untersucht zusätzlich die MTU.
  * dig, host, nslookup: Diagnose-Tools für DNS
  * Bsp.: host www.google.de (Verwendet den DNS-Server aus /etc/resolv.conf.)
  * Bsp.: host -t MX google.de (Verwendet den DNS-Server aus /etc/resolv.conf.)
  * Bsp.: dig  @<NS> -t MX google.de
  * nslookup
  * > server <IP>
  * > set type=MX
  * > google.de
  * whois verwendet den TCP-Port 43.
  * whois google.de
  * ftp <server>
  * get <filename>
  * mget <wildcards> -> Download von mehreren Dateien.
  * put <file> -> Upload
  * mput <wildcards>
  * telnet: Konsolensitzung, die nicht verschlüsselt ist. TCP-Port 23. Unsicheres Protokoll, überträgt sogar das Passwort in PLAIN.
==== 109.2 - Grundlegende Netz-Konfiguration ====
  * /etc/hostname
  * /etc/hosts
  * /etc/resolv.conf
  * /etc/nsswitch.conf
  * ifconfig
  * ifup
  * ifdown
  * route
  * ping
  * /etc/hosts, /etc/hostname und /etc/HOSTNAME enthalten den Hostname.
  * /etc/hosts ist historisch betrachtet der Vorgänger vom DNS.
  * /etc/networks wird - falls vorhanden - von route und netstat eingelesen und enthält z. B. die loopback- oder localnet-Adresse.
  * /etc/resolv.conf enthält die IPs der DNS-Server, sowie domain, search..
  * Der search-Eintrag wird benötigt, wenn Computer unterschiedlicher Domänen sich gegenseitig über die kurzen Host-Namen erreichen können sollen.
  * /etc/nsswitch.conf beeinflusst diverse Systeme in Bezug auf Namensauflösung und Authentifizierung.
  * /etc/host.conf steuert ausschließlich die Auflösungsreihenfolge des DNS-Clients.
  * Beispiel:
  * order hosts, bind
  * multi on
  * "multi on" = Resolver für einen Host, der mit mehreren IPs in /etc/hosts/ eingetragen ist, diese (IPs) auch dem Client zur Verfügung stellt
  * ifconfig konfiguriert Netzwerkschnittstellen.
  * Beispiel: ifconfig eth1 down
  * ifconfig eth1 10.10.125.20 netmask 255.255.255.0
  * ifconfig eth1 up
  * ifconfig bzw. ifconfig eth0 zeigt nur die aktuelle Konfiguration.
  * ifup und ifdown starten bzw. stoppen bereits vorkonfigurierte Netzwerkschnittstellen.
  * route zeigt die aktuellen Routen an.
  * Beispiel: route add default gw 10.10.125.1
  * route add -net 10.10.10.0 netmask 255.255.255.0 10.10.10.1
==== 109.3 - Grundlegende Netz-Fehlersuche ====
  * ifconfig
  * ifup
  * ifdown
  * route
  * host
  * hostname
  * dig
  * netstat
  * ping
  * traceroute
  * netstat: Diagnoseprogramm für das Anzeigen von Netzwerkverbindungen Routing-Tabellen oder Statistiken von Interfaces.
  * netstat -n: Keine Namensauflösung
  * netstat -r: Zeigt Routing-Tabellen
  * netstat -i: Zeigt Liste an Network-Interfaces
  * netstat -a: Zeigt alle Connections an und nicht nur die, an denen der Host selbst lauscht
  * netstat -c: Aktualisiert die Anzeige permanent

==== 109.4 - Clientseitiges DNS konfigurieren ====
  * /etc/hosts
  * /etc/resolv.conf
  * /etc/nsswitch.conf
  * Siehe vorherige Kapitel. DNS-Server müssen nicht konfiguriert werden.

===== 110 - Sicherheit =====
==== 110.1 - Administrationsaufgaben für Sicherheit durchführen ====
  * find
  * passwd
  * lsof
  * nmap
  * chage
  * netstat
  * sudo
  * /etc/sudoers
  * su
  * usermod
  * ulimit
  * find / -perm -u+s: Findet alle Dateien mit geseztem SUID-Bit.
  * find / -perm -g+s: Findet alle Dateien mit gesetztem GUID-Bit.
  * socket: Simuliert Netzwerkverbindungen.
  * Bsp.: socket -sl 80
  * socket -s: Erstellt einen Server.
  * socket -l: Erzeugt einen loop und kann nur in Verbindung mit -s verwendet werden.
  * ulimit -a zeigt die Limits des aktuellen Benutzers an.
  * ulimit sollte in /etc/profile konfiguriert werden.
  * ulimit -c 20000 setzt die Maximalgröße für Core-Files auf 20 MB.
  * ulimit -d 15000 setzt die maximale Datengröße eines Programms auf 15 MB.
  * ulimit -Sd $(ulimit -Hd) limitiert die Größe des Softlimits für die maximale Datengröße eines Programs auf die Größe des korrespondierenden Hardlimits.
  * lsof |wc -l zeigt die Anzahl der geöffneten Dateien.
  * Bsp.: lsof /media/mount-ordner
  * kill -9 $(lsof -t /mount/bla) beendet schlagartig alle Zugriffe auf das angegebene Ziel.
  * lsof -i zeigt, welche Prozesse Verbindungen zum Netzwerk herstellen.
  * su = superuser -> verschafft einem vorübergehend root-Rechte.
  * su -l dominik = Rechte von Dominik verwenden.
  * sudo <command>..
  * Man muss in /etc/sudoers stehen, wenn man die Berechtigung für sudo besitzen soll.
  * visudo bearbeitet /etc/sudoers.
  * Beispieleintrag für root: root ALL=(ALL) ALL
  * Beispieleintrag: %admin ALL=(ALL) ALL und dann in /etc/group eine Admingruppe definieren.
  * Ein unberechtigter Zugriff auf sudo wird meist protokolliert.

==== 110.2 - Einen Rechner absichern ====
  * /etc/nologin
  * /etc/passwd
  * /etc/shadow
  * /etc/xinetd.d/*
  * /etc/xinetd.conf
  * /etc/inet.d/*
  * /etc/inetd.conf
  * /etc/inittab
  * /etc/init.d/*
  * /etc/hosts.allow
  * /etc/hosts.deny
  * inetd ist ein alter Superdaemon und lauscht zur Laufzeit stellvertretend für benötigte Serverdienste an deren TCP- und UDP-Ports. Wenn nun ein Client eine Verbindung zu einem von inetd kontrollierten Netzwerkdienst aufnimmt, startet inetd diesen Dienst und übergibt ihm die Kontrolle über die Sitzung.
  * Damit inetd seine Zuständigkeiten kennt, bezieht er seine Infos aus /etc/inetd.conf. Einige Dienste sind hier mit einem Doppelkreuz auskommentiert.
  * Beispieleintrag aus der inetd.conf:
  * imap2 stream tcp nowait root /usr/sbin/tcpd /usr/sbin/imapd
  * imap2 ist der Name des Dienstes, so wie er in der Datei /etc/services eingetragen ist. stream zeigt den Socket-Typ, gültige Werte sind hier stream, dgram, raw, rdm und seqpacket (meist: stream für TCP, dgram für UDP). tcp ist das Transportprotokoll (siehe /etc/protocols). nowait ist ein Flag, hier könnte nur noch wait stehen. /usr/sbin/tcpd /usr/sbin/imapd stellt das zu startende Programm inklusive Startparameter dar. Hier führt der TCP-Wrapper imapd aus.
  * tcpdchk kann inetd.conf auf Syntaxfehler prüfen.
  * xinetd ist der moderne Nachfrage von inetd. Er kann auch Dienste starten, die über keinen Eintrag in /etc/services verfügen.
  * /etc/xinetd.conf
  * /etc/xinet.d/<configs>
  * In xinetd ist der TCP-Wrapper funktional integriert.
  * Die Konfiguration von TCP-Wrappern erfolgt via /etc/hosts.allow und /etc/hosts.deny.
  * Wenn in /etc/hosts.allow eine zutreffende Regel gefunden wird, dann wird der Zugriff - basierend auf dieser Regel - erlaubt. Die Datei /etc/hosts.deny wird dann nicht mehr verarbeitet.
  * Wenn in /etc/hosts.deny eine zutreffende Regel gefunden wird, dann wird der Zugriff - basierend auf dieser Regel - verweigert.
  * Wenn keine Einträge in den beiden Dateien zutreffen, wird der Zugriff erteilt.
  * Ist eine Datei oder sind beide nicht vorhanden, wird das gewertet, als wäre(n) die Datei(en) leer.
  * /etc/nologin verhindert, dass sich ein Benutzer interaktiv am System anmeldet. Es genügt die Datei zu erstellen und jeden enutzer in einer eigenen Zeile mit seinem Loginnamen aufzuführen.
==== 110.3 - Daten durch Verschlüsselung schützen ====
  * ssh
  * ssh-keygen
  * ssh-agent
  * ssh-add
  * .ssh/id_rsa und id_rsa.pub
  * .ssh/id_dsa und id_dsa.pub
  * /etc/ssh/ssh_host_rsa_key und ssh_host_rsa_key.pub
  * /etc/ssh/ssh_host_dsa_key und ssh_host_dsa_key.pub
  * .ssh/authorized_keys
  * /etc/ssh_known_hosts
  * gpg
  * .gnupg/*
  * SSH = Secure Shell
  * ssh <remote server>
  * ssh -l <user> <remote server>
  * Verbindung tunneln: ssh -l <user> -X <remote server> und dann ein Kommando ausführen.
  * Die Anwendung wird im oberen Beispiel auf dem remote server ausfgeführt, während die grafische Ausgabe und die Bedienung lokal auf dem SSH-Client erfolgt. Das nennt man X11-Tunnel.
  * Port-Tunneling: ssh <server> -L <local port>:<IP>:<remote port>
  * Bsp.: ssh meinserver.org -L 4711:10.10.10.24:3389
  * ssh -L: Weiterleitung des lokalen Ports an die entfernte IP-Adresse mit dem externen Port.
  * Adressierung des Remote-Ports lokal via localhost:4711.
  * Priviligierte Ports können nur durch den Benutzer root weitergeleitet werden.
  * /etc/ssh/sshd_config: Konfiguration des sshd (SSH-Server), z. B. Port, Protocol, ListenAddress, PermitrootLogin....
  * /etc/ssh/ssh_config: SSH-Client konfigurieren
  * /etc/hosts.allow und /etc/hosts.deny: Der Zugriff auf SSh kann auch über diese beiden Dateien gesteuert werden.
  * /etc/nologin: Leer erstellen, dann kann sich nur noch root via SSH verbinden. Man kann hier auch eine Nachricht an benutzer hinterlassen, die sich anmelden wollen. Diese Message wird dann beim Anmeldeversuch im SSH-Client angezeigt.
  * /etc/ssh_known_hosts beinhaltet die öffentlichen RSA-Keys bereits bekannter Hosts.
  * /etc/sshrc wird ausgeführt, sobald sich ein Benutzer über SSH authentifiziert hat. Das geschieht noch vor dem Laden einer Shell.
  * Beim Anmelden über SSH authentifiziert sich der Server gegenüber dem Client mit seinem Hostkey.
  * ssh-keygen -t dsa erstellt ein public/private DSA-Key-Pair. Speichert den Private (Identification) per default in /root/.ssh/id_dsa und den Public in blabla.pub.
  * Die /etc/ssh/ssh_host_dsa_key enthält sowohl den privaten als auch den öffentlichen Schlüssel des Hosts.
  * die Datei /etc/ssh/ssh_host_dsa_key-pub nur den public key.
  * Der public key kann in die /etC/known_hosts eingetragen werden.
  * Der DSA-Key dient ausschließlich der Signatur. Für die Verschlüsselung ist ein RSA-Key nötig.
  * ssh-keygen -t rsa
  * Wenn noch Clients mit der SSH-Version 1 verwendet werden, wird noch ein weiterer Hostkey benötigt.
  * ssh-keygen -t rsa1
  * SSH1 sollte nicht mehr verwendet werden.
  * Wenn die Benutzerauthentifizierung für SSH-Verbindungen ohne Passwort durchgeführt werden soll, kann mit Keys gearbeitet werden.
  * Der public key eines Benutzers muss in die .ssh/authorized_keys gelegt werden.
  * Bei ssh-keygen kann übrigens auch eine Passphrase eingestellt werden.
  * ssh-agent: Er ist in der Lage, mehrere Keys für einen Benutzer zu verwalten. Zu diesem Zweck sollte er frühzeitig während der Startphase von X ausgeführt werden.
  * ssh-add fügt dem ssh-agent weitere Keys hinzu. Der ssh-agent sieht dabei in .ssh/id_rsa, id_dsa und identitity nach.
  * Es können aber auch gezielt Keys angegeben werden.
  * ssh -l: Listet die finger prints der verfügbaren Keys auf.
  * ssh -d: Entfernt den angegebenen Key vom ssh-agent.
  * ssh -D: Entfernt alle Keys vom ssh-agent.
  * ssh -s: Liegt Key von Smartcard.
  * ssh -e: Entfernt Key der Smartcard.
  * ssh -x: Sperrt den ssh-agent mit Kennwortschutz.
  * ssh -X: Entsperrt den Agent.
  * GnuPG kann Daten verschlüsseln oder signieren.
  * GnuPG = GNU Privary Guard
  * GPG ist eine Weiterentwicklung als Ersatz für PGP.
  * Das Verschlüsselungsverfahren von GPG ist asymmetrisch, weshalb bei der Verwendung von GnuPG ein Schlüsselpaar erforderlich ist.
  * Der public key verschlüsselt, der private key entschlüsselt.
  * Der private Key wird beim Generieren von Signaturen verwendet.
  * gpg --gen-key erstellt einen GPG-Schlüssel.
  * Bei der Schlüsselgültigkeit: Diese Option ist nur für Signaturen von Belang. Ein verfallener Key kann aber weiterhin Daten ver- bzw. entschlüsseln.
  * Das Standardverzeichnis für GnuPG ist ~/.gnupg.
  * Es enthält beispielsweise gpg.conf, pubring.gpg, random_seed, secring.gpg und trustdb.gpg.
  * Die Datei pubring.gpg enthält den public key des Benutzers. secing.gpg die private keys.
  * In thrustedb.gpg sind die Signaturschlüssel anderer Benutzer gespeichert, denen ein Benutzer selbst vertraut.
  * gpg.conf kann verwendet werden, um ständig wiederkehrende Optionen automatisch an das Kommando gpg anzuhängen.
  * gpg --encrypt <file> verschlüsselt eine Datei. Die ursprüngliche bleibt jedoch erhalten und muss von Hand gelöscht werden.
  * gpg --decrypt <file>.gpg > <file>
  * Als Kennwort wird die passphrase vom key pair verwendet.