Die c’t erklärt in dem online verfügbaren Artikel „Fotofallen“ aus Heft 21/12, was man alles beachten sollte, wenn man Fotos – auch eigene – ins Netz stellt. So ist beispielsweise so gut wie immer ein Copyright- oder Quellen-Hinweis direkt am Bild erforderlich. Und auch bei selbstgemachten Fotos muss man prüfen, ob nicht etwa etwas geschütztes im Bild zu sehen ist.
diff aus 2x STDOUT
Man kann bei diff
normalerweise nur einen der beiden Datei-Parameter durch ein „-“ ersetzen, um diese Daten vom Standard-Input zu lesen. Was aber, wenn man die Ausgaben von zwei Programmen vergleichen und man diese nicht in Dateien zwischenspeichern will?
Bei commandlinefu.com fand ich die Lösung:
diff <( cmd1 ) <( cmd2 )
Man kann also prima die Ausgabe von zwei Greps auf ps vergleichen, um die User zu finden, bei denen ein Programm nicht gestartet ist:
diff <( ps -ef | grep 'bin/anel' | sort | cut -c 1-8 ) \n <( ps -ef | grep 'script/start_aws' | sort | cut -c 1-8 )
Skip der ersten Zeile wenn leer
Heute hatte ich das Problem, eine leere Ausgabe des Programms „zip“ zu unterdrücken, damit Cron mir keine Mail schickt, wenn es nichts zu zippen gibt.
Findet zip nichts, was es einpacken kann, bekommt man die folgende Meldung:
/usr/bin/zip -r /tmp/test.zip . -t `date -d "-1 days" +%Y-%m-%d` -i "*/bearbeitet/*" zip error: Nothing to do! (/tmp/test.zip)
Die Zeile mit „Nothing to do!“ lässt sich ja noch einfach mit einem grep unterdrücken, aber wie werde ich die Leerzeile davor los? Ein
| tail +2
bewirkt zwar, dass die Ausgabe erst ab der zweiten Zeile erfolgt – leider auch dann, wenn zip etwas zu tun bekommt. Also muss perl ran:
more testdaten | perl -n -e 'print $_ unless ( $. == 1 && /^$/ )'
Dies unterdrückt die erste Zeile nur, wenn sie leer ist, wobei weitere Leerzeilen nicht ausgefiltert werden.
Der ganze Aufruf sieht dann so aus:
/usr/bin/zip -r /tmp/test.zip . -t `date -d "-1 days" +%Y-%m-%d` -i "*/bearbeitet/*" 2>&1 | \n perl -n -e 'print $_ unless /zip error: Nothing to do/ || ( $. == 1 && /^$/ )'
Login und Befehlseingaben an telnet pipen
Durch eine Meldung von Command Line Magic bin ich dahinter gekommen, wie man Befehlseingaben per Pipe an telnet überträgt. Damit gelingt sogar ein Login.
(sleep 3;echo user1;sleep 1;echo geheimnis;sleep 1;echo "ls -l";sleep 5)|telnet 192.168.0.1
Das ist recht nützlich für Scripte, wenn das Gegenüber kein ssh kann.
Windows Netzwerkpasswort löschen/ändern
Hat man z.B. einen Netzwerkdrucker auf seinem Windows-Rechner eingebunden und ändert sich das Passwort für diese Verbindung, kann man auf den Drucker nicht mehr zugreifen. Bislang musste ich dann den Drucker immer löschen und wieder neu einrichten, was natürlich ziemlich lästig ist, wenn die IT-Abteilung einen zwingt, alle 21 Tage das Passwort zu ändern. Nun habe ich aber in dem Beitrag Windows Netzwerkpasswort löschen/ändern auf intelligensbestien.de die Lösung gefunden: Start -> Ausführen -> control userpasswords2 -> Reiter Erweitert -> Kennwörter verwalten.
Passwörter sicher in Webanwendungen speichern
Im Artikel Cracker-Bremse auf heise.de ist sehr gut erklärt, wie man es in eigenen Webanwendungen anstellt, die Passwörter der User sicher zu speichern. Inklusive Hintergründe und Einführung in Phpass (auf Seite 4).
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.
- Getestet habe ich Firefox 3.6, IE6 – 8, Safari 5 (Win), Konqueror 4.1.3 ↩