STDERROR in eine Variable umleiten

In einem Script verkette ich mehrere Befehle, was aber den Nachteil hat, dass sich für die Fehlerbehandlung nur der Exit-Wert des äußeren Befehls auswerten lässt. Hier die Zeile, um die es geht:

sudo -u backup ssh root@${RECHNER} "~/sbin/do_SSHbackup" > $BACKUPDIR/${RECHNER%%.*}/${AKTDATE}.tgz || OK=NOK

Hier wird die Variable OK nur auf NOK gesetzt, wenn z.B. sudo fehlschlägt oder das Zielverzeichnis nicht existiert. Wirft jedoch das per SSH aufgerufene Script do_SSHbackup einen Fehler, so bekommt die Variable OK nichts davon mit. Auf dem Standardfehlerkanal landet jedoch eine Fehlermeldung.

Wenn ich nun die Ausgabe der Fehlermeldungen in einer Variablen sammeln und diese auswerten könnte, wäre ein Abfangen des Fehlers möglich. Aber wie, ohne dabei den Standardausgabekanal zu beeinflussen? Nach ein wenig „Googleei“ fand ich die Lösung bei stackoverflow.com.

OUTPUT=$( { sudo -u backup ssh root@${RECHNER} "~/sbin/do_SSHbackup" > $BACKUPDIR/${RECHNER%%.*}/${AKTDATE}.tgz; } 2>&1 ) || OK=NOK

Somit bekomme ich alle Fehlermeldungen in die Variable OUTPUT, welche ich im Nachgang auswerten kann:

if [ "$OK" != "OK" -o -n "$OUTPUT" ] ; then
  echo "$OUTPUT">&2
  ...
fi

Adobe-Reader Installationsdateien

Die Links zur Installation des (Acrobat) Adobe Reader, die man so im Netz findet, führen alle zur Adobe-Seite und dort zu einem Installer, der die eigentliche Installation aus dem Netz nach lädt. Das nützt einem aber nichts, wenn man den Reader auf einem Rechner installieren will, der gar keinen Zugang zum Internet hat.

Aber bei chip.de findet sich in den Kommentaren der Hinweis auf ftp://ftp.adobe.com/pub/adobe/reader/win/. Hier gibt es aktuelle und ältere Versionen des Windows-Installers zum Download. Installer für andere Betriebssysteme (z.B. Linux, Mac) findet man unter ftp://ftp.adobe.com/pub/adobe/reader/.

krdc: RDP mit Domänen-Angabe

Bei KDE gibt es ja auch krdc, den „Verbindungsclient zu Fremdrechner“, mit dem man sich wunderbar per Remote-Desktop-Protokoll (RDP) auf Windows-Rechner verbinden kann. Ich nutze das täglich, u.a. wegen des guten Vollbild-Modus. Der ist nämlich beim Kommandozeilen-Tool rdesktop leider nicht so gut. Dafür hat rdesktop eine Option -d, mit der man die Windows-Domäne angeben kann.

Aber man kann das auch mit krdc erreichen in dem man die Domäne vor den Benutzernamen stellt und beide Teile durch zwei Backslashs trennt:

krdc --fullscreen rdp://Domaene\\klaus.meier@192.168.1.2

Will man das in einem Desktop-Icon eintragen, so muss man die beiden Backslashs verdoppeln, hat dann also vier davon:

Exec=krdc --fullscreen rdp://Domaene\\\\klaus.meier@192.168.1.2

Webtool: Browsergröße ändern

Ich bin heute über einen Link gestolpert, mit dem man mal eben das Browserfenster auf verschiedene Größen einstellen kann: resizeMyBrowser.

Gut, das kann der Webdeveloper-Toolbar auch, aber der o.g. hat diverse Größen für mobile Geräte parat und funktioniert – ohne eine Installation – auf verschiedenen Browsern1. Das ist nicht ganz unwichtig, wenn man das mal nicht auf seinem eigenen Rechner nutzen will, um jemanden etwas vorzuführen.

Einzig die Einstellung „Maximum“ funktioniert nicht ganz zufriedenstellend. Hier öffnet sich – je nach Einstellung des Popup-Blockers – ein neues Browserfenster.

  1. Getestet habe ich Firefox 3.6, IE6 – 8, Safari 5 (Win), Konqueror 4.1.3

Perl: Einen Hash aus einer Datei befüllen

Manchmal muss man eine Liste aus einer Datei einlesen, weil man nach Elementen aus dieser Liste suchen möchte. Hier bietet es sich an, die Daten in einen Hash einzulesen. Und das geht erfreulich einfach mit:

open LIST, '<', $nodefile or die "Cannot open '$nodefile' $!";
my %nodelist = map /^([^;]+)\s*;\s*(.+)\s*$/, <LIST>;
close LIST;

Man öffnet die Datei zum Lesen und map macht den Rest. In der Datei sind die Werte durch ein Semikolon getrennt (CSV-Datei). Hat man ein Gleichheitszeichen als Trenner, dann sieht die Zeile so aus:

my %nodelist = map /^([^=]+)\s*=\s*(.+)\s*$/, <LIST>;

Hier das Ganze als komplettes Perl-Skript:

#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Std;

my $nodefile;
my %option;
my $usage = "USAGE: $0 -N filename\n";

unless(getopts("N:", \%option)) {
 die "$usage";
}
if(defined $option{N}) {
 $nodefile = $option{N};
} else {
 die "$usage";
}

open LIST, '<', $nodefile or die "Cannot open '$nodefile' $!";

