LPI-Prüfungsvorbereitung LPIC-2

> # Sonstige Programmiertechniken

> ### Rückgabewerte überprüfen

> Wenn innerhalb eines Scripts ein Befehl aufgerufen wurde, so kann es für den weiteren Ablauf sehr wichtig sein, ob der Befehl erfolgreich war oder nicht. Diese Frage beantworten uns die Rückgabewerte (exit-codes). Jedes Programm gibt dem Betriebssystem einen ganzzahligen Rückgabewert zurück, wenn es abgeschlossen ist. Ist dieser Wert 0, dann bedeutet es eine fehlerfreie Beendigung des Programms, in allen anderen Fällen bedeutet es einen Fehler.

> Das Programm test beispielsweise nutzt diese Fähigkeit, um be stimmte Tests durchzuführen und die Ergebnisse als Rückgabewert (0 bedeutet Test war erfolgreich also wahr) zurückzuliefern.

> Die Shell kennt drei Methoden, diesen Rückgabewert zu analysieren:

> - Die Variable $?
>   Die Variable `$?` enthält immer den Rückgabewert des letzten ausgeführten Programms. Sie kann nach dem Aufruf eines Programms z.B. mit der if-Bedingungsüberprüfung abgefragt werden:

>         ...
>         Programm
>         if [ $? -eq 0 ]
>         then
>           ...       # Programm war erfolgreich
>         fi

>   Sobald ein anderes Programm abgelaufen ist, hat die Variable `$?` aber bereits einen anderen Wert, den des neuen Programms eben.

> - Verknüpfung zweier Programme mit &&
>   Wenn zwei Programme mit zwei direkt aufeinanderfolgenden Ampersands (&)verknüpft werden, so wird das zweite Programm nur ausgeführt, wenn das erste mit Rückgabewert 0 abgeschlossen wurde.

> - Verknüpfung zweier Programme mit ||
>   Wenn zwei Programme mit zwei direkt aufeinanderfolgenden Pipe-Symbolen (||)verknüpft werden, so wird das zweite Programm nur ausgeführt, wenn das erste mit Rückgabewert ungleich 0 abgeschlossen wurde.

> Eine häufig benutzte Zeile, die die dritte Möglichkeit ausnutzt ist

>       test -x /usr/bin/foo || exit

> Wenn das Programm `/usr/bin/foo` nicht existiert und ausführbar ist, wird das Script mit `exit` beendet.

> ### Mail an root unter bestimmten Bedingungen

> Ein Script wird häufig automatisch abgearbeitet auch wenn kein User am Terminal anwesend ist. Wenn es jetzt eine Meldung an den Benutzer oder den Systemverwalter ausgeben will, bleibt nur das Mail-System. Oder es soll eine Nachricht an den Systemverwalter abschicken, wenn bestimmte Bedingungen erfüllt sind, auch hier ist die E-Mail die beste Methode. Dazu existiert der Befehl mail.

> Dieser Befehl schickt eine Mail mit bestimmter Titelzeile an eine bestimmte Adresse. Die Mail selbst wird entweder aus einer Datei oder aus einem Here-Dokument von der Standard-Eingabe gelesen. Im Script ist die Form des Here-Documents am verbreitetsten:

>       mail  -s Titel Adresse  <<EOM
>         Beliebige Textzeilen
>       EOM

> Alles, was zwischen den beiden EOMs steht, wird an die angegebene Adresse per Mail verschickt. Beinhaltet der Titel Leerzeichen, so muß er in Anführungszeichen gesetzt werden. Als Adresse für den Systemverwalter kann einfach `root` eingegeben werden:

>       #!/bin/bash
>       Auslastung=`df /dev/hda1| grep ^/ |cut -c52-54`
>       if [ $Auslastung -gt 90 ]
>       then
>         mail -s "Alarm: Platte bald voll" root <<EOM
>           Hallo Systemverwalter. Die Platte /dev/hda1 ist bald voll.
>           Sie ist zu $Auslastung Prozent belegt.
>           Mach was!!!
>         EOM
>       fi

> Es können aber auch Programme direkt ihre Ausgaben an mail weiterpipen, also etwa

>       df | mail -s "Ausgabe von df" root

> In beiden Fällen wird eine Mail an root verschickt, im ersten Beispiel, wird eine Warnung an root weitergegeben, wenn die Platte `/dev/hda1` voller als 90% ist, im zweiten wird einfach die Ausgabe von df gemailt.

> ### Speicherort von Scripts

> Scripte sind nur dann ausführbar, wenn sie innerhalb des Suchpfades liegen. Bei der Wahl einer geeigneten Stelle für eigene Scripts sollte unterschieden werden, wofür sie gedacht sind.

> Soll nur der Systemverwalter diese Scripts ausführen dürfen, dann empfiehlt es sich,

> 1. die Scripts entweder in `/usr/local/sbin` oder `/root/bin` abzuspeichern. Beide Verzeichnisse liegen nur im Suchpfad des Systemverwalters.
> 2. die Zugriffsmodi auf 700 zu setzen (`rwx---`), und dafür zu sorgen, dass sie root gehören. Somit kann sie nur root ausführen.

> Sollen sie aber von allen Usern ausführbar sein, so sollten sie nach `/usr/local/bin` gelegt werden und den Zugriffsmodus 755 (`rwxr-xr-x`) besitzen. `/usr/local/bin` ist im Suchpfad aller User.

> Grundsätzliche Vorsicht ist mit der Verwendung des SUID-Bits angeraten. Die Shell reagiert aber seit einigen Jahren sehr vorsichtig darauf und bezieht sich ihre Informationen über die Identität nicht aus der Effektiven UID sondern aus der echten UID. Ältere Versionen können hier aber erhebliche Schwierigkeiten machen\dots{}

> [ Zurück ] [ Zurück zur Startseite LPI 201 ] [ Zurück zur LPI-Seite ] [ Zurück zur Hauptseite von Linux-Praxis ] [ Guestbook ] [ Kontakt ]

> Diese und die darunterliegenden Seiten wurden erstellt von F. Kalhammer

> © 2001 by F.Kalhammer - all rights reserved.