Linux:FAQ

Aus Fortinet Wiki
Zur Navigation springen Zur Suche springen


Datenschutz

        *********************************************************************
        *                                                                   *
        *  THIS FILE MAY CONTAIN CONFIDENTIAL, PRIVILEGED OR OTHER LEGALLY  *
        *      PROTECTED INFORMATION. YOU ARE PROHIBITED FROM COPYING,      *
        *    DISTRIBUTING OR OTHERWISE USING IT WITHOUT PERMISSION FROM     *
        *                  ALSO SCHWEIZ AG SWITZERLAND.                     *
        *                                                                   *
        *********************************************************************

"Die in diesen Artikeln enthaltenen Informationen sind vertraulich und dürfen ohne
schriftliche Zustimmung von der ALSO Schweiz AG gegenüber Dritt-Unternehmen nicht 
                         bekannt gemacht werden"

FAQ - Fragen und Antworten fuer Linux

Wo finde ich mehr Informationen ueber die "Filesystem Hierarchy"?

       Filesystem Hierarchy Standard       http://www.pathname.com/fhs/pub/fhs-2.3.html

Wie mounte ich einen USB Stick/Device?

Grundsaetzlich muss man wissen das ein USB Stick unter Linux als "SCSI" Device erkannt wird. Folgender Befehl zeigt welche "SCSI" Devices bereits auf dem System erkannt wurden:

       # cat /proc/scsi/scsi

Sollte das System keine anderen SCSI Geräte erkennen so ist der Mount Point folgender Device:

       /dev/sda1

NOTE
Wenn das System bereits über SCSI Geräte verfügt, kann das Device entsprechend anders Nummeriert sein zB. /dev/sda2, sdb1, etc.

Der USB Stick kann über den Mount Befehl als Filesystem gemountet werden. Als erstes erstellen wir einen "mount point" dh. ein Verzeichnis zB. /usb_stick:

       # mkdir /usb_stick
       # mount /dev/sd[scsi device number] /usb_stick

Wie wechsle ich auf der Kommandozeile in den "background" oder "forderground"?

Unter Linux ist es moeglich zur gleichen Zeit indem ein Script laeuft in den "background" zu wechseln dh. wenn zB ein Script eine spezielle Angabe wuenscht, man diese jedoch momentan nicht weiss und man sich in einer seriellen "session" befindet, muesste man theoretisch das Script beenden und danach auf der "shell" die gewuenschte Angabe suchen und wiederum das Script erneut starten nachdem die gewuenschten Angaben auf der "shell" gefunden worden sind Das Ganze kann umgangen werden indem man in den "background" wechselt oder in den "forderground" dh. wenn wir ein Script starten und nun befinden wir uns zB in einem Dialog innerhalb des Scriptes, jedoch wissen wir die Angaben nicht ausser wir koennten kurz zurueck auf dies "shell", kann nun in den "background" gewechselt werden mit folgender Tasten-Kombination:

       Ctrl+z

Nach der Tasten-Kombination befinden wir uns im "background" dh. das "shell" Script laeuft immer noch weiter im "forderground". Da wir uns nun auf der "shell" befinden koennen wir die gesuchten Angaben suchen. Haben wir diese gefunden wechseln wir wieder zurueck in den "forderground" dh. in das Script resp. in den Dialog des Scriptes zurueck. Gebe folgendes auf der Kommandozeile ein um in den "forderground" zu wechseln:

       # fg
       

Wie partitioniere ich eine Festplatte?

Bei einer Partitionieren einer Festplatte ist als erstes zu identifizieren um welches Devices es sich handelt zB "/dev/hdb" usw. Ist dies festgestellt so kann mit dem Tool "fdisk" die Partitionierung vorgenommen werden:

       # fdisk /dev/hdb

NOTE
In unserem Beispiel wurde die ganze Festplatte als "primary partition" angelegt und nur 1 Partition angelegt!

Wurde die Festplatte paritioniert so kann ein Filesystem angelegt werden zB "ext3":

       # mke2fs -j /dev/hdb1

NOTE
Der Befehl "mke2fs" ist zwar zustaendig fuer das Anlegen eines "ext2" Filesystem jedoch durch die Angaben der Option "-j" fuer "journaling" wird ein "ext3" Filesystem angelegt.


Nach erfolgreichen anlegen des Filesystems kann die Festplatte zB ueber die Einstellungen in "/etc/fstab" gemountet werden dh.:

       # vi /etc/fstab
       
       --------------- /etc/fstab ---------------
       
       /dev/hdb1               /export/bab_disk        ext3    defaults        1 1
       
       --------------- /etc/fstab ---------------
       
       # mount /dev/hdb1
       

Wie Finde ich das neuste File und zeige dieses oder dessen Inhalt an?

