Navigation

 News
 Blog
 Dokumente
    - Upload
     Linux
    - Windows
    - IT-Security
    - Kryptologie
    - Programmierung
    - Netzwerktechnik
    - Allgemeines
 Projekte
 Hacks
 Download
 Forum
 Partner
 Banner
 Links
 Changelog
 Impressum


Willkommen 18.222.20.30

Neuesten 3 Dokus:


Partner:

www.wissenundpraxis.com
www.saveyour.homelinux.org
www.sco-world.de
www.hakin9.org/de

schon Partner...?


zurück

Linux Tipps & Tricks

Hallo,

dieses Dokument bietet viele Tipps und Tricks an, die beim täglichen Arbeiten mit Linux sehr hilfreich sind. Eine Erweiterung findet in unregelmäßigen Abständen statt.
Damit man sich besser zu Recht findet, sind die Tipps in Kategorien gegliedert:

1. Systemstart
2. Allgemeines
3. Shell
4. Dateiverwaltung
5. Prozessverwaltung
6. Netzwerk
7. Kernel, Module & Bibliotheken


Teil 1 Systemstart:

Beim Booten eines Rechners durchläuft jeder PC zunächst einmal den Power On Self Test(POST). Wenn dieser erfolgreich durchlaufen wurde, wird nach einem Bootdevice gesucht, welches man im BIOS festlegen kann.
Dabei wird der Inhalt des ersten Sektors des ersten Devices (bei Festplatten, Disketten oder vergleichbaren Medien, jedoch nicht bei PXE) vom BIOS geladen und führt den Code aus. Dieses wird dann versucht zu starten.
Im Falle einer mit Linux formatierten Festplatte, ist dort der Code eines speziellen Programms zu finden. Die bekanntesten verwendeten Linux-Bootloader sind GRUB( GRand Unified Bootloader) oder LiLo (Linux Loader).
Der Bootloader lädt dann die Linux-Kerneldatei in den Speicher und startet diesen dann.
An den Kernel werden meist einige Parameter übergeben, eines der wichtigsten ohne den ein erfolgreicher Start unmöglich ist, ist der Device-Name der Root-Partition ( z.B. root=/dev/sda1).
Nach dem Start des Kernel wird dieser vorläufig im Read-Only-Modus auf die Root-Partition zugreifen. Dann startet der Kernel als erstes Programm /sbin/init. Das Programm init nimmt dann die Basiskonfiguration des Systems vor und steuert den Start zahlloser Dämonen.

Als Dämonen (engl. daemons) werden Hintergrundprozesse zur Systemverwaltung bezeichnet.
Die Dämonen sind mit den Windows Diensten bzw. Services zu vergleichen.

Der Aufbau von init und wie es ausgeführt wird, hängt von der jeweiligen Distribution ab.
Dennoch orientieren sich die meisten Distributionen an dem System-Init-V-Prozess.

Der Aufbau des Systemstarts sieht meist wie folgt aus:

1. GRUB oder LiLo lädt den Kernel
2. Der Kernel startet das Programm /sbin/init
3. init wertet die Konfigurationsdatei /etc/inittab aus.
4. init führt ein Script zur Systeminitialisierung aus
5. init führt das Script /etc/rc.d/rc oder /etc/init.d/rc aus.
6. rc startet verschiedene Script-Dateien aus verschiedenen Runleveln

Um das verhalten von init zu beeinflussen ist es notwendig die Konfigurationsdatei /etc/inittab entsprechend zu verändern.

Runlevel:

init, welcher der erste laufende Prozess ist, übernimmt die Rolle alle weiteren Prozesse zu starten. Dieses sind alles Subprozesse von init. Genauso ist init der letzte, laufende Prozess beim herunterfahren.
Doch was sind nun Runlevel?
Man muss sich die Runlevel als Phase des Systemstarts vorstellen, welche bei vielen Distributionen folgendermaßen deklariert sind:

Runlevel 1 und S		: Single-User
Runlevel 2			: Multi-User ohne Netzwerk
Runlevel 3			: Multi-User mit Netzwerk, ohne automatischen Start von X
Runlevel 5			: Multi-User mit Netzwerk, mit automatischem Start von X

Beim Herunterfahren gibt es folgende Runlevel:

Runlevel 0: Shutdown mit Halt (ausschalten)
Runlevel 6: Shutdown mit Reboot (neustart)


Dennoch gibt es unter einigen Distributionen gravierende Abweichungen, welche man aber der gut dokumentierten /etc/inittab entnehmen kann.
Gerade Debian ist ein Paradebeispiel dafür, das es doch nicht überall gleich ist.

Um z.B. direkt in einem anderen Runlevel zu starten bietet es sich an, den Default-Runlevel zu ändern:

