Posts mit dem Label shell werden angezeigt. Alle Posts anzeigen
Posts mit dem Label shell werden angezeigt. Alle Posts anzeigen

17.09.2011

Linux: Logdateien als normaler Benutzer lesen

Jedesmal ein su oder sudo voranzusetzen, weil man /var/log/messages lesen oder verfolgen will kann nervig sein, zu dem braucht man das root-passwort, vor allem muss man es ständig eintippen:

~> sudo tail -fn200 /var/log/messages
Passwort:

Das nervt!

Dem kann man zwar abhelfen, in dem man jedermann Leserechte gibt, aber dies ist auch nicht gerade "ideal" - oft wird man das aus Gründen der Sicherheit nicht wollen.

Und es geht auch besser: Hier die Schritt-für Schritt-Anleitung:

1. Installieren Sie das Paket "facl". Ob das installiert ist kann man mit setfacl --help feststellen. Das Programm wird gefunden? Dann ist die Installation bereits erfolgt.

2. Überprüfen Sie, ob die Option "acl" in /etc/fstab für das Mounten der Partition gesetzt ist. Wenn nicht tragen Sie das nach. Das sieht zum Beispiel so aus:
/dev/disk/by-id/ata[...]-part5 / ext4 acl,user_xattr,noatime 1 1

3. Danach können Sie mittels
~# mount -o remount /

die Partition mit dem neuen Parameter laden. Natürlich kann man auch neu booten (aber dann hätte man auch gleich ein rebootfreundliches Win.... installieren können :)

4. Setzen Sie jetzt einmalig das Leserecht für den Benutzer:
~# fsetacl -m BENUTZERNAME:r /var/log/messages

Erhalten Sie keine Fehlermeldung, so können Sie davon ausgehen, dass dies funktioniert hat. Sind Sie dennoch unsicher, so probieren Sie:
~# fgetacl /var/log/messages

Sieht die Ausgabe so aus:
# file: var/log/messages
# owner: root
# group: root
user::rw-
user:BENUTZERNAME:r--
group::r--
mask::r--
other::---

... dann ist alles bestens.

5. Das genügt aber noch nicht,

denn das Systemprogramm logrotate legt die Datei mit einer gewissen Regelmäßigkeit neu an - und Sie wollen den Vorgang doch nicht mit einer, von der Konfiguration Ihres Linux abhängigen Häufigkeit wiederholen.

Logrotate kann Ihnen aber auch helfen.

Und ich lasse mir gerne von meinem Computer bei Problemen helfen, die ich ohne ihn nicht hätte: Auf meinen System (OpenSuSE-Desktop) öffne ich mit root-Rechten die Datei /etc/logrotate.d/syslog mit einem geeigneten Editor:

~# vi /etc/logrotate.d/syslog

und suche folgenden Abschnitt, ergänze den um die fett ausgegebene Zeile:
/var/log/warn /var/log/messages [...] {
compress
dateext
maxage 365
rotate 99
missingok
notifempty
size +4096k
create 640 root root
sharedscripts
postrotate
/etc/init.d/syslog reload > /dev/null
/usr/bin/setfacl -m BENUTZERNAME:r /var/log/messages
endscript
}

Fertig! Natürlich kann ich das für beliebige Logfiles wiederholen. Weitere Hilfe gibt es mit ~> info setfacl, ~> info getfacl (oder in meinem Aufsatz "Benutzerrechte: Access-Control-Lists (ACL) unter_Linux" - PDF) oder mit ~>info logrotate.

13.01.2011

Kein KDE-Sendfax / ksendfax mehr

Viele Benutzer aktueller Linuxversionen, die z.B. mit einer guten, alten ISDN-Karte von AVM Faxe via capisuitefax versenden wollen, werden das Programm KDE-Sendfax vermissen.

Ich mache das deshalb mit folgender, minimalistischer Lösung:
------------------------------------------
#!/bin/sh
echo 'Versenden von:';
echo $*;
echo '';
echo 'Abbrechen mit [STRG]+[c] ... oder';
echo -n 'Faxnummer? ';
read nummer;
capisuitefax -d "$nummer" "$*";
echo -n "Enter zum Beenden";
read ende;
------------------------------------------
Gespeichert unter ~/bin/MyFax und dann im Dateimanager mit Postscript- und PDF-Dateien verknüpft (Ausführen in Terminal!) tut es sein Werk. Will ich mehrere Dokumente (z.B. einen Antrag mit Anlagen) auf einmal versenden, dann hilft mir das PDF-Toolkit (pdftk) mit dem ich mehrere PDF-Dateien (nicht nur) zusammenfügen kann.

Bild: Einrichtung mit Konqueror 4.4.4

13.02.2010

Über den richtigen Umgang mit wget

Aufgabe: Nächtliches Abholen einer großen Datei von einem Webserver.
Problem: Der Webserver hustet, die DSL-Leitung möchte gerade nicht - also alle möglichen Arten von Störungen. Wer will daneben sitzen bleiben?

