Startseite --> Hilfen & Technische Artikel --> Codeschnipsel --> Perl: Lesbare Dateirechte

Perl: Lesbare Dateirechte

Wenn man mit einer Unix-Shell arbeitet und in einem beliebigen Verzeichnis ls -l eingibt, bekommt man aufgelistet, welche Dateien sich in diesem Verzeichnis befinden. Zusätzlich bekommt man noch wertvolle Informationen - zum Beispiel die Dateigröße, das Änderungsdatum und die Rechte. Die Rechte werden dabei typischerweise in einer Form wie rw-r--r-- angegeben, damit sie für einen Menschen einigermaßen verständlich sind.

Wenn man über irgendeine Programmiersprache an die Rechte einer Datei kommen will, bekommt man diese aber als Zahl, in der jeweils Bits für bestimmte Rechte gesetzt sind. Diese Zahlen sind für einen Menschen natürlich nicht verständlich. Natürlich kann man beispielsweise mit sprintf() diese Zahl in eine Oktalzahl umwandeln - die oktale Schreibweise dieser Zahlen dürfte nämlich für die meisten Menschen schon verständlicher sein, wenn sie sich mit dem chmod()-Befehl auskennen. Aber es ist auch möglich, diese Zahl in eine Zeichenkette umzuwandeln, wie sie von ls -l bekannt ist. Die folgende Funktion, die im Rahmen des Dev-Editor-Projektes entstanden ist, macht es möglich. Sie erkennt neben den normalen Rechten auch, ob das SetUID-, das SetGID- und das Sticky-Bit gesetzt sind. Der Dateityp, wie es von ls -l bekannt ist, wird allerdings nicht ermittelt.

sub mode_string($)
{
 my $mode   = shift;
 my $string = '';

 # User

 $string  = ($mode & 00400) ? 'r' : '-';
 $string .= ($mode & 00200) ? 'w' : '-';
 $string .= ($mode & 00100) ? (($mode & 04000) ? 's' : 'x') :
                               ($mode & 04000) ? 'S' : '-';

 # Group

 $string .= ($mode & 00040) ? 'r' : '-';
 $string .= ($mode & 00020) ? 'w' : '-';
 $string .= ($mode & 00010) ? (($mode & 02000) ? 's' : 'x') :
                               ($mode & 02000) ? 'S' : '-';

 # Other

 $string .= ($mode & 00004) ? 'r' : '-';
 $string .= ($mode & 00002) ? 'w' : '-';
 $string .= ($mode & 00001) ? (($mode & 01000) ? 't' : 'x') :
                               ($mode & 01000) ? 'T' : '-';

 return $string;
}

Zunächst wird die leere Zeichenkette $string angelegt. Sie wird später die vollständige Rechteangabe enthalten. Anschließend wird die Zahl mit den Rechteangaben darauf geprüft, ob die einzelnen Bits gesetzt sind. Damit es etwas überschaubarer ist, wird die Oktalschreibweise für diese Bits verwendet. Was die einzelnen Bits jeweils bedeuten, können Sie der Man-Page von chmod() entnehmen. Das Ergebnis dieser Prüfung ist entweder ein Buchstabe, der anzeigt, ob das jeweilige Bit gesetzt ist oder ein Bindestrich, wenn es nicht gesetzt wurde. Dieser Buchstabe wird an das Ende der Zeichenkette $string angehängt. Wenn alle relevanten Bits überprüft wurden, wird die fertige Zeichenkette zurückgegeben.

Nutzen können Sie die Funktion beispielsweise folgendermaßen:

my @stat = stat("MeineDatei");
print mode_string($stat[2]);

So würden Sie die Rechte von MeineDatei als lesbare Zeichenkette ausgeben.

Startseite --> Hilfen & Technische Artikel --> Codeschnipsel --> Perl: Lesbare Dateirechte