Filehandles, αρχεία, κατάλογοι

umask#

Θέτει ή διαβάζει τη μάσκα mode δημιουργίας αρχείων της διεργασίας.

Η umask ελέγχει ποια bits δικαιωμάτων καθαρίζονται από το όρισμα MODE κάθε κλήσης δημιουργίας αρχείου ή καταλόγου που κάνει αυτή η διεργασία από εδώ και στο εξής. Είναι ιδιότητα της εκτελούμενης διεργασίας, όχι κάποιου συγκεκριμένου filehandle, και κληρονομείται από τις θυγατρικές διεργασίες. Καλέστε umask EXPR για να εγκαταστήσετε νέα μάσκα και να λάβετε την προηγούμενη· καλέστε σκέτη umask για να διαβάσετε την τρέχουσα μάσκα χωρίς να την αλλάξετε.

Σύνοψη#

umask EXPR
umask

Τι επιστρέφεται#

Η προηγούμενη umask ως ακέραιος, ώστε να μπορείτε να την αποθηκεύσετε και να την επαναφέρετε αργότερα:

my $old = umask 0077;
# ... create private files ...
umask $old;

Η σκέτη umask επιστρέφει την τρέχουσα μάσκα χωρίς να την αλλάξει. Αν το σύστημα δεν διαθέτει κλήση umask(2) και ο καλών προσπαθεί να περιορίσει την πρόσβαση για τον εαυτό του ((EXPR & 0700) > 0), εγείρεται εξαίρεση· αν η κλήση δεν είναι υλοποιημένη και ο καλών δεν περιορίζει τη δική του πρόσβαση, επιστρέφεται undef. Σε Linux αυτή η περίπτωση δεν προκύπτει.

Πώς εφαρμόζεται η μάσκα#

Η μάσκα είναι αφαιρετική. Κάθε bit που είναι ενεργό στη umask καθαρίζεται από το MODE που περνιέται στις mkdir, sysopen, open σε λειτουργίες δημιουργίας, και στις υποκείμενες κλήσεις συστήματος creat(2) / mkdir(2). Τα πραγματικά δικαιώματα του νέου αρχείου είναι MODE & ~umask.

Δικαίωμα Unix όπως rwxr-x--- είναι τρία σύνολα τριών bits, ή τρία οκταδικά ψηφία - 0750. Το αρχικό 0 σηματοδοτεί την κυριολεκτική τιμή ως οκταδική και δεν είναι το ίδιο ψηφίο δικαιωμάτων. Η umask γράφεται με τον ίδιο τρόπο και κατονομάζει τα bits που θέλετε απενεργοποιημένα για νεοδημιουργημένα αρχεία.

Επεξεργασμένο παράδειγμα. Με umask 0022, ζητώντας από την sysopen το 0666 στην πραγματικότητα δημιουργείται αρχείο με mode 0644:

  0666  &~  0022   =   0644
  rw-rw-rw-    ----w--w-      rw-r--r--

Με umask 0027 (η ομάδα δεν μπορεί να γράψει, οι άλλοι δεν μπορούν να διαβάσουν, να γράψουν ή να εκτελέσουν), το ίδιο αίτημα 0666 αποδίδει 0640 (0666 & ~0027 == 0640).

Καθολική κατάσταση που επηρεάζει#

Η ίδια η μάσκα είναι καθολική σε επίπεδο διεργασίας κατάσταση πυρήνα που τίθεται μέσω της umask(2). Η umask δεν διαβάζει ούτε γράφει άμεσα καμία ειδική μεταβλητή της Perl, αλλά κάθε κλήση δημιουργίας στη διεργασία την παρατηρεί, και η $! τίθεται από τις υποκείμενες κλήσεις συστήματος που καταναλώνουν τη μάσκα (mkdir, sysopen, open), όχι από την ίδια την umask. Θυγατρικές διεργασίες που δημιουργούνται μέσω fork, exec ή system κληρονομούν την τρέχουσα τιμή.

Παραδείγματα#

Εγκαταστήστε μάσκα που κρύβει το αρχείο από όλους εκτός του ιδιοκτήτη, διατηρώντας την προηγούμενη τιμή για επαναφορά:

my $old = umask 0077;
open my $fh, ">", "secret.txt" or die "open: $!";
# secret.txt is created mode 0666 & ~0077 == 0600
close $fh;
umask $old;

Διαβάστε την τρέχουσα μάσκα χωρίς να την αλλάξετε - χρήσιμο για καταγραφή ή διαγνωστικά:

printf "current umask: %04o\n", umask;      # e.g. "current umask: 0022"

Τυπικές τιμές που μπορείτε να περάσετε - αυτές είναι οι τρεις μάσκες που στην πραγματικότητα χρησιμοποιούνται στην πράξη:

umask 0022;   # group + other: read/execute, no write   (default on most systems)
umask 0027;   # group: read/execute; other: nothing
umask 0077;   # owner-only; nothing for group or other

