Computer
Grundlagen
Tools
Kernel
Tipps
Literatur

 

Quick-Index

Lange Tipps - Kurze Tipps - Literatur

Linux-Tipps

Ich finde die Kommandozeile unter Unix (und somit auch Linux) eine wunderbare Möglichkeit um sich kreativ zu betätigen. Was mir in meinem Admin-/Useralltag so unterkommt und was ich für interessant befinde sammle ich an dieser Stelle. Verbesserungsvorschläge, Kommentare, Feedback und Ergänzungen sind natürlich willkommen.

Lange Tipps ;-)

chroot (für ssh/scp/...)

Eine chroot-Umgebung ist eine Technik auf Unix-Systemen, um Prozesse in eine restriktierte und isolierte Umgebung (im Dateisystem) einzusperren. Auf Linux-Systemen kann man so eine chroot-Umgebung sehr einfach aufbauen. Wolfgang Fuschlberger stellt auf www.fuschlberger.net/programs/ssh-scp-chroot-jail/ ein Skript zur Verfügung das alle relevanten Schritte automatisch durchführt. Ich habe Bugs und Informationen die mir beim Erstellen einer chroot-Umgebung aufgefallen sind auf einer eigenen kleinen Webpage festgehalten.

Schnelles Einfügen:

Einfügen von markiertem Text erfordert den Einsatz der mittleren Maustaste. Wer nicht gerne mit der Maus arbeitet oder wem das Emulieren der mittleren Maustaste auf einer zwei Tasten Maus nicht leicht von den Fingern geht, kann sich auch mit SHIFT-INSERT behelfen. Diese Tastenkombination funktioniert in allen Terminal Applikationen und in vielen X Anwendungen.

CD Abbilder von Festplatte verwenden:

Einige Hersteller von Distributionen bieten ISO Abbilder der Installations CDs zum Download an. Diese Abbilder lassen sich - eine entsprechend schnelle Leitung oder genügend Geduld vorausgesetzt - herunterladen und auf CD brennen. Ist gerade kein Brenner verfügbar können ISO Abbilder auch direkt verwendet werden. Mit folgendem Kommando hängt man eine Datei direkt im Filesystem ein:

mount Dateiname.iso /mnt -t iso9660 -o ro,loop=/dev/loop0

Das CD Abbild steht nun unter dem Verzeichnis /mnt zum Lesen zur Verfügung. Zum Schreiben eignet sich ein CD Abbild natürlich nicht.

Editieren von Dateien im Pfad:

Soll eine Datei im Suchpfad editiert werden, kann auf die Angabe des vollständigen Pfades verzichtet werden. Es genügt ein "editorname `which dateiname`" um die Datei zu bearbeiten. Natürlich ist es dabei dann notwendig, das sich eine Datei mit diesem Namen nur einmal im Pfad befindet - ansonsten stellt man besser sicher, dass auch die richtige Datei bearbeitet wird. Und wer unvorsichtig ist bearbeitet eine binäre Datei ;-) (thx Alex)

X sicherer machen:

Ein laufendes X lauscht normalerweise an Port 6000 nach eingehenden Verbindungen. Wer seinen Rechner ohne Netz stand-alone betreibt, hat aber selten den Wunsch sich von anderen Rechner zu verbinden. Dafür stellt ein offener Port immer ein Sicherheitsrisiko dar. Abhilfe schafft die Option "-nolisten tcp". Das Verbinden von fremden Rechner ist damit unmöglich.

Herkunft einer Datei herausfinden:

Vergleicht man Systeme miteinander kommt es gelegentlich vor, dass auf einem der Systeme eine Datei vorhanden ist, die auf dem anderen fehlt. Fragt man sich, welches Paket diese Datei enthält so genügt folgendes Kommando, wenn das System auf RPM basiert:

rpm -qf /vollstaendiger_pfad/dateiname

Die Ausgabe ist der Name des rpm Paketes, welches diese Datei installiert hat.

Herausfinden, ob ein Paket installiert ist:

Oft bekommt man von jemandem einen Tipp für eine gute Software, die man installieren möchte, aber es gibt Dependencies, oder die Software befindet sich vielleicht sogar schon auf der Platte. Bei RPM-Systemen hilft folgendes Kommando:

rpm -qa | grep packetname

Zum Beispiel "rpm -qa | grep ssh" gibt alle Paketnamen aus, die den Ausdruck "ssh" im Namen enthalten, dazu gehören auch alle Pakete der Serie OpenSSH.

Löschen offener Dateien:

