Magic SysRq keys benutzen

Wenn ein Linux-System nicht mehr reagiert, ist der Reset-Knopf nur die letzte, aber nicht die einzige Option. Sollte man noch Zugang zum betroffenen System haben, können über das im Linux-Kernel integrierte sysrq-Interface Befehle übergeben werden.

Der Kernel muss mit Unterstützung für sysrq (CONFIG_MAGIC_SYSRQ) übersetzt worden sein. Im /proc-Dateisystem existiert dann der Eintrag sysrq-trigger.

Wenn Sie Zugriff auf die Console des Systems haben, betätigen Sie die Tastenkombination [Alt]-[Druck] ([S-Abf]). Danach können Sie mit einer weiteren Taste den gewünschten Befehl ausführen.
Es folgt eine der Kernel-Dokumentation entnommenen Liste der unterstützten Befehle.

  • ‘r’ – Turns off keyboard raw mode and sets it to XLATE.
  • ‘k’ – Secure Access Key (SAK) Kills all programs on the current virtual console. NOTE: See important comments below in SAK section.
  • ‘b’ – Will immediately reboot the system without syncing or unmounting your disks.
  • ‘c’ – Will perform a kexec reboot in order to take a crashdump.
  • ‘d’ – Shows all locks that are held.
  • ‘o’ – Will shut your system off (if configured and supported).
  • ‘s’ – Will attempt to sync all mounted filesystems.
  • ‘u’ – Will attempt to remount all mounted filesystems read-only.
  • ‘p’ – Will dump the current registers and flags to your console.
  • ‘t’ – Will dump a list of current tasks and their information to your console.
  • ‘m’ – Will dump current memory info to your console.
  • ‘n’ – Used to make RT tasks nice-able.
  • ‘v’ – Dumps Voyager SMP processor info to your console.
  • ‘w’ – Dumps tasks that are in uninterruptable (blocked) state.
  • ‘x’ – Used by xmon interface on ppc/powerpc platforms.
  • ’0′-’9′ – Sets the console log level, controlling which kernel messages will be printed to your console. (’0′, for example would make it so that only emergency messages like PANICs or OOPSes would make it to your console.)
  • ‘f’ – Will call oom_kill to kill a memory hog process.
  • ‘e’ – Send a SIGTERM to all processes, except for init.
  • ‘g’ – Used by kgdb on ppc platforms.
  • ‘i’ – Send a SIGKILL to all processes, except for init.
  • ‘h’ – Will display help (actually any other key than those listed above will display help. but ‘h’ is easy to remember :-)

Beim Zugriff aus der Ferne senden Sie als Benutzer root die Befehle an /proc/sysrq-trigger. Mit echo s > /proc/sysrq-trigger weisen Sie Linux an, seine Puffer auf die Festplatten zurückzuschreiben (“sync”). Wenig später können mit [e] die laufenden Prozesse beendet werden (“SIGTERM”); Prozesse, die diesem Befehl nicht Folge leisten werden mit [i] erledigt (“SIGKILL”). Danach können Sie mit echo u > /proc/sysrq-trigger alle Dateisysteme read-only remounten und mit echo b > /proc/sysrq-trigger einen Reset auslösen.

Wer eine serielle RemoteConsole an einem entfernten Server nutzt, kann mitunter über spezielle Tastenkombinationen Befehle an sysrq zu übergeben. Bei der RemoteConsole von STRATO-Servern ist über die Tastenfolge [~]-[b]-[r]-[e]-[a]-[k] und einer weiteren Taste ein Befehl ausführen.

Damit die sysctl-Schnittstelle nicht mißbraucht wird, gibt es einen Schutzmechanismus: Erst wenn in /proc/sys/kernel/sysrq ein Wert größer als 0 eingetragen ist, reagiert das System überhaupt auf den Tastendruck oder die Ausgaben nach /proc/sysrq-trigger. Gegebenenfalls müssen Sie die Funktion erst mit echo 1 > /proc/sys/kernel/sysrq einschalten.

Fehlersuche bei CGI-Skripten (Perl)

Kann ein CGI-Skript nicht ausgeführt werden, zeigt der Browser einen Fehler 500 “Internal Server Error” an. Diese Meldung gibt nur an, dass ein Fehler aufgetreten ist. Die Ursache bleibt unbekannt.

Als Erstes sollte geprüft werden, ob die Datei “ausführbar” ist, also die Zugriffsrechte der Datei das eXecutiable-Bit gesetzt haben. Die Zugriffsrechte sollten “-rwxr-xr-x” oder 755 lauten. Die Zugriffsrechte können mit den meisten FTP-Programmen oder über den SSH-Zugang mit dem Kommando chmod 755 /pfad/zur/datei.cgi geändern werden.

Sind die Zugriffsrechte in Ordnung, muss der Skriptcode geprüft werden. Die erste Zeile eines Perl-Skripts muss das Shebang sein. Die Shebang-Zeile enthält den Pfad zum Perl-Interpreter. In vielen Fällen ist das /usr/bin/perl.

