back Home http://mitschang.net - Homepage von Jonas Mitschang

Software Projekte, Tips & Tricks

Tip of the day: Never rm -rf .* - I ACCIDENTALLY / - happended to me once - will never happen again
i accidentally /

Tips & Tricks

Hier möchte ich ein paar Befehle aufschreiben, die sich im laufe der Zeit in meiner cool_commands Datei angesammelt haben.
Vielleicht ist der ein oder andere Trick ja ganz nützlich und wenn nicht, dann halt nicht ;-)

Linux Kernel

Kernel (2.6.) unter Debian kompilieren:
apt-get install build-essential kernel-package ncurses-dev
cd /usr/src
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.bz2
tar xjf linux-2.6.20.tar.bz2
rm linux; ln -s linux-2.6.20 linux
cd linux
# Wenn schon eine alte Kernel-Config vorliegt:
#   cp ../oldlinux/.config .
#   make oldconfig # Neue Kernel Config Einstellungen bewundern
make menuconfig # Kernel Config anpassen
make-kpkg kernel_image --initrd

Eigenen Kernel installieren:
dpkg --install /usr/src/linux-image-2.6.xxx.deb
update-grub

Eigenen Kernel wieder entfernen:
dpkg --purge --force-remove-essential kernel-image-2.6.xxx

Netzwerk

Alle gelinkten ZIP Dateien einer URL herunterladen:
wget -H -r -l1 -A.zip http://www.url.com/

Eine Datei (von verschiedenen Mirrorn) mit mehreren Connctions gleichzeitig downloaden; kann wget leider nicht:
axel -n 3 http://www.url.com/datei.zip

Hardware Adresse (MAC) eines Netzwerk Interfaces ändern:
ifconfig eth0 hw ether 00:DE:AD:BE:EF:00

Netzwerkverbindung über serielle Schnittstelle:
pppd /dev/ttyUSB0 115200 10.0.0.2:10.0.0.1 noauth nodetach defaultroute persist

Sende ASCII-Text per ICQ:
figlet FOOBAR | centericq-utf8 -s msg -p icq -t 1234567

Mehrere Nachrichten zeitverzögert per ICQ senden:
for t in "Nachricht 1" "Nachricht 2"; do echo $t | centericq-utf8 -s msg -p icq -t 1234567; sleep 1m; done

Mail Queue anhand von E-Mail Adresse löschen:
postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } / addr@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -

Ein FTP-Server Verzeichnis mounten:
apt-get install lufs-utils
m-a a-i lufs
modprobe lufs
lufsmount ftpfs://ftp.bla.org /mnt/ftp_server

MySQL root Passwort ändern.
killall mysqld
mysqld --skip-grant-tables
# variante 1: komfortabler
mysqladmin -u root password 'newpasswd'
# jetzt mysqld wieder normal starten

# variante 2: falls mysqladmin nicht installiert ist
mysql -u root mysql
mysql> update user set password=PASSWORD("newpassword") where user='root';
mysql> flush privileges;
mysql> quit

Zone Transfer einer DNS Zone:
dig axfr @dns_server.de zone.de

Welchen F.ROOT-SERVER verwende ich?
dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT

Backup

Rekursiv über ssh kopieren (manchmal versagt scp -r) und nur die Änderungen übertragen:
rsync -a user@server.de:/directory /local_destination

Backup eines entfernten Rechners machen. Verzeichnisse namens nobackup und deren Inhalte werden dabei nicht gesichert. Der entfernte Rechner meinserver.de verfügt über einen Systembenutzer rsync, der sudo Rechte auf rsync hat. Mit bwlimit wird die Bandbreite auf 1MB/s begrenzt, um den Server nicht auszulasten.
rsync --stats -aze 'ssh -i /var/backups/rsync/.ssh/id_rsa -l rsync' --bwlimit=1024 --rsync-path='sudo /usr/bin/rsync' \
  --prune-empty-dirs --include '*/' --exclude '**/nobackup/**' --include '/etc/**' \
  --include '/home/**' --include '/usr/local/**' --exclude '/**' \
  rsync@meinserver.de:/ /var/backups/zielverzeichnis/

