Immer größere Datenmassen sicher zu speichern ist eine Herausforderung für jede IT-Infrastruktur. Schon mit Gigabit-Ethernet lassen sich aber ... (mehr)

Bibliotheksrecherche

Die Aufrufe von »getuid()« und »getgid()« bringen die User und die Group-ID des Benutzers in Erfahrung, der das Programm gestartet hat. Dagegen liefern »geteuid()« und »geteguid()« die effektiven User- und Group-IDs zurück, unter denen das Programm tatsächlich läuft, zum Beispiel wenn der Benutzer »sudo« verwendet hat. Es folgt wieder eine Reihe von Open- und Stat-Aufrufen für Systemverzeichnisse und Perl-Bibliotheken, von denen jedoch die meisten -1 zurückgeben, weil – wie gesagt – eine ganze Reihe von Verzeichnissen und Dateien durchsucht wird.

Irgendwann wird schließlich der Perl-Interpreter aufgerufen. Zeile 10 in Listing 2 sucht den Pfad zur ausführbaren Perl-Datei, indem sie die Pseudo-Datei des Proc-Dateisystems »/proc/self/exe« und als zweites Argument einen Pointer auf den Puffer für das Ergebnis übergibt. Im Strace-Log ist schon das Ergebnis »/usr/bin/perl« zu sehen. Der Rückgabewert ist die Länge des geschriebenen Puffers, also hier jene 13 Bytes, die der String »/usr/bin/perl« einnimmt.

Der Aufruf von »getppid()« liefert umstandslos die ID des laufenden Prozesses. Die folgende Read-Operation auf dem File Handle 3 liest schließlich den Quelltext des Perl-Skripts, wie man in den Klammern sehen kann (Zeile 12). Auch hier ist das zweite Argument des Open-Aufrufs ein Pointer auf einen Buffer, in dem die C-Library das Ergebnis ablegt.

Lesen und schreiben über File Handles

Listing 3 zeigt die Zeilen der Strace-Ausgabe, die sich um die Strict-Anweisung im Perl-Code kümmern. Eine Reihe von Suchversuchen schlägt fehl, bis schließlich mit dem Stat-Aufruf in Zeile 4 das passende Perl-Modul »/usr/share/perl/5.8/strict.pm« gefunden ist. Listing 4 zeigt das Öffnen und anschließende Lesen aus dieser Datei. Hier ist gut zu erkennen, wie die Lese- und Seek-Operationen den Wert 4 als File Handle verwenden, den der Open-Aufruf in Zeile 1 zurückgegeben hat.

Listing 4

Perl-Modul lesen

01 open("/usr/share/perl/5.8/strict.pm", O_RDONLY) = 4
02 ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff6a1bd900) = -1 ENOTTY (Inappropriate ioctl fo
03 r device)
04 lseek(4, 0, SEEK_CUR)                   = 0
05 read(4, "package strict;\n\n$strict::VERSIO"..., 4096) = 599
06 lseek(4, 598, SEEK_SET)                 = 598
07 lseek(4, 0, SEEK_CUR)                   = 598
08 close(4)                                = 0

Listing 3

Perl-Modul gesucht

01 stat("/etc/perl/strict.pmc", 0x7fff6a1bdcb0) = -1 ENOENT (No such file or directory)
02 stat("/etc/perl/strict.pm", 0x7fff6a1bdb70) = -1 ENOENT (No such file or directory)
03 ...
04 stat("/usr/share/perl/5.8/strict.pm", {st_mode=S_IFREG|0644, st_size=599, ...}) = 0

Wenn das Einlesen der Skriptdatei und der nötigen Bibliotheken abgeschlossen ist, startet der Perl-Interpreter seine Arbeit. Die schlägt sich allerdings nicht im Strace-Log nieder, denn das protokolliert eben nur Systemaufrufe, also Sprünge vom Userspace in den Kernel, und die sind beim Übersetzen des Perl-Skripts in Maschinencode nicht nötig.

Das Ergebnis dieses Ablaufs zeigt sich erst in Zeile 4 von Listing 5. In Zeile 2 ist noch das abschließende Lesen des Skripts zu sehen, das dazu führt, dass die Datei in Zeile 3 geschlossen wird. Zeile 4 gibt schließlich mit Systemmitteln, das heißt einem Systemaufruf von »write()« , den String "Hello, Perl!\n" aus.

Listing 5

Ende des Perl-Trace

01 ...
02 read(3, "", 4096)                       = 0
03 close(3)                                = 0
04 write(1, "Hello, Perl!\n", 13)          = 13
05 exit_group(0)                           = ?

Das war ziemlich viel Aufwand für eine so einfache Sache, aber immerhin haben Sie nun einen kleinen Einblick davon bekommen, was hinter den Kulissen so alles abläuft. Gleich sehen Sie, was passiert, wenn man statt eines Perl-Skripts ein in C geschriebenes Programm mit Strace analysiert.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Zertifikatsmanagement mit Certmonger

Zertifikate werden dazu verwendet, um Benutzer, Services und Hardware mit der Hilfe eines signierten Schlüssels zu verifizieren. Hierfür existieren Public-Key-Infrastrukturen (PKI). Aber wie gelangen die Zertifikate eigentlich auf das Ziel-Gerät? Der Open-Source-Tipp in diesem Monat beschreibt, wie Sie für diese Aufgabe das Tool certmonger verwenden können. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Linux-Distro

Welche Linux-Distribution setzen Sie vorwiegend auf dem Server ein?

  • Arch Linux
  • CentOS
  • Debian
  • Fedora
  • openSUSE
  • Oracle Linux
  • Red Hat Enterprise Linux
  • SUSE Linux Enterprise Server
  • Ubuntu
  • andere Linux-Distribution
  • FreeBSD
  • OpenBSD

Google+

Ausgabe /2017

Microsite