Die Online-Enzyklopädie Wikipedia kann über DNS abgefragt werden. Toll daran ist, dass man somit jederzeit die Definition von einem Begriff aus der Shell heraus per DNS abfragen kann.
Read the rest of this post »
Die Online-Enzyklopädie Wikipedia kann über DNS abgefragt werden. Toll daran ist, dass man somit jederzeit die Definition von einem Begriff aus der Shell heraus per DNS abfragen kann.
Technik
Der DNS-Server wp.dg.cx stellt über TXT-Ressource-Records den ersten Absatz von den englischen Wikipedia-Artikeln zur Verfügung. Der DNS-Server kann mit nslookup oder dig abgefragt werden.
Abfrage
Ich möchte die Definition von Foo wissen. Der DNS-Query sieht folgendermassen aus:
emanuel@discordia:~
$ dig foo.wp.dg.cx TXT
;; Truncated, retrying in TCP mode.
; DiG 9.7.2-P3 txt foo.wp.dg.cx
;; global options: +cmd
;; Got answer:
;; ->>HEADER
Digitalkameras speichern Bilder oft unter Dateinamen wie DSC00523.jpg. Mit diesen nicht sprechenden Namen kann ich nicht viel anfangen. Das Datum und die Uhrzeit des Fotos ist für den Dateinamen viel besser geeignet.
Read the rest of this post »
Digitalkameras speichern Bilder oft unter Dateinamen wie DSC00523.jpg. Mit diesen nicht sprechenden Namen kann ich nicht viel anfangen. Das Datum und die Uhrzeit des Fotos ist für den Dateinamen viel besser geeignet.
EXIF-Daten auslesen
Die Digitalkamera speichert das Datum und die Uhrzeit in den so genannten EXIF-Tags. Mit jhead kann man diese Tags auslesen und bearbeiten.
Mit jhead dateiname.jpg kann man sich die EXIF-Tags anzeigen lassen:
emanuel@discordia:~
$ jhead DSC00523.JPG
File name : DSC00523.JPG
File size : 2277972 bytes
File date : 2011:02:06 13:45:34
Camera make : Canon
Camera model : Canon DIGITAL IXUS 80 IS
Date/Time : 2010:12:27 12:02:37
Resolution : 2592 x 1944
Flash used : No
Focal length : 14.3mm (35mm equivalent: 90mm)
CCD width : 5.72mm
Exposure time: 0.020 s (1/50)
Aperture : f/4.5
Focus dist. : 6.57m
ISO equiv. : 800
Whitebalance : Auto
Metering Mode: pattern
In der Zeile Date/Time sieht man, dass das Foto am 27.12.2010 um 12:02:37h erstellt wurde.
Datei umbenennen
Mit jhead kann man nun das Foto nach dem Muster YYYY-mm-dd-HH-MM-SS umbenennen. Dies geschieht mit der Option -nf von jhead.
emanuel@discordia:~
$ jhead -nf%Y-%m-%d_%H-%M-%S DSC00523.JPG
DSC00523.JPG --> 2010-12-27_12-02-37.jpg
Kann das Erstellungsdatum und die Erstelungsuhrzeit nicht aus den EXIF-Daten herausgelesen werden, wird der Zeitstempel der Datei verwendet.
In der Manpage von jhead sieht man, wie sich der Format-String zusammensetzen lässt:
%H Hour in 24-hour format (00 - 23)
%j Day of year as decimal number (001 - 366)
%m Month as decimal number (01 - 12)
%M Minute as decimal number (00 - 59)
%S Second as decimal number (00 - 59)
%w Weekday as decimal number (0 - 6; Sunday is 0)
%y Year without century, as decimal number (00 - 99)
%Y Year with century, as decimal number
Alle Fotos in einem Ordner umbenennen
Mit dem regulären Ausdruck *.[jJ][pP][gG] benennt jhead alle Fotos in einem Ordner um:
emanuel@discordia:~
$ jhead -nf%Y-%m-%d_%H-%M-%S *.[jJ][pP][gG]
Alle Fotos umbenennen
Mit find kann man die gesamte Bildersammlung auf einmal umbenenen:
emanuel@discordia:~
$ find Daten/Bilder -iname *.jpg -exec jhead -nf%Y-%m-%d_%H-%M-%S {} \;
Im Ordner Daten/Bilder sind alle Fotos gespeichert, welche umbenannt werden.
Automatisieren
Damit man nicht jedes mal den Befehl von jhead eingeben muss, kann man sich ein Skript schreiben:
#!/bin/bash
########################################################################
#
# imagerename
# Fotos nach Datum umbenennen
#
# 2009-01-01; Emanuel Duss; Erste Version
#
########################################################################
########################################################################
# Main
jhead -nf%Y-%m-%d_%H-%M-%S *.[jJ][pP][gG]
# EOF
Ist dieses Skript ausführbar unter dem Dateinamen imagerename gespeichert und durch die Variable $PATH auffindbar, kann man in jedem Verzeichnis durch den Aufruf von imagerename alle Bilder im aktuellen Verzeichnis umbenennen.
Man kann sich aber auch einen Alias erstellen, welcher den Befehl ausführt. Folgende Zeile schreibt man sich in die Datei ~/.bashrc:
alias imagerename='jhead -nf%Y-%m-%d_%H-%M-%S *.[jJ][pP][gG]'
Auch jetzt kann man im jedem Verzeichnis durch imagerename alle Fotos umbenennen.
Ich mag es, wenn meine Konsole farbig dargestellt wird. So finde ich es auch praktisch, wenn bestimmte Schlüsselwörter in Manpages farbig hervorgehoben werden.
Read the rest of this post »
Ich mag es, wenn meine Konsole farbig dargestellt wird. So finde ich es auch praktisch, wenn bestimmte Schlüsselwörter in Manpages farbig hervorgehoben werden.
Anleitung
Mit folgenden Befehlen kann man den Pager less dazu bringen, die Ausgaben anders zu formatieren:
export LESS_TERMCAP_us=$'\E[01;32m' # Beginn unterstrichen
export LESS_TERMCAP_ue=$'\E[0m' # Ende unterstrichen
export LESS_TERMCAP_so=$'\E[01;44;33m' # Beginn Standout-Mode
export LESS_TERMCAP_se=$'\E[0m' # Ende Standout-Mode
export LESS_TERMCAP_md=$'\E[01;31m' # Start fett
export LESS_TERMCAP_mb=$'\E[01;31m' # Start blinken
export LESS_TERMCAP_me=$'\E[0m' # Ende alles
Diese Befehle schreibt man sich in die Datei ~/.bashrc, die automatisch bei jeder neuen Shell ausgeführt wird.
Mehr Informationen über die Variabeln LESS_TERMCAP_xx findet man in der Manpage termcap. Die Farben werden über ANSI-Escape-Codes definiert.
Beispiel
Hier ein Beispiel anhand der Manpage von man:
$ man man
Der Text, der normalerweise fett dargestellt wird, ist jetzt rot, und der unterstrichene Text ist jetzt grün.
Weitere Informationen
Gefunden habe ich diesen Tipp im Planeten von Arch Linux und stammt aus der Zsh-Konfiguration von Grml, welche unter der Lizenz GPL v2 veröffentlicht wurde.
ANSI-Escape-Codes
Planet Forum von Arch Linux
Arch Linux Planet "Farbige Manages auf der Konsole"
Grml.org
Zsh-Konfiguration von Grml
Das HTC Desire wird standardmässig mit HTC Sense ausgeliefert. Dies ist eine angepasste Benutzeroberfläche für Android von HTC. Was das Gute daran ist, weiss ich auch nicht. Die Benutzeroberfläche von den anderen Android-Geräten gefielen mir viel besser. Das war der Hauptgrund, wieso ich mein HTC Desire rootete und Android 2.3 ohne HTC Sense installierte.
Read the rest of this post »
Das HTC Desire wird standardmässig mit HTC Sense ausgeliefert. Dies ist eine angepasste Benutzeroberfläche für Android von HTC. Was das Gute daran ist, weiss ich auch nicht. Die Benutzeroberfläche von den anderen Android-Geräten gefielen mir viel besser. Das war der Hauptgrund, wieso ich mein HTC Desire rootete und Android 2.3 ohne HTC Sense installierte.
Wichtig
Ich übernehme keine Haftung für entstandene Schäden. Die Garantie kann verloren gehen. Sichert zuerst all eure Daten. Angeblich kann man mit einem Tool von HTC das HTC Desire wieder zurücksetzen. Das habe ich jedoch nicht ausprobiert, da ich keine Probleme hatte und mir Android 2.3 ohne HTC Sense sehr gefällt. Viel Erfolg!
Rooten
Als erstes muss man sein HTC Desire rooten. Dies ist mittlerweilen sehr einfach geworden. Man braucht lediglich ein USB-Kabel und die Software unrevoked3.
Das HTC Desire muss zum Rooten im USB Debugging Modus am Computer angeschlossen werden. Den Punkt USB Debugging findet man im Menü Einstellungen → Anwendungen → Entwicklung. Dort muss die Checkbox bei USB Debugging aktiviert sein.
Danach lädt man die Software unrevoked3 von der Webseite http://unrevoked.com/recovery/ herunter. Am einfachsten geht dies mit wget:
$ wget http://downloads.unrevoked.com/recovery/3.32/reflash.tar.gz
Jetzt entpackt man die Software:
$ tar -xvzf reflash.tar.gz
Der Rootvorgang muss unter dem Root-User gestartet werden. Deshalb wird die Software mit sudo gestartet:
$ sudo ./reflash
Um den Rootvorgang zu starten, drückt man auf OK. Danach bootet das Mobiltelefon mehrmals neu. Den aktuellen Status kann man immer im Fenster von unrevoked3 beobachten. Am Schluss zeigt die Software Done an.
Somit ist das HTC Desire gerootet. Dies erkennt man darunter, dass die Software Superuser installiert wurde.
Android 2.3
Android 2.3 kann mit einem Custom Rom auf das HTC Desire installiert werden. Das Custom Rom heisst Oxygen.
Zuerst lädt man das Custom Rom Oxygen 2.0 herunter:
$ wget http://download.oxygen.im/roms/update-oxygen-2.0-RC6-signed.zip
Das ZIP-Archiv muss nicht entpackt werden. Man kopiert es lediglich auf die SD-Karte vom HTC Desire. Hierfür muss der Festplattenmodus aktiviert sein, damit man auf die SD-Karte zugreifen kann.
$ cp update-oxygen-2.0-RC6-signed.zip /media/android_sdcard/
Dann schaltet man das HTC Desire aus und wieder ein. Beim Einschalten hält man die Lautstärke Leiser Taste gedrückt, damit man ins Bootmenü kommt.
Jetzt löscht man das komplette Gerät. Das macht man im Menüpunkt Clear Storage. Mit den Lautstärketasten navigiert man im Menü zum Menüpunkt Clear Storage und mit der Anschalttaste bestätigt man den Menüeintrag. Der Löschvorgang muss mit der Lautstärke Lauter Taste bestätigt werden.
Danach bootet das Gerät automatisch neu. Beim Booten muss man direkt wieder ins Bootmenü mit der Lautstärke Leiser Taste geraten! Bootet das Gerät durch, muss man den Schritt Clear Storage wiederholen!
Ist man wieder im Bootmenü, wählt man den Menüpunkt Recovery und dann instal zip from sdcard. Der Menüpunkt install zip from sdcard wird mittels Trackball angewählt. Dann wählt man choose zip from sdcard. Dort wird unser Custom Rom mit dem Dateinamen update-oxygen-2.0-RC6-signed.zip aufgelistet. Dieses wird ausgewählt mit im nächsten Menü mit Yes - Install update-oxygen-2.0-RC6-signed.zip bestätigt. Dann wird das Custom Rom installiert. Die Installation ist fertig, wenn auf dem Bildschirm Install from sdcard complete erscheint.
Mit der Zurücktaste geht man ein Menü zurück und wählt dann Reboot System. Jetzt ist Android 2.3 auf dem HTC Desire installiert.
Fazit
Nach einigen Tagen nach der Installation von Android 2.3 kann ich ein Fazit ziehen. Die Installation von Android 2.3 hat sich für mich auf jeden Fall gelohnt!
Mir gefällt vor allem, dass die HTC Sense Oberfläche nicht mehr vorhanden ist. Die Original Android Oberfläche gefällt mir viel besser. HTC hat in meinen Augen die Oberfläche verschlimmbessert.
HTC Sense beinhaltet eigene Software, welche ich nie benötigte. Dies sind unter anderem Apps für Twitter, Facebook und Aktien. Diese Apps lassen sich auch nicht deinstallieren. Ich habe die Twitter-App einmal ausprobiert, doch mir gefällt die ofizielle Twitter-App von Twitter viel besser. Die anderen habe ich gar nie verwendet.
Einige Apps wurden von HTC auch verändert bzw. ausgetauscht. So zum Beispiel der Musikplayer, die SMS-App, die Telefon-App, die Fotografieren-App und die Bilder-App. Der Musikplayer von HTC fand ich nie angenehm zum Bedienen. Ich verwendete immer DoubleTwist. Der Musikplayer von Android hingegen gefällt mir sehr. Die SMS-App sieht etwa gleich aus, wobei die SMS-App von Android besser ins Gesamtbild vom Android-System passt. Auch die Kamera entspricht mir mehr. Als ich zum ersten mal die Bilder-App von einem Samsung Glaxy S sah, gefiel mir diese viel besser. Man kann viel einfacher durch die vielen Bilder navigieren. Mit dem Android 2.3 System hat man auch diese Bilder-App installiert.
Auch die Tastatur finde ich viel angenehmer zum Bedienen. Obwohl die Tasten etwas kleiner ausfallen, als bei der HTC Sense Tastatur, vertippe ich mich viel weniger!
Weiter ist mir aufgefallen, dass das zoomen mit zwei Fingern in Google Maps sowie im Browser keinen "Ruckler" mehr hat am Schluss. Dieses ruckartige Bewegen habe ich schon oft festgestellt, hat mich jedoch nie gross gestört. Diesen Bug habe ich jetzt nicht mehr.
Mit dem Custom Rom Oxygen werde ich auch sehr schnell mit Updates versorgt. Es dauert immer sehr lange, bis HTC neue Softwareversionen anpasst und an den Mobilfunkprovider weitergibt. Dann muss ich warten, bis mein Provider noch einige Anpassungen vorgenommen hat. Dies hab beim Update auf Android 2.2 sehr lange gedauert. Diese Wartezeiten habe ich jetzt nicht mehr.
Was mich auch erstaunt ist, dass der Akku gefühlt länger hält. Ich habe keine genauen Tests durchgeführt, jedoch hält der Akku in meinen Augen massiv länger. Am Abend hatte ich immer noch so um die 15% Restakku. Jetzt nach der Neuinstallation habe ich noch 30% Restakku. Dieser Unterschied ist für mich sehr spürbar.
Zwei Sachen hat HTC jedoch sehr gut in der HTC Sense Oberfläche implementiert. Man konnte eine Zeit angeben, wie lange man das Entsperrmuster nicht eingeben will. Diesen Wert hatte ich auf 15 Minuten eingestellt. Entsperrte ich das HTC Desire, musste ich 15 Minuten lang kein Entsperrmuster mehr eingeben. Beim original Android muss man jedes mal beim Entsperren das Entsperrmuster eingeben (ausser man deaktiviert es komplett). Dies finde ich etwas schade.
Auch konnte man mit der Telefon-App von HTC die Kontakte einfacher durchsuchen. Die App von HTC zeigte eine mit jeweils drei Buchstaben beschriftete Nummerntastatur (wie man es von den herkömmlichen Mobiltelefonen her kennt). Dann konnte man direkt eine Nummer eingeben und telefonieren oder wie bei einer SMS einen Namensteil eintippen, was die Kontakte durchsuchte. Ich habe mich an diese etwas spezielle Methode sehr schnell gewöhnt und fand diese erstklassig!
Schlussendlich darf ich sagen: Die HTC Sense Oberfläche finde ich so unpraktisch und schlechter als die original Android Benutzeroberfläche, dass ich jedem interessierten das Update auf Android 2.3 ohne HTC Sense empfehle! Hätte ich ein Mobiltelefon mit der normalen Android Oberfläche, würde ich das installieren von Android 2.3 vielleicht nicht empfehlen. Natürlich machte das ganze herumspielen an meinem Android Mobiltelefon auch sehr viel Spass!
Wenn ihr noch Fragen habt, eine bestimmte Information benötigt oder wenn ich etwas testen soll, könnt ihr auf dieser Seite einfach einen Kommentar hinterlassen.
Links und weitere Informationen
HTC Desire Rooten: http://stadt-bremerhaven.de/htc-desire-root-in-1-minute
HTC Desire mit Android 2.3: http://stadt-bremerhaven.de/htc-desire-mit-android-2-3-gingerbread-ausstatten
Custom Rom Oxygen 2.0 http://forum.xda-developers.com/showthread.php?t=829734
Viele Digitalkameras verfügen über einen Gravitationssensor, der erkennt, wie die Kamera beim erstellen des Bildes gehalten wurde. Diese Information kann man dazu nutzen, um das Bild automatisch richtig zu drehen. Die Information wird im EXIF-Tag “Orientation” des Bildes gespeichert. Mit dem Tool jhead kann man diese Information auslesen und das Foto automatisch drehen lassen.
Read the rest of this post »
Viele Digitalkameras verfügen über einen Gravitationssensor, der erkennt, wie die Kamera beim erstellen des Bildes gehalten wurde. Diese Information kann man dazu nutzen, um das Bild automatisch richtig zu drehen. Die Information wird im EXIF-Tag "Orientation" des Bildes gespeichert. Mit dem Tool jhead kann man diese Information auslesen und das Foto automatisch drehen lassen.
EXIF-Daten
Wird jhead keine Option angegeben, werden einige EXIF-Informationen angezeigt:
$ jhead foto.jpg
File name : foto.jpg
File size : 2040209 bytes
File date : 2011:01:16 18:22:37
Camera make : Canon
Camera model : Canon DIGITAL IXUS 80 IS
Date/Time : 2011:01:14 23:05:42
Resolution : 2592 x 1944
Orientation : rotate 90
Flash used : Yes (auto)
Focal length : 6.2mm (35mm equivalent: 39mm)
CCD width : 5.72mm
Exposure time: 0.017 s (1/60)
Aperture : f/2.8
Focus dist. : 0.48m
ISO equiv. : 250
Whitebalance : Auto
Metering Mode: pattern
Das Tag "Orientation" sagt, dass das Bild um 90° gedreht wurde. Aber jetzt weiss man immer noch nicht, ob das Bild im Uhrzeigersinn, oder im Gegenuhrzeigersinn gedreht werden muss.
Noch mehr Informationen kann man jhead mit der Option -v entlocken:
$ jhead -v foto.jpg | grep -i orientation
Orientation = 6
Orientation : rotate 90
Das Orientation-Tag beseitzt den Wert 6. In den Spezifikationen von den EXIF-Tags steht folgendes dazu:
The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.
Daraus lässt sich schliessen, dass das Bild um 90° im Uhrzeigersinn gedreht werden muss.
Das Foto drehen
Mit der Option -autorot kann jhead das Foto automatisch drehen.
$ jhead -autorot foto.jpg
Modified: foto.jpg
Das eigentliche Rotieren übernimmt nicht jhead, sondern jpegtran.
Das Orientation-EXIF-Tag besitzt nun den Wert 1. Das Bild muss also nicht mehr gedreht werden.
$ jhead -v foto.jpg | grep -i orient
Orientation = 1
Orientation-Tag entfernen
Möchte man ein Foto nicht rotieren, aber das Orientation-EXIF-Tag trotzdem entfernen, kann man das mit der Option -norot machen:
$ jhead -norot anderesfoto.jpg
Alle Fotos in einem Verzeichnis drehen
Meistens will ich alle Fotos in einem Verzeichnis richtig drehen. Das kann man folgendermassen machen:
$ jhead -autorot *.[jJ][pP][gG]
Die Shell löst den regulären Ausdruck *.[jJ][pP][gG] auf, und übergibt alle passenden Dateinamen an jhead weiter.
Diesen Befehl habe ich in einem Skript, damit ich jederzeit jhead so aufrufen kann:
#!/bin/bash
################################################################
#
# imagerotate
# Dreht Fotos anhand des EXIF-Tag Orientation
#
# 2011-01-16; Emanuel Duss; Erste Version
#
################################################################
################################################################
# Main
jhead -autorot *.[jJ][pP][gG]
# EOF
Natürlich kann man auch einen Alias in der .bashrc eintragen:
alias imagerotate="jhead -autorot *.[jJ][pP][gG]"
Alle Fotos drehen
Folgendermassen kann man alle Bilder, welche sich im Ordner "~/Bilder" befinden automatisch drehen:
$ find ~/Bilder -type f -name *.[jJ][pP][gG] -exec jhead -autorot {} \;
Somit ist die gesamte Bildersammlung richtig gedreht.
Links und weitere Informationen
EXIF Spezifikationen: http://www.exif.org/specifications.html
Projektseite von jhead: http://www.sentex.net/~mwandel/jhead/
An öffentlichen Plätzen oder in Cafes gibt es oft öffentliche Hotspots. Manchmal verlangen diese eine Registrierung oder sind nur nutzbar, wenn man bezahlt. Interessant dabei ist, dass DNS-Anfragen auch ohne Anmeldung aufgelöst werden. Jetzt kann man den gesamten Traffic über DNS tunneln und so ohne Anmeldung im Internet surfen.
Read the rest of this post »
An öffentlichen Plätzen oder in Cafes gibt es oft öffentliche Hotspots. Manchmal verlangen diese eine Registrierung oder sind nur nutzbar, wenn man bezahlt. Interessant dabei ist, dass DNS-Anfragen auch ohne Anmeldung aufgelöst werden. Jetzt kann man den gesamten Traffic über DNS tunneln und so ohne Anmeldung im Internet surfen.
Voraussetzung
Ein DNS-Server
Ein Server, welcher für den Tunnel verantwortlich ist
Ein Client
Die Software OzymanDNS von Dan Kaminsky
Übersicht
Einrichtung DNS-Server
Auf dem DNS-Server eine Zonendelegierung angelegt:
dnstunnel.example.org. IN NS ns.server2.example.org.
ns.server2.example.org. IN A 42.23.05.21
Die IP-Adresse 42.23.05.21 entspricht dabei dem Server, welcher für den DNS-Tunnel verantwortlich ist.
Installation der Software OzymanDNS
Auf dem Tunnel-Server und auf dem Client muss die Software OzymanDNS von Dan Kaminsky installiert werden. Als Voraussetzung für diese Software werden Perl-Bibliotheken für DNS und für die Base32/Base64 Codierung benötigt. Folgendermassen können diese über die Paketverwaltung installiert werden:
Arch Linux
sudo pacman -S perl-net-dns
yaourt -S perl-mime-base32
yaourt -S perl-mime-base64
Debian
sudo aptitude install libnet-dns-perl
sudo aptitude install libmime-base32-perl
sudo aptitude install libmime-base64-perl
Dann wird die Software heruntergeladen (Auf dem Tunnel-Server und auf dem Client):
$ wget http://s3.amazonaws.com/dmk/ozymandns_src_0.1.tgz
Und danach entpackt:
$ tar -xvzf ozymandns_src_0.1.tgz
aska.pl
droute.pl
geta.pl
nomde.pl
glance.c
Einrichtung Tunnel-Server
Auf dem Tunnel-Server wird die Software OzymanDNS von Dan Kaminsky gestartet.
$ sudo ./nomde.pl -i 0.0.0.0 dnstunnel.example.org
Verwenden des Tunnels
Der Client kann jetzt ganz einfach eine SSH-Verbindung zum Tunnel-Server herstellen. Dabei ist zu beachten, dass die Subdomain sshdns vor die Tunnel-Domäne geschrieben wird und dass man als Host den localhost angibt:
$ ssh -o ProxyCommand="./droute.pl sshdns.dnstunnel.example.org" username_server2@localhost
Jetzt hat man bereits eine SSH-Session auf den Tunnel-Server offen.
Verwenden des Tunnels als SOCKS-Proxy
Mit SSH kann man ganz einfach einen SOCKS-Proxy erstellen:
$ ssh -D 8080 -N -f -o ProxyCommand="./droute.pl sshdns.dnstunnel.example.org username_server2@localhost
Im Webbrowser kann jetzt als SOCKS-Proxy localhost auf Port 8080 eingetragen werden.
Was wird übertragen
Mit tcpdump sieht man sehr gut, dass der gesamte Traffic über DNS TXT-Ressource-Records ausgetauscht wird:
emanuel@discordia:~
$ sudo tcpdump port domain
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:55:01.972425 IP 10.0.0.100.53055 > homeserver.duss.xy.domain: 16680+ TXT? 4744-24063.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:01.972788 IP 10.0.0.100.45578 > homeserver.duss.xy.domain: 21284+ PTR? 10.0.0.10.in-addr.arpa. (40)
19:55:01.978312 IP homeserver.duss.xy.domain > 10.0.0.100.45578: 21284* 1/1/1 PTR homeserver.duss.xy. (98)
19:55:01.978381 IP 10.0.0.100.57785 > homeserver.duss.xy.domain: 17573+ PTR? 100.0.0.10.in-addr.arpa. (41)
19:55:01.986232 IP homeserver.duss.xy.domain > 10.0.0.100.57785: 17573 NXDomain* 0/1/0 (106)
19:55:01.989063 IP 10.0.0.100.34507 > homeserver.duss.xy.domain: 155+ TXT? 23848-14105.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:02.113795 IP homeserver.duss.xy.domain > 10.0.0.100.53055: 16680 1/1/0 TXT `` `` (96)
19:55:02.127387 IP homeserver.duss.xy.domain > 10.0.0.100.34507: 155 1/1/0 TXT `` `` (97)
19:55:04.686581 IP 10.0.0.100.39743 > homeserver.duss.xy.domain: 27552+ TXT? 4744-46997.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:04.823762 IP homeserver.duss.xy.domain > 10.0.0.100.39743: 27552 1/1/0 TXT `` `` (96)
19:55:06.005887 IP 10.0.0.100.37415 > homeserver.duss.xy.domain: 64196+ TXT? 23848-57440.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:06.183955 IP homeserver.duss.xy.domain > 10.0.0.100.37415: 64196 1/1/0 TXT `` `` (97)
19:55:08.019211 IP homeserver.duss.xy.domain > 10.0.0.100.37457: 55047 1/13/0 A 174.143.142.58 (271)
19:55:08.043757 IP homeserver.duss.xy.domain > 10.0.0.100.37457: 61460 0/1/0 (94)
19:55:08.701239 IP 10.0.0.100.51678 > homeserver.duss.xy.domain: 27523+ TXT? 4744-698.id-31410.down.sshdns.dnstunnel.example.org. (59)
19:55:08.840241 IP homeserver.duss.xy.domain > 10.0.0.100.51678: 27523 1/1/0 TXT `` `` (94)
19:55:10.021281 IP 10.0.0.100.48429 > homeserver.duss.xy.domain: 48196+ TXT? 23848-40142.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:10.161332 IP homeserver.duss.xy.domain > 10.0.0.100.48429: 48196 1/1/0 TXT `` `` (97)
19:55:12.717222 IP 10.0.0.100.36828 > homeserver.duss.xy.domain: 35283+ TXT? 4744-24488.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:12.856288 IP homeserver.duss.xy.domain > 10.0.0.100.36828: 35283 1/1/0 TXT `` `` (96)
19:55:14.036261 IP 10.0.0.100.46071 > homeserver.duss.xy.domain: 6736+ TXT? 23848-52187.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:14.174095 IP homeserver.duss.xy.domain > 10.0.0.100.46071: 6736 1/1/0 TXT `` `` (97)
19:55:16.734383 IP 10.0.0.100.52763 > homeserver.duss.xy.domain: 26146+ TXT? 4744-8838.id-31410.down.sshdns.dnstunnel.example.org. (60)
19:55:18.052329 IP 10.0.0.100.58725 > homeserver.duss.xy.domain: 17293+ TXT? 23848-45884.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:18.195326 IP homeserver.duss.xy.domain > 10.0.0.100.58725: 17293 1/1/0 TXT `` `` (97)
19:55:18.752778 IP 10.0.0.100.57793 > homeserver.duss.xy.domain: 27305+ TXT? 4744-2538.id-31410.down.sshdns.dnstunnel.example.org. (60)
19:55:18.891504 IP homeserver.duss.xy.domain > 10.0.0.100.57793: 27305 1/1/0 TXT `` `` (95)
19:55:22.069854 IP 10.0.0.100.52682 > homeserver.duss.xy.domain: 45231+ TXT? 23848-21518.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:22.208718 IP homeserver.duss.xy.domain > 10.0.0.100.52682: 45231 1/1/0 TXT `` `` (97)
19:55:22.767600 IP 10.0.0.100.43772 > homeserver.duss.xy.domain: 56593+ TXT? 4744-12830.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:22.964026 IP homeserver.duss.xy.domain > 10.0.0.100.43772: 56593 1/1/0 TXT `` `` (96)
19:55:26.085406 IP 10.0.0.100.57741 > homeserver.duss.xy.domain: 39143+ TXT? 23848-26195.id-52787.down.sshdns.dnstunnel.example.org. (62)
19:55:26.225206 IP homeserver.duss.xy.domain > 10.0.0.100.57741: 39143 1/1/0 TXT `` `` (97)
19:55:26.786028 IP 10.0.0.100.57263 > homeserver.duss.xy.domain: 18543+ TXT? 4744-39657.id-31410.down.sshdns.dnstunnel.example.org. (61)
19:55:26.931594 IP homeserver.duss.xy.domain > 10.0.0.100.57263: 18543 1/1/0 TXT `` `` (96)
Weitere Tipps und Tricks
Zum schnellen Umschalten der Proxy-Einstellungen eignet sich das Firefox-Plugin FoxyProxy
Da die Verbindung nicht sehr schnell ist, kann man mit dem Firefox-Plugin User Agent Switcher den User Agent auf z. B. iPhone ändern, was die Auswirkung hat, dass oft eine mobile Version der Seite geladen wird.
Mit ssh -C kann man die Verbindung komprimieren und somit den zu übertragenen Traffic verkleinern
Mit der Software tsocks kann man jedes Programm mit einem vorgegebenen Proxy starten
Weitere Informationen und Links
http://www.dnstunnel.de/
http://www.plenz.com/tunnel-everything
http://dankaminsky.com/2004/07/29/51/
http://de.wikipedia.org/wiki/NS_Resource_Record
Es gibt viele Wege, wie man einen Screenshot erstellen kann. Für diese Aufgabe verwende ich scrot.
Read the rest of this post »
Es gibt viele Wege, wie man einen Screenshot erstellen kann. Für diese Aufgabe verwende ich scrot.
Wenn ich vom ganzen Desktop einen Screenshot machen will, starte ich scrot direkt aus der Shell:
emanuel@discordia:~
$ scrot screenshot.png
Nach dem Ausführen von diesem Befehl befindet sich der Screenshot mit dem Dateinamen screenshot.png im aktuellen Verzeichnis.
Oft will ich mit einem Screenshot nur einen Ausschnitt von meinem Desktop dokumentieren. Für diesen Zweck kann man folgenden Befehl in der Shell ausführen:
emanuel@discordia:~
$ scrot -s screenshot.png
Nach dem Ausführen von diesem Befehl kann man mit der Maus einen Bereich auf dem Desktop markieren. Der ausgewählte Bereich wird in der Datei screenshot.png gespeichert.
Um das ganze zu automatisieren und noch etwas praktischer zu machen, habe ich mir folgendes Skript geschrieben:
#!/bin/bash
########################################################################
#
# screenshot
# Erstellt Screenshots
#
# Copyright 2011 Emanuel Duss
# Licensed under GNU General Public License
#
# 2009-12-07; Emanuel Duss; Erstellt und erste Version
# 2010-08-22; Emanuel Duss; Mirage statt eog als Viewer
# 2011-01-01; Emanuel Duss; Feh statt Mirage als Viewer
#
########################################################################
########################################################################
# Variabeln
FOLDER="$HOME/Daten/Screenshots"
APP="feh --borderless --scale-down --image-bg black"
########################################################################
# Main
if [ ! -d "$FOLDER" ]
then
mkdir $FOLDER
else
scrot -s -e "$APP \$f" "$FOLDER/%Y-%m-%d_%k-%M-%S.png"
fi
# EOF
Nach dem Starten vom Skript muss man einen Bereich auf dem Desktop markieren. Der Screenshot wird in meinem Screenshot-Verzeichnis mit einem passenden Namen (Datum und Uhrzeit) abgespeichert und dann direkt mit meinem Bildanzeiger geöffnet.
Wenn man im Internet eine Fotogalerie publizeren will, oder man viele Fotos per E-Mail verschicken will, sollte man die Fotos verkleinern. Ich habe mir ein Skript geschrieben, welches die Auflösung der Bilder verkleinert und die JPEG-Qualitätsstufe heruntersetzt. Somit kann man ganz schnell viele Bilder verkleinern.
Read the rest of this post »
Wenn man im Internet eine Fotogalerie publizeren will, oder man viele Fotos per E-Mail verschicken will, sollte man die Fotos verkleinern. Ich habe mir ein Skript geschrieben, welches die Auflösung der Bilder verkleinert und die JPEG-Qualitätsstufe heruntersetzt. Somit kann man ganz schnell viele Bilder verkleinern.
Mit dem Befehl convert kann ein Bild verkleinert werden. Hierzu muss das Paket imagemagick installiert sein.
convert -resize 2048x2048 -quality 60 bild.jpg klein.jpg
Man sieht gut, wie sich die Dateigrösse verändert:
emanuel@discordia:/tmp
$ du -h bild.jpg klein.jpg
1.5M bild.jpg
168K klein.jpg
Die Datei wurde durch diesen Vorgang um 90% kleiner.
Um mehrere Bilder in einem Verzeichnis zu verkleinern, habe ich mir ein Skript geschrieben. Dieses Skript erstellt den Unterordner small, verkleinert alle Bilder und gibt aus, wie viele Fotos bereits verkleinert wurden.
#!/bin/bash
########################################################################
#
# imageshrink
# Verkleinert alle Bilder im aktuellen Verzeichnis
#
# Copyright 2010 Emanuel Duss
# Licensed under GNU General Public License
#
# 2009-10-09; Emanuel Duss; Erste Version
# 2010-12-12; Emanuel Duss; Optionen als Variabeln
#
########################################################################
########################################################################
# Variabeln
COUNT=0
TOTAL=`echo *.[Jj][Pp][Gg] | wc -w`
# Optionen
FOLDER="small"
SIZE="2048x2048"
QUALITY="60"
########################################################################
# Main
mkdir $FOLDER
for datei in *.[Jj][Pp][Gg]
do
COUNT=`expr $COUNT + 1`
echo $datei: Foto $COUNT von $TOTAL \(`expr 100 \* $COUNT / $TOTAL`%\)
convert -resize $SIZE -quality $QUALITY "$datei" "small/$datei"
done
# EOF
Die Auflösung und die JPEG-Qualitätsstufe kann in den Variabeln angepasst werden.
Der klassische Texteditor vi (nicht vim) kann man über die Datei .exrc im Homeverzeichnis konfigurieren.
Ich mag den verbesserten vi-Editor vim (Vi IMproved) zwar mehr, jedoch ist dieser nicht auf allen Systemen vorhanden. Deshalb habe ich mir auch eine Konfigurationsdatei für vi gemacht.
Read the rest of this post »
Der klassische Texteditor vi (nicht vim) kann man über die Datei .exrc im Homeverzeichnis konfigurieren.
Ich mag den verbesserten vi-Editor vim (Vi IMproved) zwar mehr, jedoch ist dieser nicht auf allen Systemen vorhanden. Deshalb habe ich mir auch eine Konfigurationsdatei für vi gemacht.
Meine .exrc sieht folgendermassen aus:
"#######################################################################
"
" ~/.exrc
" Konfigurationsfile fuer vi
"
" Copyright 2010 Emanuel Duss
" Licensed under GNU General Public License
"
" 2010-09-18; Emanuel Duss; Erste Version
"
"#######################################################################
"#######################################################################
" Optionen
set showmode " Editmodus anzeiten
set wrapscan " Uebers Dateiende hinaus suchen
set nowrap " Kein Zeilenumbruch
set tabstop=2 " Tabulator = 2 Zeichenbreite
set shiftwidth=2 " Einruecken um 2 Zeichenbreite
set showmatch " Gegenklammer anzeigen
set number " Zeilen nummerieren
set noerrorbells " Bei Fehler nicht piepsen
set ignorecase " Ignoriere Gross-/Kleinschreibung
set nolist " Tabulatoren/Zeilenende ausblenden
set autoindent " Automatisch einruecken
" EOF
Für Verbesserungsvorschläge bin ich jederzeit dankbar!
Da es für mich keine passende Backup-Lösung gab, habe ich mir diese selber geschrieben. Meine Daten werden jetzt per rsync auf meinen Backup-Server synchronisiert. Für meine Backup-Lösung braucht man nicht zwingend einen Backup-Server. Mit rsync kann man auch auf dem lokalen Rechner Dateien und Verzeichnisse synchronisieren.
Read the rest of this post »
Da es für mich keine passende Backup-Lösung gab, habe ich mir diese selber geschrieben. Meine Daten werden jetzt per rsync auf meinen Backup-Server synchronisiert. Für meine Backup-Lösung braucht man nicht zwingend einen Backup-Server. Mit rsync kann man auch auf dem lokalen Rechner Dateien und Verzeichnisse synchronisieren.
Das tolle an meinem Skript ist, dass ich verschiedene Versionen von meinen Daten habe. Wenn ich eine Datei lösche und dann mein Backup starte, wird diese Datei auf dem Backup-Server nicht gelöscht! Dies geschieht mit Hardlinks. Das geniale daran ist, dass nur die neuen Daten neuen Platz auf der Harddisk beanspruchen. Obwohl ich über 10 mal die selbe Datei gesichert habe, wird deren Speicherplatz nur einmal belegt.
Voraussetzung
Meine Backuplösung basiert auf diversen Bash-Skripten. Diese müssen mit den nötigen Rechten ausgeführt werden können. Will man die Daten auf einen Server sichern, benötigt man dort ein SSH-Login. Am einfachsten geht dies mit Public-/Private-Keys, damit man nicht jedes mal ein Passwort eingeben muss.
Als Client benutze ich mein Lenovo Thinkpad T61 Notebook und mein Asus EEEPC 1000H Netbook, welche beide mit Arch Linux laufen. Bei meinem Backup-Server handelt es sich um eine Asus EEEBOX, welche mit Debian 5.0 läuft. Das Backup-Skript sollte jedoch auf jedem Linux lauffähig sein.
Übersicht
Hier eine kleine übersicht über mein Backup-Konzept:
[caption id="attachment_139" align="alignnone" width="300" caption="Backup-Konzept"][/caption]
Komponenten
Mein Backup-Script benötigt folgende Komponenten:
install: Installiert die Verzeichnisstruktur für die Backups auf dem Server/Computer
crontab: Die Einträge in der Crontab rufen das Backup-Script auf dem Server auf. Dies kann aber auch manuell gemacht werden.
backup: Dieses Skript kopiert die Backup Ordner und ermöglicht so eine Versionierung
syncup: Mit diesem Skript werden meine Daten auf den Server synchronisiert
syncup.conf: Wird syncup ohne Parameter aufgerufen, werden die in dieser Datei angegebenen Dateien und Verzeichnisse gesichert.
Installation
Das Installationsskript install erstellt folgende Ordner:
backupdata: Hier werden die zu sichernden Daten abgespeichert
daily_1 bis daily_7: Eine Version der Daten von den letzten sieben Tagen
weekly_1 bis weekly_4: Eine Version der Daten von den letzten vier Wochen
monthly_1 bis monthly_12: Eine Version der Daten von den letzten zwölf Monaten
yearly_1 bis yearly_5: Eine Version der Daten von den letzten fünf Halbjahren
Folgendes Skript erstellt mir die Ordnerstruktur:
#!/bin/bash
################################################################
#
# install
# Erstellt die Verzeichnisse fuer backup
#
# Copyright 2010 Emanuel Duss
# Licensed under GNU General Public License
#
# 2009-12-05; Emanuel Duss; Erste Version
#
################################################################
################################################################
# Main
cd /media/backup/backup/
# Ordner fuer die Synchronisation
mkdir backupdata
# Ordner fuer taegliche Backups
for i in `seq 1 7`
do
mkdir daily_$i
done
# Ordner fuer woechentliche Backups
for i in `seq 1 4`
do
mkdir weekly_$i
done
# Ordner fuer monatliche Backups
for i in `seq 1 12`
do
mkdir monthly_$i
done
# Ordner fuer halbjaehrliche Backups
for i in `seq 1 5`
do
mkdir yearly_$i
done
# EOF
Synchronisation
Das Skript syncup synchronisiert die als Parameter angegebene Verzeichnisse und Dateien auf meinen Backup-Server. Werden keine Parameter angegeben, werden die Dateien und Verzeichnisse aus dem Konfigurationsfile syncup.conf gesichert. Will man keinen Backup-Server nutzen, sondern eine lokale Sicherung durchführen (z. B. auf eine externe Festplatte), lässt man bei der Variable BACKUPPATH den Hostnamen weg.
#!/bin/bash
################################################################
#
# syncup
# Synrchonisiert die Backup-Daten
#
# Copyright 2009 Emanuel Duss
# Licensed under GNU General Public License
#
# 2009-12-07; Emanuel Duss; Erster Entwurf
# 2009-12-15; Emanuel Duss; Erste produktive Version
# 2010-01-17; Emanuel Duss; rsync --progress
# 2010-09-14; Emanuel Duss; $BACKUPSRV, prepare () für mount
# 2010-10-06; Emanuel Duss; rycnc -h (Human)
# 2010-11-25; Emanuel Duss; Nutze Parameter als Quellverzeichnis
# 2010-11-27; Emanuel Duss; Mehrere Verzeichnisse und Konfigfile
#
################################################################
################################################################
# Variabeln
TIMESTAMP="`date +%Y-%m-%d_%H-%M-%S`"
HOSTNAME="`uname -n`"
RSYNC="/usr/bin/rsync"
RSYNC_PARAMETER="-avhz --progress --delete"
BACKUPSRV="emanuel@eeebox"
BACKUPPATH="$BACKUPSRV:/media/backup/backup/backupdata/$HOSTNAME/"
CONFIGFILE="`dirname $0`/syncup.conf"
################################################################
# Main
# Lege die zu sichernden Files fest
if [ -n "$*" ]
then
SOURCE=`echo $* | awk '{ gsub("/ "," "); gsub("/$",""); print }'`
elif [ -e "$CONFIGFILE" ]
then
echo "Konfigurationsfile: $CONFIGFILE"
SOURCE=`grep -E "^[^#]" $CONFIGFILE | tr "\n" " " | awk '{ gsub("/ "," "); gsub("/$",""); print }'`
else
echo "Usage:"
echo "syncup [ Verzeichnisse und Dateien ]"
echo ""
echo "Wird kein Parameter angegeben, wird das Konfigfile $CONFIGFILE verwendet."
exit 1
fi
# Info ausgeben
echo
echo "Source: $SOURCE"
echo "Target: $BACKUPPATH"
echo
# Backup-HD mounten
ssh $BACKUPSRV "sudo mount /media/backup"
# Dateien synchronisieren
$RSYNC $RSYNC_PARAMETER $SOURCE $BACKUPPATH
# Backup-HD umounten
ssh $BACKUPSRV "sudo umount /media/backup"
# EOF
Entweder wird das Skript direkt mit ./syncup im aktuellen Verzeichnis aufgerufen, oder man platziert es in einen Ordner, der in der $PATH-Variable eingetragen ist (z. B. /usr/local/bin). Jetzt kann dieses Skript in der Konsole aufgerufen werden:
emanuel@discordia:~
$ sudo syncup Daten/ /etc/ /var/www
Source: /etc
Target: emanuel@eeebox:/media/backup/backup/backupdata/discordia/
sending incremental file list
etc/openvpn/client.conf
880 100% 175.78kB/s 0:00:00 (xfer#1, to-check=539/1389)
sent 47.16K bytes received 219 bytes 31.59K bytes/sec
total size is 6.02M speedup is 127.00
Ich muss das Skript mit den nötigen Rechten aufrufen. Das Verzeichnis /etc ist nur durch den User root vollständig lesbar. Deshalb rief ich das Skript mit sudo auf. Für eigene Verzeichnisse ist dies nicht nötig.
Die Daten befinden sich jetzt im Ordner backupdata auf dem Backup-Server.
Das File syncup.conf sieht folgendermassen aus:
################################################################
#
# syncup.conf
# Konfigurationsdatei fuer syncup
#
# Copyright 2010 Emanuel Duss
# Licensed under GNU General Public License
#
# 2010-11-27; Emanuel Duss; Erste Version
#
################################################################
# Verzeichnisse
/home/emanuel/Daten
/home/emanuel/.config
/home/emanuel/.filezilla
/home/emanuel/.ssh
/home/emanuel/.vim
# Files
/home/emanuel/.conkyrc
/home/emanuel/.bashrc
/home/emanuel/.exrc
/home/emanuel/.fehrc
/home/emanuel/.history
/home/emanuel/.muttrc
/home/emanuel/.screenrc
/home/emanuel/.vimrc
/home/emanuel/.vimperatorrc
/home/emanuel/.xinitrc
/home/emanuel/.Xdefaults
/home/emanuel/.smbcredentials*
# Systemdaten
/etc
#EOF
Wenn syncup ohne Parameter aufgerufen wird, werden alle Dateien und Verzeichnisse aus diesem Konfigurationsfile gesichert:
emanuel@discordia:~
$ sudo syncup
Konfigurationsfile: /home/emanuel/Daten/Scripts/syncup.conf
Source: /home/emanuel/Daten /home/emanuel/.config /home/emanuel/.filezilla
/home/emanuel/.ssh /home/emanuel/.vim /home/emanuel/.conkyrc /home/emanuel/.bashrc
/home/emanuel/.exrc /home/emanuel/.fehrc /home/emanuel/.history /home/emanuel/.muttrc
/home/emanuel/.screenrc /home/emanuel/.vimrc /home/emanuel/.vimperatorrc
/home/emanuel/.xinitrc /home/emanuel/.Xdefaults /home/emanuel/.smbcredentials* /etc
Target: emanuel@eeebox:/media/backup/backup/backupdata/discordia/
sending incremental file list
etc/openvpn/up.sh
453 100% 0.00kB/s 0:00:00 (xfer#1, to-check=540/393538)
sent 6.34M bytes received 32.75K bytes 296.59K bytes/sec
total size is 73.20G speedup is 11479.75
Backup
Die Daten wurden erst auf den Server synchronisiert. Wenn man eine Datei auf der Workstation löschen würde, dann wäre diese bei der nächsten Synchronisation ebenfalls gelöscht. Darum erstelle ich pro Tag, Woche, Monat und Halbjahr eine Kopie aller Daten. Dies erledigt mein Backup-Server. Da ich hierfür Hardlinks verwende, wird bei jeder Kopie kein weiterer Speicherplatz beansprucht. Lediglich neue Daten beanspruchen neuen Speicherplatz. Das ist genial!
Das Backup-Skript sieht folgendermassen aus:
#!/bin/bash
################################################################
#
# backup
# Backup mit Hardlinks
#
# Copyright 2009 Emanuel Duss
# Licensed under GNU General Public License
#
# 2009-10-22; Emanuel Duss; Erster Entwurf
# 2009-12-05; Emanuel Duss; Erste produktive Version
# 2010-04-27; Emanuel Duss; Logfile in /var/log
#
################################################################
################################################################
# Variabeln
BACKUPDIR=/media/backup/backup
LOGFILE=/var/log/backup.log
TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`
################################################################
# Funktionen
usage ()
{
echo "Usage:
backup ( daily | weekly | monthly | yearly )"
}
################################################################
# Backup-Funktionen
daily ()
{
rm -r $BACKUPDIR/daily_7
mv $BACKUPDIR/daily_6 $BACKUPDIR/daily_7
mv $BACKUPDIR/daily_5 $BACKUPDIR/daily_6
mv $BACKUPDIR/daily_4 $BACKUPDIR/daily_5
mv $BACKUPDIR/daily_3 $BACKUPDIR/daily_4
mv $BACKUPDIR/daily_2 $BACKUPDIR/daily_3
mv $BACKUPDIR/daily_1 $BACKUPDIR/daily_2
mkdir $BACKUPDIR/daily_1
cp -al $BACKUPDIR/backupdata/* $BACKUPDIR/daily_1
}
weekly ()
{
rm -r $BACKUPDIR/weekly_4
mv $BACKUPDIR/weekly_3 $BACKUPDIR/weekly_4
mv $BACKUPDIR/weekly_2 $BACKUPDIR/weekly_3
mv $BACKUPDIR/weekly_1 $BACKUPDIR/weekly_2
mkdir $BACKUPDIR/weekly_1
cp -al $BACKUPDIR/backupdata/* $BACKUPDIR/weekly_1
}
monthly ()
{
rm -r $BACKUPDIR/monthly_12
mv $BACKUPDIR/monthly_11 $BACKUPDIR/monthly_12
mv $BACKUPDIR/monthly_10 $BACKUPDIR/monthly_11
mv $BACKUPDIR/monthly_9 $BACKUPDIR/monthly_10
mv $BACKUPDIR/monthly_8 $BACKUPDIR/monthly_9
mv $BACKUPDIR/monthly_7 $BACKUPDIR/monthly_8
mv $BACKUPDIR/monthly_6 $BACKUPDIR/monthly_7
mv $BACKUPDIR/monthly_5 $BACKUPDIR/monthly_6
mv $BACKUPDIR/monthly_4 $BACKUPDIR/monthly_5
mv $BACKUPDIR/monthly_3 $BACKUPDIR/monthly_4
mv $BACKUPDIR/monthly_2 $BACKUPDIR/monthly_3
mv $BACKUPDIR/monthly_1 $BACKUPDIR/monthly_2
mkdir $BACKUPDIR/monthly_1
cp -al $BACKUPDIR/backupdata/* $BACKUPDIR/monthly_1
}
yearly ()
{
rm -r $BACKUPDIR/yearly_5
mv $BACKUPDIR/yearly_4 $BACKUPDIR/yearly_5
mv $BACKUPDIR/yearly_3 $BACKUPDIR/yearly_4
mv $BACKUPDIR/yearly_2 $BACKUPDIR/yearly_3
mv $BACKUPDIR/yearly_1 $BACKUPDIR/yearly_2
mkdir $BACKUPDIR/yearly_1
cp -al $BACKUPDIR/backupdata/* $BACKUPDIR/yearly_1
}
################################################################
# Main
echo "$TIMESTAMP Backup $1 start" >> $LOGFILE 2>&1
case $1 in
daily|weekly|monthly|yearly)
mount /media/backup
$1 >> $LOGFILE 2>&1
umount /media/backup
;;
*)
usage
exit 1
;;
esac
echo "$TIMESTAMP Backup $1 done" >> $LOGFILE 2>&1
# EOF
Kurze Erklärung: Der älteste Ordner wird gelöscht. Dann werden alle um eins verschoben. Das Herzstück vom ganzen Backup verbirgt sich hinter der Option -l von cp. Diese Option erstellt lediglich einen Hardlink von allen Dateien. Dies ist das tolle daran. Bei der Kopie mit cp -al src dst wird kein weiterer Speicherplatz auf dem Speichermedium belegt!
Backups erstellen
In der Crontab, welche mit sudo crontab -e aufgerufen wird, erstelle ich folgende Einträge:
# Backup
# Backup daily; 1:30h
30 1 * * * /usr/local/bin/backup daily
# Backup weekly; Montag, 2:00h
0 2 * * 1 /usr/local/bin/backup weekly
# Backup monthly; 1. Tag 4:00h
0 4 1 * * /usr/local/bin/backup monthly
# Backup yearly; 31. Dezember 3:00h
0 3 31 12 * /usr/local/bin/backup yearly
Jetzt werden zu bestimmten Zeiten die vberschiedenen Backups durchgeführt. Natürlich kann man die Befehle auch von Hand ausführen. Jedoch vereinfachen die Cronjobs diese Aufgabe erheblich!
Überwachung
Im Logfile können wir uns über den Status informieren:
emanuel@eeebox:~
$ tail /var/log/backup.log
2010-11-25_23-31-55 Backup daily start
2010-11-25_23-31-55 Backup daily done
Ich sehe keine Fehlermeldung. Das Backup hat funktioniert!
Restore
Ein Backup ist ohne erfolgreichen Restore gar nichts wert! Das restoren ist sehr einfach. Man kann einfach den gewünschten Ordner oder die gewünschte Datei zurückkopieren. Man muss gar nichts beachten!
emanuel@eeebox:/media/backup/backup/weekly_2/discordia
$ scp -r Daten/ discordia:/tmp/
Download
Hier könnt ihr alle Dateien als Archiv herunterladen: backup_emanuelduss.tar
Schluss
Wenn man das Backup einmal eingerichtet hat, hat man eine sehr zuverlässige Lösung um seine Daten zu sichern. Ich rate jedem an, seine Daten regelmässig zu sichern und auch den Restore durchzuspielen! Das Logfile sollte regelmässig nach Fehlern durchsucht werden, um die integrität aller Backup-Daten festzustellen.
Für Anmerkungen, Kritik und Verbesserungsvorschläge bin ich jederzeit dankbar und offen! Man lernt schliesslich nie aus!
Viel Spass mit euren Backups.