Inkrementelles Backup eines entfernten Rechners machen. Verzeichnisse namens nobackup und deren Inhalte werden dabei nicht gesichert. Der entfernte Rechner meinserver.de verfügt über einen Systembenutzer rdiff, der sudo Rechte auf rdiff-backup hat. Es sollte darauf geachtet werden, dass sich die rdiff-backup Versionen auf Client und Server nicht unterscheiden.
ACHTUNG: Das Pattern für --include bzw. --exclude unterscheidet sich ein wenig von rsync!
rdiff-backup --print-statistics --remote-schema 'ssh -i /var/backups/rdiff/.ssh/id_rsa %s sudo rdiff-backup --server' \
  --exclude "**/nobackup/**" --include /var/lib/mysql --include /etc \
  --include /home --include /usr/local --exclude /\
  rdiff@meinserver.de::/ /var/backups/zielverzeichnis/

Größen der inkrementellen Backups von rdiff-backup ausgeben:
# rdiff-backup --list-increment-sizes /var/backups/zielverzeichnis/
        Time                       Size        Cumulative size
        -----------------------------------------------------------------------------
        Sun Nov 26 16:42:23 2006         1.51 GB           1.51 GB   (current mirror)
        Fri Oct 27 02:11:15 2006         2.02 MB           1.51 GB
        Mon Oct 16 13:49:50 2006       568 bytes           1.51 GB
        Fri Sep  8 02:59:50 2006         0 bytes           1.51 GB
        Tue Aug 15 10:18:48 2006         3.92 KB           1.51 GB
        Sun Jul 30 22:28:59 2006         0 bytes           1.51 GB
        Tue Jul 25 22:05:22 2006         0 bytes           1.51 GB
        Thu Jul 13 10:14:01 2006         17.0 MB           1.53 GB
        Thu Jun 29 03:34:39 2006         0 bytes           1.53 GB
        Thu Jun 15 00:57:32 2006          273 MB           1.80 GB
        Wed Apr 19 20:51:38 2006         0 bytes           1.80 GB

Alle inkrementellen Backups älter als ein bestimmtes Datum löschen:
# rdiff-backup --force --remove-older-than "2006-08-25" /var/backups/zielverzeichnis/
Deleting increments at times:
Mon Apr  3 19:48:15 2006
Mon Apr  3 21:35:17 2006
Tue Apr 11 22:45:13 2006
Tue Apr 11 23:17:34 2006
Wed Apr 19 20:51:38 2006
Wed May  3 01:44:03 2006
Wed May 10 21:48:46 2006
Thu Jun 15 00:57:32 2006
Thu Jun 29 03:34:39 2006
Thu Jul 13 10:14:01 2006
Tue Jul 25 22:05:22 2006
Sun Jul 30 22:28:59 2006
Tue Aug 15 10:18:48 2006

Laptop

Batteriestatus in Prozent ausgeben. Am besten in /usr/local/bin/bat speichern.
Die Ausgabe des Scripts kann z.B. für ein Alarm Script weiterverwendet werden: [ $( bat ) -lt 4 ] && beep
Script hier herunterladen: bat
# directory of the battery status
bat=/proc/acpi/battery/BAT0

IFS=":"
echo $(( $( cat $bat/state $bat/info | while read a b; do
  if [ "$a" == "remaining capacity" ]; then
    echo -n "$b" | sed "s/[ mAh]//g"
    echo -n " * 100 / "
  fi
  if [ "$a" == "last full capacity" ]; then
    echo -n $b | sed "s/[ mAh]//g"
  fi;
done ) ))