Αλλαγή με εμβέλεια γύρω από μπλοκ κώδικα που δημιουργεί αρχεία. Η umask δεν έχει δική της μαγεία local - αποθηκεύστε και επαναφέρετε ρητά:

sub write_private_file {
    my ($path, $data) = @_;
    my $old = umask 0077;
    open my $fh, ">", $path or do {
        umask $old;
        die "open $path: $!";
    };
    print $fh $data;
    close $fh;
    umask $old;
}

Οκταδική κυριολεκτική τιμή έναντι συμβολοσειράς - μια συνηθισμένη παγίδα. Η umask είναι αριθμός, όχι συμβολοσειρά οκταδικών ψηφίων. Η ανάγνωσή της από διαμόρφωση απαιτεί την oct:

my $from_config = "0027";                   # string
umask oct $from_config;                     # correct: 0027 as a number
umask $from_config;                         # WRONG: decimal 27 == 033 octal

Οριακές περιπτώσεις#

  • Η σκέτη umask σε περιβάλλον λίστας εξακολουθεί να επιστρέφει έναν μόνο ακέραιο. Η συνάρτηση έχει βαθμωτή τιμή.

  • Αρνητικές ή εκτός εύρους τιμές μασκάρονται στα εννέα χαμηλής τάξης bits δικαιωμάτων από τον πυρήνα· επιβιώνουν μόνο τα bits 0777. Το πέρασμα 0777 απενεργοποιεί όλα τα δικαιώματα σε κάθε νεοδημιουργημένο αρχείο, κάτι που σχεδόν ποτέ δεν είναι αυτό που θέλετε.

  • Η umask δεν επηρεάζει υπάρχοντα αρχεία. Φιλτράρει μόνο το όρισμα MODE κλήσεων δημιουργίας. Για να αλλάξετε τα δικαιώματα ενός υπάρχοντος αρχείου χρησιμοποιήστε την chmod.

  • Η umask δεν επηρεάζει την open για υπάρχον αρχείο - το άνοιγμα αρχείου που υπάρχει ήδη δεν εφαρμόζει ξανά τη μάσκα. Εφαρμόζεται μόνο όταν δημιουργείται αρχείο (O_CREAT στη sysopen, ή λειτουργίες >/>>/+> που δημιουργούν νέα διαδρομή στην open).

  • Κληρονομικότητα σε fork/exec. Τα παιδιά ξεκινούν με την τρέχουσα umask του γονέα. Η ρύθμιση της μάσκας πριν από system ή exec αλλάζει το περιβάλλον που κληρονομεί το παιδί· επαναφέρετέ την μετά, αν ο γονέας εξακολουθεί να ενδιαφέρεται.

  • Threads. Η umask είναι ιδιότητα ανά διεργασία στον πυρήνα, οπότε σε συστήματα όπου τα threads της Perl μοιράζονται διεργασία (η συνηθισμένη περίπτωση) κάθε thread βλέπει την ίδια μάσκα. Η αλλαγή της σε ένα thread την αλλάζει για όλα.

  • Η umask(2) δεν είναι υλοποιημένη. Το POD τεκμηριώνει διαδρομή εφεδρείας για συστήματα χωρίς την κλήση συστήματος: εγείρει σε προσπάθειες περιορισμού της δικής του πρόσβασης του ιδιοκτήτη, διαφορετικά επιστρέφει undef. Κάθε πλατφόρμα που στοχεύει η pperl διαθέτει umask(2), οπότε αυτή η διαδρομή είναι ουσιαστικά μη προσβάσιμη εδώ.

  • Οκταδική παρουσίαση. Εκτυπώστε τη μάσκα με printf "%04o"· το προεπιλεγμένο %d εκτυπώνει δεκαδικά, που είναι δυσανάγνωστα ως bits δικαιωμάτων.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • chmod - αλλάζει δικαιώματα σε υπάρχον αρχείο· ο αντίστροφος του φιλτραρίσματος κατά τη δημιουργία που εκτελεί η umask

  • mkdir - κλήση δημιουργίας καταλόγου της οποίας το όρισμα MODE φιλτράρεται μέσω της τρέχουσας umask

  • sysopen - δημιουργία αρχείου χαμηλού επιπέδου της οποίας το όρισμα MODE φιλτράρεται μέσω της τρέχουσας umask· το κανονικό σημείο όπου γίνεται αισθητή η μάσκα

  • open - σε λειτουργίες δημιουργίας (>, >>, +>) η υποκείμενη creat(2) εφαρμόζει την umask στο προεπιλεγμένο 0666

  • oct - μετατρέπει συμβολοσειρά όπως "0027" σε ακέραια τιμή που αναμένει η umask

  • $! - τίθεται από τις κλήσεις δημιουργίας που καταναλώνουν τη μάσκα, όχι από την ίδια την umask· ελέγξτε την μετά την open / sysopen / mkdir που αποτυγχάνει