# vi /etc/inittab
id:5:initdefault #durch den entsprechenden Runlevel ersetzen.
# Um z.B. ohne X zu starten kann man den Eintrag auf id:3:initdefault setzen

Um bei einem schon gebooteten Linux den Runlevel zu ändern, ist als Root das Programm init zu verwenden:

init 3 #wechselt in das Runlevel 3

Runlevel ändern:

Zum einem ist es möglich, die Verknüpfungen zu den einzelnen Run-Leveln zu ändern:

So ist z.B. /etc/init.d/rc1.d/K50xinetd ein Zeichen dafür, dass in Runlevel 1(Single-User Betrieb), der Daemon xinetd beendet wird.

Doch was bedeutet das jetzt im Einzelnen:
In /etc/init.d liegen alle Daemons und die Verzeichnisse rc0.d bis rc6.d, dabei gibt rc0.d das Runlevel 0 an. Eine andere Zahl, würde auf einen anderen Runlevel hindeuten. Das K bedeutet das es beendet wird(K entspricht Kill). Das Gegenstück hierzu wäre S, welches zum Starten der Prozesse benutzt wird. Der Wert 50 gibt hierbei die Priorität vom Prozess an. Je niedriger der Wert der Zahl ist, desto früher wird dieser beendet oder gestartet, je nach dem ob ein K oder S davor steht.

Da es hier schnell zu Problemen kommen kann, bieten viele Distributionen ein Tool zum einfachen Verwalten der Init-Scripte an.
chkconfig --list              #anzeigen aller Init-Scripte
chkconfig --del httpd     #löschen eines Init-Scriptes
chkconfig --add httpd    #hinzufügen eines Init-Scriptes
chkconfig --level 35 httpd on    #aktivieren des Scriptes in Runlevel 3 und 5.

Natürlich wird das Init-Script nicht gelöscht, sondern nur die entsprechende Verknüpfung.

Teil 2 Allgemeines


Benutzerzugehörigkeit

Um z.B. feststellen zu können welche ID der momenten aktive Benutzer hat, kann man sich mit dem Kommando id weiterhelfen lassen. Außerdem gibt es noch die ID der primären Gruppe an:

