Unsorted Linux-Tipps

Hier findet man einige Sachen, die ich mir einfach nicht merken kann (hattu Kopf wie Sieb, muttu notieren), oder die ich zu selten gebrauche, um sie mir zu merken :-)
Da ich mir leider wesentlich weniger merken kann, als hier zu finden ist, werde ich diese Seite immer dann erweitern, wenn mir etwas eingefallen ist, das mir vorher entfallen war.


Einige Websites nicht aufrufbar (Connection refused, no response):

Ab 2.4 Kernel ist ECN (Explicid Congestion Notification, RFC2481) standardmässig eingeschaltet. Fehlkonfigurierte Sites bzw. Router/Firewalls, die alle ICMP-Pakete filtern, sind so nicht erreichbar. Umgehen kann man das Problem indem man ECN ausschaltet:

echo 0 > /proc/sys/net/ipv4/tcp_ecn

bzw.

sysctl -w net.ipv4.conf.default.tcp_ecn=0

Man kann das ganze auch dauerhaft in /etc/sysctl.conf eintragen. Der richtige Weg wäre aber eigentlich, den Administrator der betroffenen Site das Problem an der Wurzel lösen zu lassen.


Sämtliche Syslog-Ausgaben auf einem ungenutzten tty ausgeben:

Das ist eine sehr praktische Sache - einfach mit strg+alt+F12 unschalten, und man ist im Bilde.

in /etc/syslog.conf folgendes anhängen:

*.* /dev/tty12


GPG-Keys signieren:

Wenn man so einen Schnippsel von jemanden in die Hand gedrückt bekommt, sollte man zunächst die Identität desjenigen anhand eines Lichtbildausweises feststellen. Wenn Ähnlichkeit zwischen Foto und Person besteht, geht's ans signieren.

Key importieren:

gpg --recv-key

Fingerprint prüfen:

gpg --fingerprint

Key signieren:

gpg --edit-key

mit Befehl "sign" signieren, mit Befehl "trust" den Ownertrust ändern.

Signierten Key wieder exportieren:

gpg --send-key


Ein paar Worte zu DNS+dig:

Um rauszukriegen, welche DNS-Server authorisiert sind:

[andre@Gandalf ~ ] > dig -t ns vobis.net

; <<>> DiG 9.1.3 <<>> -t ns vobis.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51942
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;vobis.net.                     IN      NS

;; ANSWER SECTION:
vobis.net.              29695   IN      NS      NS.MGI.DE.
vobis.net.              29695   IN      NS      NS.VOBIS.DE.
vobis.net.              29695   IN      NS      XLINK1.XLINK.net.
vobis.net.              29695   IN      NS      NS.MGI.DE.
vobis.net.              29695   IN      NS      NS.VOBIS.DE.
vobis.net.              29695   IN      NS      XLINK1.XLINK.net.

;; Query time: 37 msec
;; SERVER: 193.189.244.197#53(193.189.244.197)
;; WHEN: Fri Feb 22 14:12:26 2002
;; MSG SIZE  rcvd: 142

Prüfen ob ein SOA-Record vorhanden ist:

[andre@Gandalf ~ ] > dig -t SOA vobis.net @NS.MGI.DE

; <<>> DiG 9.1.3 <<>> -t SOA vobis.net @NS.MGI.DE
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 51080
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;vobis.net.                     IN      SOA

;; Query time: 53 msec
;; SERVER: 194.123.45.97#53(NS.MGI.DE)
;; WHEN: Fri Feb 22 14:13:27 2002
;; MSG SIZE  rcvd: 27


Diverse Wege eine CD als ISO-Image auf die Platte zu bekommen:

cp /dev/hda image.iso

cat /dev/hda > image.iso

dd if=/dev/scd0 of=/home/username/isoimage.iso


Ein ISO-Image mounten:

mount -o loop image.iso /mnt/test


ARP Einträge auf CISCO-Router faken:

conf t

arp 195.71.236.4 0000.dead.beef arpa

eintippen. Die Änderung wird sofort wirksam.

Zum Rückgängig machen:

conf t

no arp 195.71.236.4


Prüfen, ob ein Nameserver tut:

Erstmal gucken, ob überhaupt ein named laeuft:

ps -ef | grep named

Sollte in etwa sowas zeigen:

root       139     1  0 Jan15 ?        00:17:12 /usr/sbin/named


D.h. zumindest gibt es einen Prozess namens named.

Ob der auch arbeitet, kann man via:

ndc status

oder

ndc querylog 


ueberpruefen - Nach dem Starten des Loggens mit
ndc querylog
sollte im /var/log/daemon.log etwa folgendes zu sehen sein:

