/
Güttli's Tipps und Tricks der EDV
Ich habe etwa im Jahr 2000 mit einer Text-Datei namens
readme.guettli angefangen. Dort wurden kleine Shell-Scripte und
Argumente für Befehle aufgeschrieben, die man im Beruf oder in der
Freizeit immer wieder benötigt. Im Laufe der Zeit wurde die Datei
überarbeitet und steht hier nun schon mehrere Jahre für andere zur
Verfügung.
Während eine sachliche Beschreibung von Software meistens
vorhanden ist, fehlt oft eine subjektive Wertung. Darum stelle ich
außerdem meine Sichtweise vor. Da für jedes Problem mehrere
Lösungsmöglichkeiten existieren, hoffe ich mit Hinweisen wie "ich
finde aufgrund XYZ Programm A besser als Programm B" Einsteigern zu helfen.
Seit Juli 2016 pflege ich meine Tipps zur Softwareentwicklung hier: My personal programming guidelines
Inhaltsangabe
1 Linux vs. Windows
[toc]
Die Diskussion bei welchen Aspekten Linux oder Windows besser ist, ist immer wieder
interessant. Da es die meisten Linux-Programme für Windows gibt,
jedoch die wenigsten Windows-Programme für Linux, verstehe ich jeden
Anwender der nicht zu Linux wechseln will.
Als Betriebssystem für Server und als Plattform für
Softwareentwicklung, verwende ich auf jeden Fall Linux.
Aufgabe |
Windows |
Linux |
Serverprozesse |
Windows unterstützt folgende Funktionen nicht:
- select() auf Pipes
- fork()
- pass_fd: Offene Filedescriptoren zwischen Prozessen austauschen
|
Linux ist wie die meisten Unix-Systeme gut geeignet für
Serveranwendungen.
|
Anwendungen |
Unter Windows gibt es viele GUI-Anwendungen. Alles schön
bunt. Viel Spaß beim Klicken. |
Unter Linux gibt es viele Serveranwendungen. Mail-, DNS-, Web-,
Zeitserver .... Alles schön stabil. Viel Spaß beim
Netzwerkeln. Eine Alternative zum Zeichenprogramm MS-Viso gibt es
aber derzeit für Linux nicht (Dia, Inkscape, LibreOffice Draw sind
noch nicht so gut).
|
Meine Tipp: Kein Dual-Boot! Also nicht Linux und Windos parallel installieren. Entscheide dich für ein
Betriebssystem und starte das andere in einer
virtuellen Umgebung. Dual-Boot Umgebungen machen immer Ärger.
2 Interaktive Programme
[toc]
Um zwei Dateien Zeile für Zeile zu vergleichen, kann
man Folgendes verwenden:
diff -w -y -W 200 -t old.txt new.txt | less
-w: Ignoriere Änderungen die nur aus Leerzeichen bestehen
-y: Zeige die Dateien nebeneinander an
-W 200: Verwende insgesamt 200 Zeichen in der Breite (Etwa 100 für old.txt, und 100 für new.txt)
-t: Geben keine Tabs, sondern Leerzeichen aus (Nötig, wenn less mit der Option -x4 (Ein Tab entspricht vier Leerzeichen) gestartet wird)
Schöne bunte Diffs kann man mit vimdiff oder meld produzieren.
2.2.1 Thunderbird
[toc]
Der Email Client Thunderbird
läuft unter Windows, Linux und vielen anderen
Betriebssystemen. Folgende Plugins verwende ich:
- Thunderbird
ConversationsAlle Mails eines "Dialogs" zusammen anzeigen,
auch wenn die Mails in verschiedenen Ordnern liegen.
- Nostalgy:
Mit diesem Plugin lassen sich Shortcuts definieren, um
Thunderbird besser mit der Tastatur (anstatt der Maus) bedienen zu
können. Bsp: Mails mit "S" und dann einem Autocomplete-Feld in Ordner verschieben.
- Sieve: Mit diesem Plugin
lassen sich Sieve Scripte leicht auf dem Server editieren/installieren/aktivieren.
- EditSubject:
Mit diesem Tool kann man die Betreffzeilen von Mails bearbeiten.
2.2.2 Keyboardshortcuts
[toc]
Es lohnt sich auch mit den Keyboardshortcuts zu beschäftigen: Shortcuts
2.3.1 Einführung in den Pager "less"
[toc]
Der Pager less ist eines der wichtigsten Werkzeuge auf der
Kommandozeile. Er zeigt Ausgaben von Programmen oder
ASCII-Dateien seitenweise an:
> beispiel_command | less
oder
> less .bashrc
Die wichtigsten Befehle:
/ --> Suchen (n: Nächster Treffer; N: vorhergehender Treffer)
F --> wie "tail -f": Die Anzeige wird aktualisiert,
falls neue Daten da sind.
Wieder zurück in den Pager-Modus mit ctrl-c.
Kann auch beim Aufruf angegeben werden: "less +F datei.log"
-S --> Zu lange Zeilen werden nicht umgebrochen
g/G --> Gehe zum Anfang/Ende der Datei
20G --> Gehe zur Zeile Nummer 20
2.3.2 Umgebungsvariablen
[toc]
Folgende Umgebungsvariable setze ich in .bashrc
#less pager
#q: silent
#Q: allways quiet (Switching from "F" back)
#i: case insensitiv search
#x4: Tab is four spaces (not eight)
#F --quit-if-one-screen: Causes less to automatically exit if the entire file can be displayed on the first screen.
#M: Print size of file in the prompt at the bottom
export LESS=-qQix4FM
2.3.3 Suchen mit +
[toc]
Mit "+" lassen sich beim Aufruf Befehle angeben, die gleich
ausgeführt werden:
less +/path .bashrc # Öffne .bashrc und suche nach "path"
less +F /var/log/auth.log # Öffne das Log-File und aktualisiere das Ende fortlaufend
2.3.4 ascii vs latin1 oder utf8
[toc]
Um zu erkennen wie die non-ascii Zeichen in einer Textdatei kodiert sind, nehme ich folgenden Aufruf:
LESSCHARSET=ascii less -R file-with-latin1-or-utf8.txt
2.4 Bildbearbeitung
[toc]
2.4.1 Speicherung auf der Festplatte
[toc]
Pro Tag nehme ich ein Verzeichnis um meine Bilder zu speichern. Seit 2016 nutze ich dieses Ablageschema für meine
Fotos: YYYY/YYYY-MM/YYYY-MM-DD/. Also zB 2017/2017-12/2017-12-24/
Das hat den Vorteil, dass auch das Verzeichnis des Tages das Jahr und den Monat enthält.
Die Einsortierung in dieses Schema mache ich derzeit mit einem einfachen Script. Siehe get-images.sh.
2.4.2 Gimp
[toc]
Gimp ist ein Bildbearbeitungsprogramm (eine Alternative zu
Photoshop). Es ist auch für Windows verfügbar. Es macht keinen großen Spaß mit gimp zu arbeiten,
aber es ist besser als die anderen Programme die es unter Linux gibt.
- ALT+SHIFT während dem Verschieben verschiebt nur
die "Selection" aber nicht das Bild in der Selektion.
- Linien zeichnen: Mit Pinsel oder Stift malen und Shift-Taste
halten.
- Füllen von transparentem Hintergrund: Markieren,
Bearbeiten/Füllen
- Mit transparenter Farbe malen (Alphakanal bearbeiten): Im
Ebenen-Dialog die gewünschte Ebene markieren. Rechte Maustaste
--> "Ebenenmaske hinzufügen" (ggf. vorher Alphakanal
hinzufügen). Und dann "Alphakanal der Ebene übernehmen". Für die
Ebene gibt es nun zwei Vorschaubilder (im Ebenen-Dialog), die man
einzeln selektieren kann. Wählt man die Ebenenmaske, dann malt
schwarze Farbe den Bereich transparenter und weiße Farbe macht
den Bereich deckender.
Siehe auch Ebenenmaske
im Handbuch
- Farbe zu Transparenz: Kontexmenü / Filter / Farben / Farbe
nach Transparenz
- Rote Augen entfernen:
- Mit der Lupe die Augen 'ranzoomen'.
- Doppelklick auf Freihand-Auswahl
- Ausblenden einstellen
- roten Bereich markieren (Shift-Klick, beim zweiten Auge, damit erster Bereich nicht verloren geht)
- rechte Maustaste: Werkzeuge / Farben / Farbton-Sättigung
- Helligkeit und Sättigung nach links ziehen.
- Anschließend ggf. Lichtreflex in den Augen mit dem Stempelwerkzeug aufhellen. (Mit strg-Klick den weißen
Bereich neben der Iris wählen. Pinsel auf 1x1 Pixel stellen)
Siehe auch:
gimp-rote-augen
- Crop per Tastatur: Shift-c, Ausschnitt wählen, dann Enter drücken.
- Deutschsprachiges Benutzerhandbuch
2.4.3 Gruppenfoto beschriften
[toc]
Als Elternsprecher der Klasse meines Sohnes habe ich das Gruppenfoto
der Kinder mit Nummern und Namen versehen. Das Ergebnis wurde für die
Eltern der Kinder ausgedruckt. So fällt es allen leichter die Kinder
der Klasse kennen zu lernen. Folgender Ablauf verwendet drei
verschiedene Programme.
- Fehlende Personen mit dem Bildbearbeitungsprogramm Gimp mit verschiedenen Ebenen "dazu zaubern". Speichern als
XCF, exportieren als gruppenfoto.png
- Inkscape (Vektorgrafikprogramm): Die PNG Datei vom letzten Schritt per "Verknüpfung" laden. Nummern über das
Bild malen. Speichern als gruppenfoto-mit-nummern.svg, exportieren als gruppenfoto-mit-nummern.png (300dpi, Export
von "Zeichnung")
- LibreOffice: Bild einfügen (aus Datei. Dabei "als Link" aktivieren). Tabelle mit der Namen und Nummern der
Personen unter dem Foto mit Nummern erstellen. Exportiert zu gruppenfoto-mit-nummern-und-namen.pdf
- Diese PDF-Datei an alle per Mail veschickt. Vorher Dateigröße prüfen. Sollte nicht größer als 1MB sein. Fragen
ob es Verbesserungsvorschläge oder Hinweise zu Tippfehlern gibt.
- Eine Woche auf Antwort warten.
- Aus LibreOffice exportieren als gruppenfoto-mit-nummern-und-namen.jpg. Bei Fotodienstleister drucken lassen.
- An Personen verteilen.
Wenn bei Inkscape und LibreOffice die Datei als Verknüpfung geladen wird, sind nachträgliche Anpassungen auch leicht
möglich.
2.5 FTP-Client
[toc]
Ich bin ncftp sehr zufrieden. Er kann auch nicht interaktiv (in
Shell-Scripten) verwendet werden: ncftpput, ncftpget.
2.6 Screen
[toc]
Das Programm Screen ist ein Terminal Multiplexer. Es ermöglicht in
einem Terminal mehrere Terminals zu starten. Besonders praktisch
ist, dass man sich von den Sitzungen ab- und wieder anmelden
kann. Beispiel: Man möchte auf einem entfernten Server einen lang
dauernden Prozess ausführen. Starten man den Prozess innerhalb von
Screen, kann man sich von dem Terminal trennen, ohne den Prozess zu
beenden. Anders, als bei dem Befehl "nohup", kann man sich mit dem
Prozess auch wieder verbinden ("screen -r").
Falls man einen Prozess ohne screen gestartet hat, und sich
gerne abmelden möchte, kann man wie folgt vorgehen:
- Strg-z -->> Prozess unterbrechen
- bg --> Prozess im Hintergrund schicken
- disown -h %1 --> Prozess von der Shell abkoppeln und immun gegen SIGHUP machen.
- logout --> Aktuelle Shell kann beendet werden, und Prozess läuft trotzdem weiter.
3.1 Sich in der Shell "bewegen"
[toc]
Die Readline Bibliothek wird von vielen Programmen verwendet. Allen
voran der Shell "Bash". Die Readline Bibliothek wird auch in vielen
anderen Programmen eingesetzt: Python im interaktiven Modus, pgsql (PostgreSQL) ...
Pfeil-hoch/runter: Blättern in der History
ctrl-a: Anfang der Zeile
ctrl-e: Ende der Zeile
ctrl-r: Rückwärts in der History (letzte Eingaben) suchen
ctrl-k: Bis Ende der Zeile löschen
ctrl-y: Einfügen von gelöschten Bereichen
ctrl-d: Aktuelles Zeichen löschen
Tricks der Bash:
ALT. --> letztes Argument einfügen.
3.2 Allgemein
[toc]
Den Begriff "Shell" könnte man mit "Kommandozeile" übersetzten. Die
Shell unter Unix ist einiges leistungsfähiger als die
DOS-Eingabeaufforderung der Microsoft Betriebssysteme. Im Folgenden
werden die Shell Bash und die üblichen Unix-Tools (GNU-Version)
beschrieben. Die meisten Programme sind mittels cygwin auch für
Windows-Betriebssysteme verfügbar. Inzwischen verwende ich die
Shell nur noch interaktiv. Fast alle Programme schreibe ich in
Python. Selbst kleine Scripte, die nur einmal genutzt werden.
3.3 Startdateien
[toc]
Bei den folgenden Startdateien sollte man darauf achten, dass alle
Ausgaben nach stderr geschrieben werden (Siehe SSH), da sonst Programme wie "scp"
annehmen, dass diese Ausgaben Teil der zu übertragenden Daten sind.
- ~/.bashrc:
# ~/.bashrc: executed by bash(1) for non-login shells.
# Ich finde folgende Prompt praktisch.
# Vorteil 1: "===>" findet man leicht, wenn man
# mehrere Seiten im xterm zurückblättert.
# Vorteil 2: Da das aktuelle Verzeichnis in der ersten
# Zeile und der Cursor auf der zweiten, steht der Cursor
# immer an der gleichen Stelle
if [ "$PS1" ]; then
if [ "$USER" = "root" ]; then
striche="###"
else
striche="==="
fi
PS1="\u@\h:\w\n${striche}> "
fi
if [ "$PS1" ]; then
# C-w nicht vom Terminal verarbeiten,
# sondern per .inputrc zu kill-region mappen
stty werase ''
fi
# Per Default Leserechte für alle.
# 022 entspricht "chmod 755" oder "chmod a=rX,u+w"
# Für Verzeichnisse: drwxr-xr-x
# Für Dateien: -rw-r--r--
umask 022
# Das Software, die man mit prefix=$HOME installiert ist in $HOME/bin.
# Meine Scripte sind in $HOME/scripts
PATH="$HOME/bin:$HOME/scripts:${PATH}:.:/usr/sbin:/sbin"
# History der Bash (zurückblättern) soll lang sein.
# Default von 500 Zeilen ist zu wenig.
# HISTSIZE: Anzahl der Zeilen im Speicher
export HISTSIZE=50000
# HISTFILESIZE: Anzahl der Zeilen in der Datei
export HISTFILESIZE=50000
# Schreibe die eingegebenen Befehle sofort und
# mit Zeitstempel in die History
export PROMPT_COMMAND="history -a"
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S : "
#less pager
#q: silent
#Q: allways quiet (Switching from "F" back)
#i: case insensitiv search
#x4: Tab is four spaces (not eight)
export LESS=-qQix4
#Deutscher Zeichensatz, aber Fehlermeldungen
#sollen auf englisch sein:
export LC_CTYPE=de_DE
- ~/.inputrc
#~/.inputrc fuer readline Bibliothek
# Änderungen an dieser Datei können mit C-x C-r eingelesen werden.
#Kein Piepsen!
set bell-style visible
#Case insensitiv file completion (TAB-Taste bei Befehlen/Dateien)
set completion-ignore-case on
Grep verwendet Reguläre Ausdrücke um Zeilen in der Textdatei zu
finden.
-
find . | grep -E '\.(txt|html)$'
-E: Extended Regular Expression
findet alle Dateien ab dem aktuellen Verzeichnis, die mit .txt oder
.html enden ($ == Ende). Symlinks werden nicht aufgelöst.
-
grep -rsiEI '[^f]xform' .
-r: Rekursiv
-s: silent (Keine Fehlermeldung falls "permission denied")
-i: Case-Insensitiv (kein Unterscheidung zwischen Groß- und
Kleinschreibung)
-I: Durchsuche nur Text-Dateien, keine binären Dateien.
-E: Extended Regular Expression: "(" für Gruppierungen, "|" für "oder"
-P: Perl/Python Compatible Regular Expression.
-
grep -r --include '*.txt' abcde .
--include: Durchsuche nur Dateien auf die das Glob-Muster passt (Siehe auch "man 7 glob")
- Bestimme Prozesse killen:
> kill $(ps aux | grep '[g]pg-agent'| tr -s ' ' ' ' | cut -d ' ' -f2)
- ps aux: Alle Prozesse anzeigen
- grep: gpg-agent, aber nicht den eigenen grep-Prozess anzeigen
- tr -s ' ' ' ': Mehrfache Leerzeichen durch eins ersetzen
- cut -d' ' -f2: Nur die zweite Spalte ausgeben
- kill $(...): Das Ergebnis des geklammerten Ausdrucks sind Prozess-IDs. Diesen Prozessen
das Signal SIGTERM senden.
- Alle nicht druckbaren Zeichen ersetzen:
> befehl-mit-ausgabe-auf-stdout | tr -c '\n\040-\176' '\n~'
siehe "man ascii"
\040 ist oktal SPACE
\176 ist oktal ~
-c Komplementär von MENGE1
UTF8 Zeichen machen bei grep ggf. Unschöne Umbrüche: (Umlaut Ä)
Die Ã
nderung
--> Die ~~nderung
3.6 Schleife
[toc]
3.6.1 Allgemein
[toc]
Wenn Dateien Leer- oder Sonderzeichen enthalten wird das Arbeiten
mit Shell-Scripten teilweise richtig schwierig. Inzwischen schreibe ich
so gut wie nie mehr Shell-Schleifen. Dafür nutze ich Python.
find . | while read file
do
bsp_command "$file"
done
Bei obigen Beispiel muss man jedoch beachten, dass die Bash für die
Zeilen der While-Schleife eine neue Subshell
erstellt. Umgebungsvariablen, die man in setzt sind nach dem "done"
nicht zu sehen, da sie nicht an die Eltern-Shell zurückgegeben
werden. Obiges Beispiel ist aber nicht 100% sicher. Das
Newlinezeichen ist in Dateinamen unter Unix zulässig. Das Lesen von
Stdin würde jedoch darüber 'stolpern'. Mein Tipp: Die Shell
nur interaktiv nutzen. So bald man Schleifen programmieren muss: Python.
3.6.2 Dateien umbenennen
[toc]
for file in *.TTF; do mv "$file" "${file%.TTF}.ttf"; done
Näheres zu ${file%.TTF} finden man unter "Parameter Expansion" in
"man bash". Während % am Ende ersetzt, kann man mit /.../ auch in der Mitte ersetzen:
#abc_foo.jpg --> abc_bar.jpg
for file in *.jpg; do mv $file ${file/foo/bar}; done
3.6.3 Dateie verschieben
[toc]
Nur eine Auswahl an Dateien in ein Zielverzeichnis verschieben:
find ... -print0 -name '*.png' | xargs -0 mv --target-directory mydir
3.7 mystring.endswith("beispiel") in der Bash
[toc]
In Python haben Zeichenketten die praktische Funktion "endswith()".
In der Bash ist das etwas komplizierter:
if [ "${myvar: -3:3}" = "foo"]; then
....
fi
Das Leerzeichen vor "-3" ist nötig. Siehe "man bash" "Parameter Expansion"
3.8 Ausgaben zusätzlich in eine Datei umleiten
[toc]
3.9 Dateien nach Zeitstempel sortieren (inkl. Unterverzeichnisse)
[toc]
find . -printf '%TY-%Tm-%Td:%TT %p\n' | sort
oder einfacher: find -printf '%T+ %p\n' (GNU Extension)
%T steht für die mtime (Modifikationszeitpunkt). Es kann
auch %C (Change Time) oder %A (Access Time) verwendet werden.
Siehe auch "man find" und "man stat"
3.10 Dateien, die älter als 24 Stunden sind finden
[toc]
find . -mtime +0 # Dateien, die älter als 24 Stunden sind
find . -mtime 0 # Dateien, die jünger als 24 Stunden sind
find . -mtime -1 # auch: Dateien, die jünger als 24 Stunden sind
3.11 Dateien eines bestimmten Datums finden
[toc]
Leider kann man mit GNU-find nur nach Dateien mit einem bestimmten
Datum suchen, wenn man eine temporäre Datei anlegt:
# MMDDHHMM (7. Juli des aktuellen Jahres)
touch -t 07070000 ~/tmp/start$$
touch -t 07072359 ~/tmp/end$$
find -newer ~/tmp/start$$ \! -newer ~/tmp/end$$
rm ~/tmp/start$$ ~/tmp/end$$
3.12 Plattenplatzverbrauch
[toc]
3.12.1 Liste aller Verzeichnisse/Dateien sortiert nach größe
[toc]
Falls der Plattenplatz knapp wird, und man wissen möchte welche
Datei und welches Verzeichnis am meisten Platz benötigt, kann
folgende Zeile ausführe. Diese Zeile erstellt eine Liste aller
Verzeichnisse und Dateien sortiert nach Größe. Falls die Platte
(also in diesem Beispiel auch /var/tmp voll) ist, sollte man
die Ausgaben ggf. per ssh zu einem anderen Rechner umleiten.
root> du -ax / | sort -rn > /var/tmp/du-$(date --iso).log
-x: Bleibe auf diesem Dateisystem. D.h. /proc wird übersprungen.
-a: Alle Dateien, nicht nur Verzeichnisse werden angegeben.
sort -rn: Numerisch absteigend sortieren.
Falls kein Platz mehr für die Log-Ausgaben sind:
root@plattevoll> du -ax / | ssh nutzer@woanders -C "sort -rn > /var/tmp/du-$(date --iso).log"
3.12.2 Man spricht menschlich
[toc]
Platzverbrauch mit menschenfreundlicher Ausgabe: Die
Option -h (human-readable) zeigt bei den folgenden Kommandos die
Größe in kByte, Mega-Byte oder Giga-Byte an:
ls -lh
--> Größe der Dateien im aktuellen Verzeichnis
du -h
--> Gesamte Größe inkl. Unterverzeichnisse
df -h
--> Platz auf den Dateisystemen/Partitionen
3.12.3 Gesamte Größe bestimmter Dateien.
[toc]
find -name '*.py' -print0 | du -b -c --files0-from=-
Damit lässt sich du Größe von einer Auswahl von
Dateien bestimmen. Im obigen Beispiel wird nur die Größe von
Python-Scripten berechnet.
3.13 Mehrere Jobs
[toc]
Vergisst man ein Programm im Hintergrund zu starten ("&" am
Zeilenende), kann man mit Strg-z das Programm anhalten. Mit den
Befehlen "fg" bzw. "bg" kann man das Programm im Vordergrund
bzw. im Hintergrund weiterarbeiten lassen.
Trick: Möchte man wissen, wann ein lang laufendes Programm
sich beendet, kann man es mit Strg-z anhalten und dann mit
folgendem Befehl wieder starten:
fg ; while /bin/true; do echo -ne \\a; sleep 1; done
Nach dem das Programm beendet ist wird in einer Endlosschleife ein
Piepgeräusch erzeugt.
3.14 Control-Zeichen
[toc]
Oct Dec Hex C
-----------------------------
000 0 00 \0 ^@ NULL (Binäre Null)
007 7 07 \a ^G bell
010 8 08 \b ^H Backspace
011 9 09 \t ^I Tab
012 10 0A \n ^J Linefeed (newline)
013 11 0B \v ^K Vertical Tab
014 12 0C \f ^L Formfeed
015 13 0D \r ^M Carriage Return
033 27 1B ^[ Escape
Siehe auch "man ascii" unter Linux.
In der Shell Bash können Controll-Zeichen mittels z.B. $'\t'
(bzw. $'\xHH') angegeben werden. Gerade für das Tab-Zeichen ist das
in Shell-Skripten sinnvoll, da der Unterschied zwischen Tab und
mehreren Leerzeichen nicht zu sehen ist. Siehe "Quoting" in "man
bash".
3.15 Recode
[toc]
Mit dem Programm recode kann den Zeichensatz einer Text-Datei
ändern.
Text-Dateien von Unix werden im Notepad auf einer Zeile
angezeigt, und Scripte, die mit "#!/bin/interpreter" anfangen
laufen nicht unter Unix, da noch ein "Carriage Return" hinten
dransteht.
# CR/LF wird zu LF (dos --> unix)
recode latin1/CR-LF..latin1 datei.txt
# und zurück
recode latin1..latin1/CR-LF datei.txt
3.16 Fehlende Beispiele
[toc]
Die Shell "Bash" hat einen Nachteil. Die meisten Befehle sind nur
sehr kurz in der Dokumentation (Siehe "man bash" oder "help befehl")
beschrieben. Beispiele sind bei den GNU-Tools leider nicht
vorhanden. Darum sind in den folgenden Punkten einige Beispiele
aufgeführt.
3.16.1 chmod
[toc]
Mit dem Befehl "chmod" werden die Zugriffsrechte einer Datei
geändert. Möchte man rekursiv für alle Leserechte hinzufügen, kann
man das mit folgenden Aufruf erledigen:
chmod -R a+rX
-R rekursiv
a+ für alle folgende Rechte hinzufügen
r Leserecht
X Nur für Verzeichnisse: Das Recht, das Verzeichnis aufzulisten (ls)
3.16.2 Reguläre Ausdrücke
[toc]
Die Bash unterstützt auch reguläre Ausdrücke. Die Syntax zu lernen ist
aber aus meiner Sicht zeitverschwendung. Lieber die Regex-Syntax von Python lernen. Die ist mächtiger und flexibler.
3.16.3 set -u
[toc]
Durch set -u
bricht das Bash-Script ab, falls eine
Variable nicht gesetzt ist. Falls man prüfen will, ob eine Variable
gesetzt ist, es ist der verzweifelte Versuch der Freunde der Shellprogrammierung
das Shell-Scripting etwas zuverlässiger zu machen.
Ich nutze die Shell nur noch interaktiv, und darum brauche ich auch "set -u" nicht mehr :-)
3.17 Defekte Symlinks finden (Find broken symlinks)
[toc]
find / -type l ! -execdir test -e '{}' \; -print
Erläuterung:
find / Starte find
im Wurzelverzeichnis
-type l Suche Symlinks
! -execdir test -e '{}' \; Falls Datei nicht existiert,
-print gebe den Dateinamen aus
3.18 Prozesse
[toc]
Da das Paket pstree
nicht immer installiert ist,
verwende ich gerne ps aux --forest
. Außerdem lässt sich
mit ps
besser angeben, welche Prozesse angezeigt werden
sollen.
3.19 Scripte
[toc]
Eine Übersicht über meine Script-Sammlung: Scripte
Hier eine kleine Auswahl:
- kill-regexp.pl: Beende Prozesse, auf die ein regulärer Ausdruck
passt.
- my-html-tidy.sh: Überprüfe HTML-Seiten mit tidy, ignoriere dabei
unnötige Warnungen.
- number-html-headings.py: Nummeriere HTML-Seiten
entsprechend der <h?> Tags. Erstelle ggf. eine Inhaltsangabe.
- reprec.py:
Rekursives Ersetzen. Kann mit und ohne regulären Ausdrücken
verwendet werden.
- settitle.sh: Eine spezielle echo-Anweisung ändert den Titel eines
xterms. Bei mehreren xterms auf einem Desktop, kann man so schnell zu einem bestimmten xterm wechseln.
3.20 Wann nimmt man eine "richtige" Programmiersprache?
[toc]
Abschließend zu dem Kapitel "Shell" einen Hinweis: Mit wenigen
Zeilen lassen sich erstaunlich komplexe Probleme lösen. Doch ab
etwa 15 Zeilen werden Shell-Scripte meist unübersichtlich und
fehleranfällig. Dann sollte man sich die Zeit nehmen und nochmal
von vorne mit einer "richtigen" Programmiersprache anfangen. Die
meisten Shellscripte funktionieren nicht mehr, falls Leer- oder
Sonderzeichen in Dateinamen vorkommen.
Seit 1996 benutze ich fast täglich die Shell interaktiv. Anfangs verwendete ich Shellscripts für einfache
Aufgaben und Python für komplexe Aufgaben. Seit etwas 2010 nutze ich auch für einfache Aufgaben Python.
Shellscripts sind aus meiner Sicht unzuverlässig.
4 Sonstiges
[toc]
4.1 Vermeide "harte Links"
[toc]
Außer der Möglichkeit mittels harten Links (ln datei
ziel
) ein inkrementelles Backup mit rsync zu machen, gibt es
aus meiner Sicht sehr wenige Stellen, an denen harte Links sinnvoll
sind.
Symbolische Links (ln -s datei ziel
) sind
weniger fehleranfällig und lassen sich auf für Verzeichnisse
anwenden.
SSH (Secure Shell) ist ein Programm um eine sichere Verbindung
zwischen zwei Rechnern zu erstellen. "Sicher" im Sinne von
"abhörsicher" und "manipulationssicher".
-
Da scp die Login-Dateien wie z.B. .bashrc ausführt, darf in
diesen Dateien keine Ausgabe nach stdout geschehen. Die Ausgabe
sollten nach stderr umgeleitet werden:
echo "bla" >&2
- X-Forwarding:
beispiel@here> ssh -X user@server
user@server> xeyes ---> Anzeige der xeyes auf dem lokalen Rechner, Programm
läuft jedoch auf dem entfernten Rechner.
- SSH über Hops. Kommt man von Rechner C zu S nur über Rechner M, so
hilft folgende .ssh/config Datei (C --> M --> S):
Host S
ProxyCommand ssh M netcat -w 5 S 22
#ssh/scp nun direkt von C zu S möglich.
Hinweis: Das Programm netcat muss auf dem Rechner M installiert sein.
- Mit "scp -r" ist es leider nicht möglich nur bestimmte Dateien
zu übertragen. Das ist auch nicht nötig, weil man mit zwei
Tar-Befehlen arbeiten kann. Das "tar" auf dem entfernten Rechner
schreibt nach stdout und das "tar" auf dem lokalen Rechner liest von
stdin. Beispiel:
# Beispiel 1: Dateien von remotehost holen:
ssh remotehost "cd beispiel; find . -name '*.jpg' | tar -cf - --files-from=-" | tar -xvf -
# Beispiel 2: Dateien zu remote host kopieren:
# Aus dem Verzeichnis "workdir" wird das Verzeichnis "beispieldir" kopiert.
cd workdir
find beispieldir -name "*.txt" | tar -cf - --files-from=- | ssh remotehost tar -xvf - -C workdir
-
Startet man in einer SSH-Session ein Programm, das nach Beenden der
Session weiterhin aktiv ist (z.B. mit dem Befehl "nohup" ohne
schließen von stdin mit "</dev/null"), kann man die SSH-Sitzung
nicht beenden. Nach dem Logout (bzw. Strg-D) bleibt die Shell
offen. Wie folgt kann man nun vorgehen:
RETURN ~ h --> Hilfe: Zeigt die Befehle die SSH versteht
RETURN ~ . --> Beendet die aktuelle Sitzung
RETURN ~ & --> Schickt die SSH-Sitzung in den Hintergrund.
- Portforwarding ist einfach und praktisch. Um einen Port vom
lokalen Rechner zu einem entfernten weiterzuleiten wird die Option
"-L" verwendet:
Zwei Rechner:
hier --- entfernt
nutzer@hier> ssh -L 8888:localhost:80 entfernt
Die Secure Shell baut eine Verbindung zu dem Rechner
"entfernt" auf und leitet von dort localhost:80 weiter zu dem
Rechner "hier". Anschließend kann man mit "telnet localhost 8888"
auf dem Rechner "hier" testen, ob die Verbindung besteht. Merke: Der
Hostname zwischen den Doppelpunkten wird auf dem Rechner "entfernt"
aufgelöst.
Vier Rechner:
hier2 --- hier --- entfernt --- weit-weg
nutzer@hier> ssh -g -L 8888:weit-weg:80 entfernt
Wie oben, bloß dass von dem Rechner "entfernt" der Port von
"weit-weg" weitergeleitet wird. Mit der Option "-g" (Gateway) ist es
anderen Rechnern möglich, den weitergeleiteten Port auf dem Rechner
"hier" anzusprechen. Eine Verbindung mit "telnet hier 8888" vom
Rechner "hier2" ist nun möglich.
Die Fehlermeldung "bind: Address already in use" kann ignoriert
werden. Sie kommt angeblich davon, dass SSH versucht auf IPv4 und
IPv6 Ports lauschen.
- Fehlersuchen beim SSHD: Falls der SSH-Server sich nicht so
verhält wie er soll, und man möchte z.B. mehr Debug-Meldungen
sehen, kann man einen zweiten Server auf einem anderen Port
starten. Das ist insbesondere sinnvoll, falls man gerade per SSH
eingeloggt ist, und man nicht den Zugang für andere während dem
Testen stören will. Gerade bei weit entfernten Server muss man beim
Bearbeiten der SSHD Konfiguration sehr vorsichtig sein.
/usr/sbin/sshd -d -e -p 2222
-d Debug
-e Log nach stderr
-p Anderer Port (richtiger Server läuft weiterhin auf 22)
Es startet ein SSH-Server auf Port 2222. Mit einem Client kann man
sich nun, mit der zusätzlichen Option "-p 2222" mit diesem Server
verbinden.
Man kann auch mit "-f" dem Debug-Server eine andere
Konfigurationsdatei geben. Mit dieser Konfigurations kann man dann
"spielen" und den richtigen Server erst neustarten, falls die Tests
erfolgreich waren.
Achtung: Der mit "-d" gestartete Server beendet sich nach einer
Verbindung wieder.
-
NTP für Arme. Lohnt sich der Einsatz von NTP (Network Time
Protocol) nicht, oder ist ein Rechner nur per TCP und nicht per
UDP erreichbar, dann hilft folgender Aufruf, um die Uhrzeit auf
einem entfernten Rechner zu setzen:
ssh root@weitweg date -s \"$(date -R)\" \; hwclock --systohc
"date -R" wird auf dem lokalen Rechner ausgeführt. Die Option "-R"
bewirkt, dass eine Ausgabe erzeugt wird, die der entfernte Rechner
auch versteht. Die Ausgabe von Date ohne Optionen ("Mi Dez 14
20:16:05 CET 2005") wird aufgrund der deutschen Schreibweise auf
dem entfernten Rechner ggf. nicht verstanden. Mit "date -s" wird
auf dem entfernten Rechner das Datum gesetzt.
- SSH Public Key für passwortfreies Anmelden installieren:
cat ~/.ssh/id_rsa.pub | ssh remote-rechner "mkdir -p .ssh; cat >> .ssh/authorized_keys"
Für diesen SSH-Aufruf muss man das Passwort noch ein letztes Mal eingeben.
Einfacher geht es mit ssh-copy-id
- SSH
Filesystem. Mit aktuellen Linux-Systemen, können Dateisysteme
auch von normalen Nutzern eingebunden werden (FUSE).
Rsync ist ein sehr mächtiges Programm um Dateien zu kopieren. Es
werden nur die Änderungen übertragen. Dateien, die auf beiden
Rechnern gleich sind, werden übersprungen. Rsync kann mittels ssh,
dem eigenen rsync-Protokoll oder lokal benutzt werden.
In der Regel sollte man es vermeiden, einen Rsync-Server
aufzusetzen, da es eine unnötige Sicherheitslücke ist. Besser ist
es in der Regel, rsync mittels ssh zu verwenden.
Werden die Daten auf beiden Systemen geändert, sollte man anstatt
rsync unison
verwenden. Zum Beispiel um einen Laptop und einen PC abzugleichen.
4.4 strace
[toc]
Das Programm "strace" zeigt alle System-Rufe eines Programms an. Es
ist somit sehr gut geeignet, um in fremden Programmen Fehler zu
finden. Um es sinnvoll einsetzen zu können muss man verstehen was
ein System-Ruf (system call) ist. Öffnen von Dateien, schreiben in
Dateien oder Sockets, erstellen neuer Prozesse ... sind
Systemrufe. Vergleichen von Zeichenketten und Berechnungen sind
keine Systemrufe, da dafür keine Funktionen des Betriebssystems
nötig sind.
Man kann strace auf ein Programm ausführen (myapp), oder sich mit
einem laufenden Prozess verbinden.
strace myapp
strace -p PID
4.5 Open Source Software Lizenzen
[toc]
Meistens verbindet man freie Software mit der Lizenz "GPL". Ich
bevorzuge die BSD-Lizenz, da sie kurz und verständlich
ist. Außer Richard Stallman, dem Autor der GPL-Lizenz, gibt es
sicherlich wenige, die die GPL gelesen und verstanden haben. Mir ist
die Zeit dafür zu schade, und bevorzuge deshalb die
BSD-Lizenz. Außerdem darf "BSD-Software" auch in kommerziellen
Produkten verwendet werden.
4.6 Netzwerke
[toc]
Die folgenden Punkte beziehen sich auf Linux, bzw. Unix-ähnliche
Betriebssysteme.
-
Meine beliebtesten Optionen für netstat:
-l Zeige Sockets die an einem Port lauschen (Server)
-a Zeige alle (lauschende und verbundene) Sockets.
-Ainet nur tcp/udp nicht unix sockets. Entspricht -tu
-n Numeric (Port und Rechnernamen als Zahlen anzeigen)
-p Zeige die PID und den Programmnamen in jeder Zeile.
Mehr über den Prozess kann man in dem Verzeichnis /proc/PID/ erfahren.
Nur der Nutzer root kann die PID von anderen Nutzern sehen.
-e Erweiterte Informationen (Nutzername, Inode)
Bsp:
Welche Server lauschen auf welchen Ports? (Per Inted gestartete Server ggf. nicht zu sehen)
netstat -tulpe
-
Mit "lsof -in | grep port_number" kann man herausbekommen welcher
Prozess mit dem Port port_number verbunden ist. Als Nutzer kann man
sich nur Prozesse anzeigen, die zu seiner UID gehören. Benutzer
root kann die offenen Verbindungen von allen Nutzern einsehen.
Oder "lsof -i:80": Zeigt alle Verbindungen von/zu Port 80 (http)
Oder "fuser -n tcp ssh": Zeigt die PID des offenen SSH-Ports an.
- "lsof -i UDP -n":
Zeige alle offenen UDP Ports an. Kann nur auf dem Server ausgeführt werden.
Offene Ports auf anderen Rechnern kann man per Portscanning erfahren
(z.B. nmap)
- Broadcast: Wer ist im Netz? (Leider antworten nicht alle
Betriebssysteme)
ping -b 172.168.0.255
- Akustisches Signal, falls Verbindung funktioniert: Während man
unter dem Tisch am Switch oder Hub Netzwerkkabel umsteckt, möchte
man hören wenn die Verbindung funktioniert:
ping -a remote_host
-
Ein Netzwerk mittels einem IP-Filter sicher zu machen ist nicht
schwierig. Da "Verstehen" besser als "SuSE-Firewall" ist,
empfehle ich jedem das kurze Netfilter Howto durchzulesen: Netfilter
Howto
Es bringt übrigens keine zusätzliche Sicherheit, wenn man
ungewünschte Pakete mit DROP ignoriert. Ich finde es besser mit
REJECT zu antworten. Das macht das Finden von Fehlern im eigenen
Netz einfacher, da nicht auf ein Timeout gewartet werden muss,
sondern sofort von der Firewall zurückgewiesen wird.
Firewall-Regeln kann man mit iptables-save und -restore
speichern und wieder herstellen. Aus meiner Sicht ist das jedoch
nicht sinnvoll. Meist erstellt man die Firewallregeln in einem
kleinen Script. Die Regeln sind also schon in dem Script
gespeichert. Das lässt sich auch viel besser anpassen als die
Ausgaben von iptables-save. Außerdem kann man im Script
mit Variablen arbeiten.
- Kommunikation zwischen Client und Server aufzeichnen:
# Verbindung zum Port 80 wird in der Datei capture.dat gespeichert.
# Es werden die ersten 9000 Bytes der Pakete in die Datei geschrieben.
# tcpdump läuft auch auf vielen embedded Systemen wie z.B. OpenWRT
tcpdump -i any -s 0 -w capture.dat port 80
# Nach der Aufzeichnung kann man sich die Datei mit folgendem Befehl
# ansehen:
wireshark -r capture.dat
- Wireshark: Display Filter:
Damit in Whireshark uninteressante Pakete ausgeblendet werden,
kann man mit Display Filtern arbeiten:
Display Filter
Kasperfalle:
richtig: !(ip.addr == 1.2.3.4)
falsch: ip.addr != 1.2.3.4 --> Da auf Absender und Empfänger geprüft wird, ist diese Angabe immer richtig!
- Vermeide FTP: Da FTP (File Transfer Protocol) zwei
TCP-Verbindungen benötigt, macht es immer wieder Probleme mit
Firewalls: Bei aktivem FTP baut der Server eine Verbindung zum
Client auf. Der Client hat jedoch meist keine öffentliche
IP-Adresse und ist somit nicht erreichbar. Wegen dem Problem
verwendet man heute meist passives FTP. Bei dieser Variante baut
der Client für den Datentransfer eine Verbindung zum Server
auf. Meist steht der FTP-Server hinter einer Firewall in der DMZ
(Demilitarisierte Zone). Hat das Netz des Server-Anbieters nur eine
öffentliche IP, hat man ein Problem: Einfaches Port-Forwarding
reicht nur für den Steuerkanal, der Datentransfer über die zweite
TCP-Verbindung ist nicht ohne Weiteres möglich, da die Firewall nur
den Port 23 (FTP) weiterleitet.
- Kopieren ohne "Overhead": Dateien kopiert man meist per SSH/SCP
über das Netzwerk. Will man den "Overhead" für die Verschlüsselung
umgehen (oder ist SSH nicht verfügbar), kann man Folgendes
verwenden:
Empfänger (zuerst starten):
netcat -l -p 5555 | tar -xf -
Sender:
tar -cv -exclude=... -f - . | netcat IP-Empfänger 5555
Eine einzelne Datei kann man auch so kopieren:
Empfänger (zuerst starten):
netcat -l -p 5555 | cat > dateiname
Sender:
cat dateiname | netcat IP-Empfänger 5555
In wie weit es eine Beschleunigung gegenüber rsync/scp ist, kommt
auf das Netzwerk und die Hardware der Rechner an. Rsync über einen
SSH-Tunnel benötigt bei einem 1.8GHz Pentium4 10%
CPU-Zeit. Entsprechend wird die Lösung mit netcat kaum schneller
sein. Der Flaschenhals ist nicht das Ver- und Entschlüsseln sonder
das Netzwerk.
- OpenVPN ist eine sehr
einfach einzusetzende VPN (Virtual Privat Network) Software. OpenVPN
wird von Linux, *BSD und Windows unterstützt. Ich kenne keine andere
VPN-Software mit der man eine Verbindung zwischen zwei Rechnern
aufbauen kann, die nur mittels DynDNS erreichbar sind
(also keine feste IP besitzen).
- Eine Seite mehrfach auf einer Seite drucken (zB kleine Handouts erstellen):
# one-page.pdf besteht aus einer Seite, die man zB mit Inkscape erstellt hat.
# Mit dieser Zeile wird die PDF-Datei four-pages.pdf erstellt, die aus vier Seiten besteht. Viermal die gleiche Seite.
pdftk one-page.pdf one-page.pdf one-page.pdf one-page.pdf cat output four-pages.pdf
# Fasse die Datei von oben zusammen: Vier Seiten auf einer Seite. Erstellt wird four-pages-nup.pdf
pdfjam --nup 2x2 four-pages.pdf --outfile four-pages-nup.pdf
# Erstellte Datei mit zB "evince" anschauen
evince four-pages-nup.pdf
# Ausdrucken, zerschneiden, verteilen ....
4.8 CD Brennen
[toc]
Während ich viele Jahre mit cdrecord auf der Kommandozeile gearbeitet habe, nutze ich inzwischen auch
nur noch Brasero (GUI für Ubuntu). Das Brennen von CD/DVDs ist inzwischen auch deutlich seltener geworden.
Die Netzwerkverbindungen sind besser oder man tauscht einen USB-Memory-Stick aus.
4.9 Exim / Postfix
[toc]
Als Mailserver verwende ich Exim oder Postfix
- Die wichtigsten Befehle:
Aktion |
Exim |
Postfix |
Sendmail |
Print Mailqueue |
exim -bp |
postqueue -p |
sendmail -bp |
flush queue (send mails now) |
exim -qf |
postqueue -f |
sendmail -q |
flush queue, retry frozen messages |
exim -qff |
postsuper -H ALL (restart messages from queue 'hold') |
remove message from queue |
exim -Mrm <message-id> |
postsuper -d <message-id> |
write mail to stdout |
exim -Mvb <message-id> |
postcat -q <message-id> |
- Die wichtigsten Begriffe bei Exim:
- Transport: Zustellung der Email (SMTP oder lokale Zustellung).
Wird von Director oder Router aufgerufen.
- Router: Für nicht lokale Domains (Ausgehende Emails)
- Director: Für lokale Domains
- Driver: Transport, Router oder Director
Die Reihenfolge in exim.conf ist entscheidend. Falls ein Router oder
Director fehlschlägt (decline) wird der nächste versucht. Falls der
letzte fehlschlägt: failed.
Gute Anleitung für Postfix: Postfix, saslauthd & dovecot
imapd/pop3d Howto für Debian sarge 3.1
Cron ist ein Unix-Dienst, der wiederkehrende Aufgaben ausführt. Der
Dienst verschickt eine E-Mail an den Nutzer, falls das Script auf
stdout oder stderr schreibt. Oft wird deshalb stdout in ein Log-File
umgebogen, damit man nicht täglich mit E-Mails "belästigt"
wird. Falls eine Warnung auf stderr geschrieben wird, so erhält man
trotzdem eine Nachricht. Das Script sollte so geschrieben sein, dass
es nur im Fehlerfall auf stderr schreibt, und somit die E-Mail
sinnvoll ist.
- Emails im Fehlerfall:
# Siehe "man 5 crontab"
# minute hour day_of_month month day_of_week
00 01 * * * $HOME/bin/myscript >> $HOME/log/myscript.log 2>&1
Nachteil: Die Fehlermeldungen erreichen uns nur per E-Mail, sind
aber nicht im Logfile. Darum Folgendes:
00 01 * * * $HOME/bin/myscript 2>&1 >> $HOME/log/myscript.log | tee -a $HOME/log/myscript.log
Schritt für Schritt, zum Mitdenken:
- Stderr des Scripts wird umgebogen, damit es in die Pipe (| tee
...) schreibt.
- Stdout des Scripts schreibt in das Logfile. Normale Ausgaben
erzeugen keine E-Mail durch Cron.
- Das "tee" liest den ursprünglichen stderr-Strom und gibt ihn auf
stdout aus (Cron nimmt das entgegen und verschickt eine E-Mail) und
hängt ihn außerdem an das Logfile an.
Ziel der Übung: Nur im Fehlerfall eine E-Mail erhalten und die
Fehlermeldung ist außerdem im Logfile.
Hinweis: Unter Unix kann gefahrlos in eine Dateien von
mehreren Prozessen im append-Modus geschrieben werden (Ausnahme:
Dateien, die per NFS eingebunden sind).
- Fehlerfinden bei Cronjobs:
Wenn ein Script funktioniert, wenn es von der Shell aus aufgerufen
wird, heißt noch nicht, dass es klappt, wenn es von Cron gestartet
wird. Grund: Es fehlen Umgebungsvariablen:
- PATH: In der Regel ist der Pfad nur
/usr/bin:/bin
. In der interaktiven Shell ist jedoch
meist $HOME/bin und /usr/local/bin auch im Pfad.
- HOST: Diese und andere Umgebungsvariablen sind meist nicht
gesetzt. Hier hilft z.B.
uname -n
Zum Fehlerfinden kann man folgenden Code in eine Datei schreiben, und
sie per Cron aufrufen lassen:
#!/bin/sh
echo $(date) >> /tmp/crontest.log
echo env >> /tmp/crontest.log
- Funktioniert ein Script als Cronjob nicht, obwohl es von der
Shell aus aufgerufen funktioniert, kann man wie folgt ausprobieren,
was passiert, wenn keinerlei Umgebungsvariablen übergeben werden:
nutzer@host> env -i myscript # Der Prozess 'myscript' hat keine Umgebungsvariablen
nutzer@host> env -i PATH=/bin/:/usr/bin/ # Der Prozess hat nur die Umgenungsvariable 'PATH'
- Damit die Umgebunsvariablen eines Cronjobs, der interaktiven
Shell entsprechen, lese ich oft die Datei .bashrc vorher ein:
00 01 * * * . .bashrc && bin/myscript.py
4.11 Debian / Ubuntu
[toc]
Das auf Debian basierende Ubuntu
ist meine
bevorzugte Linux Distribution. Ubuntu ist nutzerfreundlich und
außerdem ein gutes Betriebssystem für Server. Eine gute Einführung
ist der Ubuntuguide.
Die Paketverwaltung mit apt
und dpkg
ist spielend einfach:
>apt-cache search "regex"
Sucht nach "regex" in allen Paketbeschreibungen
>apt-cache show apache
Zeigt Paketbeschreibung von Paket "apache" an.
>apt-file "beispiel"
Sucht nach der Datei "beispiel" in allen installierbaren Paketen.
Alle Pakete die auf "hold" stehen zu "install" machen, damit
sie beim nächsten "apt-get upgrade" aktualisiert werden:
root> dpkg --get-selections > /tmp/selections
root> cat /tmp/selections | sed 's/hold$/install/' | dpkg --set-selections
>dpkg -L beispiel
Zeige die Liste der installierten Dateien des Paketes "beispiel".
>dpkg -S /etc/beispiel
Sucht das Paket zu dem die Datei "/etc/beispiel" gehört. Es wird dabei nur nach installieren Paketen gesucht.
Achtung, der Slash am Ende ist von Bedeutung:
# dpkg -S /etc/ssh
ssh: /etc/ssh
# dpkg -S /etc/ssh/
dpkg: /etc/ssh/ nicht gefunden.
>dpkg-query ... ähnliche wie dpkg, es wird aber in den installierten und nicht installierten Paketen gesucht.
Siehe Debian Anwenderhandbuch
Möchte man an die Daten, ohne das Paket zu installieren, so kann man
eine RPM Datei wie folgt auspacken:
-Archiv entpacken:
mkdir wvware
cd $_
rpm2cpio ../wv-0.7.2-189.src.rpm | cpio -id
cpio: -i: extract, -d: create directories
Wie bekommt man heraus zu welchem Paket
die Datei "beispiel" gehört?
rpm -qf /usr/bin/tex
Informationen über ein Paket
rpm -qi beispiel
Dateiliste eines Pakets:
rpm -ql gcc
4.13 Pakete, die man braucht
[toc]
Hier eine Liste von Paketen, die ich normalerweise immer installiere:
pakete.txt
4.14 umount /media/dvd: device is busy
[toc]
Eine DVD oder CD kann man erst herausholen, wenn sie aus dem
Unix-System entfernt wurde. Das aushängen (umount) ist aber nur
möglich, wenn kein Prozess mehr das Dateisystem benötigt. Leider
teilt der Befehl nicht mit, welche Prozess das Dateisystem noch
benötigt. Falls man "lsof" installiert hat, kann man das wie folgt
herausbekommen:
# ggf. als root aufrufen, damit man alles sieht.
lsof | grep /media/dvd
# oder
fuser -u /media/dvd
Falls "lsof" nicht installiert ist:
for file in /proc/[0-9]*/cwd /proc/[0-9]*/fd/* ; do echo $file $(readlink $file) ; done | grep /media/dvd
4.15 SMTP, POP3, HTTP per Telnet
[toc]
Eine Socket-Verbindung wird vom Client zum Server aufgebaut. Mit dem
Programm "telnet" kann man zu jedem Port eines Servers einen
Verbindungsaufbau mit einem TCP-Socket versuchen.
Protokolle wie SSH, POP3, SMTP, HTTP verwenden TCP für die
Kommunikation zwischen Client und Server.
SMTP (RFC 821):
2xx = OK
5xx = Fehler
telnet mails-server 25
ggf. (M$ IIS): EHLO client-rechner
[AUTH PLAIN ???]
Die Zeichenkette für "???" erhält man mit:
perl -MMIME::Base64 -e 'print encode_base64("username\0username\0password");'
(Siehe Postfix SASL README)
mail from: <email@me.de>
rcpt to: <user@blu.de>
data
Subject: Hallo!
das ist der Body der Email
. (Zeile mit nur einem Punkt beendet die Email)
quit
POP3 (RFC 1725):
telnet mail-server 110
user <name>
pass <passwort>
list (Anzeige der Emails)
retr <nummer> (Email anzeigen)
dele <nummer> (Email löschen)
[top <msg> <N> (Optionaler
Befehl (wird von den meisten POP3-Servern implementiert: Anzeigen der ersten N Zeilen)]
quit
HTTP (RFC 2616):
telnet www.beispiel.org 80
GET url HTTP/1.0
(Zweimal Return)
url: / bzw. /beispiel.html
HTTP... kann ggf. weggelassen werden
Da viele Webserver mit "namebased virtual hosts" arbeiten, muss man
dem Webserver noch mitteilen, unter welchem Namen man sich mit ihm
unterhält:
telnet www.beispiel.org 80
GET url HTTP/1.1
Host: www.beispiel.org
Noch ein Hinweis zu Telnet: Wenn man mit telnet auf einen
Portzugreift, und die Verbindung nicht mit protokollspezifischen
Befehlen wie "quit" beenden kann, kann man mit Strg-] die Sitzung
unterbrechen und die Verbindung konfigurieren.
4.16 Englisch-Deutsches Wörterbuch
[toc]
Unter der URL dict.tu-chemnitz.de gibt es
ein sehr umfangreiches Deutsch-Englisches Wörterbuch. Im Gegensatz zu
dem bekannten Wörterbuch von LEO kann man das der Chemnitzer Uni
herunterladen. In der 4,7 MByte großen Datei kann man schnell mit
seinem Editor der Wahl nachschlagen. Eine Internetverbindung ist nach
dem Herunterladen nicht mehr nötig.
4.17 AVI verkleinern
[toc]
die AVIs meiner Digitalkamera sind sehr
groß. Mit folgender Kommandozeile verkleiner ich die Dateien.
HandBrakeCLI -i 20110607_080831-0.MOV -o 20110607_080831-0.mp4
HandBrake ist bis jetzt noch recht
unbekannt. Es funktioniert sehr gut und nutzt auch mehrere
CPUs/Cores. Das Programm gibt es mit gtk GUI oder für die
Kommandozeile. Das Programm "mencoder" mit den vielen kryptischen
Optionen hat bei mir oft eine Verzögerung in der Ton-Spur verursacht.
4.18 Anti-Tipps
[toc]
Folgende Programme und Technologien sind weit verbreitet, jedoch gibt es moderne,
bessere und ggf. kostengünstigere Alternativen:
Bisher / Standard |
Besser |
Begründung |
Sendmail |
Exim oder Postfix |
Weniger Altlasten im Quelltext. Sicherer und leichter
zu konfigurieren. |
Fetchmail |
getmail |
Getmail ist nicht in C geschrieben, sondern in Python.
Sicherheitslöcher wie bei Fetchmail sind unwahrscheinlich. |
Procmail |
Sieve |
Die Syntax der Konfiguration von Procmail ist unnötig
kompliziert. Sieve ist eine einfache Programmiersprache um Emails zu
filtern. Es gibt mehrere Implementierungen. Der größte Vorteil ist,
dass das Filtern schon auf dem Server passieren kann, so dass die
Emails in verschiedene (meist IMAP) Ordner abgelegt werden. |
MBox Format |
maildir |
Bei Maildir wird pro Email eine Datei gespeichert. Es gibt keine
Probleme beim Locking, falls mehrere Prozesse auf die Emails
zugreifen. Siehe auch Maildir im
Dovecot Wiki.
|
Cyrus (IMAP/POP3 Server) |
Dovecot |
Dovecot ist leichter zu konfigurieren und zu verstehen. |
Perl |
Python |
Siehe Warum ich von Perl zu Python gewechselt
bin. |
tail -f |
less +F |
Der Vorteil von Less ist, dass das fortlaufende Lesen der Datei
abgebrochen werden kann, und man z.B. nach bestimmten Zeilen suchen kann.
|
ntpd |
chrony |
Der Dienst zum Synchronisieren der Zeit ist einfacher und hat weniger Code. Chrony öffnet außerdem nicht wie
ntpd einen UDP-Port im Listen-Modus (wie ein Server)
|
gtk/qt |
Django Web-Framework |
Native-GUIs entwickelt man nicht mehr.
|
IPSec |
OpenVPN |
OpenVPN ist einiges einfacher und verträgt sich
besser mit Firewalls.
|
Debian |
Ubuntu |
Während Debian nur von Freiwilligen entwickelt wird, wird
das auf Debian aufbauende Ubuntu durch bezahlte Entwickler
verbessert.
|
Oracle, MySQL |
PostgreSQL |
PostgreSQL ist eine robuste relationale Datenbank. Sie wird seit
mehr als 15 Jahren weiterentwickelt und unterstützt die Standards
SQL92 und SQL99. Siehe
auch PostgreSQL Tipps.
|
mencoder/transcode |
HandBrake |
Video-Komprimierung kann auch ganz einfach sein. |
4.19 Der kleine Unterschied
[toc]
Siehst du den Unterschied?
user@host> su
Passwort:
root@host:/home/user# /etc/init.d/apache restart
user@host> su -
Passwort:
root@host:~# /etc/init.d/apache restart
Lösung: 'su' ohne Bindestrich übernimmt
die Umgebung des Nutzers. Das heißt $HOME, $PATH, ... werden vom
Nutzer übernommen. Das kann scheinbar nicht erklärbare Veränderungen
für alle von Apache gestarteten Kindprozesse (CGI-Scripte)
haben.
5 Programmiersprachen
[toc]
5.1 Python
[toc]
Meine bevorzugte Programmiersprache: Siehe Python Einführung
5.2 Python
[toc]
5.2.1 Anzahl der Tage zwischen zwei Datumsangaben
[toc]
Wie lange noch bis Weihnachten?
#!/usr/bin/env python
import datetime
today=datetime.date.today()
weihnachten=today.replace(month=12, day=24)
print weihnachten-today
5.3 Sonstiges
[toc]
- Da C eine extrem langsame Programmiersprache ist
(Entwicklungszeit!) gibt es nur selten Grund damit zu arbeiten. Um
alte Programme oder kleine laufzeitkritische Funktionen zu testen
ist valgrind genial: Jeder
Speicherzugriff wird interpretiert und man erhält eine Warnung
(inkl. Programmzeile) falls man auch nur ein Byte danebengreift.
6 Web-Design und Web-Entwicklung
[toc]
6.1 Allgemein
[toc]
- Verwende
zB jQuery um das Rad nicht neu zu
erfinden.
- Nicht zu viele Farben. Lieber einen durchgehenden
Farbton.
- Gescannte Bilder oder Bilder einer Digitalkamera sollte man als
JPG speichern. Bilder mit großen gleichfarbigen Flächen
(Screenshots, Schriftzug, Computer-Zeichnungen) sollte man als PNG
speichern. PNG
komprimiert verlustfrei, während JPEG verlustbehaftet
komprimiert. Folgende Tabelle zeigt einen Screenshot im PNG und im
JPEG Format. Bei der blauen Schrift sind die Artefakte besonders
deutlich.
PNG 36 kByte |
|
JPG 88 kByte |
|
TIFF sollte man aus meiner Sicht auch vermeiden. Es gibt
viel "Unterformate" von TIFF. Meistens können Anwendungen nur
einen Teil aller möglichen Formate lesen und schreiben.
- Die Syntax von HTML lässt sich leicht mit dem Programm tidy
überprüfen: http://tidy.sourceforge.net/
Um gewisse Warnungen zu ignorieren verwende ich folgendes Script:
my-html-tidy.sh.
- URLs die auf ein Zeil verweisen, dass auf dem gleichen Server
liegt, sollten nicht das Protokoll (
http://..
)
enthalten. Erstens: Wird die Seite per https anstatt http
angesprochen, funktionieren die Links nicht mehr. Zweitens lässt
sich die Seite auch per Portforwarding per SSH
(https://localhost:8080 wird zu einem anderen Rechner
weitergeleitet) benutzen. Darum sollte man aus meiner Sicht das base-Tag
nicht verwenden.
7 Persönliche Meinung
[toc]
- KISS: "Keep it Simple and Stupid". Die geringe Akzeptanz
von großen Standards wie z.B SGML zeigen, dass man versuchen
sollte, die Dinge so einfach wie möglich zu lösen.
- Standards: Standards sind nur sinnvoll wenn die
Kommunikation oder der Datenaustausch standardisiert wird. Bei
vielen Dingen (z.B. Programmiersprachen) ist es sinnvoller *eine*
freie Implementierung zu haben.
- Patente: Mittels Patenten halten sich große Unternehmen
Konkurrenz vom Leib. Leider profitieren hauptsächlich große Konzerne
von Patenten. Für Kleine- und Mittelständische Unternehmen ist die
Anmeldung eines Patents zu aufwendig. Durch Patente geschützte
Monopole hindern den freien Wettbewerb und ermöglichen so
ungerechtfertige Preise. Folgende Dinge kann man als kleiner Mann tun:
- Ogg anstatt MP3
für Audiodateien verwenden, da das Erstellen von MP3s nur mit einer
Lizenz der Frauenhofer-Gesellschaft erlaubt ist!
- xpdf anstatt Acrobat-Reader verwenden.
- Vereine wie FFII unterstützen.
- Du bist nicht allein: Es gibt wohl kein Problem, über das
nicht schon andere gestolpert sind. Wenn man innerhalb von 30 Minuten
keinen Lösung zu einem Problem gefunden hat, sollte man sich an eine
entsprechende Newsgroup oder Mailingliste wenden. Oft reicht es mit
Google in Groups zu suchen.
Oder suche eine passende Seite bei Stackexchange.
Selbst wenn du eine Lösung zu einem Problem gefunden hast, spreche trotzdem mit anderen darüber.
Vielleicht gibt es noch eine bessere/einfachere Lösung :-)
- Spenden: Open Source Software kostet Geld. Auch wenn die
Software kostenfrei angeboten wird, hat der Entwickler Kosten für
Hardware, Netzzugang und ähnliche Dinge. Eine Spende ist in gewisser
Weise auch eine Art "Dankeschön" zu sagen. Folgende Projekte habe ich
bisher (mit einem kleinen Betrag) finanziell Unterstützt:
2002
2004
2005
2006
2007
- theora.org: Theora is an open video codec being developed by the
Xiph.org Foundation as part of their Ogg project
- Adrian Holovaty: Ein
Geschenk aus der Amazon Wishlist, als Dankeschön für Django.
2008
- ie4linux: Internet Explorer für Linux (via
Wine)
2010
- Hugin:Panorama photo stitcher
Regelmäßige Spenden
8 Historie
[toc]
© 2003-2017 Thomas Güttler. Der Text darf nach belieben
kopiert und modifiziert werden, solange dieser Hinweis zum Copyright
und ein Links zu dem Original unter www.thomas-guettler.de
erhalten bleibt. Es wäre nett, wenn Sie mir Verbesserungsvorschläge
mitteilen: guettli@thomas-guettler.de
Schreiben Sie mir doch eine E-Mail, falls Ihnen die Seite
gefallen/geholfen hat. Falls Ihnen die Seite sehr gut gefällt, wäre
ein für Google auffindbarer Link hierher nett.