Πληροφορίες χρηστών και ομάδων
getpwuid#
Αναζητά την εγγραφή passwd ενός χρήστη βάσει αριθμητικού UID.
Η getpwuid περιτυλίγει την κλήση getpwuid(3) της βιβλιοθήκης C του συστήματος. Περάστε ένα αριθμητικό ID χρήστη όπως 0 ή $<· λαμβάνετε πίσω την εγγραφή passwd για εκείνον τον χρήστη, ή κενή λίστα / undef αν δεν υπάρχει τέτοιο UID. Η μορφή επιστροφής εξαρτάται από το περιβάλλον: το περιβάλλον λίστας δίνει κάθε πεδίο της εγγραφής· το βαθμωτό περιβάλλον δίνει μια μοναδική χρήσιμη τιμή - για την getpwuid συγκεκριμένα, το όνομα σύνδεσης (login).
Σύνοψη#
getpwuid UID
Τι επιστρέφεται#
Περιβάλλον λίστας επιστρέφει μια λίστα 10 στοιχείων που αντικατοπτρίζει το struct passwd εμπλουτισμένο με τα BSD επιπλέον πεδία - η ίδια μορφή που επιστρέφει η getpwnam:
my ($name, $passwd, $uid, $gid, $quota,
$comment, $gcos, $dir, $shell, $expire) = getpwuid($uid);
$name- όνομα σύνδεσης (login)$passwd- κρυπτογραφημένος κωδικός, ή"x"/"*"σε συστήματα shadow-password. Μολυσμένο (tainted) υπό-T.$uid- αριθμητικό ID χρήστη (ο ίδιος αριθμός που περάσατε)$gid- αριθμητικό ID πρωτεύουσας ομάδας$quota- όριο δίσκου, ή$change/$ageσε ορισμένα συστήματα. Κενή συμβολοσειρά όταν δεν υποστηρίζεται.$comment- διαχειριστικό σχόλιο, ενίοτε$class. Κενή συμβολοσειρά όταν δεν υποστηρίζεται.$gcos- πεδίο GECOS (συνήθως το πραγματικό όνομα συν άλλες πληροφορίες χρήστη). Μολυσμένο υπό-Tεπειδή οι χρήστες μπορούν να το επεξεργαστούν.$dir- αρχικός κατάλογος (home)$shell- κέλυφος σύνδεσης (login shell). Μολυσμένο υπό-T.$expire- λήξη λογαριασμού / κωδικού, όταν υποστηρίζεται.
Το βαθμωτό περιβάλλον επιστρέφει μόνο το $name (το όνομα σύνδεσης). Για την getpwuid - μια αναζήτηση βάσει UID - το βαθμωτό περιβάλλον σάς δίνει «το άλλο πράγμα», σύμφωνα με τον κανόνα που το upstream τεκμηριώνει για όλες τις συναρτήσεις getpw* / getgr* / gethost* / getnet* / getproto* / getserv*.
Σε αποτυχία αναζήτησης και τα δύο περιβάλλοντα επιστρέφουν την κενή λίστα / undef. Ελέγχετε πάντα την επιστροφή πριν την αποπακετάρετε.
Καθολική κατάσταση που επηρεάζει#
Ορίζει το
$!σε αποτυχία κλήσης συστήματος (σπάνιο - η «εύρεση μηδενικού UID» δεν είναι αποτυχία, είναι κενή επιστροφή).Διαβάζει τα
$<και$>έμμεσα μόνο όταν τα περάσετε ως όρισμα, αλλά το κοινό ιδίωμαgetpwuid($<)είναι αυτό που μετατρέπει την ειδική μεταβλητή του πραγματικού UID σε χρήσιμη εγγραφή.Υπό
-T(taint mode), τα$passwd,$gcosκαι$shellεπιστρέφουν μολυσμένα (tainted). Δείτεperlsecγια το πώς να τα ξεπλύνετε.Μοιράζεται την ίδια υποκείμενη κατάσταση επαναλήπτη με τις
getpwent,setpwentκαιendpwent. Μια κλήσηgetpwuidδεν διαταράσσει έναν εν εξελίξει βρόχοgetpwentστη glibc, αλλά ο φορητός κώδικας δεν θα έπρεπε να βασίζεται σε αυτό.
Παραδείγματα#
Βασική αναζήτηση UID-προς-όνομα σε βαθμωτό περιβάλλον:
my $name = getpwuid(0); # "root"
«Ως ποιος εκτελούμαι» - το καθιερωμένο ιδίωμα της getpwuid, που επιλύει το πραγματικό UID σε όνομα σύνδεσης:
my $me = getpwuid($<); # e.g. "alice"
Συνδυάστε με την getlogin για μια αξιόπιστη αλυσίδα εφεδρείας που επιβιώνει σε αποσυνδεδεμένες διεργασίες και συνεδρίες su:
my $login = getlogin() || getpwuid($<) || "unknown";
Η getlogin διαβάζει την εγγραφή του ελέγχοντος tty και μπορεί να ψεύδεται (ή να επιστρέψει κενό) όταν δεν υπάρχει tty· η getpwuid($<) απαντά από το καταγεγραμμένο στον πυρήνα UID και λειτουργεί πάντα.
Πλήρης εγγραφή σε περιβάλλον λίστας, με αμυντικό έλεγχο:
my @pw = getpwuid($uid)
or die "uid $uid: not in passwd database";
my ($name, undef, undef, $gid, undef, undef, $gcos, $home, $shell) = @pw;
print "$name ($uid) -> $home, shell $shell\n";
Από UID → όνομα ομάδας μέσω του πεδίου $gid:
my $gid = (getpwuid($<))[3];
my $groupnam = getgrgid($gid);
Αντικειμενοστρεφής προσπέλαση μέσω της παράκαμψης User::pwent, χρήσιμη όταν θέλετε ονομασμένες μεθόδους προσπέλασης αντί να μετράτε θέσεις λίστας:
use User::pwent;
my $pw = getpwuid($<);
printf "%s lives in %s, runs %s\n", $pw->name, $pw->dir, $pw->shell;
Το use User::pwent αντικαθιστά την getpwuid με μια έκδοση που επιστρέφει ένα blessed αντικείμενο με τις μεθόδους προσπέλασης ->name, ->uid, ->gid, ->dir, ->shell. Οι δύο μορφές δεν αναμιγνύονται: μέσα σε μία εμβέλεια χρησιμοποιείτε είτε την παράκαμψη είτε την ενσωματωμένη, όχι και τις δύο.
Οριακές περιπτώσεις#
Ανύπαρκτο UID επιστρέφει κενή λίστα σε περιβάλλον λίστας και
undefσε βαθμωτό περιβάλλον. Αυτό δεν είναι σφάλμα - το$!δεν ορίζεται. Διακρίνετε το «UID λείπει» από το «η αναζήτηση απέτυχε» ελέγχοντας το$!μόνο όταν θέλετε να αναφέρετε μη αναμενόμενη αποτυχία, όχι όταν αποφασίζετε αν υπάρχει το UID.Το
$passwdείναι σπάνια χρήσιμο. Σε σύγχρονα συστήματα Linux και BSD, το πραγματικό hash ζει στο/etc/shadow, αναγνώσιμο μόνο από τον root. Εδώ λαμβάνετε"x"ή"*". Χρησιμοποιήστε PAM ή το άρθρωμαAuthen::PAMγια πιστοποίηση, αντί να συγκρίνετε με αυτό το πεδίο.Φορητότητα των
$quota,$comment,$expire. Αυτά τα πεδία είναι κενά ή χωρίς νόημα σε Linux. Το upstream POD παραθέτει τιμέςConfig(d_pwquota,d_pwage,d_pwchange,d_pwcomment,d_pwexpire) που μπορείτε να ελέγξετε αν χρειάζεται να γνωρίζετε σε χρόνο εκτέλεσης αν η πλατφόρμα τα συμπληρώνει.Μολυσμένα πεδία υπό
-T. Τα$passwd,$gcos,$shellείναι μολυσμένα επειδή οι χρήστες μπορούν να τα τροποποιήσουν (μέσωchsh,chfn, ή απευθείας επεξεργασίας του/etc/passwdσε προνομιακά πλαίσια). Περάστε τα μέσα από μια σύλληψη regex για ξέπλυμα προτού τα χρησιμοποιήσετε σε κλήση συστήματος.Η βαθμωτή επιστροφή για UID 0 δεν είναι ποτέ ψευδής. Σε αντίθεση με την
getpwnam, της οποίας η βαθμωτή επιστροφή για τονrootείναι το UID0(ψευδής τιμή), η βαθμωτή επιστροφή τηςgetpwuidείναι το όνομα"root"- πάντοτε αληθής συμβολοσειρά για υπαρκτούς χρήστες. Έτσι, τοif (getpwuid($uid)) { ... }λειτουργεί όπως θα αναμένατε, αλλά καταφύγετε στοdefinedούτως ή άλλως αν σας ενδιαφέρει η διάκριση μεταξύ «λείπει» και «κενό όνομα»:if (defined getpwuid($uid)) { ... } # unambiguous if (my @pw = getpwuid($uid)) { ... } # also correct
Το UID είναι αριθμός, όχι όνομα. Η
getpwuid("root")μετατρέπει το"root"σε συμβολοσειρά αριθμού0(με προειδοποίηση υπόuse warnings) και αναζητά το UID0. Χρησιμοποιήστεgetpwnamγια αναζητήσεις βάσει ονόματος.Αρνητικά / υπερβολικά μεγάλα UID. Η κλήση συστήματος δέχεται ό,τι δέχεται ο τύπος
uid_tστην πλατφόρμα (συνήθως 32-bit μη προσημασμένος). Η Perl μετατρέπει τις αρνητικές τιμές μέσω συμπληρώματος ως προς δύο κατά την είσοδο· το αποτέλεσμα εξαρτάται από την πλατφόρμα και σχεδόν ποτέ δεν είναι αυτό που θέλετε.Μεγάλοι κατάλογοι (LDAP / NIS / SSSD). Η
getpwuidπερνά μέσα από το NSS, οπότε το κόστος κλιμακώνεται ανάλογα με το πώς απαντά ο τοπικός resolver. Μια αποτυχημένη αναζήτηση σε λανθασμένα διαμορφωμένο διακομιστή LDAP μπορεί να μπλοκάρει για δευτερόλεπτα. Αποθηκεύστε τα αποτελέσματα σε hash αν επιλύετε πολλά UID σε στενό βρόχο (π.χ. σχολιάζοντας έξοδο τύπουls -l).Νήματα. Το upstream σημειώνει ότι η
getpwuid_rχρησιμοποιείται αυτόματα όπου την παρέχει η πλατφόρμα· η επανάληψη μέσωgetpwent, αντιθέτως, παραμένει ανά διεργασία. Δεν είναι έγνοια στην pperl (χωρίς ithreads), αλλά αξίζει να γνωρίζετε αν μοιράζεστε κώδικα με την perl5.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getpwnam- η ίδια εγγραφή, αναζητούμενη βάσει ονόματος σύνδεσης· συνδυάστε με τηνgetpwuidόταν χρειάζεται να μεταβείτε από όνομα → UIDgetpwent- επαναλάβετε σε ολόκληρη τη βάση passwd· χρησιμοποιήστε όταν χρειάζεστε κάθε χρήστη, όχι κάποιον συγκεκριμένοgetgrgid- αντίστοιχη συνάρτηση για τη βάση ομάδων· χρειάζεται για την επίλυση του πεδίου$gidαπό αυτή την εγγραφή σε όνομα ομάδαςgetlogin- φθηνή αναζήτηση «ποιος βρίσκεται σε αυτό το tty»· επανέλθετε στηνgetpwuid($<)όταν επιστρέφει κενόUser::pwent- αντικειμενοστρεφές περιτύλιγμα με ονομασμένες μεθόδους προσπέλασης· κατφύγετε σε αυτό όταν θέλετε->nameαντί να μετράτε θέσεις λίστας