# id
uid=0(root gid=0(root)

Root-Partition bestimmen

Es kommt immer mal wieder vor, dass man wissen muss, auf welchem Device sich die Root-Partition befindet, hier hilft folgendes Kommando:

$ rdev
/dev/sda1

Große Dateien

Kommt man mal in die Situation, große Textdateien ( > 1mb) zu öffnen, so kann es je nach Editor schon mal was länger dauern. Eine Lösung hierfür bietet das Zusammenspiel von den Kommandos head oder tail und dem Kommando less:

$ tail -n 20000 bigfile.txt | less

DNS-Server bestimmen

Möchte man die Software und die dazugehörige Version eines DNS-Servers feststellen, so dient folgende Befehlskette zur Lösung dieses Problems:

dig @217.237.150.97 version.bind. txt CHAOS | grep -i "^V"

mkfifo

Hat man die Notwendigkeit mit einer Datei so zu arbeiten, wie mit einer Pipe, bieten sich so genannte FIFO-Dateien (First In First Out) an. Somit ermöglichen diese den Austausch zwischen zwei Programmen über eine Datei.
Hierzu dient das Programm mkfifo:

user$ mkfifo fifo
user$ ls -l > fifo
user$ more < fifo


Teil 3 Shell


Darstellung

Möchte man z.B. in ein Verzeichnis wechseln, welches Leerzeichen enthält, so muss man den Verzeichnisnamen mit Anführungszeichen(") umschließen.

user$ cd "/home/daniel/super langes verzeichnis"
Das gute daran ist, dass trotz den Anführungszeichen immer noch Variabeln ausgewertet werden:

user$ verz="super langes verzeichnis 2"
user$ cd "/home/daniel/super langes verzeichnis/$verz"
Eine noch stärkere Auswirkung haben die einfachen Hochkommatas ('), denn zwischen zwei ' bleiben selbst Variablennamen erhalten, die die Shell ansonsten (auch zwischen Anführungszeichen) durch den Wert der jeweiligen Variabel ersetzt.

user$ verz="super langes verzeichnis 2"
user$ cd '/home/daniel/super langes verzeichnis/$verz'
cd: Verzeichnis /home/daniel/super langes verzeichnis/$verz kann
	nicht gefunden werden
Die Backticks (`) haben hingegen eine ganz andere Bedeutung:
user$ strings `which passwd`
Die Shell ersetzt ein Kommando zwischen zwei ` durch die Ausgabe dieses Kommandos.
Somit wird zuerst das Ergebnis von which passwd ausgewertet und anschließend wird der Pfad mit strings angezeigt. Dies ist also eine mögliche Alternative hier für:
user$  strings $(which passwd)


Teil 4 Dateiverwaltung


Zugriffe ansehen

Es kommt immer mal wieder vor, dass man Wissen muss wie die Zugriffsbits für eine Datei gesetzt sind. Hierbei bietet natürlich ls einen guten Ansatz:
user$ ls -la file
-rw-r--r--   1 daniel    daniel     0 Aug 1 07:25 file

Eine noch bequemere Lösung ist das Verwenden des Kommandos stat, da es wesentlich detaillierter bei der Ausgabe ist:

stat datafile
  File: "datafile"
  Size: 0         	Blocks: 0          IO Block: 4096 reguläre leere Datei
Device: 303h/771d	Inode: 821         Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    daniel)   Gid:(  100/   users)
Access: 2006-09-02 18:51:56.000000000 +0200
Modify: 2006-09-02 18:51:56.000000000 +0200
Change: 2006-09-02 18:51:56.000000000 +0200


Teil 5 Prozessverwaltung


Lsof

Wie der Name schon sagt (lsof = list open files), können mit lsof alle geöffneten Dateien, wozu auch Netzwerk-Sockets gehören, in einer Liste dargestellt werden.

# lsof | less

Um Informationen zu einem gezielten Bereich zu erhalten, kann man lsof auch in Verbindung mit egrep benutzen:

# lsof | egrep "ssh"

Darüber hinaus ist die Zusammenarbeit von lsof mit netstat oft eine sehr gute Methode, um verdächtige oder ungewöhnliche Netzwerkverbindungen zu entdecken.
So kann z.B. eine Remote-Shell enttarnt werden. Folgendes Beispiel soll dies veranschaulichen:

# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address          State
tcp        0      0 *:netbios-ssn           	   *:*           LISTEN
tcp        0      0 *:sunrpc                 	   *:*           LISTEN
tcp        0      0 localhost:novell-zen     	   *:*           LISTEN
tcp        0      0 *:ipp                   	   *:*           LISTEN
tcp        0      0 localhost:12345         	   *:*           LISTEN
tcp        0      0 *:microsoft-ds          	   *:*           LISTEN
tcp        0      0 fubian.sit:microsoft-ds 192.168.5.29:rrifmm  ESTABLISHED
tcp        0      0 *:ssh                   	   *:*           LISTEN
tcp        0      0 localhost:smtp           	   *:*           LISTEN
udp        0      0 *:filenet-tms           	   *:*
udp        0      0 daniel.site:netbios-ns         *:*
udp        0      0 *:netbios-ns            	   *:*
udp        0      0 daniel.site:netbios-dgm 	   *:*
udp        0      0 *:netbios-dgm                  *:*
udp        0      0 *:mdns                  	   *:*
udp        0      0 *:sunrpc                	   *:*
\85

# lsof | egrep \9312345\94
bindshell  574   root  	 3u    IPv4		1842  TCP *:12345 (LISTEN)

Mit diesen Informationen über den Namen des Programms (bindshell), das den Port 12345 besetzt, und der Tatsache, dass das Programm unter root-Rechten ausgeführt wird, lässt diese Remote-Shell sehr schnell entdecken.


Teil 6 Netzwerk


Netzwerk einrichten

Um unter Linux seine Netzwerkkarte zu konfigurieren, ist die dafür verantwortliche Konfigurationsdatei /etc/network/interfaces zu bearbeiten:

# vi /etc/network/interfaces
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
iface lo inet loopback

# The first network card - this entry was created during the Debian
# installation (network, broadcast and gateway are optional)
iface eth0 inet static	# Die Netzwerkkarte für die die folgenden
						# Option gelten
	address 192.168.15.29 # hier wird die IP-Adresse gesetzt
	netmask 255.255.255.0 # die Subnetzmaske
	network 192.168.15.0	# Die Netz-ID
	broadcast 192.168.15.255 # Die Broadcast-Adresse

Um später die Einstellungen zu überprüfen, hilft folgendes Kommando:

# ifconfig eth0
eth0    Link encap 100Mbps Ethernet  HWaddr 00:00:C0:90:B3:42
        inet addr 192.168.15.29 Bcast 192.168.15.255 Mask 255.255.255.0
        UP BROADCAST RUNNING  MTU 1500  Metric 0
        RX packets 3136 errors 217 dropped 7 overrun 26
        TX packets 1752 errors 25 dropped 0 overrun 0

Nun kann man die Netzwerkkarte mit ifup aktivieren und mit ifdown deaktivieren.
Falls es den Befehl nicht geben sollte, kann man den Ersatz mit ifconfig wählen:
# ifup eth0
Oder
# ifconfig eth0 up

Um einen DNS-Server einzustellen ist ein Eintrag in /etc/resolv.conf zu machen:

# vi /etc/resolv.conf
nameserver 192.168.15.1
# nameserver 

Meist ist es auch noch nötig seinem Rechner einen Standardgateway anzubieten:

# route add default gw 192.168.15.1

Zum überprüfen sollte man sich die Routing-Tabelle ansehen:

# route -n
Kernel IP routing table
Destination		Gateway			Genmask			...
192.168.15.0	0.0.0.0				255.255.225.0		...
0.0.0.0			192.168.15.1		0.0.0.0			...

Linux-Router

Hat man einen Linux-Router, möchte man evtl. Einblick auf die NAT-Tabelle werfen (NAT --> Network Adress Translation). Alle die ihren Linux-Router unter anderem mit dem Netfilter-Software des Kernel arbeiten und somit mit iptables arbeiten, können sich mit folgendem Befehl die NAT-Tabelle ansehen:
# iptables -L -t nat

Da der Kernel alle aktiven Verbindungen unter /proc/net/ip_conntrack festhält, ist es mit netstat möglich, diese auf maskierte Pakete hinzu untersuchen:

# netstat  --masquerade
oder
# netstat  -M

Sniffen:

Wer gerne mal den Datenverkehr seines privaten Netzes untersuchen möchte und einer seiner PCs über Hubs miteinander verbunden hat, muss zu allererst seine Netzwerkkarte in den Promiscuous Mode (zu Deutsch: Promiskmodus) versetzen.
Denn ansonsten akzeptiert die Network Interface Card (NIC; Netzwerkkarte) nur Daten (Frames) welche als Ziel-MAC-Adresse die MAC-Adresse der Netzwerkkarte haben.
Der Promiscuous Mode erlaubt es jetzt alle Frames zu akzeptieren, die auch eine komplett andere MAC-Adresse besitzen. Dies geht unter den meisten Linux-Distributionen mit folgendem Befehl:

# ifconfig eth0 promisc

Wenn man den Modus wieder verlassen möchte, muss einfach ein "-" vor promisc gesetzt werden:

# ifconfig eth0 -promisc

Zum Mitschneiden eignet sich z.B. tcpdump.
tcpdump ermöglicht es, den kompletten Netzwerkverkehr, der an einem Interface vorbeifließt mitzuschneiden. Der Mitschnitt lässt sich nach verschiedenen Gesichtspunkten beeinflussen und analysieren.
Startet man tcpdump ohne Argumente, bindet es sich an das erste Interface in der Systemliste, das aktiviert (up) ist. Ein gewünschtes Interface lässt sich mittels -i spezifizieren. Startet man nun tcpdump -i eth0 so wird der gesamte Verkehr über tlp1 mitgeschnitten
und am Bildschirm ausgegeben:

# tcpdump -i eth0
tcpdump: listening on tlp0
...

Möchte man z.B. den Verkehr, der auf Schnittstelle eth0 eintrifft, nur auf ICMP-Verkehr untersuchen, könnte das ganze wie folgt aussehen:

# tcpdump -n -i eth0 icmp

Teil 7 Kernel, Module & Bibliotheken


lsmod

Möchte man sicherstellen, das z.B. alle notwendigen Module für einen Linux Rechner, den man als Router konfigurieren möchte, vorhanden sind, so bietet das Programm lsmod genau die richtigen Funktionen.
Mit lsmod werden alle geladenen Module auf einem System angezeigt:

# lsmod

Damit jetzt nur noch alle Module angezeigt werden, die das Wort ip enthalten, muss man lsmod filtern( ip deshalb, da alle Netfilter-Module das Wort ip enthalten):

# lsmod | grep -i ip

ldd

Es gibt Situationen, in denen man Wissen muss welche Bibliotheken ein bestimmtes Programm benötigt. In solchen Fällen kommt oft ldd zum Einsatz, welches genau für solch einen Zweck konzipiert wurde:

# ldd /bin/cp
libacl.so.1 => /lib/libacl.so.1 (0x4002d000)
...


Ende

Wie man sieht werden viele Themen nur angerissen, doch das ist nicht weiter verwunderlich, da es sich hier nur um eine Tipp- und Tricks-Sammlung handelt, die das tägliche Arbeiten mit Linux vereinfachen soll.
Dennoch werde ich immer mal wieder dieses Dokument erweitern oder verbessern.
Falls Sie glauben auch einen guten Tipp oder Trick zu haben, dann schicken Sie mir diesen doch einfach und ich werde diesen dann hier unter Ihrem Namen veröffentlichen.

Bei weiteren Fragen, Kritik oder Anregungen zum Artikel stehe ich natürlich jederzeit zur Verfügung.
Einfach eine E-Mail an duddits-[at]-remoteshell-security.com. Ich versuche diese dann so schnell als möglich zu beantworten.

Nach oben


Copyright © 2006-2024 Daniel Baier: Alle Rechte vorbehalten