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- αλλάζει δικαιώματα σε υπάρχον αρχείο· ο αντίστροφος του φιλτραρίσματος κατά τη δημιουργία που εκτελεί ηumaskmkdir- κλήση δημιουργίας καταλόγου της οποίας το όρισμαMODEφιλτράρεται μέσω της τρέχουσας umasksysopen- δημιουργία αρχείου χαμηλού επιπέδου της οποίας το όρισμαMODEφιλτράρεται μέσω της τρέχουσας umask· το κανονικό σημείο όπου γίνεται αισθητή η μάσκαopen- σε λειτουργίες δημιουργίας (>,>>,+>) η υποκείμενηcreat(2)εφαρμόζει την umask στο προεπιλεγμένο0666oct- μετατρέπει συμβολοσειρά όπως"0027"σε ακέραια τιμή που αναμένει ηumask$!- τίθεται από τις κλήσεις δημιουργίας που καταναλώνουν τη μάσκα, όχι από την ίδια τηνumask· ελέγξτε την μετά τηνopen/sysopen/mkdirπου αποτυγχάνει