Spezielle Tasten der (Laptop)-Tastatur einbinden: Das lustige kleine Programm xev starten, die Keycodes der Tasten herausfinden und in die Datei .Xmodmap im home Directory eintragen mit den zugeorndneten Funktionen. Eine .Xmodmap könnte z.B. so aussehen:
keycode 144 = XF86AudioPrev
keycode 151 = XF86Launch1
keycode 153 = XF86AudioNext
keycode 159 = XF86LaunchA
keycode 160 = XF86AudioMute
keycode 161 = XF86Calculator
keycode 162 = XF86AudioPlay
keycode 164 = XF86AudioStop
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 178 = XF86WWW
keycode 222 = XF86PowerOff
keycode 223 = XF86Sleep
keycode 227 = XF86WakeUp
keycode 229 = XF86Search
keycode 230 = XF86Favorites
keycode 231 = XF86Refresh
keycode 232 = XF86Stop
keycode 233 = XF86Forward
keycode 234 = XF86Back
keycode 235 = XF86OfficeHome
keycode 236 = XF86Mail
keycode 237 = XF86Video

Bei einigen Distributionen wird xmodmap automatisch beim Einloggen ausgeführt und bei anderen nicht. In dem Fall muss man selbst dafür sorgen indem man z.B. im Verzeichnis $HOME/.kde/Autostart/ eine Datei mit folgendem Inhalt anlegt:
#!/bin/bash
/usr/bin/xmodmap $HOME/.Xmodmap

Datenträger

LVM

Festplatte (oder Partition) aus einem bestehenden LVM herauslösen. (Remove partition from existing LVM.)
Es muss natürlich genug freier Speicher im LVM sein, um die Fesplatte zu entfernen.
umount /mnt/devicename
e2fsck -f /dev/mapper/devicename
resize2fs /dev/mapper/devicename 800G   # blockdevice verkleinern (800G ist kleiner als die Summe der verbleibenden Platten)
lvreduce -L 800G /dev/mapper/devicename
pvmove -v /dev/sdc
vgreduce devicename /dev/sdc
pvremove /dev/sdc
mount /mnt/devicename

Eine neue Festplatte (oder Partition) einem bestehenden LVM hinzufügen. (Add partition to existing LVM.)
umount /mnt/devicename
e2fsck -f /dev/mapper/devicename
pvcreate /dev/sdc
vgextend devicename /dev/sdc
lvextend -L +500G /dev/mapper/devicename
resize2fs /dev/mapper/devicename   # ohne Groessenangabe wird das Dateisystem maximiert
mount /mnt/devicename

CDs brennen

ISO Datei brennen: (ACHTUNG: cdrecord wurde umbenannt in wodim)
wodim -tao -v dev=/dev/hdc image.iso
# bzw
cdrecord -tao -v dev=/dev/hdc image.iso

Verzeichnisse und Dateien brennen (aus der Console):
mkisofs -iso-level 3 -J -joliet-long -R /verzeichnis1 /verzeichnis2 | wodim -v fs=6m dev=/dev/hdc -

Okay wer eher auf klicki bunti steht der sollte mit k3b zufrieden sein:
apt-get install k3b cdparanoia libflac++5 libk3b2 vcdimager

Bluetooth

Eine SMS über ein Bluetooth-Handy schicken:
apt-get install bluetooth bluez-utils kdebluetooth smstools

invoke-rc.d bluez-utils start
hcitool scan
rfcomm bind 0 00:01:E3:0B:A3:80 # Die Adresse vom scan
invoke-rc.d smstools start
gsmsendsms -d /dev/rfcomm0 017990123456 "Nachrichtentext ..."

Eine Datei auf ein Handy hochladen (okay in KDE geht das klicki-bunti):
obexftp -b 00:01:E3:0B:A3:80 --put file.mp3

Bildbearbeitung

Einen Kontaktabzug mehrerer Bilddateien erstellen (convert ist Bestandteil des ImageMagick Pakets):
convert vid:*.jpg index.jpg