Logfiles können sehr schnell sehr groß werden, lassen sich aber nicht immer ohne weiteres löschen. Läuft der Prozess noch, der das Logfile geöffnet hat, kommt es zu Problemen. Ein einfacher Weg schnell wieder Platz zu schaffen ist, die Datei zu überschreiben. Mit folgendem Befehl setzt man die Dateigröße auf 0 Byte:

cat /dev/null > logfile
Noch kürzer ist folgende Variante (danke für den Hinweis - Michael Matzick!):
echo -n > logfile
oder in Bourne-Shells:
:> logfile

Nur Verzeichnisse anzeigen mit ls:

Was macht man, wenn man einmal nur Verzeichnisse gelistet haben will?

ls -ld | grep '^d'
behelfen. Wildcards sind dabei natürlich möglich. Ein "ls -ld a* | grep '^d'" zeigt zum Beispiel nur Unterverzeichnisse, die mit a beginnen.

Björn Albers hat mich netterweise auf eine Variante die ohne grep auskommt hingewiesen:

ls -ld */.

Die Wildcard erfasst alle Dateien mit einem Link auf sich selbst, also alle Unterverzeichnisse im aktuellen Verzeichnis.

Mit der zsh kann man auch gleich versteckte Verzeichnisse anzeigen:

ls -dl */(D)

Suchen zweier Alternativen:

Mit dem grep Kommando kann man innerhalb von Dateien nach Zeilen suchen, die einen bestimmten Text enthalten. Gelegentlich sucht man aber nach zwei oder mehreren Alternativen, also nach allen Zeilen, die entweder den einen oder den anderen Text enthalten. Hier hilft ein regulärer Ausdruck weiter. Mit "grep -E "Text1|Text2" *" werden alle Zeilen ausgegeben, die Text1 oder (|) Text2 enthalten. Sollen weitere Alternativen gefunden werden, kann die Liste entsprechend verlängert werden.

DOS-Zeilenumbrüche entfernen

Entweder das Programm dos2unix verwenden oder eine andere Methode heranziehen:
sed 's/.$//'    dosfile > unixfile       # assumes that all lines end with CR/LF
sed 's/^M$//'   dosfile > unixfile       # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' dosfile > unixfile       # gsed 3.02.80, but top script is easier
awk '{sub(/\r$/,"");print}'              # assumes EACH line ends with Ctrl-M
gawk -v BINMODE="w" '1' infile >outfile  # in DOS environment; cannot be done with
                                         # DOS versions of awk, other than gawk
tr -d \r < dosfile > unixfile            # GNU tr version 1.22 or higher
tr -d '\015' < dosfile > unixfile        # use octal value for "\r" (see man ascii)
tr -d '[\015\032]' < dosfile > unixfile  # sometimes ^Z is appended to DOS-files
vim -c ":set ff=unix" -c ":wq" file      # convert using vim
vim -c "se ff=dos|x" file                # ... and even shorter ;)
recode ibmpc..lat1 file                  # convert using recode
echo -e "s/\r//g" > dos2unix.sed; sed -f dos2unix.sed < dosfile > unixfile

Anmerkung: Das ^M wird dabei durch Halten der Ctrl-Taste und Drücken der Tasten V und M (nacheinander, während Ctrl fest gehalten wird!) erzeugt. Die End-of-Lines sind wie folgt definiert:

Mac:CTRL-M [0x0d]
Unix:CTRL-J [0x0a]
DOS/Windows:CTRL-M+CTRL-J [0x0d 0x0a]

Mac-Zeilenumbrüche entfernen

tr '\r' '\n' < macfile > unixfile
recode mac:lat1 < macfile > unixfile # pinfo recode && recode -l | grep -i mac
awk '{ gsub("\r", "\n"); print $0;}' macfile > unixfile
perl -p -e 's/\r/\n/g'  < macfile > unixfile

Diskette kopieren

Diskette in Image-Dateien kopieren und wieder zurück:
dd if=/dev/fd0 of=floppyimage
Exakte Kopie der Diskette wird unter floppyimage abgelegt.
dd if=floppyimage of=/dev/fd0
Dadurch wird das Floppyimage wieder auf eine Diskette zurückkopiert.

Linux aus dem NT-Bootmanager heraus starten

