Filehandles, αρχεία, κατάλογοι
chown#
Αλλάζει τον ιδιοκτήτη και την ομάδα μιας λίστας αρχείων.
Η chown παίρνει ένα αριθμητικό id χρήστη, ένα αριθμητικό id ομάδας και μια λίστα αρχείων, και αλλάζει την ιδιοκτησία σε κάθε αρχείο στο οποίο η καλούσα διεργασία επιτρέπεται να επεμβαίνει. Τα δύο πρώτα στοιχεία της LIST είναι τα νέα UID και GID, με αυτή τη σειρά· κάθε επόμενο στοιχείο είναι όνομα αρχείου (ή, σε συστήματα που υποστηρίζουν την fchown(2), ένα filehandle). Η τιμή -1 σε οποιαδήποτε από τις θέσεις id σημαίνει «άφησε αυτό το id αμετάβλητο» - χρήσιμη όταν θέλετε να αλλάξετε μόνο την ομάδα ή μόνο τον ιδιοκτήτη.
Σύνοψη#
chown UID, GID, LIST
chown $uid, $gid, $file
chown $uid, $gid, @files
chown -1, $gid, @files # change group only
Τι επιστρέφεται#
Ο αριθμός των αρχείων στα οποία η ιδιοκτησία άλλαξε επιτυχώς, ως απλός ακέραιος. Όχι λογική τιμή - μια κλήση πάνω σε δέκα αρχεία που πετυχαίνει σε επτά επιστρέφει 7. Συγκρίνετε με το μήκος της λίστας όταν χρειάζεστε σημασιολογία «όλα ή τίποτα»:
my @files = ('a', 'b', 'c');
my $ok = chown $uid, $gid, @files;
$ok == @files
or die "chown failed on ", scalar(@files) - $ok, " files: $!";
Όταν κάποιο μεμονωμένο αρχείο αποτυγχάνει, η $! κρατάει το errno από την τελευταία κλήση που απέτυχε. Μια τιμή επιστροφής μικρότερη από scalar @files είναι το αξιόπιστο σήμα «κάτι πήγε στραβά»· η $! σας λέει ποια ήταν η τελευταία αποτυχία, όχι κάθε αποτυχία.
Καθολική κατάσταση που επηρεάζει#
$!- τίθεται στο errno της τελευταίας υποκείμενης κλήσηςchown(2)που απέτυχε. Αμετάβλητη όταν κάθε αρχείο πετυχαίνει.
Μόνο αριθμητικά id#
Η chown δεν δέχεται ονόματα χρήστη ή ομάδας. Περάστε τη συμβολοσειρά "root" εκεί που αναμένεται uid και θα πάρετε αριθμητική μετατροπή σε 0 (με προειδοποίηση Argument … isn't numeric υπό use warnings) - σχεδόν ποτέ αυτό που θέλετε. Μεταφράστε ονόματα σε αριθμούς με τις getpwnam και getgrnam:
my $uid = getpwnam('alice') // die "no such user";
my $gid = getgrnam('staff') // die "no such group";
chown $uid, $gid, @files;
Η επιστροφή της getpwnam σε περιβάλλον λίστας δίνει την πλήρη εγγραφή passwd· σε βαθμωτό περιβάλλον δίνει μόνο το uid, που είναι συνήθως αυτό που θέλει η chown.
Κανόνες δικαιωμάτων#
Σε Linux και σε κάθε άλλο σύστημα POSIX, μόνο ο υπερχρήστης μπορεί να δώσει ένα αρχείο σε διαφορετικό ιδιοκτήτη. Ένας μη προνομιούχος χρήστης μπορεί να αλλάξει την ομάδα ενός αρχείου που του ανήκει, αλλά μόνο σε μία από τις δικές του δευτερεύουσες ομάδες. Η προσπάθεια να γίνει κάτι περισσότερο επιστρέφει αποτυχία με την $! τεθειμένη σε EPERM.
chown 0, 0, 'passwd.new'
or warn "need root to chown: $!";
Ο περιορισμός επιβάλλεται από τον πυρήνα, όχι από την Perl - δεν υπάρχει προέλεγχος που θα σας γλίτωνε από μια αποτυχημένη κλήση συστήματος. Βασιστείτε στην τιμή επιστροφής.
Παραδείγματα#
Αλλαγή και του ιδιοκτήτη και της ομάδας σε ένα μόνο αρχείο:
chown $uid, $gid, '/var/log/app.log'
or die "chown failed: $!";
Αλλαγή μόνο της ομάδας, χωρίς να θιγεί ο ιδιοκτήτης:
chown -1, $gid, @files;
Μετάφραση ονομάτων σε αριθμητικά id πριν την κλήση:
my ($login, $pass, $uid, $gid) = getpwnam('www-data')
or die "www-data not in passwd file";
chown $uid, $gid, glob('/var/www/*');
Μετρήστε πόσα αρχεία ανατέθηκαν πράγματι εκ νέου:
my @targets = glob('/srv/data/*.dat');
my $changed = chown $uid, $gid, @targets;
warn "only $changed of ", scalar(@targets), " files changed: $!"
if $changed != @targets;
Chown μέσω filehandle σε σύστημα που υποστηρίζει την fchown(2). Το filehandle πρέπει να είναι glob ή αναφορά σε glob - ένα bareword αντιμετωπίζεται ως όνομα αρχείου:
open my $fh, '>', '/tmp/out' or die $!;
chown $uid, $gid, $fh;
Οριακές περιπτώσεις#
Κενή λίστα αρχείων:
chown $uid, $gid;- κανένα αρχείο για ενέργεια, επιστρέφει0, δεν αγγίζει την$!.-1σε θέση id: τυπική φρουρά POSIX με σημασία «άφησε αυτό το id αμετάβλητο». Λειτουργεί σε κάθε υποστηριζόμενη πλατφόρμα.Συμβολοσειρά ως id: μια μη αριθμητική συμβολοσειρά γίνεται σιωπηρά
0(root / wheel) μετά τη συνηθισμένη αριθμητική μετατροπή. Υπόuse warningsπαίρνετε προειδοποίησηArgument isn't numeric, αλλά δεν υπάρχει σκληρό σφάλμα. Πάντα να περνάτε ακέραιο.Αρχείο που δεν υπάρχει: μετράει ως αποτυχία, δεν διακόπτει την κλήση. Τα υπόλοιπα αρχεία εξακολουθούν να επεξεργάζονται.
Στόχος symlink: η
chownακολουθεί τα symlinks και αλλάζει το αρχείο στο οποίο δείχνουν. Για να κάνετε chown στον ίδιο τον σύνδεσμο, χρησιμοποιήστε τηνlchown(2)μέσω τηςsyscallή ένα άρθρωμα που την εκθέτει - ο πυρήνας της Perl δεν την εκθέτει.Μορφή filehandle: σε συστήματα χωρίς
fchown(2)(σπάνιο στην πράξη σε Linux), το πέρασμα filehandle εγείρει εξαίρεση. Τα barewords στη λίστα αρχείων αντιμετωπίζονται πάντα ως ονόματα αρχείων - χρησιμοποιήστε\*FHή έναmy $fhγια να εννοήσετε «αυτό το handle».Περιορισμός παραχώρησης: σε συστήματα POSIX με
_PC_CHOWN_RESTRICTEDενεργό για τη διαδρομή-στόχο, μόνο ο root μπορεί να αλλάξει τον ιδιοκτήτη γενικά. Δοκιμάστε με:use POSIX qw(pathconf _PC_CHOWN_RESTRICTED); my $restricted = pathconf($path, _PC_CHOWN_RESTRICTED);
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
chmod- αλλάζει τα bits δικαιωμάτων αρχείου· δέχεται το ίδιο σχήμα «mode, μετά λίστα αρχείων» και επιστρέφει τον ίδιο μετρητή αριθμού αρχείων που άλλαξανstat- διαβάστε τον τρέχοντα ιδιοκτήτη, ομάδα και mode ενός αρχείου πριν αποφασίσετε τι θα αλλάξετεumask- θέτει την προεπιλεγμένη μάσκα δικαιωμάτων για αρχεία που δημιουργούνται από αυτή τη διεργασία· συμπληρώνει τηνchownγια νεοδημιουργημένα αρχείαgetpwnam- μεταφράζει ένα όνομα χρήστη στο αριθμητικό uid που απαιτεί ηchowngetgrnam- μεταφράζει ένα όνομα ομάδας στο αριθμητικό gid που απαιτεί ηchown$!- κρατάει το errno της τελευταίας ανά-αρχείο κλήσηςchown(2)που απέτυχε, όταν ο μετρητής επιστροφής είναι κάτω από το μήκος της λίστας