Weitere Einschränkungen können durch fehlerhafte Zeichencodierung auftreten. Enthält das Skript Windows-Zeilenumbrüche, kann es nicht ausgeführt werden. In diesem Fall ist die Datei vorher mit Unix-Zeilenumbrüchen zu konvertieren. Eine solche Funktion wird von vielen Texteditoren angeboten.
Einschränkungen können auch auftreten, wenn die Datei per FTP als Binary übertragen wurde. Die Skriptdatei muss im ASCII-Modus übertragen werden.

Damit ein Perl-Skript Ausgaben an den Browser ausliefern kann, muss der Content-type übermittelt werden.

print “Content-type: text/html\n\n;

Diese Zeile sollte möglichst zu Beginn des Skripts, aber auf jeden Fall vor der ersten Ausgabe erfolgen.
Der Content-type kann auch auf anderen Wegen übermittelt werden. Macht das Skript etwa vom Modul CGI Gebrauch, kann der Content-type mit der Funktion header() übergeben werden.

Einfache Beispiele für Perl-CGI-Skripte:

#!/usr/bin/perl
print “Content-type: text/html\n\n;
print “Hello, world!”;

#!/usr/bin/perl
use CGI;
my $query = new CGI;
my $message = “Hello, world!”;
print $query->header,
      $query->start_html( -title=>$message ),
      $query->p( $message ),
      $query->end_html;

Sind alle diese Bedingungen erfüllt, muss eine fehlerhafte Anweisung im Skript verantwortlich für den “Internal Server Error” sein. Die Einschränkung sollte zu einer Fehlermeldung des Perl-Interpreters führen, die aber leider nicht im Browser angezeigt wird. Dieses Verhalten lässt sich unterdrücken, indem im Skript mit der folgenden Zeile Perl angewiesen wird, Fehlermeldungen an den Browser auszuliefern:

use CGI::Carp qw( fatalsToBrowser );

Hat man SSH-Zugriff kann das Skript direkt auf der Shell ausgeführt werden und die Fehlermeldung wird auch ohne oben genannte Änderung ausgegeben.

Eine Syntax-Prüfung kann auf der Shell mit folgendem Kommando durchgeführt werden:

perl -c /pfad/zum/skript.cgi

Das folgende Skript demonstriert die Ausgabe einer Fehlermeldung an den Browser. In der letzten Zeile wird Perl angewiesen 1 durch 0 zu teilen. Die Division durch Null ist unzulässig und Perl liefert eine Fehlermeldung:

#!/usr/bin/perl
use CGI::Carp qw( fatalsToBrowser );
print “Content-type: text/html\n\n;
print “Hello, world!”;
print “Division durch Null: “ . 1/0;

Ohne die zweite Zeile wäre die Ausgabe nur der Fehler 500 “Internal Server Error”.
Anhand der Fehlermeldung sollte es nun möglich sein, den Fehler im Skript zu finden und zu beheben.

Eigene Perl-Module auf STRATO Webhosting installieren

Wenn man eigene Perl-Module in STRATO Webhosting-Paketen nutzen möchte, kann man diese selbst installieren.
Das Array @INC enthält die Verzeichnisse, in denen Perl nach Modulen sucht, die über Skripte nachgeladen werden sollen. Das Array enthält auch das Verzeichnis ‘.’, das das aktuelle Verzeichnis repräsentiert.

Dies ermöglicht es dem Benutzer, ausgehend vom Skriptpfad, Module nachzuinstallieren. Die folgende Anleitung beschreibt anhand des CPAN-Moduls CGI::Session die Installation eigener Module.
Wenn man auf der Suche nach einer bestimmten Funktion ist, kann diese vielleicht bei CPAN, einer Suchmaschine für Perl-Module gefunden werden.
Holen und entpacken Sie das Modul CGI::Session.

Üblicherweise befindet sich im Archiv ein Verzeichnis /lib, das Unterverzeichnisse mit den Moduldateien enthält. In diesem Fall liegt in /lib das Verzeichnis CGI.
Der Pfad zum Perl-Modul ergibt sich aus seinem Namen: Das Modul CGI::Session muss im Verzeichnis ./CGI/Session.pm liegen. (Ein Modul Test::Example::Hello müsste unter ./Test/Example/Hello.pm abgelegt werden.) Es ist auf jeden Fall die Großkleinschreiben zu beachten.

Kopieren Sie diese Verzeichnisse in das Verzeichnis /cgi-bin auf Ihrem Webspace. Das Modul ist jetzt installiert und kann nun aus Ihren Skripten heraus aufgerufen werden. Erstellen Sie ein kleines Testskript mit folgendem Inhalt:

#!/usr/bin/perl58
use CGI::Session;
$session = new CGI::Session();
$CGISESSID = $session->id();
print $session->header();

Wenn Sie das Skript auf der Shell ausführen, werden Sie sehen, dass ein Cookie erzeugt wurde:

> ./session.cgi
Set-Cookie: CGISESSID=7d070ddee98d8287ed1827b9e37391c0; path=/
Date: Tue, 05 Jun 2007 13:08:57 GMT
Content-Type: text/html; charset=ISO-8859-1

Das Modul wurde erfolgreich installiert und kann benutzt werden.