my %nodelist = map /^([^;]+)\s*;\s*(.+)\s*$/, <LIST>;

close LIST;

for my $entry ( sort keys %nodelist ) {
 print "$entry: $nodelist{$entry}\n";
}

Dateien mit Sym- oder Hardlinks finden

Symlinks finden

Das Verlinken von Dateien oder Verzeichnissen per Symlink ist eine prima Sache. Schwierig wird es nur, wenn man Dateien löscht oder verschiebt, auf die Symlinks zeigen. Diese laufen dann nämlich ins Leere. Um zu prüfen, ob es Symlinks auf eine Datei oder ein Verzeichnis gibt, nutz man das folgende Kommando:

find / -type l -print | xargs ls -ld | grep 'dateiname'

Das kann ich auch verwenden, wenn ich z.B. ein Verzeichnis verschieben will und nicht weiß, ob es Links auf Dateien oder Unterverzeichnisse im fraglichen Verzeichnis gibt. Ich setze dann als ‚dateiname‘ den Namen des Verzeichnisses ein, das ich verschieben will.

Siehe auch http://www.grymoire.com/Unix/Find.html#uh-6

Hardlinks finden

Mitunter benutzt man auch Hardlinks, um Dateien zu verlinken (z.B. Backup mit rsync, wie in der c’t 07/2009, S. 212 beschrieben). Hat man nun eine Datei, bei der man anhand des Linkcount erkennt, dass sie Hardlinks hat, will man evt. auch wissen, wo die anderen Links liegen. Mit

find . ! -type d -links +1 -ls|sort -n

findet man alle Dateien, deren Linkcount größer 1 ist. Durch die Sortierung anhand des Inodes (erste Spalte) kann man gut zusammengehörende Dateien erkennen.

Will man für eine Bestimmte Datei die zugehörigen Links finden, geht das auch so:

f=`ls -i dateiname |awk '{print $1}'`
find / -inum $f

Siehe auch: The UNIX and Linux Forums: search for hardlinks based on filename via find command.

Videos der ZDF-Mediathek mit Linux speichern

Dieser Tage lief wieder ein sehr interessanter Beitrag im ZDF, den ich leider aus zeitlichen Gründen nicht sehen konnte. Zum Glück konnte ich ihn zwei Tage später in der ZDF-Mediathek finden. Aber leider ruckelte der Stream sehr stark, so dass ich ihn so nicht sehen wollte. Nach einiger Recherche im Netz und ein paar nicht so erfolgreichen Versuchen, den Stream mit dem VLC zu speichern, fand ich meine Lösung in einem Blog-Artikel von Stefan Waidele.

Hier die Kurzfassung:

  1. Beitrag in der Mediathek finden.
  2. Oben rechts auf die HTML-Version wechseln und dann den 2000er Mediaplayer-Link kopieren.
  3. Den kopierten Link in den folgenden Einzeiler einbauen, warten, fertig!
curl VIDEO-URL | grep mms: | cut -d \" -f 2 | xargs -n1 mplayer -dumpstream -dumpfile DATEINAME.wmv

Zum Betrachten muss man nicht zwangsläufig den MPlayer benutzen, das geht dann auch wieder mit dem VLC.

Sicherlich kann man zum Aufzeichnen auch den VLC benutzen, aber ich hatte bislang weder die Zeit noch die Lust, mich mit den vielen und verwirrenden Kommandozeilen-Optionen des VLC auseinander zu setzen. Aber vielleicht hat ja jemand einen Tipp.

Die freigegebenen Ordner herausfinden

Manchmal hat man es mit einem mehr oder weniger unbekannten Windowssystem (oder Samba) zu tun und möchte nun wissen, welche Freigaben es auf diesem Ordner gibt und welche Ordner das lokal sind.

Auf einem aktuellen Windows-Rechner ist das sehr einfach in der Konsole zu ermitteln:

NET SHARE

zeigt mir alle Freigabennamen (Shares), die Resourcen (Ordner) und die Beschreibungen dazu an.

Auf einem Samba-System gibt es zwar auch die NET-Tools, diese unterscheiden sich aber von den windowseigenen Befehlen. So zeigt mir das Kommando

net share -l

auf einem Linux-Rechner mit laufenden Samba zwar die Freigabenamen (Share names) und die Beschreibungen dazu an, nicht aber die lokalen Ordner.

Open-Office: Dezimale Stunden oder Minuten im Zeit-Format anzeigen

Ich habe immer mal wieder das Problem, dass ich in Open-Office dezimale Stunden oder Minuten berechne und diese dann aber in einem menschlichen Format angezeigt haben möchte.

Also aus 3 * 0,3 Std wird 0,9 Std., dies soll aber als 0:54 angezeigt werden (also 54 Minuten, 0 Stunden).

Oder ich addiere Minuten, erhalte 104 und möchte das nun als 01:44 sehen.

Dies geht in Open-Office mit der nicht ganz so offensichtlich dafür geeigneten Funktion ZEIT. Dabei muss man den Stunden- oder den Minutenwert an die entsprechende Stelle der Parameterliste stellen und die anderen Felder mit 0 belegen.

Für die Stunden Geschichte von oben sieht das dann so aus: =ZEIT(0,9;0;0) oder =ZEIT(3*0,3;0;0).

Und bei den 104 Mituten erhält man die richtige Anzeige mit =ZEIT(0;104;0).

Natürlich kann man anstelle der direkten Zahlen hier auch Zellbezüge einsetzen.