Dazu als erstes den Bootsektor auf die Diskette kopieren:
dd if=/dev/hda2 bs=512 count=1 of=/floppy/boot.sek
Jetzt Windows booten und die Datei boot.sek von der Diskette in das Wurzelverzeichnis der Partition kopieren, auf der Windows installiert ist. Jetzt die Datei C:\boot.ini mit einem Text-Editor bearbeiten (bei Problemen den Schreibschutz der Datei entfernen). Jetzt in der Datei die Zeile
c:\boot.sek="Linux"
Fertig - jetzt kann Linux aus dem Windows-Bootmanager heraus gestartet werden.

Username in Shell-Skripten

Oft benötigt man in Skripten den Namen des momentan angemeldeten Benutzers oder des aktuellen Computers. Diese stehen in der Bash in Form von Variablen zur Verfügung: SHORTNAME=$(hostname) liefert den Namen des Computers LONGNAME=$(hostname) liefert den Namen und die Domäne des Computers USERNAME=$(id -un) liefert den Usernamen Die Mailadresse läßt sich daraus zum Beispiel auf folgende Art zusammensetzen: mailad=$USERNAME@$LONGNAME.

Netzwerk-"Tätigkeit"

netstat -pa
für detaillierte Informationen zu den Sockets.
netstat -a -n | grep "^tcp" | cut -c 68- | sort | uniq -c | sort -n
um zu sehen, wieviele Sockets in welchem Status sind.
cat /proc/net/sockstat
um die Anzahl der aktuell geöffneten Sockets zu erhalten.
fuser -n tcp 5006 | sed -e 's/.*: *//'
um anzuzeigen, welche Prozess-IDs einen bestimmten TCP-Socket verwenden.

Kurze Tipps ;-)

Umbenennen mehrerer Dateien

Entfernen von Leerschritten/-zeichen und Ersetzen durch Underscore (_):
mmv '* *' '1_#2' # achtung: ersetzt nur ein Vorkommen eines Leerzeichens
Umbenennen von dateiname1.avi in dateiname01.avi für alle Dateien mit Zahlen von 1-9:
mmv 'dateiname?.avi' 'dateiname0#1.avi'

Live-Stream in Datei speichern

mplayer -ao pcm -aofile $DATEI
oder
mencoder mms://datei.wmv -o blub -ovc copy -oac copy

Videodateien mergen

Avi-Dateien:
avimerge -i *.avi -o blub.avi
mpg-Dateien:
$ cat *.mpg > blub.mpg
wmv-Dateien (achtung - sehr ressourcenhungrig!):
cat *.wmv | mencoder - -oac copy -ovc copy -ofps 25 -o blub.wmv
# funktioniert aber leider nicht wie gewuenscht, deshalb:
mencoder file1.wmv -ovc lavc -oac lavc -ofps 25 -srate 48000 -o file1.avi
mencoder file2.wmv -ovc lavc -oac lavc -ofps 25 -srate 48000 -o file2.avi
avimerge -i file1.avi file2.avi -o blub.avi

Ton-Ausgabe auf der X-Konsole

Das kann zum Beispiel mit dem vielseitigen Tool xset erreichen, z.B.:
xset b 50 440 100
oder mit echo:
echo -e "\a"

Ton-Ausgabe auf der Non-X-Konsole

Das kann man mit dem Programm setterm erreichen, z.B.:
setterm -bfreq 440 -blength 100
oder wieder mit echo:
echo -e "\a"

Dynamisch gebunden Libraries von Programmen herausfinden

ldd programmname
oder
ldd `which programmname`
oder
which programmname | xargs ldd

Aus Anzeige von less oder more in Editor wechseln

Einfach nur v drücken :-) (more nimmt immer vi, less liest die Variable $EDITOR aus)

Letzten Prozess hervorholen

fg $$
bzw.
bg $$
bzw. geht natürlich auch mit fg $1, fg $2 und CO.

Automatisches Logout in der Bash

Folgenden Eintrag in die ~/.bashrc einfügen:
TMOUT=180
Bewirkt, dass man nach 180/60 = 3 Minuten ausgeloggt wird.

MS Office-Dokumente "anschauen" ;-)

strings filename.doc | fmt | less

aktuelles Runlevel bestimmen

/sbin/runlevel
oder
ps auxw | grep 'init \[[0-6]\]'

Netzwerktraffic "messen"

Empfangen:
/sbin/ifconfig $INTERFACE | sed -n 's/.*RX bytes:[^(]*(\([^)]*\)).*/\1/p'
Gesendet:
/sbin/ifconfig $INTERFACE | sed -n 's/.*TX bytes:[^(]*(\([^)]*\)).*/\1/p'

Aus einem "man" den jeweiligen Teil extrahieren

Zum Beispiel MACHTYPE im "man bash":
$ man bash | col -b | sed -n '/^ *MACHTYPE/,/^$/p'