mgr1:~# tail -f /var/log/daemon.log 
Jan 22 13:10:34 mgr1 named[139]: ns_forw: query(110.81.238.157.in-addr.arpa) All possible A RR's lame
Jan 22 13:11:09 mgr1 named[139]: query log on 
Jan 22 13:11:09 mgr1 named[139]: XX+/217.49.203.141/stations-de.real.com/A/IN
Jan 22 13:11:10 mgr1 named[139]: XX+/127.0.0.1/140.210.71.195.in-addr.arpa/PTR/IN
Jan 22 13:11:10 mgr1 named[139]: XX+/127.0.0.1/144.210.71.195.in-addr.arpa/PTR/I
Jan 22 13:11:15 mgr1 named[139]: XX+/127.0.0.1/hub62.wpr2.mediaways.net/A/IN
Jan 22 13:11:16 mgr1 named[139]: XX+/127.0.0.1/144.210.71.195.in-addr.arpa/PTR/IN
Jan 22 13:11:16 mgr1 named[139]: XX+/127.0.0.1/143.210.71.195.in-addr.arpa/PTR/IN
Jan 22 13:11:16 mgr1 named[139]: XX+/127.0.0.1/hub7.wpr2/A/IN
Jan 22 13:11:16 mgr1 named[139]: XX+/127.0.0.1/hub7.wpr2.mediaways.net/A/IN
Jan 22 13:11:17 mgr1 named[139]: XX+/127.0.0.1/140.210.71.195.in-addr.arpa/PTR/IN
Jan 22 13:11:17 mgr1 named[139]: XX+/127.0.0.1/146.210.71.195.in-addr.arpa/PTR/IN
Jan 22 13:11:17 mgr1 named[139]: XX+/217.49.237.204/www.yahoo.com/A/IN
Jan 22 13:11:17 mgr1 named[139]: XX+/127.0.0.1/hub5.wpr2/A/IN
Jan 22 13:11:17 mgr1 named[139]: XX+/127.0.0.1/hub5.wpr2.mediaways.net/A/IN
Jan 22 13:11:17 mgr1 named[139]: XX+/127.0.0.1/146.210.71.195.in-addr.arpa/PTR/IN


Nicht vergessen anschliessend das Logging wieder abzuschalten, da sonst über kurz oder lang das Filesystem volllaufen würde. Abschalten durch erneute Eingabe von
ndc querlog


Zur Erklaerung der Ausgabe:

XX+/127.0.0.1/hub7.wpr2/A/IN

XX ist das querylog. Danach kommt jeweils durch / getrennt erst der anfragende Host (hier 127.0.0.1) der Name oder die IP Adresse, die angefragt wird (hier hub7.wpr2), der Typ (hier A) und der Network typ (Hier IN).

Es koennen die Typen

A - A Record (Addresse) PTR - Pointer (Name) SOA - Source of Authority (Zonen header)

angefragt werden.


Was ich mir nie merken kann: Radius checken mit radpwtst:

radpwtst -r 1 -d /bla/radius/raddb/ -s SERVER -w PASSWORD -u ppp USER


SERVER:   ist der Hostname oder die IP eines Servers, auf dem ein radiusd läuft und in dessen Clientsfile die Maschine, auf der man diesen Befehl absetzt, eingetragen ist. Dieser Server bekommt die Anfrage.
USER:   Username
PASSWORD:   Password des Users
-u gibt den Typ der Anfrage an. Wenn -u nicht angegeben wird, wird ein "Authenticate Only" Request gestellt. Manche Radiusserver mögen solche Requests nicht und lehnen sie ab, auch wenn User und Passwort ok sind.

Usage: radpwtst [-a ACKs] [-c code] [-d directory] [-f file]
    [-g group] [-h] [-i client-id] [-l async port] [-n]
    [-p UDP-port] [-r retries] [-s server] [-t timeout]
    [-u type] [-v version] [-w password] [-x] accessID
Codes: Access-Request = 1
       Accounting-Request = 4
       Password = 7
       Status-Server = 12
Types: challenge, chap, dumb, slip, ppp, arades, dbdumb,
       dpslip, dbppp, outbound, admin, exec, dbadmin 



Alle Dateinamen in einem Verzeichnis modifizieren:

Zum Beispiel alle Dateinamen in Kleinschreibung ändern:

for i in *; do j=`echo $i | tr 'A-Z' 'a-z'`; echo $i $j; done

Zum Beispiel einen String entfernen und die Dateiendung in Kleinschreibung ändern

