Detaillierte Informationen über den Boot-Prompt (also die Eingabeaufforderung
beim Systemstart) gibt es beim LDP BootPrompt-HOWTO
.
Sobald man Zugriff auf die Tastatur eines Rechners hat, kann das System
gestartet werden und ein Login stattfinden, auch ohne das root-Passwort zu
kennen. (Dies setzt allerdings voraus, dass keine zusätzlichen Schutzmaßnahmen
ergriffen wurden, wie z.B. ein BIOS-Passwort oder eine Passwortabfrage durch
lilo
, was ein Booten des Systems verhindern würde.)
Dies ist ein Vorgehen, das keine externen Boot-Medien und Änderungen der BIOS-Einstellungen benötigt. Die Bezeichnung für die voreingestellte Boot-Option sei "Linux".
Sobald die lilo
-Boot-Meldung boot: erscheint (auf
einigen Systemen muss die Shift-Taste/Umschalt-Taste gedrückt werden, um einen
automatischen Bootvorgang zu unterbrechen), ist folgendes einzugeben:
boot: Linux init=/bin/sh
Das System startet nun den Kernel und daraufhin das Programm
/bin/sh
anstelle des üblichen init
-Prozesses. Die
nun erlangte Shell hat root-Privilegien. Da das Hauptverzeichnis
/
nur les- aber nicht schreibbar ist und viele während des
üblichen Boot-Prozesses eingeklinkten Verzeichnisse nicht erreichbar sind,
müssen diese nachträglich gemountet werden, um ein vernünftiges Arbeiten zu
ermöglichen:
init-2.03# mount -n -o remount,rw / init-2.03# mount -avt nonfs,noproc,nosmbfs init-2.03# cd /etc init-2.03# vi passwd init-2.03# vi shadow
(Wenn in der Datei /etc/passwd
das zweite Datenfeld bei allen
Einträgen ein "x" ist, dann benutzt das System shadow-Passwörter. In
diesem Fall muss statt /etc/passwd
die Datei
/etc/shadow
editiert werden.) Um das root-Passwort zurückzusetzen,
muss das zweite Feld des root-Eintrags gelöscht werden. Nach einem Neustart
ist das root-Passwort leer und kann neu vergeben werden. Wenn das System in
den Runlevel 1 fährt, wird (zumindest bei Debian-Versionen nach Potato) ein
Passwort benötigt.
Ein Editor im /bin/
-Verzeichnis ist absolut empfehlenswert, für
den Fall, dass der /usr/
-Baum nicht erreichbar ist (siehe dazu
auch Rettungseditoren, Abschnitt
11.2).
Für Notfälle hat sich außerdem sash
(stand alone shell) bewährt.
Wenn das System nicht mehr gebootet werden kann, geben Sie am
lilo
-Prompt folgendes ein:
boot: Linux init=/bin/sash
Das Programm sash
dient als Ersatz für sh
, selbst
wenn /bin/sh
nicht nutzbar ist. Es ist statisch gelinkt und hat
viele Standardbefehle eingebaut. (Wenn sash
gestartet ist, wird
"help" eine kurze Referenz anzeigen.)
Starten Sie das System mit einer Rettungsdiskette/-CD. Sei
/dev/hda3
die root-Partition. Dann kann die
Passwortdatei editiert werden durch:
# mkdir fixit # mount /dev/hda3 fixit # cd fixit/etc # vi shadow # vi passwd
Der Vorteil dieser Variante ist, dass ein eventuell vergebenes
lilo
-Passwort umgangen werden kann. Erforderlich ist allerdings,
dass im BIOS die Einstellung für das Boot-Laufwerk manipuliert werden kann
(falls es nicht schon entsprechend eingestellt ist).
Dies ist kein Problem, selbst wenn Sie keine Boot-Diskette während der
Installation angelegt haben. Wenn lilo
defekt ist, können Sie die
Boot-Disk des Debian-Installationsets verwenden und davon Ihr System booten.
Wenn Ihre root-Partition /dev/hda12
ist und im Runlevel
3 gestartet werden soll, geben Sie folgendes am Boot-Prompt ein:
boot: rescue root=/dev/hda12 3
Danach haben Sie ein fast vollständig funktionsfähiges System mit dem Kernel des Installationsmediums gestartet. (Es kann einige kleinere Probleme aufgrund fehlender Kerneleigenschaften oder Module geben.)
Vergleichen Sie Installation eines Pakets in ein nicht bootfähiges System, Abschnitt 6.3.6 wenn Sie ein defektes System haben.
Benötigen Sie eine angepasste Boot-Diskette, folgen Sie den Anweisungen in
readme.txt
auf der Rettungsdiskette.
Dem Nachjagen von unstable/sid ist lustig, aber ein fehlerhaftes
xdm
, gdm
, kdm
und wdm
, das
während des Boot-Prozesses gestartet wird, kann sehr unangenehm sein.
Zuerst sollten Sie Zugang zu einer root-Shell erlangen, indem Sie folgendes am Boot-Prompt eingeben:
boot: Linux vga=normal s
Hier steht Linux für das Kernel-Image das Sie starten;
"vga=normal" stellt sicher, dass lilo
im normalen VGA
Modus startet und "s" (oder "S") ist der Parameter der an
init
weitergegeben wird und für Single-User-Modus steht. Geben
Sie das root Passwort am Prompt ein.
Es gibt mehrere Möglichkeiten alle Daemonen die X starten zu deaktivieren:
/etc/init.d/?dm
Dateien.
/etc/rc2.d/S99?dm
Dateien
in /etc/rc2.d/K99?dm
.
/etc/rc2.d/S99?dm
Dateien.
Hier muss die Nummer in rc2.d
dem Runlevel entsprechen,
das in der /etc/inittab
Datei angegeben wurde.
?dm
bedeutet, dass das Kommando mehrfach ausgeführt
wird, wobei es jeweils durch xdm
, gdm
,
kdm
und wdm
ersetzt wird.
Nur der erste Weg ist "der eine wahre Weg" in Debian. Der letzte ist
einfach, funktioniert aber nur in Debian und erfordert, dass der
Display-Manager später mit dpkg-reconfigure
gesetzt wird. Alles
andere sind allgemeine Methoden um Daemonen zu deaktivieren.
Sie können immer noch X mit dem startx
Kommando von einer
beliebigen Konsole starten.
Mittels des lilo
-Boot-Prompts kann das System in einem beliebigen
Runlevel gestartet werden. Details dazu finden sich im BootPrompt-HOWTO
(LDP).
Soll das System im Runlevel 4 starten, verwenden Sie folgende Eingabe am
lilo
Boot-Prompt.
boot: Linux 4
Wenn das System im normal funktionierendem Einzelnutzer-Modus gestartet werden
soll und Sie das root Passwort kennen, so kann eins der folgenden Beispiele am
lilo
Boot-Prompt verwendet werden.
boot: Linux S boot: Linux 1 boot: Linux -s
Auch der benutzte Speicherbereich kann eingeschränkt werden. Das folgende Beispiel weist das System an, nur 48MB des verfügbaren Speichers zu belegen.
boot: Linux mem=48M
Achtung: Wird an dieser Stelle mehr Speicher angegeben als vorhanden, wird der
Kernel abstürzen. Wenn man mehr als 64 MB Speicher hat, kann es bei alten
Kernels und/oder Mainboards passieren, dass das System nur 64MB nutzt. In
diesem Fall kann man versuchen den ungenutzten Speicher mit
mem=128M zu aktivieren. Äquivalent dazu ist ein Eintrag in der
Datei /etc/lilo.conf
.
GRUB ist ein neuer Boot-Manager des GNU Hurd Projekts und ist viel flexibler als Lilo aber handhabt die Boot-Parameter etwas anders.
grub> find /vmlinuz grub> root (hd0,0) grub> kernel /vmlinuz root=/dev/hda1 grub> initrd /initrd grub> boot
Sie müssen die Hurd Gerätenamen kennen:
Hurd/GRUB Linux MSDOS/Windows (fd0) /dev/fd0 A: (hd0,0) /dev/hda1 C: (usually) (hd0,3) /dev/hda4 F: (usually) (hd1,3) /dev/hdb4 ?
Vergleichen Sie /usr/share/doc/grub/README.Debian
und
/usr/share/doc/grub-doc/html/
für Details.
Um ein Unix-artiges System gekonnt zu administrieren, sind mitunter knifflige oder raffinierte Aufgaben zu erledigen. Machen Sie sich deshalb mit den grundlegenden Konfigurationsaufgaben vertraut, so dass Sie im Notfall wissen, wo Sie Hand anlegen müssen. Fensterbasierte Konfigurations-Werkzeuge sind nett und bequem, nutzen aber nichts, wenn man versucht eine defekte X-Window-Konfiguration wieder herzustellen.
Die Aufzeichnung von Tastatur-Eingaben ist, insbesondere als root, hin und wieder nützlich.
Emacs: M-x shell startet die Aufzeichnung. ("M" steht hier für die Meta-Taste, meist Alt oder auch Esc.) C-x C-w schreibt die aufgezeichnete Sequenz in eine Datei.
Shell: Verwenden Sie das screen
Kommando mit "^A H", wie
in Konsolenumschaltung mit screen
, Abschnitt
8.6.27 beschrieben oder dass script
Kommando.
$ script Script wurde gestartet, die Datei ist typescript ... irgendwelche Eingaben ... Strg-D $ col -bx <typescript >Sicherung $ vi Sicherung
Falls das script
-Programm fehlt, kann diese Funktion mit der Shell
simuliert werden:
$ bash -i 2>&1 | tee typescript
Um den grafischen Bildschirm aufzunehmen, auch X-Terminals und andere beliebige
Fenster, kann gimp
benutzt werden. Alternativen sind
xwd
(xbase-clients
), import
(imagemagick
) und scrot
(scrot
).
Möchte man seine Verzeichnisstruktur neu arrangieren, verschiebt man den Inhalt inklusive Datei-Links wie folgt:
Standardmethode: # cp -a /source/directory /dest/directory # erfordert GNU cp # (cd /source/directory && tar cf - . ) | \ (cd /dest/directory && tar xvfp - ) Wenn ein harter Link beteiligt ist, benötigt man eine pedantische Methode: # cd /Pfad/zum/alten/Verzeichnis # find . -depth -print0 | afio -p -xv -0a /neues/Verzeichnis Vom entfernten Rechner: # (cd /Quell/Verzeichnis && tar cf - . ) | \ ssh user@host.dom (cd /Ziel/Verzeichnis && tar xvfp - ) Wenn es keine Links gibt: # scp -pr user1@host1.dom:/Quell/Verzeichnis \ user2@host2.dom:/Ziel/Verzeichnis
Hier gilt scp
<==> rcp
und ssh
<==> rsh
.
Die folgenden vergleichenden Informationen zum Kopieren eines kompletten
Unterverzeichnis wurden von Manoj Srivastava srivasta@debian.org
auf
debian-user@lists.debian.org aufgeführt.
cp
Ursprünglich war das cp
Programm für diesen Zweck nicht gut
geeignet, da es keine symbolischen Links auflösen oder harte Links beibehalten
konnte. Ein anderer Punkt waren spärliche (sparse) Dateien (Dateien mit
Löchern).
Die GNU-Version von cp
überwand zwar diese Probleme, doch auf
nicht-GNU-Systemen kann es noch zu Schwierigkeiten kommen. Desweiteren kann
cp
keine kleinen, portablen Archive erzeugen.
% cp -a . neuesverzeichnis
tar
Das Archivierungsprogramm tar
kann im Gegensatz zu cp
mit symbolischen Links umgehen. Obwohl cpio
mit speziellen
Dateien umgehen kann, konnten ältere tar
Versionen dies nicht.
Wenn tar
auf mehrere harte Links einer Datei stößt, wird nur
einmal die Datei in das Archiv kopiert; die Datei kann dann nur unter
dem Namen der ursprünglichen Datei zurückgewonnen werden. cpio
dagegen kopiert für jeden harten Link die komplette Datei in das Archiv, so
dass sie unter jedem der Link-Namen wiedergeholt werden kann.
Das tar
Kommando hat die Option für das Packen mit
.bz2
Dateien zwischen Potato und Woody umbenannt. Empfohlen wird
deshalb in Skripten die Option --bzip2 statt der Kurzform
-I (Potato) oder -j (Woody).
pax
Hinter dem Namen pax
(IEEE-Standard 1003.2-1992, Seiten
380–388 (Abschnitt 4.48) und Seiten 936–940 (Abschnitt E.4.48))
verbirgt sich ein multifunktionales POSIX-Werkzeug zum Austausch von portablen
Archiven. pax
liest und schreibt Archive, listet deren Inhalt
auf, und kopiert Verzeichnishierarchien. pax
arbeitet unabhängig
von einem spezifischen Archivformat und unterstützt eine große Bandbreite an
Formaten.
pax
ist noch neu und es können noch Kinderkrankheiten auftreten.
# apt-get install pax $ pax -rw -p e . newdir oder $ find . -depth | pax -rw -p e newdir
cpio
Das Kommando verwaltet die gleichnamigen Archive oder auch solche, die mit
tar
erstellt wurden. Das Archiv kann statt einer Datei auch eine
Pipe oder ein Magnetband sein.
$ find . -depth -print0 | cpio --null --sparse -pvd new-dir
afio
afio
ersetzt cpio
. Es liest dessen Archive
schneller, unterstützt mehr Laufwerksoptionen, hat eine bessere Fehlerkorrektur
und kann das Archiv auf mehrere Medien verteilen. Die Kompression mit
afio
ist zuverlässiger als die von tar
und
cpio
. Am besten benutzt man afio
in Backup-Skripts
als "Archiv-Maschinerie".
$ find . -depth -print0 | afio -px -0a new-dir
Ich mache alle meine Backups auf Band mit afio
.
Differenzielle Backups und Datensynchronisation kann mit verschiedenen Methoden implementiert werden:
rcs
: Backups, auch mehrerer älterer Versionen, nur für Texte
rdiff-backup
: Backups, auch mehrerer älterer Versionen.
Symbolische Links werden unterstützt.
pdumpfs
: Backups, auch mehrerer älterer Versionen in einem
Dateisystem. Symbolische Links werden unterstützt.
rsync
: 1-Wege Synchronisation
unison
: 2-Wege Synchronisation
cvs
: Mehr-Wege Synchronisation mit Server-Backups, auch mehrerer
älterer Versionen, nur für Texte, ausgereift. Vergleichen Sie mit Concurrent Versions System (CVS) – System für
simultane Versionen, Abschnitt 12.1.
arch
: Mehr-Wege Synchronisation mit Server-Backups, auch mehrerer
älterer Versionen. Es gibt keine Dinge wie "Arbeitsverzeichnis".
subversion
: Mehr-Wege Synchronisation mit Server-Backups, auch
mehrerer älterer Versionen, Apache.
Kombinationen einer dieser Methoden mit der Archivierungsmethode, die in Kopieren und Archivieren eines Unterverzeichnis, Abschnitt
8.3 beschrieben ist und den automatisierten Jobs in Terminplanung für Prozesse (cron
,
at
), Abschnitt 8.6.26 bilden ein nettes Backup-System.
Ich werde drei einfach zu nutzende Hilfsmittel angeben.
rdiff-backup
bietet ein nettes und einfaches Backup mit
differenziellen Versionen für beliebige Dateitypen, inklusive symbolischen
Links. Sichern des Großteils von ~/
nach
/mnt/backup
:
$ rdiff-backup --include ~/tmp/keep --exclude ~/tmp ~/ /mnt/backup
Wiederherstellen von drei Tage alten Daten aus diesem Archiv nach
~/old
:
$ rdiff-backup -r 3D /mnt/backup ~/old
Vergleichen Sie rdiff-backup(1)
.
pdumpfs
pdumpfs
ist ein einfaches System zum täglichen Backup, ähnlich zu
Plan9's dumpfs
, das tägliche Schnappschüsse bewahrt. Man kann auf
die letzten Schnappschüsse zu beliebiger Zeit zugreifen, um eine Datei eines
bestimmten Tages wiederherzustellen. Führen Sie ein Backup Ihres
Homeverzeichnisses mit pdumpfs
und cron
aus!
pdumpfs
erstellt die Schnappschüsse YYYY/MM/DD im
Zielverzeichnis. Alle Quelldateien werden in das Schnappschussverzeichnis
kopiert, wenn pdumpfs
das erste Mal gestartet wird. Beim zweiten
und folgenden Male kopiert pdumpfs
nur aktualisierte oder neu
erstellte Dateien und speichert nicht geänderte Dateien als harte Links auf die
Dateien vom Schnappschuss des letzten Tages, um Speicherplatz zu sparen.
$ pdumpfs src-dir dest-dir [dest-basename]
Vergleichen Sie pdumpfs(8)
.
Changetrack
zeichnet Änderungen von textbasierten
Konfigurationsdateien regelmäßig in RCS Archiven auf. Sehen Sie
changetrack(1)
.
# apt-get install changetrack # vi changetrack.conf
top
hilft außer Kontrolle geratene Prozesse zu identifizieren.
`P' sortiert die Spalten nach CPU-Last, `M' nach Speicherverbrauch und `k' kann
einen Prozess "abschießen". Alternativ kann das BSD-artige ps
aux | less oder System V-artige ps -efH | less verwendet
werden. Die System V-artige Syntax zeigt die IDs der Elternprozesse
(PPID), die zum Killen von Zombie-Kindprozessen genutzt werden
können.
Verwenden Sie kill
zum Killen eines Prozesses mittels der
Prozess-ID-Nummer (oder um ihm Signale zu senden). killall
bewerkstelligt das selbe über den Namen des Programms. Oft verwendete Signale
sind
1: HUP, Daemon neustarten 15: TERM, normales Beenden 9: KILL, erzwungenes Beenden
Wenn der Kernel mit Unterstützung der "magischen SysRq-Taste" kompiliert wurde, kann das System mit etwas Glück auch aus dem totalen Nirwana geholt werden. Drücken von Alt-SysRq (SysRq ist oft mit "Druck" beschriftet) bei einem i386, gefolgt von einer der Tasten r 0 k e i s u b, aktiviert die Kernel-Notbremse.
`r' stellt die Tastatur wieder her, nachdem beispielsweise X abgestürzt ist.
`0' setzt den Level mit dem Fehlermeldungen auf der Konsole ausgegeben werden
herunter. `k' (system attention key) killt alle Prozesse auf der aktuellen
virtuellen Konsole. `t' beendet alle Prozesse des aktuellen Terminals außer
init
. `i' killt alle Prozesse außer init
.
`S'ync, `u'mount und re`b'oot sind wirklich nur für den allerletzten Notfall.
Debian Standard Kernel sind, zur Zeit der dieses Dokument geschrieben wird,
nicht mit dieser Option kompiliert. Es muss zur Nutzung dieser Taste ein neuer
Kernel kompiliert werden. Detaillierte Informationen finden sich in
/usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz
oder
/usr/src/kernel-version/Documentation/sysrq.txt.gz
.
less
ist der Standard-Dateibetrachter, der Textdateien seitenweise
ausgibt. Hilfe bietet `h'. less
kann mehr als dessen Urahn
more
. Es kann mit eval $(lesspipe) oder eval
$(lessfile) in einer Shell-Startdatei überladen (erweitert) werden.
Sehen Sie hierzu /usr/share/doc/lessf/LESSOPEN
. Die Option
-R erlaubt die Ausgabe von Sonderzeichen (raw characters) und
schaltet die ANSI Farbsequenzen ein. Vergleichen Sie less(1)
.
w3m
kann für einige Code-Systeme (EUC) eine Alternative sein.
free
und top
informieren über freien Speicher und
dessen Verbrauch. Sorgen Sie sich nicht um die Größe des
"used"-Eintrags in der zweite Datenzeile, sondern lesen Sie den Wert
darunter ab (hier: 38792)
$ free -k # für 256MB Hauptspeicher total used free shared buffers cached Mem: 257136 230456 26680 45736 116136 75528 -/+ buffers/cache: 38792 218344 Swap: 264996 0 264996
Die präzise Menge an Hauptspeicher, die zur Verfügung steht, kann mit grep '^Memory' /var/log/dmesg bestätigt werden, was in diesem Fall "Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)" ergibt.
Total = 262144k = 256M (1k=1024, 1M=1024k) Free to dmesg = 256984k = Total - kernel - reserved - data - init Free to shell = 257136k = Total - kernel - reserved - data
Etwa 5MB können nicht vom System verwendet werden, da der Kernel sie in Beschlag nimmt.
# date MMDDhhmmCCYY # hwclock --utc --systohc # hwclock --show
Dies setzt die Hardware-Uhr auf MM/DD hh:mm, CCYY. Dabei stehen die Kürzel für DD=Tag, MM=Monat, hh=Stunde, mm=Minute, CCYY=Jahr. Die Zeiten werden in lokaler Zeit ausgegeben, die Hardware-Uhr verwendet jedoch UTC als Zeitzone.
Referenz: Managing
Accurate Date and Time HOWTO
.
Die Uhrzeit kann automatisch mit Hilfe eines Zeit-Servers korrekt gesetzt werden:
# ntpdate server
Dies sollte in /etc/cron.daily/
verwendet werden, wenn man eine
permanente Internet-Verbindung hat.
Das Paket chrony
hilft hier weiter.
Zum Deaktivieren des Bildschirmschoners sind folgende Kommandos geeignet:
Auf der Konsole:
# setterm -powersave off
Start der kon2 (kanji) Konsole mit:
# kon -SaveTime 0
Während X-Windows läuft:
# xset s off oder # xset -dpms oder # xscreensaver-command -prefs
Lesen Sie die entsprechenden Handbuchseiten um zu erfahren, wie man andere
Eigenschaften der Konsole steuert. Vergleichen Sie auch stty(1)
zum Ändern und zur Ausgabe von Terminal-Line Einstellungen.
Die glibc-Bibliothek ermöglicht das Durchsuchen von System-Datenbanken, nach
beispielsweise passwd, group, hosts, services, protocols oder networks mittels
getent(1)
.
getent database [key ...]
Im Zweifelsfall kann man immer den Stecker des Lautsprechers herausziehen ;-) Für die Bash-Shell gilt:
echo "set bell-style none">> ~/.inputrc
Wenn übermäßig viele Fehlermeldungen die Konsole unbrauchbar werden lassen,
sollte man zuerst in /etc/init.d/klogd
nachsehen. Um das
Warnlevel zu ändern kann man hier KLOGD="-c
3" setzen. Neustart des Daemons mit
/etc/init.d/klogd restart
aktiviert die neuen Werte. Alternativ
kann dmesg -n3 benutzt werden.
Das Warnlevel schlüsselt sich wie folgt auf:
Wenn eine bestimmte unkritische Fehlermeldung oft auftritt, kann diese auch
durch einen trivialen Kernelpatch unterbunden werden. (Siehe dazu das Beispiel
shutup-abit-bp6
im Beispielverzeichnis
.)
Auch ein Blick in /etc/syslog.conf
kann hilfreich sein, um zu
verstehen, welche Nachrichten auf der Konsole ausgegeben werden.
Die Konsole wird in Unix-artigen Systemen üblicherweise mit den Routinen aus
der (n)curses-Bibliothek angesteuert. Dies erlaubt eine im Wesentlichen von
der Terminal-Art unabhängige Ausgabe mit vernünftiger Update-Strategie. Siehe
ncurses(3X)
und terminfo(5)
.
Debian bietet eine ganze Reihe von Voreinstellungen:
$ toe | less # alle Einträge $ toe /etc/terminfo/ | less # Benutzer einstellbare Einträge
Die Auswahl kann durch Export der Umgebungsvariablen TERM aktiviert werden.
Wenn der terminfo-Eintrag für xterm
mit einem xterm
,
das remote aufgerufen wird und das nicht auf Debian läuft, nicht funktioniert,
kann der Terminaltyp von "xterm" auch auch eine der primitiveren
Varianten, wie "xterm-r6", umgestellt werden. Sehen Sie
/usr/share/doc/libncurses5/FAQ
für weitere Informationen. Der
kleinste gemeinsame Nenner für terminfo ist "dumb".
Ist der Bildschirm auf Grund von cat Binärdatei unleserlich (und sogar eingetippte Kommandos sind nicht sichtbar), so hilft:
$ reset
Eine DOS-Textdatei (Zeilenende von ^M^J), kann mit einem einzigen Kommando in eine Unix-Textdatei (Zeilenende = ^J) umgewandelt werden:
# apt-get install sysutils $ dos2unix dosDatei
Alle Vorkommen des regulären Ausdrucks REGEX können durch TEXT in allen Dateien DATEIEN ersetzt werden durch:
$ perl -i -p -e 's/REGEX/TEXT/g;' DATEIEN ...
-i zeigt an, dass die Orginaldateien bearbeitet werden, -p sorgt ausdrücklich für die Iteration über die Dateinamen. Wenn der reguläre Ausdruck kompliziert ist, kann man sich versichern, indem man die Originaldateien behält: Durch -i.bak anstelle von -i bleiben die Originale erhalten und bekommen die Endung .bak.
Das folgende Skript entfernt die Zeilen 5–10 und 16–20 ohne Umweg über eine temporäre Datei.
#!/bin/bash ed $1 <<EOF 16,20d 5,10d w q EOF
Die ed
-Kommandos sind die selben wie beim vi
im
Kommandomodus. Das Bearbeiten der Datei von hinten erleichtert die Arbeit.
Die folgenden Kommandos bestimmen die Unterschiede zwischen zwei Quelldateien und erzeugen diff-Dateien Datei.patch0 und Datei.patch1 im "unified"-Stil:
$ diff -u Datei.alt Datei.neu1 > Datei.patch0 $ diff -u alt/Datei neu1/Datei > Datei.patch1
Die diff-Datei (alternativ wird sie auch patch-Datei genannt) wird verwendet, um Veränderungen zu beschreiben. Jeder der diese Datei erhält, kann diese Änderungen auf eine andere Datei wie folgt anwenden:
$ patch -p0 Datei < Datei.patch0 $ patch -p1 Datei < Datei.patch1
Wenn drei Versionen des Quellcodes vorliegen, können diese einfacher mit
diff3
vermengt werden:
$ diff3 -m Datei.meine Datei.alt Datei.deine > Datei
$ split -b 650m Datei # in 650MB große Stücke trennen $ cat x* >großeDatei # wieder zusammenfügen
Sei DPL
der Name einer Textdatei, in welcher alle vorherigen
Debian-Projektleiter mit Namen und Einführungsdatum, durch Freizeichen
getrennt, aufgeführt sind.
Ian Murdock August 1993 Bruce Perens April 1996 Ian Jackson Januar 1998 Wichert Akkerman Januar 1999 Ben Collins April 2001 Bdale Garbee April 2002 Martin Michlmayr März 2003
Awk wird oft benutzt, um Daten aus dieser Art von Datei zu extrahieren.
$ awk '{ print $3 }' <DPL # Monat des Beginns August April Januar Januar April April März $ awk '($1=="Ian") { print }' <DPL # Vorname Ian Ian Murdock August 1993 Ian Jackson Januar 1998 $ awk '($2=="Perens") { print $3,$4 }' <DPL # wann fing Perens an April 1996
Shells wie Bash sind ebenfalls in der Lage, Dateien dieser Art auszulesen:
$ while read Vorname Nachname Monat Jahr; do echo $Monat done <DPL ... selbe Ausgabe wie beim ersten Awk Beispiel
Das eingebaute read
Kommando verwendet die Zeichen in $IFS
(interne Feld-Separatoren), um Zeilen in Wörter aufzuteilen.
Wenn IFS auf ":" gesetzt wird, kann /etc/passwd
leicht
mit der Shell ausgelesen werden:
$ altIFS="$IFS" # alten Wert sichern $ IFS=":" $ while read Benutzer Passwort uid gid Zeilenrest; do if [ "$Benutzer" = "osamu" ]; then echo "$Benutzer's ID ist $uid" fi done < /etc/passwd osamu's ID ist 1001 $ IFS="$altIFS" # Wert zurücksetzen
(Wenn Awk dazu verwendet wird, so wird der Spaltentrenner mit FS=":" angegeben.)
IFS wird auch von der Shell benutzt, um die Ergebnisse von Parameterauswertungen, Kommando-Substitutionen und arithmetischen Auswertungen aufzuteilen. Dies geschieht nicht innerhalb von doppelten oder einfachen Anführungszeichen. Der Standardwert von IFS sind die Werte <Freizeichen>, <Tabulator> und <neue Zeile>.
Man muss bei der Verwendung von IFS-Tricks vorsichtig sein. Eigenartige Dinge können geschehen, wenn die Shell Teile eines Skripts als Eingabe interpretiert.
$ IFS=":," # ":" und "," seien Feldtrenner $ echo IFS=$IFS, IFS="$IFS" # echo ist ein Bash Kommando IFS= , IFS=:, $ date -R # nur eine Kommandoausgabe Sat, 23 Aug 2003 08:30:15 +0200 $ echo $(date -R) # Untershell --> Eingabe der Haupt-Shell Sat 23 Aug 2003 08 30 36 +0200 $ unset IFS # zurücksetzen von IFS auf den Standardwert $ echo $(date -R) Sat, 23 Aug 2003 08:30:50 +0200
Hier folgen einige kleine lehrreiche Beispiele zur Verwendung von Pipes:
find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local" # Finde alle Dateien unterhalb /usr # mit Ausnahme bestimmter Pfade xargs -n 1 Kommando # Starte Kommando für alle Eingaben von stdin xargs -n 1 echo | # Beliebige Leerzeichen werden zu Zeilenumbrüchen xargs echo | # alle Zeilen zu einer zusammenfassen grep -e Muster| # Gebe Zeilen aus, die Muster # enthalten cut -d: -f3 -| # gebe das dritte Feld aus, : sei Trenner # (z.B. für die Passwortdatei passwd) awk '{ print $3 }' | # extrahiere das dritte Feld, Freizeichen sei Trenner awk -F'\t' '{ print $3 }' | # gib drittes Feld aus mit Tab als Trenner col -bx | # Entferne Backspace und expandiere Tabs zu Leerzeichen expand -| # expandiere Tabs zu Leerzeichen sort -u| # Sortiere und entferne doppelte Einträge tr '\n' ' '| # mehrere Zeilen zu einer zusammenfügen tr '\r' ''| # CR entfernen tr 'A-Z' 'a-z'| # Großbuchstaben in Kleinbuchstaben umwandeln sed 's/^/# /'| # aus der Zeile einen Kommentar machen sed 's/\.ext//g'| # Entferne .ext sed -n -e 2p| # zeige die zweite Zeile head -n 2 -| # zeige die ersten beiden Zeilen tail -n 2 -| # zeige die letzten beiden Zeilen
Die folgenden Möglichkeiten zum Durchlaufen aller auf *.ext passenden Dateien sind auch dann geeignet, wenn die Dateinamen Sonderzeichen wie Leerzeichen enthalten und bewirken alle dasselbe:
for x in *.ext; do if test -f "$x"; then Kommando "$x" fi done
find
und xargs
Kombination:
find . -type f -maxdepth 1 -name '*.ext' -print0 | \ xargs -0 -n 1 Kommando
find
mit -exec Option mit einem Kommando:
find . -type f -maxdepth 1 -name '*.ext' \ -exec Kommando '{}' \;
find
mit -exec Option mit einem kurzen Shell-Skript:
find . -type f -maxdepth 1 -name '*.ext' \ -exec sh -c "Kommando '{}' && echo 'erfolgreich'" \;
Obwohl jedes Awk-Skript automatisch in ein Perl-Skript mittels
a2p(1)
umgeschrieben werden kann, sollten einzeilige Awk-Skripte
am besten manuell nach Perl konvertiert werden. Zum Beispiel ist
awk '($2=="1957") { print $3 }' |
äquivalent zu allen der folgenden Zeilen:
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' | perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' | perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' | perl -lane 'print $F[2] if $F[1] eq "1957"' |
Da alle Leerräume im perl
-Argument in der obigen Zeile entfernt
werden können und unter Ausnutzung der automatischen Umwandlung zwischen Zahlen
und Zeichenketten in Perl kann auch folgendes verwendet werden:
perl -lane 'print$F[2]if$F[1]eq+1957' |
Man vergleiche perlrun(1)
für die Kommandozeilenoptionen. Für
noch verrücktere Perl-Skripte wird auf http://perlgolf.sourceforge.net
verwiesen.
Das folgende liest eine Webseite aus und schreibt die Ausgabe in eine Textdatei. Dies ist sehr nützlich, wenn man Konfigurationen aus dem Web kopieren will.
$ lynx -dump http://www.adresse.de/info.html >Textdatei
links
und w3m
können hier auch verwendet werden, die
Ergebnisse sich aber eventuell leicht unterschiedlich.
Falls ein Archiv einer Mailing-Liste geladen wird, kann munpack
benutzt werden, um den MIME-Inhalt zu extrahieren.
Um eine Webseite zu drucken, kann diese in das PostScript-Format umgewandelt werden:
$ apt-get install html2ps $ html2ps URL | lpr
Man vergleiche lpr
/lpd
, Abschnitt
3.6.1. Alternativ können auch das a2ps
oder
mpage
Paket zum Erzeugen von PostScript-Dateien verwendet werden.
The following will print a manual page into a PostScript file/printer.
$ man -Tps some-manpage | lpr $ man -Tps some-manpage | mpage -2 | lpr
You can merge two PostScript or PDF files.
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \ -sOutputFile=bla.ps -f foo1.ps foo2.ps $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \ -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf
Um die verschiedenen Zeiten, die mit einem Prozessablauf verbunden sind,
anzuzeigen, kann time
verwendet werden.
# time some-command >/dev/null real 0m0.035s # "Echte" Zeit user 0m0.000s # Zeit in Benutzermodus sys 0m0.020s # Zeit in Kernelmodus
nice
-Befehl
Der nice
-Befehl dient dazu, die Priorität eines Prozesses zu
setzen. Dessen Verwandter renice
(Paket bsdutils
)
ändert die Priorität eines bereits laufenden Prozesses. Letzteres kann auch
aus top
heraus geschehen. Ein nice
-Wert von 19
bedeutet niedrigste Priorität - der Prozess ist langsam --, absteigend wird die
Priorität erhöht. Kleinere Werte als 0 kann nur der Administrator setzen, -20
ist die höchste Priorität.
# nice -19 top # sehr nett # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # sehr schnell
Manchmal kann ein sehr langsamer Prozess dem System mehr schaden als nützen, also ist Vorsicht geboten.
cron
, at
)
Mit cron
und at
können zu bestimmten Terminen Befehle
ausgeführt werden. Siehe at(1)
, crontab(5)
,
crontab(8)
.
Die Tabelle für wiederkehrende Ausführung kann mit crontab -e
bearbeitet werden. (Ein anderer Editor als vi
kann mit der
Umgebungsvariablen EDITOR festgelegt werden.) Beispiele einer
crontab-Tabelle:
# Verwende /bin/sh zur Ausführung, egal was passwd sagt SHELL=/bin/sh # Standardausgabe wird an `paul' geschickt. MAILTO=paul # Min Stunde TagDesMonats Monat TagDerWoche Befehl (Komma wird 'und') # starte um 00:05, jeden Tag 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 # starte unm 14:15 am Monatsersten -- Ausgabe per Email an Paul 15 14 1 * * $HOME/bin/monthly # starte um 22:00 an Werktagen (1-5), schicke Email an Joe. % für Zeilenumbruch, letztes % für cc: 0 22 * * 1-5 mail -s "Es ist 10 Uhr" joe%Joe,%%Gute Nacht?%.%% 23 */2 1 2 * echo "Startet 23 Minuten nach 0 Uhr, 2 Uhr, 4 Uhr ..., am 1. Feb." 5 4 * * sun echo "Startet um 04:05 jeden Sonntag" # Startet um 03:40 an jedem ersten Montag des Monats 40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && command -args
Um einen Befehl zur einmaligen Ausführung zu terminieren dient at
$ echo 'command -args'| at 3:40 monday
screen
Mit screen
kann man mehrere virtuelle Terminals auf einer einzigen
Konsole starten, jedes mit einer eigenen interaktiven Shell. Selbst wenn man
immer zwischen virtuellen Terminals umschalten kann oder mehrere xterm-Fenster
offen hält, sollte man sich screen
wegen seiner vielfältigen
Möglichkeiten anschauen. Dazu gehören
Wenn man sich häufig mit einem VT100-Terminal-Programm über ein Netzwerk auf
einem PC einwählt, wird man das Sitzungsmanagement mit screen
sicherlich nützlich finden.
screen
-Sitzung ist gestartet und man hat einen längeren Text mit
einem Editor geschrieben. Aus irgendwelchen Gründen, muss man jetzt die
Verbindung unterbrechen.
screen
wird die Sitzung so restaurieren, wie
sie verlassen wurde.
screen
-Befehle
Wenn der screen
-Prozess gestartet ist, reicht dieser alle
Tastatureingaben an das aktuelle Fenster, bis auf die Kommandosequenz, die auf
^A voreingestellt ist. Alle screen
-Befehle beginnen
mit ^A und werden dann von einem einzelnen Buchstaben gefolgt
(ggf. folgen dann die Parameter). Beispiele für Befehle:
^A ? Hilfe (Tastaturbelegung) ^A c Neues Fenster und wechsele dorthin ^A n Gehe zum nächsten Fenster ^A p Gehe zum vorherigen Fenster ^A 0 Gehe zum Fenster Nummer 0 ^A w Zeige eine Liste der Fenster ^A a Gebe das ^A an die Applikation weiter ^A h Hardcopy des Fensters in Datei ^A H Starte/Beende Protokoll des aktuellen Fensters in eine Datei ^A ^X Sichere das Terminal mit einem Passwort ^A d Aktuelle Sitzung vom Terminal abmelden ^A DD Vom Terminal abmelden und Logout
Dies ist nur eine kleine Auswahl der Befehle, die das mächtige
screen
unterstützt. Siehe screen(1)
für weitere
Details.
screen
Sitzung
Wenn die Backspace- oder Strg-H-Taste während einer screen
-Sitzung
nicht funktionieren, muss die Zeile
bindkey -k kb stuff "\177"
in der Datei /etc/screenrc
auskommentiert ("#") werden.
screen
-Äquivalent unter X
Siehe Paket xmove
und dort xmove(1)
.
Installiere um die grundlegenden Funktionen des Netzwerks zu überprüfen
netkit-ping
, traceroute
, dnsutils
,
ipchains
(für 2.2 Kernel), iptables
(für 2.4 Kernel),
und das net-tools
Paket und führe folgende Sequenz aus:
$ ping yahoo.com # teste Internetverbindung $ traceroute yahoo.com # tracen der IP-Pakete $ ifconfig # testen der host-Konfiguration $ route -n # testen der routing-Konfiguration $ dig [@dns-server.com] host.dom [{a|mx|any}] |less # teste host.dom DNS-Einträge am dns-server.com # und suche dort nach {mx|any} Eintrag $ ipchains -L -n |less # teste packet-Filter (2.2 kernel) $ iptables -L -n |less # teste packet-Filter (2.4 kernel) $ netstat -a # Finde alle offenen Ports $ netstat -l --inet # Finde alle auf Eingabe wartenden Ports $ netstat -ln --tcp # Ebenso (TCP, numerisch) Ports
Um Email aus dem lokalen Spooler weiterzuleiten:
# exim -q # wartende Email anstoßen # exim -qf # alle Emails weiterleiten # exim -qff # dasselbe, auch Email mit Status 'frozen' wird weitergeleitet
-qff wäre wohl die bessere Wahl in dem Skript
/etc/ppp/ip-up.d/exim
.
Um nicht weiter vermittelbare Email aus dem lokalen Spooler zu entfernen und eine Fehlermeldung zurückzugeben dient:
# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
You need to manually deliver mails to the sorted mailboxes in your home
directory from /var/mail/username
if your home
directory became full and procmail failed. After making disk space in the home
directory, run:
# /etc/init.d/exim stop # formail -s procmail </var/mail/username # /etc/init.d/exim start
Um eine Datei zurückzusetzen, z.B. ein Log-Datei, sollte nicht rm benutzt werden, da diese Dateien im Sekundenrhythmus geschrieben werden. Sicherer ist:
$ :>dateiname
Die folgenden Befehle erzeugen leere Dateien beliebiger Größe:
$ dd if=/dev/zero of=dateiname bs=1k count=5 # 5KB große, aber leere Datei $ dd if=/dev/urandom of=dateiname bs=1m count=7 # 7MB mit Zufallsinhalt $ touch dateiname #erzeuge 0B Datei (wenn sie existiert, setze mtime neu)
chroot
Wenn man neben seiner Debian-Distribution noch eine andere installiert hat
(dies kann auch jede andere Distribution sein), z.B. auf der Partition
/dev/hda1
, dann kann dieses zweite System mit dem
aktuellen Kernel ohne Warmstart gestartet werden.
# mount /dev/hda1 /mnt/target ... dies nimmt an, dass das zweite System auf /dev/hda1 liegt # chroot /mnt/target ... Jetzt wird der Inhalt von /dev/hda1 als root-Verzeichnis betrachtet # mount proc /proc # reine Vorsicht ... Ausgeführte Befehle stammen nun von /dev/hda1
So kann man verschiedene Stabilitätszweige (stable/testing/unstable) auf einer
Maschine testen. Eine weitere Möglichkeit wäre, ein fremdes System per NFS zu
mounten und chroot
auf dieses neu gemountete Verzeichnis
anzuwenden.
Ein auf chroot
basierendes System kann leicht mit
debootstrap
(in Woody) erzeugt werden.
# mkdir potatochroot # debootstrap potato potatochroot # chroot potatochroot # apt-setup # set-up /etc/apt/sources.list
Es gibt ein ausgefeilteres chroot
-Paket, pbuilder
.
Es erzeugt eine chroot
-Umgebung und stellt ein Debian-Paket in
dieser Sandbox zusammen. So kann man Paketabhängigkeiten definieren, erkennen
und aufzulösen.
See http://www.debian.org/releases/stable/i386/ch-preparing#s-linux-upgrade
You can check whether two files are the same file with two hard links by:
$ ls -li file1 file2
mount
en
Wenn file.img
ein Festplatten-Image enthält und die
Quellfestplatte eine Konfiguration wie xxxx = (Byte/Sektor) *
(Sektor/Zylinder) hat, dann kann dieses Image mit dem folgenden Befehl nach
/mnt
gemountet werden:
# mount -o loop,offset=xxxx file.img /mnt
Die meisten Festplatten haben 512 bytes/Sektor
Grundlagen um auf Windows-Dateien zuzugreifen:
# mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid \ //server/share /mnt/smb # freigegebene Windows-Laufwerke mounten # smbmount //server/share /mnt/smb \ -o "username=myname,uid=my_uid,gid=my_gid" # smbclient -L 192.168.1.2 # Freigaben anzeigen
Die Netzwerk-Nachbarschaft kann angezeigt werden mit:
# smbclient -N -L eigene_IP_Adresse | less # nmblookup -T "*"
Many foreign filesystems have Linux kernel support, and can thus be accessed simply by mounting the devices containing the filesystems. For certain filesystems, there are also a few specialized tools to access the filesystems without mounting the devices. This is accomplished with user-space programs so that kernel filesystem support is not needed.
mtools
: for MSDOS filesystem (MS-DOS, Windows)
cpmtools
: for CP-M filesystem
hfsutils
: for HFS filesystem (native Macintosh)
hfsplus
: for HFS+ filesystem (modern Macintosh)
In order to create and check an MS-DOS FAT filesystem, dosfstools
is useful.
Here are few examples of dangerous actions. The negative impacts will be enhanced if you are using privileged account: root.
In "rm -rf .*", ".*" expands to include "." and "..", and if you happen to have privileges to write to the parent directory then you'll end up removing all directories next to your current directory as well.
Loss of some important files such as /etc/passwd
through your
stupidity is tough. The Debian system makes regular backups of them in
/var/backups
. When you restore these files, you may manually have
to set the proper permissions.
# cp /var/backups/passwd /etc/passwd # chmod 644 /etc/passwd
See also Wiederherstellung von Paketauswahldaten, Abschnitt 6.3.4.
Debian-Referenz
CVS, Mon 3. Apr 2005, 22:57:58 UTCosamu@debian.org
tux-master@web.de