Wenn man vor dem Problem steht ein File in einem Verzeichnis anzeigen zu lassen wobei man wirklich das "neuste" File will so kann man dies folgendermassena auf Kommandozeile bewerkstelligen:

       Print the newest file-name:
       ---------------------------
       
       # find ./ -type f -exec ls -l --time-style=long-iso --time=ctime {}  \; | \
       awk '{ printf("%s %s %s\n", $6, $7, $8) }' | \
       sort | \
       tail -1 | \
       awk '{ print $3 }'
       To cat the newest file:
       -----------------------
       
       # cat `
       find ./ -type f -exec ls -l --time-style=long-iso --time=ctime {}  \; | \
       awk '{ printf("%s %s %s\n", $6, $7, $8) }' | \
       sort | \
       tail -1 | \
       awk '{ print $3 }'`
    

Wie ueberpruefe ich die Limitationen auf dem System?

Um auf einem Linux System die Limitationen zu ueberpruefen betreffed System dh. inkl. CPU und Filesystem (2GB) fuehre folgendes aus:

       # ulimit -a
       
       core file size        (blocks, -c) 0
       data seg size         (kbytes, -d) unlimited
       file size             (blocks, -f) unlimited
       max locked memory     (kbytes, -l) unlimited
       max memory size       (kbytes, -m) unlimited
       open files                    (-n) 1024
       pipe size          (512 bytes, -p) 8
       stack size            (kbytes, -s) 1        0240
       cpu time             (seconds, -t) unlimited        
       max user processes            (-u) 16367        
       virtual memory        (kbytes, -v) unlimited

Je nach situation kann dann mit der entsprechenden Option die Limitation erhoeht oder ausgeschaltet werden zB wuerde man erreichen wollen das "nur" max. 20 Prozesse aktiv sind muesste man folgenden Befehl geben:

       # ulimit -u 40

ACHTUNG
Diese "tunings" und Eingriffe sind sehr gut zu ueberlegen da die Prozesse die ueber das Limit gehen rigoros beendet werden und es zu einem Datenverlust kommen kann!

Wie benutze ich tcpdump und seine Optionen?

Der Befehl "tcpdump" ist maechtig und besitzt "sehr" viele Optionen. Einige die nuetzlich und alltaeglich sind werden hier aufgefuehrt:


Filtere alle Packete von "Source" 192.168.101.11:

       # tcpdump -i eth0 ip src 192.168.101.11

Filtere alle Packete von "Destination" 192.168.101.15:

       # tcpdump -i eth0 ip dst 192.168.100.115

Filtere alle Packete fuer port "http":

       # tcpdump -i eth0 port http

Filtere alle Packete fuer port "443":

       # tcpdump -i eth0 port 443

Filtere alle Packete fuer die "Source" 192.168.101.11 mit port "443":

       # tcpdump -i eth0 ip src 192.168.100.101 port 443

Filtere alle Packete fuer die "Destination" 192.168.101.11 mit port "http":

       # tcpdump -i eth0 ip dst 192.168.100.115 port http

Filtere alle Packete fuer "Source Network" 192.168.3.0 mit Netmaske 255.255.255.0:

       # tcpdump -i eth0 src net 192.168.3.0 mask 255.255.255.0

Filtere alle Packete fuer "Destination Network" 192.168.3.0 mit Netmaske 255.255.255.0:

       # tcpdump -i eth0 dst net 192.168.3.0 mask 255.255.255.0

Filtere alle Packete fuer "Source Network" 192.168.3.0 mit Netmaske 255.255.255.0 und port 443:

       # tcpdump -i eth0 src net 192.168.3.0 mask 255.255.255.0 and port 443

Filtere alle Packete fuer "Destination Network" 192.168.3.0 mit Netmaske 255.255.255.0 und port http:

       # tcpdump -i eth0 dst net 192.168.3.0 mask 255.255.255.0 and port http

Filtere alle Packete fuer einen bestimmten "host" zB 192.168.3.1:

       # tcpdump -i eth0 host 192.168.3.1

Filtere alle Packete fuer einen bestimmten "host" zB 192.168.3.1 sowie schreibe die Information in ein File "-w":

       # tcpdump -i eth0 -w test.cap host 192.168.3.1

Um die Capture Size zu vergrösseren benutze die Option -s sowie um die Information in ein File zu schreiben benütze die Option -w:

       # tcpdump -i eth0 -w test.cap host 192.168.3.1             --> capture size 96byte
       # tcpdump -i eth0 -s 0 -w test.cap host 192.168.3.1        --> capture size 65kb

Eine Kurzreferenz ueber andere Moeglichkeiten finden man unter:

       http://taviso.decsystem.org/files/tcpdump_quickref.pdf

Wie bekomme ich unter Linux Zugriff auf ein NTFS Systeme?

Per Standard ist ein Linux System nicht faehig NTFS Systeme anzusprechen dh. um dies zu erreichen benoetigt das System einen Kernel Driver der dem Kernel die noetigen Informationen mitteilt! Dieser Kernel Treiber ist nicht Bestandteil der Linux Distribution sondern ist ein seperates Projekt das unter folgender URL zu finden ist:

       http://www.linux-ntfs.org/

Ebenfalls sollte man sich die FAQ Seite ansehen die viele nuetzliche Infos enthaelt:

       http://wiki.linux-ntfs.org/doku.php?id=ntfs-de

Auf nachfolgender Seite sind die einzelnen RPM der Distributionen zu finden:

       http://www.linux-ntfs.org/content/view/128/64/

Um das RPM zu installieren benutze folgenden Befehl:

       # rpm -ivh [rpm]

Nach der Installation muss das neue Module geladen werden:

       #  /sbin/modprobe ntfs

Um eine Kontrolle durchzufuehren ob das Module ordnungsgemaess geladen wurde benuetze folgendes Kommando:

       # dmesg | grep NTFS
       
       und/oder
       
       # cat /proc/filesystems

Um eine NTFS Partition zu mounten benuetze:

       # mount /dev/[ntfs device] /mnt/[mountdir] -t ntfs -r

Es stehen verschiedene Optionen zur Verfuegung:

       -t ntfs
       Spezifiert das zu verwendende Dateisystem. Diese Option ist eigentlich nicht
       nötig, da mount intern einen Scan-Modus enthält, der das entsprechende
       Dateisystem automatisch erkennt: 
       
       -r
       Mounted die Partition im Nur-Lese Modus. Normalerweise versucht mount die
       Partition im Schreib-Lese-Zugriff einzuhängen (Was meistens aufgrund von
       möglichen eingedrungenen Hackern etc. nicht empfehlenswert ist) - sofern nicht
       durch diese Option ausgedrücklich gewünscht. 
       
       -o ro
       dasselbe wie Option -r. 
       
       -o umask={WERT}
       Die voreingestellten Zugriffsrechte auf einer NTFS-Partition sind rwx—— (D.h.
       nur Root kann Dateien lesen, schreiben und ausführen - aus Sicherheitsgründen).
       Der umask Parameter kontrolliert nun diese Zugriffsrechte.
       
       -o uid={USERID}
       Normalerweise gehört eine NTFS-Partition und deren Dateien nach dem mounten
       (einhängen) dem Eigner Root. Wenn man nun den uid Parameter angibt, kann man
       den Eigner ändern. Als UserId kann man jeden aus /etc/passwd nehmen, oder
       irgendeine Nummer, die diesen neuen Eigner eindeutig kennzeichnet. 
               
       -o gid={GROUPID}
       Wie zuvor für den Eigner bzw. UserId beschrieben kann man ähnlich dazu auch
       die Gruppe ändern - die ebenfalls auf Gruppe Root voreingestellt ist. 
       
       -o utf8=true
       Sollte Ihr Kernel nicht utf8 unterstützen, können Sie diese Option verwenden,
       damit der Treiber utf8 unterstützt. Sie sollten - wann immer möglich - die
       Option -o iocharset=utf8 verwenden!. 
       
       -o posix={BOOL}
       Windows behält die Groß-/Kleinschreibung von Datei- und Verzeichnisnamen, aber
       es unterscheidet NICHT dazwischen - d.h. MyFileName ist GLEICH zu myfilename.
       Was daraus folgt, wenn Sie den Namen “MyFileName” zum löschen einer Datei
       verwenden, wird myfilename gelöscht (und umgekehrt) 
       
       Linux hingegen UNTERSCHEIDET zwischen Groß- und Kleinschreibung, so das
       myfilename eine andere Datei ist als MyFileName. Soll nun Linux innerhalb des
       Zugriffs auf eine NTFS-Partition sich gleich zu Windows verhalten, so müssen Sie
       die posix auf true (bzw. 1) setzen. 
       
       -o show_sys_files={BOOL}
       Wenn diese Option auf true gesetzt ist, werden die NTFS Dateisystem Metadaten
       sichtbar. Ansonsten muß man sie explizit angeben, um sie zu sehen: ls -l \$MFT
       zum Darstellen der Master File Table 
       

NOTE Aufrgund einer Restriktion der glibc (einer Bibliothek zum Erstellen/Ausfrühren des NTFS-Treibers) wird die $MFT nicht in Listings erscheinen, da ihre Inode-Nummer 0 ist.

Wenn man den NTFS Treiber sowie Partition automatisch mit Linux laden moechte so ist folgender zusaetzlicher Eintrag im Bootloader (grub) noetig:

       # vi /boot/grub/grub.conf
       
       --------------- /boot/grub/grub.conf --------------- 
       
       title Windows
           root (hd0,0)
           makeactive
           chainloader +1
       
       --------------- /boot/grub/grub.conf --------------- 
       

Wie kann ich ein RPM installieren ohne RPM Manager oder RPM Package?

Wenn das RPM package rpm-4.3.1-0.3.i386.rpm auf einer Linux Distribution deinstalliert wurde koennen keine RPM Kommandos mehr abgesetzt werden wie zB. "rpm -ivh [package] das zB fuer die Installation eines RPM Packages zustaendig ist. Um den Package Manager dh. das rpm package wieder zu installieren muss ein Workaround angewandt werden dh. erstelle folgendes Script im "/":

       # vi /rpm2cpio
       
       --------------- /rpm2cpio --------------- 
       
       #!/usr/bin/perl
       
       # Copyright (C) 1997,1998,1999, Roger Espel Llima
       # 
       # Permission is hereby granted, free of charge, to any person obtaining a copy
       # of this software and any associated documentation files (the "Software"), to 
       # deal in the Software without restriction, including without limitation the 
       # rights to use, copy, modify, merge, publish, distribute, sublicense, 
       # and/or sell copies of the Software, and to permit persons to whom the 
       # Software is furnished to do so, subject to the following conditions:
       # 
       # The above copyright notice and this permission notice shall be included in
       # all copies or substantial portions of the Software.
       # 
       # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
       # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
       # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
       # SOFTWARE'S COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
       # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
       # THE SOFTWARE
       
       # (whew, that's done!)
       
       # why does the world need another rpm2cpio?  because the existing one
       # won't build unless you have half a ton of things that aren't really
       # required for it, since it uses the same library used to extract RPM's.
       # in particular, it won't build on the HPsUX box i'm on.
       
       # sw 2002-Mar-6 Don't slurp the whole file
       
       # add a path if desired
       $gzip = "gzip";
       
       sub printhelp {
         print <<HERE;
       rpm2cpio, perl version by orabidoo <odar\@pobox.com> +sw
       dumps the contents to stdout as a cpio archive
       
       use: rpm2cpio [file.rpm] > file.cpio
       
       Here's how to use cpio:
            list of contents:   cpio -t -i < /file/name
               extract files:   cpio -d -i < /file/name
       HERE
       
         exit 0;
       }
       
       if ($#ARGV == -1) {
         printhelp if -t STDIN;
         $f = "STDIN";
       } elsif ($#ARGV == 0) {
         open(F, "< $ARGV[0]") or die "Can't read file $ARGV[0]\n";
         $f = 'F';
       } else {
         printhelp;
       }
       
       printhelp if -t STDOUT;
       
       # gobble the file up
       ##undef $/;
       ##$|=1;
       ##$rpm = <$f>;
       ##close ($f);
       
       read $f,$rpm,96;
       
       ($magic, $major, $minor, $crap) = unpack("NCC C90", $rpm);
       
       die "Not an RPM\n" if $magic != 0xedabeedb;
       die "Not a version 3 or 4 RPM\n" if $major != 3 && $major != 4;
       
       ##$rpm = substr($rpm, 96);
       
       while (!eof($f)) {
         $pos = tell($f);
         read $f,$rpm,16;
         $smagic = unpack("n", $rpm);
         last if $smagic eq 0x1f8b;
         # Turns out that every header except the start of the gzip one is
         # padded to an 8 bytes boundary.
         if ($pos & 0x7) {
           $pos += 7;
           $pos &= ~0x7;        # Round to 8 byte boundary
           seek $f, $pos, 0;
           read $f,$rpm,16;
         }
         ($magic, $crap, $sections, $bytes) = unpack("N4", $rpm);
         die "Error: header not recognized\n" if $magic != 0x8eade801;
         $pos += 16;                # for header
         $pos += 16 * $sections;
         $pos += $bytes;
         seek $f, $pos, 0;
       }
       
       if (eof($f)) {
         die "bogus RPM\n";
       }
       
       open(ZCAT, "|gzip -cd") || die "can't pipe to gzip\n";
       print STDERR "CPIO archive found!\n";
       
       print ZCAT $rpm;
       
       while (read($f, ($_=), 16384) > 0) {
         print ZCAT;
       }
       
       close ZCAT;
       
       --------------- /rpm2cpio --------------- 
       
       # chmod 700 /rpm2cpio

Das Script bewirkt das ein orginales RPM package manuell entpackt werden kann und anhand der Angaben im RPM Packages installiert wird! Um dies auszufuehren gebe folgendes ein:

       # ./rpm2cpio rpm-4.3.1-0.3.i386.rpm | cpio -dimv

Nach der Installation durch rpm2cpio steht der Package Manager rpm wieder zur Verfuegung und es wird empfohlen das orginale rpm Package nochmals im normalen Modus zu installieren dh:

       # rpm -ivh rpm-4.3.1-0.3.i386.rpm
       

Ich moechte anhand Rsynch eine Disk/Filesystem lokal kopieren?

Rsynch kann auf verschiedene Arten und Weisen genutzt werden dh. ueber SSH Remote etc. Wenn rsynch eingesetzt wird lokal um von Disk zu Disk zu kopieren dann benuetze:

       # rsynch -av [source dir]/* [destination dir]/ 

Durch diesen Befehl werden alle Files auf die Disk kopiert. Loescht man ein File im "source dir" und nachtraeglich wird wieder ein rsynch ausgefuehrt wird dieses auch im "destination dir" geloescht.

      Die Option -av bedeutet:
      
       -v         Verbose
       -a         Beinhaltet folgende Optionen "rlptgoD"

Um ein Backup durchzufuehren kann auch die Option "-b" (Backup) benuetzt werden.

Fehlermeldung: EXT3-fs error (device): ext3_journal_start_sb?

Wenn eine Festplatte das Journal verliert oder dieses Korrupt wird kommt es zu folgender Fehlermeldung:

       Sep  5 07:08:29 kolab2 kernel: EXT3-fs error (device md0): ext3_free_blocks_sb: bit already cleared for block 8192
       Sep  5 07:08:29 kolab2 kernel: Aborting journal on device md0.
       Sep  5 07:08:29 kolab2 kernel: EXT3-fs error (device md0) in ext3_reserve_inode_write: Journal has aborted
       Sep  5 07:08:29 kolab2 kernel: EXT3-fs error (device md0) in ext3_truncate: Journal has aborted
       Sep  5 07:08:29 kolab2 kernel: EXT3-fs error (device md0) in ext3_reserve_inode_write: Journal has aborted
       Sep  5 07:08:30 kolab2 kernel: EXT3-fs error (device md0) in ext3_orphan_del: Journal has aborted
       Sep  5 07:08:30 kolab2 kernel: EXT3-fs error (device md0) in ext3_reserve_inode_write: Journal has aborted
       Sep  5 07:08:30 kolab2 kernel: EXT3-fs error (device md0) in ext3_delete_inode: Journal has aborted
       Sep  5 07:08:30 kolab2 kernel: __journal_remove_journal_head: freeing b_committed_data
       Sep  5 07:08:30 kolab2 kernel: ext3_abort called.
       Sep  5 07:08:30 kolab2 kernel: EXT3-fs error (device md0): ext3_journal_start_sb: Detected aborted journal
       Sep  5 07:08:30 kolab2 kernel: Remounting filesystem read-only

Dies bedeutet das die Partition auf "read-only" gesetzt wird um weiteren Schaden zu verhindern! Um das Journal zu korrigieren oder zu loeschen muss dieses im ersten Schritt geloescht werden. Um dies durchzufuehren muss die Partition abgehaengt werden (umount). Dies kann unter Umstaenden nur ueber eine Serielle Verbindung durchgefuehrt werden.

       # debugfs -w -R "feature ^has_journal,^needs_recovery" /dev/md0
       # e2fsck /dev/md0
       e2fsck 1.38 (30-Jun-2005)
       Superblock doesn't have has_journal flag, but has ext3 journal inode.
       Clear<y>? yes
       /dev/md0 contains a file system with errors, check forced.
       Pass 1: Checking inodes, blocks, and sizes
       Pass 2: Checking directory structure
       Pass 3: Checking directory connectivity
       Pass 4: Checking reference counts
       Pass 5: Checking group summary information
       Block bitmap differences: -(1557--8191)
       
       # tune2fs -j /dev/md2

NOTE
Wenn der Befehl in diesem Sinne abgesetzt wird und bei der Frage im Context kein Zeitraum angegeben wird stellt die Anzahl "0" der maximalen Mountvorgaenge zwischen zwei Dateisystemchecks keine Ueberpruefung dar dh. e2fsck(8) und der Kernel ignorieren die Anzahl der Mountvorgaenge.

Wie kann ich Yum-Priority sowie FreshRPM installieren und nutzen?

       Linux:Yum-Priority-FreshRPM

Wie konfiguriere ich eine NTP Client Funktion?

Um einen Linux Server betreffend Zeit auf den neusten Stand zu halten benutzt man die NTP Client Funktion dh. der Linux Server aktuallisiert seine Zeit anhand eines NTP Servers. Dazu bötigt man die Binaries des NTP Packetes dh. konkret "ntpdate". Um das Packet zu installieren benütze folgnden Befehl:

       # yum install ntp

Danach wird das betreffende und benütze Repository abgefragt und das entsprechende NTP Package zum Download zur Verfügung gestellt. Wenn das Package installiert ist kann im "cron" Job folgendes konfiguriert werden:

       # crontab -e
       
       --------------- crontab -e ---------------
       
       0 0,6,12,18 * * * /usr/sbin/ntpdate ch.pool.ntp.org
       
       --------------- crontab -e ---------------

Danach sollte der "cron" Job aktualisiert werden:

       # /etc/init.d/crond restart

Das Kommando kann auch auf der Kommandozeile ausgeführt werden. Wenn die Zeit anhand des Befehls im "cron" Job aktualisiet wird wird im "/var/log/messages" ein entsprechender Log Eintrag generiert.

Wie benutze ich "nmap" auf Linux?

Wenn das "nmap" Package installiert ist (yum install nmap) kann "nmap" folgendermassen benutzt werden:

       Full Scan
       
       # nmap -sSUV -O -P0 -T5 -p1-65535 192.168.100.0/24
       Full TCP Scan
       
       # nmap -sSV -O -P0 -T5 -p1-65535 192.168.100.0/24
       Full UDP Scan
       
       # nmap -sUV -O -P0 -T5 -p1-65535 192.168.100.0/24
       Range of IP
       
       # nmap 192.168.100.1-10
       Range of ports
       
       # nmap -p 1-1024 192.168.100.1
       Service Version Detection
       
       # nmap -sV 192.168.100.1
       OS Version Detection
       
       # nmap -A 192.168.100.1
       External Script Checks
       
       # nmap -sC 192.168.100.1
       Scan without ping check (sometimes ping is blocked but you still want to scan)
       
       # nmap -PN 192.168.100.1
       Scan only scanning known ports (fast scan)
       
       # nmap -F 192.168.100.1
       Reverse Lookup Scan
       
       # nmap -sL -P0 192.168.100.0/24

Wie kann ich basierend auf einem Cron Job und eine Shell Script zeitlich Terminierte Nachrichten versenden?

Wenn man zB unter Linux einen Notification alle 45 Tage versenden möchte kann dies anhand eines Cron Jobs und einem Linxu Script bewerkstelligt werden. Als Erstes erstellen wir das nötige Shell Script.

       # mkdir /opt/scripts
       # chmod 700 /opt/scripts
       # chown root:root /opt/scripts
       # vi /opt/scripts/45dayjob-cron.sh
       
       NOTE In diesem Beispile wird ein File als Counter angelegt "/opt/scripts/45dayjob-counter". Dieser
            Counter zählt jeden Tag +1 bis der Wert erreicht ist. Danach wird das Mail ausgelöst. Ist
            Der Counter erreicht wird er mit "echo +1 überschrieben und beginnt von Neuem. Der Text der
            im Mail erscheint wird im File "/opt/scripts/45dayjob-mail.txt" abgelegt.
       
       --------------- /opt/scripts/45dayjob-cron.sh --------------- 
       
       #!/bin/sh
       
       OLDCOUNT=`cat /opt/scripts/45dayjob-counter`
       
       if [ -z $OLDCOUNT ]
       
       then
               OLDCOUNT=1
       fi
       
       MODULO=$[OLDCOUNT%43]
       
       if [ $MODULO -gt '0' ]
       
               then
                       echo $[OLDCOUNT+1] > /opt/scripts/45dayjob-counter
               else
                       echo 1 > /opt/scripts/45dayjob-counter
       
                       cat /opt/scripts/45dayjob-mail.txt | nail -s "[Place your Mail Subject here]" -r [Mailaddress from] [Mailaddress to]
       
       fi
       
       --------------- /opt/scripts/45dayjob-cron.sh --------------- 
       # vi /opt/scripts/45dayjob-mail.txt
       
       --------------- //opt/scripts/45dayjob-mail.txt --------------- 
       
       Dear Sir
       
       The counter reached 45 Days!
       
       Your Crontab
       
       --------------- /opt/scripts/45dayjob-mail.txt --------------- 

Nun fehlt nur noch einen Cron-Job der das Ganze Täglich kontrolliert dh.:

       # crontab -e
       
       --------------- crontab -e --------------- 
       
       0 8 * * * /opt/scripts/45dayjob-cron.sh
       
       --------------- crontab -e ---------------

Wie kann ich ein Linux System betreffend RAM Benützung überprüfen?

Wenn man rausfinden will wie die RAM Benützung inkl. SWAP etc. auf einem Linux System ist können vers. Befehle und Files auskunft geben zB:

       Nachfolgender Befehl listet alle Prozesse auf nach Ihrer RAM Benützung:
       
       # ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
       Nachfolgender Befehl zeigt die RAM Benutztung sowie SWAP Benützung im Gesamten sowie die CPU Auslastung pro Prozess:
       
       # top
       # vmstat 3
       Die Memory Benützung wird ebenfalls im folgenden File aufgelistet:
       
       # cat /proc/meminfo

Was sind die minimalen Services die ich unter CentOS benötige?

Unter folgenden Link findet man eine Liste mit Kurzbeschreiben welcher Services für WAS benötigt wird:

       http://magazine.redhat.com/2007/03/09/understanding-your-red-hat-enterprise-linux-daemons/
       
       oder
       
       http://www.hscripts.com/tutorials/linux-services/index.php

Ueberprüfe als Erstes welche Services momentan aktiv sind:

       # chkconfig --list |grep "3:on" |awk '{print $1}' |sort

Speicher diese Informationen in einem File "before"

       # chkconfig --list |grep "3:on" |awk '{print $1}' |sort > before

Folgende Services können unter normalen Umständen deaktiviert werden:

       # chkconfig anacron off
       # chkconfig apmd off
       # chkconfig atd off
       # chkconfig autofs off
       # chkconfig cpuspeed off
       # chkconfig cups off
       # chkconfig cups-config-daemon off
       # chkconfig gpm off
       # chkconfig isdn off
       # chkconfig netfs off
       # chkconfig nfslock off
       # chkconfig openibd off
       # chkconfig pcmcia off
       # chkconfig portmap off
       # chkconfig rawdevices off
       # chkconfig readahead_early off
       # chkconfig rpcgssd off
       # chkconfig rpcidmapd off
       # chkconfig smartd off
       # chkconfig xfs off
       # chkconfig ip6tables off
       # chkconfig iptables off
       # chkconfig avahi-daemon off
       # chkconfig firstboot off
       # chkconfig yum-updatesd off 
       # chkconfig sendmail off
       # chkconfig mcstrans off
       # chkconfig pcscd off
       # chkconfig bluetooth off
       # chkconfig hidd off
       # chkconfig restorecond off
       
       NOTE "anacron" und "kudzu" werden nur beim Start ausgeführt und sobald diese 
             Ihre Aufgaben nach dem Start durchgeführt haben werden die Services beendet!

Folgende Services sollten "nur" dann deaktiviert werden, wenn sichergestellt ist das diese nicht benutzt werden:

       # chkconfig xinetd 
       
       NOTE Wird für einige Server benötigt!
       # chkconfig acpid
       
       NOTE Wird benötigt für den "power button" um den Server/Maschine ordnungsgemäss runterzufahren! 
       # chkconfig microcode_ctl 
       
       NOTE Wird nicht benötigt auf einer AMS basierenden Server/Maschine!
       # chkconfig irqbalance 
       
       NOTE Wir nicht benötigt sofern SMP, Mutiple Cores, Multiple Processors oder Hyperthreading nicht benutzt wird!
       # chkconfig haldaemon
       # chkconfig messagebus 
       
       NOTE Wird benötigt für Plug + Play Geräte/Devices!
       # chkconfig mdmonitor 
       
       NOTE Wird nicht benötigt sofern kein Software Raid benutzt wird!

Nachdem die Services deaktiviert wurden kann der Status wiederum in ein File geschrieben werden "after":

       # chkconfig --list |grep "3:on" |awk '{print $1}' |sort > after 

Mit folgenden Befehl sieht man nun den Unterschied von "before" und "after":$

       # diff before after

Führe nachder Modifikationen der Services einen Neustart aus:

       # reboot

Wie konfiguriere ich "Source Policy Based Routing"?

Wenn man auf einem Server mehrere Interfaces hat stellt sich die Problematik, dass zwar die Anfragen ueber das entsprechende Interface reinkommt zB eth1 jedoch die Antwort über das Interface rausgeht über dieses der Default Gateway gesetzt ist dh. eth0. Speziell wenn eth0 und eth1 im gleichen Subnet sind. Um wirklich das System zu zwingen Anfragen uber eth1 und/oder eth0 auch über das jeweilige Interface zu beantworten muss "Source Policy Based Routing" implementiert werden (iproute). In unserem Beispiel gehen wir davon aus, dass folgende Konstellation existiert:

       eth0 = 192.168.100.125 Subnet 255.255.255.0
       eth1 = 192.168.100.123 Subnet 255.255.255.0
       Default Gateway 192.168.100.120

Als Erstes erstelle die entsprechende Rule im File "rt_tables" und zwar fuer jedes Interface seperate:

       # vi /etc/iproute2/rt_tables
       
       --------------- /etc/iproute2/rt_tables ---------------
        
       #
       # reserved values
       #
       255     local
       254     main
       253     default
       0       unspec
       #
       # local
       #
       200     rule-eth1
       201     rule-eth0
       
       --------------- /etc/iproute2/rt_tables ---------------

Danach definiere die Rule's:

       # /etc/sysconfig/network-scripts/rule-eth0
       
       --------------- /etc/sysconfig/network-scripts/rule-eth0 ---------------
       
       from 192.168.100.125/32 table rule-eth0
       
       --------------- /etc/sysconfig/network-scripts/rule-eth0 ---------------
       # /etc/sysconfig/network-scripts/rule-eth1
       
       --------------- /etc/sysconfig/network-scripts/rule-eth1 ---------------
       
       from 192.168.100.123/32  table rule-eth1
       
       --------------- /etc/sysconfig/network-scripts/rule-eth1 ---------------

Nun die Rule's wurden definiert nun definiere die Routing Policy fuer die jeweilige Rule:

       # vi /etc/sysconfig/network-scripts/route-eth0
       
       --------------- /etc/sysconfig/network-scripts/route-eth0 ---------------
       
       default table rule-eth0 via 192.168.100.120 dev eth0
       
       --------------- /etc/sysconfig/network-scripts/route-eth0 ---------------
       # vi /etc/sysconfig/network-scripts/route-eth1
       
       --------------- /etc/sysconfig/network-scripts/route-eth1 ---------------
       
       default table rule-eth1 via 192.168.100.120 dev eth1
       
       --------------- /etc/sysconfig/network-scripts/route-eth1 ---------------

Nun muss das Ganze aktualisiert werden indem der Service "network" neu gestartet wird:

       # service network restart

Nachträglich kann das "Source Policy Based Routing" mit folgendem Befehl kontrolliert werden:

       # ip route show

Nun kann zB anhand SCP ein Test durchgeführt werden um so zu kontrolliere ob wirklich für einen Transfer auf eth1 auch eth1 benutzt wird sowie für eth0.

Wie konfiguriere ich ein Linux Backup anhand "rsync"?

Wenn man von einem Linux Server aus von anderen Linux Server ein Backup ziehen möchte, so kann dies anhand "rsync" geschehen. Dies bedeutet eigentlich nimmt man folgende Komponenten zur Hilfe:

       rsync
       rsnapshot
       ssh

Dabei wird über einem SSH Tunnel rsync ausgeführt und lokal für die sogenannte "Rotation" rsnapshot benutzt. Um dies einzurichten installiere auf dem Linux Backup Server die oben angegebenen Komponenten anhand:

       yum install rsync
       yum install rsnapshot

Nun führe folgendes durch:

       # mkdir /backup
       # mkdir /backup-data
       
       # mkdir /backup/bin
       # mkdir /backup/etc
       # mkdir /backup/log
       # mkdir /backup/run
       
       # chmod -R 755 /backup
       # chmod 755 /backup-data
       # vi /backup/bin/rsnapshot.host
       
       --------------- /backup/bin/rsnapshot.host ---------------
       
       #!/bin/sh
        
       ##############################################################################
       #
       # rsnapshot.host
       # version 0.3
       # 2009-05-26
       #
       # This script checks whether the host is online or not before it performs an
       # rsnapshot backup.
       #
       # The once option performs monthly, weekly, and daily rsnapshot runs, but
       # only if it hasn't already done a monthly run this month, a weekly run this
       # week, or a daily run today.
       #
       # Copyright (c) 2009  Michael Nordstrom
       #
       # This program is free software; you can redistribute it and/or
       # modify it under the terms of the GNU General Public License
       # as published by the Free Software Foundation; either version 2
       # of the License, or (at your option) any later version.
       #
       # This program is distributed in the hope that it will be useful,
       # but WITHOUT ANY WARRANTY; without even the implied warranty of
       # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       # GNU General Public License for more details.
       #
       # You should have received a copy of the GNU General Public License
       # along with this program; if not, write to the Free Software
       # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
       #
       ##############################################################################
        
       if [ $# -ne 2 ] && [ $# -ne 3 ]; then
         echo "usage: $(basename $0) <host> {hourly|daily|weekly|monthly|once|du [dir]}"
         exit
       fi
        
       HOST=$1
       OPTION=$2
        
       ########################## USER DEFINES #########################
       # Location of rsnapshot application
       RSNAPSHOT="/usr/bin/rsnapshot"
        
       # Location of configuration file
       RSNAPSHOT_CONF_FILE="/backup/etc/rsnapshot.conf.$HOST"
        
       # Path to lock-files used by the once option
       LOCKFILE_PATH="/backup/run"
        
       # Location of rsnapshot's lock-file
       RSNAPSHOT_LOCKFILE="$LOCKFILE_PATH/rsnapshot.pid.$HOST"
       #################################################################
        
       # Set global variable used to initialize configuration file for given host
       export HOST
        
       # Check that rsnapshot isn't already running
       if [ -f $RSNAPSHOT_LOCKFILE ]; then
          echo "rsnapshot is already running."
          exit
       fi
        
       # It should be possible to check the size of the backup even if the given
       # host is down.
       if [ $OPTION = "du" ]; then
         # Check specified directory or all
         if [ $# -eq 3 ]; then
           DIR=$3
           $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE du $DIR
         else
           $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE du
         fi
         exit
       fi
        
       # Check if host is up and running; ping will return 1 if host is online,
       #                                                   0 if down
       online=$(ping -c 1 $HOST | grep -c 'time=')
       if [ $online -eq 0 ]; then
          echo "$HOST is down."
          exit
       fi
        
       # run rsnapshot
       case $OPTION in
         hourly)
           $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE hourly
           ;;
         daily)
           $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE daily
           ;;
         weekly)
           $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE weekly
           ;;
         monthly)
           $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE monthly
           ;;
         once)
           # Location of daily, weekly, and monthly lock-files
           DAILY_LOCKFILE="$LOCKFILE_PATH/rsnapshot.daily.$HOST"
           WEEKLY_LOCKFILE="$LOCKFILE_PATH/rsnapshot.weekly.$HOST"
           MONTHLY_LOCKFILE="$LOCKFILE_PATH/rsnapshot.monthly.$HOST"
        
           # Monthly backup
           if [ ! -f $MONTHLY_LOCKFILE ]; then
             $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE monthly
             touch $MONTHLY_LOCKFILE
           fi
        
           # Weekly backup
           if [ ! -f $WEEKLY_LOCKFILE ]; then
             $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE weekly
             touch $WEEKLY_LOCKFILE
           fi
        
           # Daily backup
           if [ ! -f $DAILY_LOCKFILE ]; then
             $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE daily
             touch $DAILY_LOCKFILE
           fi
           ;;
       esac
       
       --------------- /backup/bin/rsnapshot.host ---------------
       
       # chmod 775 /backup/bin/rsnapshot.host 
       

Diese Datei "rsnapshot.host" steuer die generelle Ausführung der Backup Host Dateien die nun erstellt werden. Dies bedeutet für jeden Host der ins Backup einbezogen wird muss ein File erstellt werden. Dieses File wird dann über die vorgängig erstelltes Script "rsnapshot.host" ausgeführt:

       # vi /backup/etc/rsnapshot.conf.example
       
       ACHTUNG Jeder Abstand in diesem File MUSS zwingend mit einem TABULATOR erstellt werden!
       
       --------------- /backup/etc/rsnapshot.conf.example ---------------
               
       config_version  1.2
       
       snapshot_root   /backup-data/dev
       
       cmd_cp          /bin/cp
       cmd_rm          /bin/rm
       cmd_rsync       /usr/bin/rsync
       cmd_ssh         /usr/bin/ssh
       cmd_du          /usr/bin/du
       
       ssh_args        -l 18000 -o BatchMode=yes -F /root/.ssh/config
       
       link_dest       1
       verbose         2
       loglevel        2
       logfile         /backup/log/rsnapshot.dev
       lockfile        /backup/run/rsnapshot.pid.dev
       exclude_file    /backup/etc/exclude.dev
       
       #retain hourly  4
       retain  daily   14
       retain  weekly  4
       retain  monthly 2
       
       backup  root@dev:/opt/                 dev/
       backup  root@dev:/root/                dev/
       backup  root@dev:/export/              dev/
       backup  root@dev:/etc/                 dev/
       backup  root@dev:/var/spool/cron/      dev/
       backup  root@dev:/var/log/             dev/
       
       --------------- /backup/etc/rsnapshot.conf.example ---------------
       
       NOTE Die Option "ssh_args 18000" bestimmt die verwendete Bandbreite innerhalb des SSH Tunnels dh. 18000
            entspricht ungfähr 54 Mbit. Dies gewährleistet, dass nicht die ganze Bandbreite für das Backup belegt wird!
       
       # chmod 644 /backup/etc/rsnapshot.conf.example 

Das erstellte File wird -wie schon erwähnt- über das Script "rsnapshot.host" aufgerufen und ist die Steuerdatei des Hosts oder auch einfach die Konfig Datei. Dies bedeutet dort wird definiert WAS ins Backup einbezogen werden soll, Wie die Rotation ausgeführt werden soll, Wo geloggt werden soll etc. Um nun einzelne Files oder Verzeichnisse aus dem Backup auszuschliessen erstelle folgende Datei mit dem gewünschten Inhalt:

       # vi /backup/etc/exclude.dev
       
       --------------- /backup/etc/exclude.dev ---------------
       
       /opt/scripts/*
       /root/.ssh
               
       --------------- /backup/etc/exclude.dev ---------------
       
       # chmod 644 /backup/etc/rsnapshot.conf.example 

Wie schon erwähnt ist das File "rsnapshot.host" ein Script, dass die Konfig Dateien aufruft und das durchführt was definiert wurde. Um dieses Script automatisiert aufzurufen erstelle einen Cron Job:

       # crontab -e
       
       --------------- crontab -e ---------------
       
       # Rotate data from backup
       0 0 * * *   rm -f /backup/run/rsnapshot.daily.* > /dev/null 2>&1
       0 0 * * mon rm -f /backup/run/rsnapshot.weekly.* > /dev/null 2>&1
       0 0 1 * *   rm -f /backup/run/rsnapshot.monthly.* > /dev/null 2>&1
       #
       # Backup data from hosts with rsnapshot
       0 1 * * * /backup/bin/rsnapshot.host dev once > /dev/null 2>&1
       
       --------------- crontab -e ---------------

Nach jedem Job wird im "/backup/run" Verzeichnis ein File angelegt. Dieses gilt als sogenanntes "lock" File dh. wenn dieses File existiert wird KEIN Backup Job ausgeführt. Aus diesem Grund läuft in den entsprechenden Abständen dh. daily, weekly, monthly ein Cron Job der diese Files entfernt um die Freigabe zu erteilen, dass daily, weekly oder monthly Backup durchzuführen.

Nun muss nur noch auf den Linux Server auf denen ein Backup durchgeführt wird eine "Public Key" Authentication etabliert werden damit über den SSH Tunnel das Backup durchgeführt werden kann:

        --> Auf dem Backup Server durchzuführen:
        
        # vi /root/.ssh/config
        
        --------------- /root/.ssh/config ---------------
        
        Host *
          UserKnownHostsFile /root/.ssh/known_hosts
          IdentityFile       /root/.ssh/id_rsa
        
        --------------- /root/.ssh/config ---------------
        
        # chmod 644 /root/.ssh/config
        
        # cd /root
        # mkdir /root/.ssh
        # chmod 700 /root/.ssh
        # chown root:root /root/.ssh
        # ssh-keygen -t rsa -f /root/.ssh/id_rsa
        Generating public/private rsa key pair.
        Enter passphrase (empty for no passphrase): 
        Enter same passphrase again: 
        Your identification has been saved in /root/.ssh/id_rsa.
        Your public key has been saved in /root/.ssh/id_rsa.pub.
        The key fingerprint is:
        f8:8f:c9:ef:42:17:8d:6d:5b:5a:95:24:47:03:55:49 root@[FQDN des Primary Servers]
        
        NOTE Gebe keine "passphrase" dh. gehe einfach mit Enter weiter! 
        
        # chmod 600 /root/.ssh/id_rsa
        --> Auf dem Linux Server durchzuführen:
        
        # cd /root
        # mkdir /root/.ssh
        # chmod 700 /root/.ssh
        # chown root:root /root/.ssh
        
        Kontrolliere das folgende Konfiguration besteht:
        
        # vi /etc/ssh/sshd_config
        
        --------------- /etc/ssh/sshd_config --------------- 
        
        # Are root logins permitted using sshd.
        # Note that sshd uses pam_authenticate(3PAM) so the root (or any other) user
        # maybe denied access by a PAM module regardless of this setting.
        # Valid options are yes, without-password, no.
        PermitRootLogin without-password
        
        # Only specific User or Host is allowed
        AllowUsers root@[FQDN des Replica Servers] emcsrv
        
        # PubkeyAuthentication is available
        PubkeyAuthentication yes
                
        --------------- /etc/ssh/sshd_config ---------------
        
        # service sshd restart
        --> Auf dem Backup Server durchzuführen:
        
        Kopiere nun den Public Key vom Backup Server über "scp" auf den Linux Server:
        
        # ssh-copy-id -i /root/.ssh/id_rsa.pub root@[FQDN des Servers]
        --> Auf dem Linux Server durchzuführen:
        
        Kontrolliere ob der Public Key korrekt kopiert wurde und vergebe die korrekten Rechte:
        
        # chmod 600 /.ssh/authorized_keys
        --> Auf dem Backup Server durchzuführen:
        
        Teste nun ob die Etablierung der Public Key Authentication erfolgreich war:
        # ssh root@[FQDN des Servers]

Was kann ich tun wenn "yum update" nicht mehr funktioniert (Segmentation fault)?

Nun wenn "yum update" ausgeführt ist kann es aus verschiedenen Gründen zu Fehlermeldungen kommen wie:

       Segmentation fault
       Transaction Error

Nun um den Prozess von Grund auf neu zu Starten (Caching) kann folgendes ausgeführt werden:

        # yum clean all

Dieses Kommando kann helfen muss aber nicht. Wenn Script Fehlermeldungen kommen oder sonstige Fehlermeldungen ist es ratsam die gesamte Datenbank von "yum" zu löschen. Diese Files der Datenbank befinden sich im Verzeichnis "/var/lib/rpm". Um die Informationen von "yum" Vollständig zu löschen führen folgendes aus:

        # cd /var/lib/rpm
        # rm -f __db*

Nun sind die Informationen entfernt sowie die Datenbank. Um diese jedoch neu zu indizieren führe folgendes aus:

        # rpm -qa -vv

Nachdem der Prozess durchgelaufen ist führe erneut zur Kontrolle folgendes aus:

        # yum clean all

Nun sollte der Befehl sauber durchlaufen. Ist dies der Fall kann "yum update" wie gewohnt ausgeführt werden.

Auf meiner CentOS Installation existieren die Files /dev/urandom /dev/ptmx /dev/null sowie /dev/random nicht?

Es kann vorkommen das die genannten Files auf einer CentOS Installation nicht existieren. Wenn dem so ist können diese anhand des "mknod" Befehls angelegt werden:

       # mknod /dev/random c 1 9 
       # mknod /dev/urandom c 1 9 
       # mknod /dev/ptmx c 5 2 
       
       # mknod /dev/null c 1 3
       # chmod +666 /dev/null