for i in *; do j=`echo $i | sed -e s/Pratchett\ // | sed -e s/PDF/pdf/`; echo "$i" "$j"; done

Die echo sollte man erst durch ein mv ersetzen, wenn alles so funktioniert, wie gewollt.


Newline am Zeilenende entfernen mit dem vi:

im vi folgendes eingeben:

: ,$ s/^M//

das ^M wird durch ctrl+v und anschliessendes return erzeugt


Doppelte Datensätze in allen Dateien suchen:

for i in `ls */bla/blub/filename` ; do if [ `grep -i "USERNAME" $i | grep TIMESTAMP | wc -l` -gt 0 ]; then echo $i ; grep -i "USERNAME" $i | grep TIMESTAMP ; fi ; done


Die grössten Files in einem Verzeichnis ausfindig machen:

ls -l | sort +4n


Festplatten sicher löschen:

dd if=/dev/urandom of=/dev/hdx bs=10240k

Nach 2-3 Durchläufen sollte nichts mehr rekonstruierbar sein. Bei grossen Platten sollte man reichlich Zeit einplanen ;-)


Grafische Konsole einschalten:

Normalerweise ist bei allen Distributionen die Unterstützung für die grafische Konsole im Kernel einkompiliert.
In der Kernelkonfig muss:

  • VGA Text Console
  • Video Selection Support
  • Support for frame buffer devices (experimental)
  • VESA VGA Graphic console
  • Advanced Low Level Drivers
  • Select Mono, 2bpp, 4bpp, 8bpp, 16bpp, 24bpp and 32bpp packed pixel drivers
  • ausgewählt sein

    In der /etc/lilo.conf kann dann der Videomode z.B. mit:
    vga=0x317 (1024x768, 16Bit Farbtiefe)
    angegeben werden.
    Wenn man bei jedem Booten nach dem gewünschten Mode gefragt werden möcte, fügt man:
    vga=ask
    in der /etc/lilo.conf an.

    Möglich sind folgende Modes:
    Colours   640x400 640x480 800x600 1024x768 1152x864 1280x1024 1600x1200
    --------+--------------------------------------------------------------
     4 bits |    ?       ?     0x302      ?        ?        ?         ?
     8 bits |  0x300   0x301   0x303    0x305    0x161    0x307     0x31C
    15 bits |    ?     0x310   0x313    0x316    0x162    0x319     0x31D
    16 bits |    ?     0x311   0x314    0x317    0x163    0x31A     0x31E
    24 bits |    ?     0x312   0x315    0x318      ?      0x31B     0x31F
    32 bits |    ?       ?       ?        ?      0x164      ?         ?      
    


    Shoutcast-Playlisten an die Playlist vom xmms anhängen:

    Wenn man auf auf einen Playlistlink klickt, ersetzt der xmms leider die Playlist anstatt die URLs
    anzuhängen. Abhilfe schafft ein Eintrag in Mozilla's Helper Applications:

    MIME type: audio/x-scpls
    File ext: pls
    Open with other application: /usr/local/bin/xmms-e.sh
    

    Das dazu gehörende Shellscript xmms-e.sh ist ein einfacher Einzeiler:
    #!/bin/sh
    xmms -e $1
    


    Magic SysRq keys nutzen:

    Die Magic SysRq keys sind in der Kernelkonfiguration fast aller Distributionen enabled. Um sie zu nutzen, muss man nur noch:

    echo 1 > /proc/sys/kernel/sysrq  ausführen.
    Um die Magic SysRq keys zu nutzen, muss man nicht eingelogged sein! Mögliche Befehle sind:

    SysRq : HELP : loglevel0-8 reBoot tErm kIll saK showMem Off showPc unRaw Sync showTasks Unmount
    Befehle kann man mit:
    Strg+Alt+[Druck/S-Abf]+[0-8,B,E,I,K,M,O,P,R,S,T,U]
    absetzen, wobei obige Hilfe immer dann angezeigt wird, wenn man eine Taste drückt, die nicht belegt ist.


    rpm hat seit Version 4.1 einen kleinen Bug

    Es bleibt manchmal (recht selten) während einer Query oder Installation einfach hängen.
    Dieses Phänomen tritt auch bei rpm V4.2 noch auf. Man kann sich recht einfach helfen, indem
    man den rpm oder rpmq Prozess mit kill -9 als root beendet. Allerdings muss man danach noch das verbliebene Lockfile mit rm -f /var/lib/rpm/__db.00* löschen. Danach tut rpm dann wieder, wie es sollte.



    Speicher und I/O-Last anzeigen:

    [root@Gandalf root]# vmstat 1
       procs                      memory    swap          io     system         cpu
     r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy  id
     1  0  0 138328   7288   5892 100908   2   2    23     7   59    29   9   8  83
     2  0  0 138328   8064   5916 100908   0   0     0    52  340 10847  13  17  71
     1  0  0 138328   8060   5916 100908   0   0     0     0  277  8409  12  11  77
     3  0  0 138328   7932   5916 101036   0   0   128     0  323  9462  10  13  77
     3  0  0 138328   7932   5916 101036   0   0     0     0  565 10232   9  16  75
     4  0  0 138328   7932   5916 101036   0   0     0     0  381  8812   8  15  77
    



    Perlmodule mit CPAN nachinstallieren:

    [root@crawler nmstools-2.0.1]# perl -MCPAN -e shell
    
    cpan shell -- CPAN exploration and modules installation (v1.63)
    ReadLine support enabled
    
    cpan> install Expect
    



    Linux Bootprozess:

    1. BIOS => MBR => im MBR liegt die Partitionstabelle und der Firststage-Loader.
    2. Fisrststage-Loader laedt den Secondstage-Loader (ausnahme GRUB: der hat "1 1/2Stage" und kann damit auf die wichtigsten Filesysteme zugreifen und hat einen Editor)
    3. Bootloader startet den Kernel.
    4. Kernel entpackt sich, startet sich, enpackt die initrd und mountet uebers Loopdevice.
    5. Kernel startet den init (PID 1). Hier haelt "Linux emergency""
    6. Init arbeitet /etc/inittab ab.
    7. aus der /etc/inittab wird /etc/rc.d/rc.sysinit abgearbeitet bevor der erste Runlevel erreicht wird. Hier haelt der Singleusermode "linux s".
    8. die Startskripte des Default-Runlevel /etc/rc.d/rc.X werden abgearbeitet (soweit nicht ein anderer Runlevel dem Bootloader uebergeben wurde). Sxx startet den Dienst beim Eintreten in den Runlevel, Kxx stopt den Dienst beim Verlassen des Runlevel. es werden nicht die einzelnen Runlevel bis zum gewuenschten Runlevel nacheinander abgearbeitet, sondern der gewuenschte Runlevel wird direkt angesprungen.
    9. als letztes wird /etc/rc.d/rc.local als S99 abgearbeitet.



    Inodes: df -i zeigt die benutzten Inodes an.

    Journaling Filesystems: Halten Daten konsistent. Nach einem Absturz muss nur das Journal rec overed werden, um rauszufinden, was noch geschrieben werden muss.

    Meta-Daten beim Journaling: Daten werden zuerst in den Journalbereich geschrieben und nach e rfolgreichen Schreiben auf die Platte wieder aus dem Journal gelöscht.



    Wenn ein Device wegen busy nicht umounted werden kann:

    lsof listet offene Files
    fuser zeigt, welche PID eine Datei offen hat



    Vorteil von Labels beim Mounten:

    wenn eine Platte physikalisch umgebaut wurde, ändern sich die Devicenamen (aus /dev/hda wird /dev/hdb o.ä.)
    Normalerweise würde der Rechner nicht mehr booten, weil das falsche Device in der fstab steht. Mit Labeln passiert das nicht, weil das Label immer auf das aktuell richtige Device zeigt .
    Nachteil: ein kaputtes Label ist eine zusätzliche Fehlerquelle.


    dumpe2fs gibt den Superblock einer Partition aus (hier findet man z.B. auch das Label der Pa rtition)


    Dateien aus RPMs extrahieren geht mit rpm2cpio oder mit dem mc.


    Dependencies mit rpm auf der Komandozeile lösen (undocumented feature):

    rpmdb-redhat installieren (enthält alle Dependencies der originalen Redhat RPMS)
    dann das Packet, das failed, mit rpm -ihv --aid xxxx.rpm installieren (geht nur im Verzeichn is, in dem die RPMs liegt).


    /etc/default/useradd enthält die Defaults für das useradd Kommando


    /etc/passwd muss worldreadable sein, da viele Daemons darauf zugreifen (/etc/shadow ist dafür nur für root lesbar)


    suid und sgid
    suid führt das Programm unter der uid des Besitzers der Datei aus. Das muss nicht root sein!
    sgid setzt beim Anlegen eines Files oder Verzeichnisses als gid die Group, der das übergeord nete Verzeichnis gehört (Sinnvoll bei Shared o. ftp-upload Verzeichnissen).
    Das Sticky-Bit (ursprünglich um zu verhindern, das ein laufendes Programm ausgelagert wird) forciert, dass Dateien/Verzeichnisse in einem Worldwriteble-Verzeichniss nur vom Besitzer ge löscht werden können. Wird beim /tmp Verzeichnis angewendet. Wird beim ls -l nicht mit s son dern mit t angezeigt!


    chmod setzt die Bits von rechts nach links. chmod 7 xxx führt zu -------rwx, chmod 77 xxx zu ----rwxrwx ...


    Wenn ein File /etc/nologin existiert, kann sich sofort kein User mehr anmelden. Das File wird beim nächsten Booten automatisch gelöscht.


    /etc/security/limits.conf: Limiterungen betreffend Login, data, fsize, memlock, cpu, nproc . ...


    Bespielkonfigurationen zur RAID-Konfiguration liegen unter /usr/share/doc/raidtools-xxx/ Die Beispiele können einfach nach /etc/raidtab kopiert und angepasst werden.


    Apache:

    Directory Anweisungen beziehen sich auf den absoluten Pfad.
    Location Anweisungen sind relativ zum Document-Root.
    Die Konfiguration der Virtual Hosts lässt sich mit:

    [root@mymx conf.d]# httpd -t -D DUMP_VHOSTS
    VirtualHost configuration:
    195.71.86.230:80       is a NameVirtualHost
             default server www.mymx.org (/etc/httpd/conf/httpd.conf:1081)
             port 80 namevhost www.mymx.org (/etc/httpd/conf/httpd.conf:1081)
             port 80 namevhost mymx.org (/etc/httpd/conf/httpd.conf:1089)
             port 80 namevhost aptrpm.mymx.org (/etc/httpd/conf/httpd.conf:1097)
    195.71.86.230:443      mail.mymx.org (/etc/httpd/conf.d/ssl.conf:91)
    Syntax OK
    
    anzeigen.


    Um die smb.conf zu checken:

    testparm zeigt, ob die Konfig ok ist und zeigt die Konfig der Shares
    testparm /etc/samba/smb.conf 123.123.123.123 testet, ob die angegeben IP zugreifen darf.


    DNS: Zonen können mehrere Domains enthalten.

    Zonentypen:

    hint: Root-Nameserver werden gefragt
    master: Server ist der Master für die Zone.
    slave: Server ist nicht Master für die Zone.

    SOA: Start of authority
    CNAME: Canonical Name (ist ein ALias)
    A: Adressrecord
    HINFO: Hostinfo (optional)
    PTR: Pointer (in der Reverse-Zone)



    Die initrd updaten:

    geht am einfachsten mit: mkinitrd /boot/initrd-2.4.22.img 2.4.22

    die initrd ist komprimiert. Wenn man ihr die Endung .gz gibt, kann man sie mit gunzip -9 auspacken und über das Loopdevice mounten, um ihren Inhalt zu checken oder zusätzliche Kernelmodule hinzuzufügen.


    xinetd und TCPwrapper:

    der Name des Dienstes, der in der Hosts.allow oder deny einzutragen ist, ist nicht der Name des Dienstes, sondern der Name des Daemons, der aufgerufen wird (ohne Pfad). z.B. pop3 geht nicht. Der Daemon heisst ipop3d (siehe /etc/xinetd/pop3) genau dieser Name muss auch in die hosts.allow oder deny eingetragen werden.


    X-Session exportieren oder eine zweite Seesion in der Session.

    Xnest :1

    Xnest -query machine.bla.com :1


    Freier X-Server für Windows:

    www.redhat.com/software/cygwin


    Beim Start des Desktop Environment passiert:

    1. X-Server starten
    2. nur für Runlevel:5 prefdm guckt ob ein displaymanager da ist (gdm,kdm,xdm)
    3. Runlevel 3: Startx startet den Windowmanager: Metacity, kwin, twm, xfce, fvwm95, windowma ker, enlightment...)
    4. Widget Set wird gestartet (gtk+, qt, Open Motif)
    5. Panel, Konfigtools, Applikationen



    Syntaxchecker:

    Samba: testparm
    Apapche: httpd -t [-D DUMP_VHOSTS]
    Bind: named-checkconf
    Print: checkpc



    Korruptes Filesystem reparieren:

    dumpe2fs /dev/hda1 | grep -i backup

    Nummer eines Superblock-Backups merken und mit

    e2fsck -b [nummer] /dev/hda1

    wieder zurückschreiben.


    Devices:

    Eine Dokumentation der Block- und Char-Devices und ihrer Nummern
    findet man unter: /usr/share/doc/MAKEDEV-x.x.x/devices.txt


    Datenfelder aufsummieren mit awk:

    awk -F";" '{sum+=$3}END{print sum}' (gibt die Summe am Ende aus)

    oder auch:
    awk -F"\t" '{print sum += $2}' (gibt die Einzelsummen aus)


    Maximum in einem File mit awk ermitteln:

    Bei einem File mit zwei mit Semikolon getrennten Spalten (in der ersten das Datum, in der zweiten der Wert):

    cat zisp_peak | awk -F";" '$2>count{count=$2;date=$1}END{print date,count}'


    awk's Ausgabeformat beeinflussen:
    Bei Benutzung von print wandelt awk auch numerische Ergebnisse ins Strings um.
    Damit grosse Zahlen nicht als 2.3456e9 angezeigt werden, kann man das Outputformat mit der internen Variable OFMT beeinflussen. Z.B.:

    awk -F"\t" '{sum+=$6}END{OFMT="%.0f"; print (sum/7/60)*30}'

    Mit printf geht das natürlich auch:

    awk -F"\t" '{sum+=$6}END{printf "%ld\n", (sum/60)}'


    MP3 nach OGG transcoden:

    Das macht natürlich nur dann Sinn, wenn man die Bitrate radikal reduzieren möchte, um Platz zu sparen. Das Transcoden von einem verlustbehafteten Codec zum anderen tut der Qualität nicht sonderlich gut.

    for i in *; do j=`echo $i | sed -e s/.mp3/.ogg/` ; mpg123 -w "/tmp/tmp.wav" "$i" ; oggenc -q1 -o "ogg/$j" "/tmp/tmp.wav" ; rm "/tmp/tmp.wav" ; done


    Ein self signed Zertifikat für Apache erzeugen:

    Ich habe mir dafür ein kleines Shellskript geschrieben:

    #!/bin/sh
    
    host=`/bin/hostname`
    cd /etc/apache-ssl
      openssl genrsa -out $host.key 1024
      chmod 600 $host.key
      openssl req -new -key $host.key -out $host.csr -in infile
      openssl x509 -req -days 1460 -in $host.csr -signkey $host.key -out $host.crt
      mv apache.pem apache.pem.old
      cp $host.key apache.pem
      cat $host.crt >> apache.pem
      chmod 600 apache.pem
    /etc/init.d/apache-ssl restart
    



    MRTG ohne SNMP:

    Man braucht nicht unbedingt SNMP, um grafische Auswertungen wie Trafficanalysen zu machen, oder die Auslastung von Memory oder Partitionen zu überwachen. Einfache Shellskripte tun's auch und man hat keinen weiteren offenen Port, um den man sich Gedanken machen muss.
    Einige Beispiele:

    CPU-Load:

    #!/bin/sh
    # executed by mrtg. Returnes CPU load 5min avg.
    
    echo 0
    cat /proc/loadavg | awk '{OFMT="%.0f"; print $2*100}'
    uptime| awk '{print $3,$4,gensub(",",".00","2",$5)}'
    hostname
    
    Partitionsauslastungen:
    #!/bin/sh
    # executed by mrtg. Returnes usage percentage of /boot and /
    
    df | grep "/dev/md0" | awk '{print gensub("%","","1",$5)}'
    df | grep "/dev/md2" | awk '{print gensub("%","","1",$5)}'
    uptime| awk '{print $3,$4,gensub(",",".00","2",$5)}'
    hostname
    
    Speicherauslastung:
    #!/bin/sh
    # executed by mrtg. Returnes usage percentage of Mem and Swap
    
    cat /proc/meminfo | grep Mem: | awk '{OFMT="%.0f"; print $3/$2*100}'
    cat /proc/meminfo | grep Swap: | awk '{OFMT="%.0f"; print $3/$2*100}'
    uptime| awk '{print $3,$4,gensub(",",".00","2",$5)}'
    hostname
    
    Netzwerktraffic:
    #!/bin/sh
    # executed by mrtg. Returnes transfered bytes
    
    cat /proc/net/dev| grep eth1 | sed -e s/eth1:// | awk '{print $1,"\n"$9}'
    uptime| awk '{print $3,$4,gensub(",",".00","2",$5)}'
    hostname
    
    Anzahl Prozesse:
    #!/bin/sh
    # executed by mrtg. Returnes number of processes
    
    echo 0
    ls /proc/| egrep "[1-9]+"| wc -l
    uptime| awk '{print $3,$4,gensub(",",".00","2",$5)}'
    hostname
    
    Die passende mrtg.cfg kann dann z.B. so aussehen:
    
    # Global configuration
    WorkDir: /var/www/mrtg
    WriteExpires: Yes
    
    Title[^]: Traffic Analysis for root48.filoo.de
    
    Target[Ethernet]: `/usr/local/mrtg/net.sh`
    MaxBytes[Ethernet]: 1250000
    Refresh: 600
    Title[Ethernet]: Traffic Analysis for eth1
    PageTop[Ethernet]: Traffic Analysis for eth1
    
    
    Target[CPU_Load]: `/usr/local/mrtg/cpu.sh`
    MaxBytes[CPU_Load]: 100
    Unscaled[CPU_Load]: dwmy
    YLegend[CPU_Load]: Load %
    ShortLegend[CPU_Load]:  %
    Options[CPU_Load]: noi,gauge
    Refresh: 600
    Title[CPU_Load]: CPU Load
    Legend2[CPU_Load]: CPU Load
    LegendO[CPU_Load]: CPU Load
    PageTop[CPU_Load]: CPU Load
    
    
    target[Memory]: `/usr/local/mrtg/mem.sh`
    options[Memory]: gauge
    title[Memory]: Utilisation Memory and Swap
    maxbytes[Memory]: 100
    unscaled[Memory]: dwmy
    YLegend[Memory]: Utilisation %
    ShortLegend[Memory]:  % 
    Legend1[Memory]: Utilisation Memory
    Legend2[Memory]: Utilisation Swap
    LegendI[Memory]: Memory
    LegendO[Memory]: Swap
    PageTop[Memory]: Utilisation Memory and Swap
    
    
    Target[Proc]: `/usr/local/mrtg/proc.sh`
    MaxBytes[Proc]: 160
    Unscaled[Proc]: dwmy
    YLegend[Proc]: Processes
    ShortLegend[Proc]:  %
    Options[Proc]: noi,gauge
    Refresh: 600 
    Title[Proc]: Processes
    Legend2[Proc]: Processes
    LegendO[Proc]: Processes
    PageTop[Proc]: Processes
    
    
    target[HD]: `/usr/local/mrtg/hd.sh`
    options[HD]: gauge
    title[HD]: Utilisation /boot and / in percent
    maxbytes[HD]: 100
    unscaled[HD]: dwmy
    YLegend[HD]: Utilisation %
    ShortLegend[HD]:  % 
    Legend1[HD]: Utilisation /boot
    Legend2[HD]: Utilisation /
    LegendI[HD]: /boot
    LegendO[HD]: /
    PageTop[HD]: Utilisation /boot and / in percent
    

    Und so sieht's aus


    Kommentarzeilen und leere Zeilen ignorieren beim Parsen mit Skripten:

    Shell: sed ersetzt Kommentarzeilen mit "nichts", egrep überspringt die leeren Zeilen.

    cat FILE | sed -e 's/#.*//' | egrep -v '^ *$'
    

    Perl:
    Kommentarzeilen überspringen:
    next if (/^#+/);
    

    Leere Zeilen überspringen:
    next if (/^\s*$/);
    



    Logfileeinträge der letzten x Stunden finden:

    Um die Fehlercodes 404 der letzten 4 Stunden im Logfile des Apache zu finden:

    for i in `seq -4 0`;do grep `date "+%d/%b/%Y:%H" --date="$i hours"` /var/log/apache2/access.log | grep " 404"; done
    

    Das Format, das date liefert, muss natürlich zum Format im Logfile passen. Obiges Format passt für meinen Apache mit LANG=c


    Allen Dateien in einem Verzeichnis unabhängig von ihrem aktuellen Namen umbenennen und mit Datum versehen:

    Zum Besipiel alle Dateien *.xls in einem Verzeichnis umbenennen und die mtime dem Namen anhängen:

    /bin/ls -lt --time-style=+%y%m%d *.xls |\ 
    while read i 
    	do DATE=`echo $i | awk '{print $6}'`; NAME=`echo $i | awk '{print $7}'`; mv $NAME MDF-Report-$DATE.xls
    done
    



    Audio Tracks von einer DVD rippen:

    Es gibt zig Wege, Audiortacks von einer DVD zu extrahieren. Ich benutze dazu mplayer:

    for i in `seq 2 18`;do mplayer dvd://1 -aid 128 -chapter $i-$i -dumpfile title2.wav -vc null -vo null -ao pcm:waveheader ; mv audiodump.wav track$i.wav; done
    

    Ich mache das in einer Schleife, damit ich für die einzelnen Kapitel separate Tracks bekomme.
    Wenn ich mp3s haben möchte, konvertiere ich die Tracks anschliessend mit lame:
    for i in `seg 2 18`; lame -h -V0 -q0 --resample 44.1 track$i.wav track$i.mp3; done
    





    Serialtime mit date in lesbares Format wandeln

    date kann seit Version 5.3 Serialtime in beliebige Formate zurückwandeln:

    andre@host:[ ~ ] > date --date=@1202465255
    Fr 8. Feb 11:07:35 CET 2008
    



    Mountoptionen für VFAT Laufwerke unter linux

    Wenn man mit rsync Daten zwischen Windows Partitionen mit VFAT und Linux Partitionen mit ext3 synchronisieren möchte, hat man unter anderem Probleme mit der Gross- und Kleinsschreibung der Dateinamen. Das liegt an der Standard Mountoption shortname=lower. Ich benutze folgende Optionen beim Mounten. Damit klappt auch der rsync ohne dass bei jedem Lauf wieder die meisten Dateien erneut übertragen werden:

    mount -t vfat -o shortname=mixed,codepage=850,umask=002,uid=500,gid=500 /dev/sdc1 /tmp/mount
    
    Wenn z.B. ein USB-Laufwerk automatisch über hal und gnome-mount gemountet wird, kann man diese Optionen mit dem gconf-editor unter /system/storage/default_options/vfat eintragen.




    Verschlüsselte Partition anlegen und beim Einloggen mounten

    Dank LUKS geht das Verschlüsseln ganzer Partitionen inzwischen ziemlich einfach:
    Zunächst wird mit cryptsetup das Volume verschlüsselt:

    cryptsetup create -c aes-cbc-essiv:sha256 -s 256 -y private /dev/sdb1
    cryptsetup luksOpen /dev/sdb1 private
    
    Danach wird das Filesystem erzeugt:
    mkfs.ext3 -m1 /dev/mapper/private
    
    Informationen über das erzeugte Volume kann man sich folgendermassen anzeigen lassen:
    cryptsetup luksDump /dev/sdb1
    
    Weitere keys (bis zu 8) kann man mit:
    cryptsetup luksAddKey /dev/sdb1
    
    hinzufügen. Löschen kann kann man keys natürlich auch (unter Angabe des key-slot):
    cryptsetup luksDelKey /dev/sdb1 <key slot>
    
    Damit das Volume beim Einloggen über GDM automatisch gemountet werden kann, muss das Passwort für das Volume dem Passwort für das Login entsprechen und das Paket pam_mount installiert sein.
    In der Datei /etc/security/pam_mount.conf.xml muss zusätzlich folgende Zeile eingefügt werden:
    <volume user="USERNAME" mountpoint="/data/private" path="/dev/sdb1" fstype="crypt" />
    
    Ausserdem muss die Datei /etc/pam.d/gdm zwei zusätzliche Einträge enthalten:
    #%PAM-1.0
    auth	   optional    pam_mount.so
    auth     [success=done ignore=ignore default=bad] pam_selinux_permit.so
    auth       required    pam_env.so
    auth       substack    system-auth
    auth       optional    pam_gnome_keyring.so
    account    required    pam_nologin.so
    account    include     system-auth
    password   include     system-auth
    session    required    pam_selinux.so close
    session    include     system-auth
    session    optional    pam_mount.so
    session    required    pam_loginuid.so
    session    optional    pam_console.so
    session    required    pam_selinux.so open
    session    optional    pam_keyinit.so force revoke
    session    required    pam_namespace.so
    session    optional    pam_gnome_keyring.so auto_start
    
    Das wärs dann auch schon ;-)


    GPS-Tracks aus einem Garmin Gerät auslesen:

    gpsbabel -i garmin -t -f usb: -o gpx -F tracks.gpx

    Umwandeln ins KML Format für Google Earth:
    gpsbabel -i gpx -f tracks.gpx -o kml -F tracks.kml


    Videos für den IPod Touch oder IPhone umwandeln:

    #!/bin/bash
    
    IN=$1
    OUT=`echo $1 | sed 's/avi/mp4/'`
    
    ffmpeg -y -i ${IN} -vcodec libx264 -acodec libfaac -ab 128k -ac 2 -b 640k -threads 4 -flags +loop \ 
    -cmp +chroma -partitions 0 -me epzs -subq 1 -trellis 0 -refs 1 -coder 0 -me_range 16 -g 300 \ 
    -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -maxrate 1M -bufsize 1M -rc_eq 'blurCplx^(1-qComp)' \
    -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 ${OUT}
    


    Ganze Datei in Großschreibung oder Kleinschreibung wandeln mit dem vi:
    Lowercase:

    :%s/.*/\L&/

    Uppercase:
    :%s/.*/\U&/


    to be continued...