IP-Adresse auslesen

Dazu gibt es mehrere Möglichkeiten, zum Beispiel:
export LC_ALL=C; /sbin/ifconfig $DEVICE | \
        awk '/inet addr/{ split($2,foo,":") ; print foo[2] }'
/sbin/ifconfig $DEVICE | awk '/inet/ { print $2 } ' | sed -e s/addr://
/sbin/ifconfig $DEVICE | fgrep "inet addr:" | \
        sed "s/^.*inet addr:\([0-9\.]*\).*$/\1/"
/sbin/ifconfig $DEVICE | sed -n 's/.*addr:\([0-9.]*\).*/\1/p'

Manual in Postscript konvertieren

zcat /usr/share/man/man1/bash.1.gz | groff -man > ~/bash.1.ps
Dass es noch einfacher geht hat mir Andreas Gutowski gemailt:
man -t bash > bash.ps

Feststellen, ob noch irgendein Symlink auf eine Datei zeigt

find / -type l -print | perl -nle '-e || print'

Installations-Datum des Systems herausfinden

ls --sort=t /dev -l | tail -n1 | awk '{print $8 " " $7 " " $9}'
aber auf manchen Systemen könnte obiges schiefgehen, dann sollte man folgendes machen:
ls --sort=t /dev -l | tail -n1 | awk '{print $7 " " $6 " " $8}'

BIOS auslesen

dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8

Alle Worte aus einer Datei einzeln herausholen und die Häufigkeit zählen

tr ' ' '\n' < datei.txt | sort | uniq -c | sort -nr

Header bei HTTP-Verbindung auslesen

echo "GET / HTTP/1.0\r\n\r\n" | netcat www.michael-prokop.at 80

Grösse einer Konfigurationsdatei ohne Kommentare und Leerzeilen herausfinden

egrep -v '(#|^$)' .vimrc | wc

Word-Dateien in Postscript-Dateien konvertieren

antiword -p a4 pflichtenheft.doc > foo.ps

E-Mail-User ohne Login einrichten

useradd -g popusers -s /bin/false superdau

X-Einstellungen für ein bestimmtes Programm auslesen

xrdb -q |grep -i emacs

Mailserver zu einer Domain herausfinden

host -t mx iwb.tu-graz.ac.at

XServer-Version herausfinden

xdpyinfo | grep release

MAC-Adressen herausfinden

nmap -sP 193.170.227.0/21 && arp -a > textfile

Backup per ssh mittels tar

tar -cz * | ssh backupserver "cat - > /backups/backup.tgz"
oder noch eleganter via:
tar cpz * --rsh-command=/usr/bin/ssh -f backupserver:/backups/backup.tgz
(Danke an Tom Braeuer für den Hinweis!)

Netzwerk-Fehler

Informationen über permanent verlorene Packete bekommt man mit folgendem Befehl:
head -2 /proc/net/snmp | cut -d' ' -f17

IPC-Informationen

ipcs
:-)

Liste der Signale und deren Nummer bekommen

trap -l

Procinfo

procinfo -a
Dieser Befehl ist ein Ersatz fuer das manuelle Auslesen des /proc-Dateisystems.

Bibliotheksinformationen

ldd -v /path/to/file
gibt aus, welche gemeinsamen Bibliotheken ein Programm oder eine andere Bibliothek verwendet und zeigt auch an, wo diese Bibliotheken im System zu finden sind für den aktuellen LD_LIBRARY_PATH.

Herausfinden, welcher Prozess welche Dateien aktuell verwendet

fuser
oder
lsof

Vergleich von Emacs und Vim ;-)

time emacs -kill && time vim t -c :q

Permission-Check

find / -type f \( -perm +4000 -o -perm +2000 \) -print

WINDOWID von einem Terminal auslesen

xwininfo -int | grep "Window id:" | cut -d ' ' -f 4

Titel eines X-Windows herausfinden

xprop WM_CLASS

locale - LC_MESSAGES checken

locale -ck LC_MESSAGES

Mehrstelliges Passwort per /dev/urandom erstellen

dd if=/dev/urandom bs=14 count=1 | hexdump | cut -c 9-

Literatur

Weitere Tipps und Tricks gibt es unter anderem bei:
http://billharlan.com/pub/papers/Debugging_GnuLinux.txt (local copy)
http://people.redhat.com/alikins/system_tuning.html (local copy)
ShellTricks von #debian

--> Links, Literatur und Dokumentation

 

* Nach oben