Ein einfaches wget [URL] kam nicht in Betracht... Lösung: Man baue wget in eine Schleife ein. Diese überprüfe den Rückgabewert, warte im Falle eines (beliebigen) Fehlers und versuche das ganze erneut:
while ! wget http://example.org/; do sleep 600; done
Da aber auch eine begonnene Übertragung abbrechen kann macht es Sinn, diese wieder aufzunehmen. Dafür gibt es die Option -c:
while ! wget -c http://example.org/;
do sleep 600;
done
So sieht das aus und ist, da es ein "Einzeiler" ist, auch als Cron-Job oder at-Job gut zu verwenden. Möglicherweise sollten Ausgaben noch nach /dev/null umgeleitet werden.
while ! wget -c http://example.org/ 1> /dev/null 2> /dev/null;
do sleep 600;
done
Der Wert hinter sleep gibt die Anzahl der Sekunden an, die gewartet wird. Ich hielt 600, also 10 Minuten, für sinnvoll. Gelegentlich macht es Sinn, den Speicherort festzulegen. Dies besorgt die Option -O
while ! wget -cO /tmp/example.org_index \
http://example.org/ 1> /dev/null 2> /dev/null;
do sleep 600;
done
Verwendung als Batch-Datei: (hole_url, am besten in ~/bin/hole_url):
#! /bin/sh
echo -e "\n\n";

if ! test -n "$1"; then
echo "Fatal: Keine Quelle angegeben.
Rufen Sie das Skript mit der Angabe einer Dateiquelle auf.
Beispiel: $0 \"http://example.org/\"
Sie können auch ein Ziel angeben.
Beispiel: $0 \"http://example.org/\" \"/tmp/index\"
";
exit;
fi

username=`whoami`;
skriptname=`echo $0 | tr -d '[:cntrl:]' | tr -d './|'`;
lockfile="/tmp/$username-$skriptname-lockfile";

if ! test -f $lockfile;
then touch $lockfile;
fi

aktiv=`grep "$1" $lockfile|wc -l`;

if test "0" != "$aktiv"; then
echo "Fatal: Für die Ressorce \"$1\" besteht bereits ein Auftrag.
Wenn Sie der Auffassung sind, dass dies nicht zutreffend ist,
dann löschen Sie den Eintrag in $lockfile.

Das Programm wird mit Fehlercode 1 beendet.
";
exit 1;
fi

if test -z "$2"; then
echo $1 >> $lockfile;
while ! wget -c "$1" 1>> ~/wget.log 2>> ~/wget.log; do
sleep 600;
done
echo -e "Die Ressource \"$1\" wurde geholt und gespeichert.\n\n";
lockfileInhhalt=`grep -v "$1" $lockfile`;
echo $lockfileInhhalt > $lockfile;
exit 0;
fi

if test -x "$2"; then
echo "Fatal: Das Ziel \"$2\" existiert bereits und ist ausführbar.
Dieses Programm weigert sich aus gutem Grund ausführbare Dateien zu
überschreiben.

Das Programm wird mit Fehlercode 2 beendet.
";
exit 2;
fi

if test -f "$2" ;then
if test ! -w "$2"; then
echo "Fatal: Das Ziel \"$2\" kann nicht geschrieben werden.
Lösung: Überprüfen Sie die Rechte.

Das Programm wird mit Fehlercode 3 beendet.
";

fi
fi

if test "force" != "$3" -a "continue" != "$3"; then
if test -f $2; then
echo "Fatal: Das Ziel \"$2\" existiert bereits.
* Wenn Sie das Ziel überschreiben wollen geben sie als drittes
Argument \"force\" an.
* Wenn Sie einen abgebrochenen Download fortsetzen wollen,
geben sie als drittes Argument \"continue\" an.
Beispiel: \"$0 $1 $2 force\"

Das Programm wird mit Fehlercode 4 beendet.
";
exit 4;
fi

else

if test -f "$2" -a "force" = "$3"; then
echo "Das Ziel \"$2\" wird gelöscht.";
rm -- "$2";
fi

echo -e "Die Ressource \"$1\" wurde geholt und
als \"$2\" gespeichert.\n\n";
fi

echo $1 >> $lockfile;

while ! wget -cO "$2" "$1" 1>> ~/wget.log 2>> ~/wget.log;
do
sleep 600;
done
lockfileInhhalt=`grep -v "$1" $lockfile`;
echo $lockfileInhhalt > $lockfile;
exit 0;

Letzte Aufgabe: bestimmter Zeitpunkt:

Ist der at-Dienst aktiv (feststellbar mit ps -C atd) kann natürlich mit
echo "hole_url http://example.org/" | at 0400
auch am nächsten Morgen ab 4 Uhr versucht werden die Datei zu holen.