Mehrere Bilddateien umbenennen in einen einheitlichen Namen (z.B. pix002.jpg):
convert *.jpg pix%03d.jpg

Mehrere Bilddateien verkleinern und gleichzeitig ein wenig in der Qualität verringern, um sie z.B. ins Internet zu setzen:
convert -sample 40% -normalize -quality 60 *.jpg zielverzeichnis/pix%03d.jpg

# Wenn zuviele Dateien gleichzeitig verarbeitet werden sollen, dann wird convert sehr langsam und es empfiehlt sich:
for i in *.jpg; do echo $i; convert -sample 40% -normalize -quality 60 $i zielverzeichnis/$i; done

Ein Video aus Einzelbildern generieren:
mencoder mf://directory/*.jpg -audiofile musik.mp3 -mf w=640:h=480:fps=25:type=jpg -vf scale=640:480 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=3000:vhq -ffourcc XVID -oac copy -idx -o myvideo.avi

Ein Video im Uhrzeigersinn drehen (sinvoll wenn das Video z.B. mit einer Digicam aufgenommen wurde):
mencoder -ovc lavc -lavcopts vcodec=mjpeg -vf rotate=1 -oac copy original.asf -o output.avi

Ein Video verkleinern (z.B. Digicam Videos):
mencoder in.avi -o output.avi -oac mp3lame -srate 11025 -channels 1 -af-adv force=1 -lameopts preset=medium:aq=0 -ovc lavc -lavcopts vcodec=msmpeg4:vbitrate=300

Sonstige Tips & Tricks

Linux Tastaturlayout im Text-Terminal auf Deutsch setzen, nachdem man z.B. von einer boot-cd (wie grml) gebootet hat:
loadkeys de-latin1

Einen String in allen Dateien (in allen Unterorndern) ersetzen. SVN-Dateien werden dabei ignoriert, sonst mach man sein SVN kaputt.
# ersetze "foo" durch "bar" in allen Dateien
find -path '*/.svn' -prune -o -type f -print0 | xargs -0 -n 1 sed -i 's/foo/bar/g'

Google Earth in Debian installieren:
apt-get install googleearth-package
make-googleearth-package
dpkg -i googleearth_4.2.198.2451+0.4.0-1_i386.deb   # Name ändert sich natürlich
rm GoogleEarthLinux.bin

Ein Backup von einem Fehlerhaften blockdevice erzeugen:
dd bs=512b conv=noerror if=/dev/sda of=backup.img

Terminal zurücksetzen (z.B. nach dem caten einer Binärdatei):
alias sane='echo -e "\\033c"; tput is2; stty $(stty -g)'

Eine X-Anwendung in einem eigenen X-Server Fenster starten (im Beispiel eine komplette KDE Sitzung). Das geht bestimt auch einfacher, aber ich weiß nicht wie...
echo startkde | xinit /proc/self/fd/0 -- /usr/bin/Xnest :2

Zugriffsrechte von Dateien und Verzeichnissen reparieren. Dateien werden lesbar und Verzeichnisse read+execute. Jeweils darf der Besitzer schreiben.
find -type f -print0 | xargs -0 chmod 644
find -type d -print0 | xargs -0 chmod 755

Was tun wenn apt immer meint, dass Pakete nicht vertrauenswürdig sind.
gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 07DC563D1F41B907 # Es muss natürlich der richtige key eingetragen werden
gpg --armor --export 07DC563D1F41B907 | apt-key add -

User erstellen ohne shell und Passwort (z.B. für rdiff-backup, siehe oben):
adduser --disabled-login --home /var/backups/rdiff rdiff

Audio CD als MP3 Dateien rippen (okay - wenn KDE richtig konfiguriert ist, kann man die MP3 Dateien einfach mit den konqueror von der CD runter kopieren, aber hier kann man ja wenigstens noch encoder Optionen angeben):
cd leeres_verzeichnis
cdparanoia -B
for i in *.wav; do lame $i; done

