Thread Best practice zu Dateiberechtigungen (21 answers)
Opened by bianca at 2020-04-03 09:39

haj
 2020-04-06 10:26
#191707 #191707
User since
2015-01-07
527 Artikel
BenutzerIn

user image
2020-04-06T06:09:40 bianca
Das heißt, du würdest sysopen und mkdir ohne Angabe der Berechtigungen nutzen? Würde in diesem Fall bedeuten, dass Dateien 0660 bekommen. OK das ginge.

Ich würde in nahezu allen Fällen open nutzen und nicht sysopen und mkdir ohne Berechtigungen nutzen. Das war übrigens auch das, was Raubtier empfohlen hatte.

2020-04-06T06:09:40 bianca
Aber wie genau ist das jetzt mit umask? Was macht das genau?

Das hatten sowohl Raubtier als auch ich schon mal beschrieben, da gehen mir so langsam die Worte aus. Hier ein letzter Versuch: Alle Berechtigungen, die in der umask drinstehen, werden von denen entfernt, die Du bei sysopen und mkdir angibst. Du hast eine umask von 0007, in Buchstaben: ------rwx, also werden bei mkdir und sysopen alle Berechtigungen entfernt, die Du für "others" angegeben hast.

2020-04-06T06:09:40 bianca
Wofür genau hatte ich die ganzen Id's ermittelt?

Wie komme ich denn jetzt zu einem Script, dass diese ganzen Schritte für mich macht?

Diese Ids sagen Dir, ob Deine CGI-Skripte unter Deiner Benutzerkennung laufen oder nicht. Denn wenn sie unter Deiner eigenen Benutzerkennung ablaufen, kannst Du die Berechtigungen für andere abdrehen. Die sind somit für Dein Skript wichtiger als alle Ausprobiererei.

2020-04-06T06:09:40 bianca
Kann mit bitte jemand sagen, wie die Syntax für sysopen lauten muss, wenn ich die Berechtigung aus einer Variable beziehe. if (sysopen my $dath,$dateiname,O_RDWR|O_EXCL|O_CREAT,$datber) {...} geht ja nicht. Aber wie muss in dieser Zeile der Parameter $datber richtig lauten, damit die Datei z. B. mit 755 angelegt wird?

Zum wiederholten Mal: Das kannst Du nicht, weil Dir Deine umask ------rwx aus rwxr-xr-x ein rwxr-x--- macht. Wenn Du gezielt eine Datei mit 0755 anlegen willst, dann musst Du entweder vorher die umask ändern, oder nach dem Anlegen der Datei mit chmod die Berechtigung auf 0755 setzen.

2020-04-06T06:09:40 bianca
Mit dieser Zeile hier: my @berechttest = (0644,0755);foreach my $test (@berechttest){sysopen my $fh,"$ENV{DOCUMENT_ROOT}/test$test.txt",O_RDWR|O_EXCL|O_CREAT,$test;} bekommen die Dateien 0640 und 0750, wenn ich das per FTP anschaue. Warum? Warum nicht 0644 und 0755?

Siehe oben. umask wirkt. Vielleicht verstehst Du's ja anhand dieser Beispiele.

2020-04-06T06:09:40 bianca
In den Dateinamen steht 420 und 493. Warum? Wieso macht Perl aus 0644 im String eine ganz andere Zahl? Ist das allein wegen der führenden Null in der Definition? Hat das seine Richtigkeit? Ist das in anderen Sprachen auch so? Ich bin darüber eigentlich ziemlich erschrocken, was man im Dezimalsystem mit einer führenden Null anrichten kann.

Das ganze gibt's schon in den Programmiersprache C, Pascal und Java. Und ja, es hat seine Richtigkeit.
Code: (dl )
perl -E "say 'Die Zahlen sind gleich' if 0644 == 420"

Eine führende Null in einem Literal bedeutet in diesen Programmiersprachen, dass die Zahl eben nicht im Dezimalsystem, sondern im Oktalsystem zu lesen ist. Der Wikipedia-Eintrag Wikipedia:Oktalsystem weist auch darauf hin, dass die führende Null als Kennzeichnung "zu schwer zu entdeckenden Flüchtigkeitsfehlern führen kann".

Wenn Du die Zahl an Deinen Dateinamen dranhängst, dann gibt Perl sie so aus, wie Perl eben Zahlen ausgibt: Im Dezimalsystem. Wenn Du es im Oktalsystem haben willst, dann brauchst Du printf und das %o-Format.

2020-04-06T06:09:40 bianca
Mit my @berechttest = ('0644','0755');foreach my $test (@berechttest){sysopen my $fh,"$ENV{DOCUMENT_ROOT}/test$test.txt",O_RDWR|O_EXCL|O_CREAT,$test;} bekommen sie S200 und S360??

Sorry: Hier fängst Du nun wirklich an, herumzustochern. In keiner Dokumentation steht, dass Du die Berechtigungen als Strings angeben kannst. Mach sowas nicht. Bei Strings wirkt die schwarze Magie der führenden Null nicht und Du verfütterst die Dezimalzahlen 644 und 750 als Modus. 644 ist in Oktal 01200, Du erzeugst also eine Datei namens test0644.txt mit --w------T

2020-04-06T06:09:40 bianca
Und mit my @berechttest = ('0644','0755');foreach my $test (@berechttest){sysopen my $fh,"$ENV{DOCUMENT_ROOT}/test$test.txt",O_RDWR|O_EXCL|O_CREAT,sprintf("%04o",$test);} kommt G260 und G520 raus. Für mich wird das immer schlimmer.

Ja, das wird schlimmer. Mit sprintf("%04o",'0644') erzeugst Du einen String '1204'. Den interpretiert Perl dezimal als 1204, und sysopen macht daraus --w-rwSr--.

Das ist alles so schräg wie Oktalzahlen nun eben mal sind, aber eben auch so beschrieben. Wenn Du Oktalzahlen vermeiden willst, dann nimm die Konstanten von CPAN:Fcntl: 0644 entspricht S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, und umask 027 kannst Du auch schreiben als umask S_IWGRP | S_IROTH | S_IWOTH | S_IXOTH oder kürzer umask S_IWGRP | S_IRWXO.

View full thread Best practice zu Dateiberechtigungen