Ramdisk erstellen und mounten:
mkfs.ext2 /dev/ram0 && mount /dev/ram0 /mnt/ramdisk

Ein mit aes verschlüsseltes Dateisystem auf einem Blockdevice (oder einer Datei) erstellen.
ACHTUNG: Der Inhalt der Datei bzw des Blockdevices device_or_file wird überschrieben.
Eine Datei beliebiger Größe (X Mb) kann mit "dd if=/dev/urandom of=dateiname bs=1024k count=X" erzeugt werden.
Die Datei wird dabei mit Zufallswerten gefüllt.
losetup -e aes -k 256 /dev/loop/0 file_or_device
mkfs.ext3 /dev/loop/0
losetup -d /dev/loop/0

# Das Dateisystem mounten (geht auch automatisch per fstab):
mount -oloop -oencryption=aes -okeybits=256 file_or_device /mnt/secret

Wenn gerade kein Würfel zur Hand ist:
echo $[$RANDOM%6+1]

dmesg fortlaufend anzeigen lassen:
# als user
watch -n 1 'dmesg|tail -n $[$LINES-2]'
# als root
while sleep 0.1; do dmesg -c; done

Google

Diese Sektion hat den Namen einer Suchmaschine, weil ich in Zukunft hier alles hin schreibe, was nicht erwähnenswert ist - wonach ich aber mehr als 5 Minuten im Netz suchen musste. In der Hoffnung, dass Google die Seite schön weit oben anzeigt und andere dadurch vielleicht nur 10 Sekunden brauchen ;-)
Also nicht über die merkwürdig redundanten Beschreibungen wundern ...

Wenn der GRUB Bootloader folgenden Fehler ausgibt. If GRUB states the following error:
Error 2: Bad File or Directory Type

Das liegt höchst wahrscheinlich daran, dass das Dateisystem (ext3) mit einer falschen Inode Size formatiert ist. 256 wird nur von neueren GRUB Versionen unterstützt. 128 sollte immer funktionieren:
# Inode Size herausbekomen (statt sda2 muss natuerlich das ensprechende blockdevice angegeben werden)
tune2fs -l /dev/sda2 | grep "Inode size"

# Inode Size neu setzen (hat bei mir nicht funktioniert, war nicht supported):
# (Achtung: das ist ein grosses i, oben ist ein kleines l. Je nach Schriftart nicht zu unterscheiden :-)
tune2fs -I 128 /dev/sda2

# Die Inode Size direkt beim erstellen des Dateisystems anzugeben hat geholfen:
mkfs.ext3 -I 128 /dev/hda2


Latex Code für das trademark Symbol (TM). Latex code for the symbol "trademark":
\texttrademark

HOWTO MySQL root Passwort ändern. MySQL root Passwort vergessen. Lost MySQL root password. HOWTO change root MySQL password.
Fehlermeldung:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Lösung: Siehe hier.


PAL to KOrganizer Konverter

Dieses Script konvertiert PAL calender Dateien (.pal) ins vCalendar Format. Das vCalendar format kann von KOrganizer importiert werden.
Auf diese Weise kann man ganz bequem z.B. seine PAL Geburtstagsliste in KOrganizer und allen Programmen, die vCalendar unterstützen, weiterverwenden.
Download: pal2ics

DIA to vCard Konverter

This script converts DIA address book files (e.g. generated by MobilEDIT) to the vCard format.
The vCard format can be easily imported by most organizer tools.
Download: dia2vcf


Feel free to leave a beer to my bitcoin address: 1JwiWthkzWRQ9dmaqTCfQUnyoYFcJjbURt

home Valid XHTML 1.0 Strict Valid CSS! UTF-8 Encoded Coffee powered Debian powered CAcert assurer