Πληροφορίες χρηστών και ομάδων
getpwnam#
Αναζήτηση εγγραφής passwd ενός χρήστη κατά όνομα σύνδεσης.
Η getpwnam περιτυλίγει την κλήση getpwnam(3) της βιβλιοθήκης C του συστήματος. Περάστε ένα όνομα σύνδεσης όπως "root" ή "alice"· επιστρέφεται η εγγραφή passwd για αυτόν τον χρήστη, ή κενή λίστα / undef αν δεν υπάρχει τέτοιος χρήστης. Η μορφή επιστροφής εξαρτάται από το περιβάλλον: το περιβάλλον λίστας δίνει κάθε πεδίο της εγγραφής· το βαθμωτό περιβάλλον δίνει μία χρήσιμη τιμή - για τη getpwnam συγκεκριμένα, το αριθμητικό UID.
Σύνοψη#
getpwnam NAME
Τι επιστρέφεται#
Περιβάλλον λίστας επιστρέφει μια λίστα 10 στοιχείων που αντικατοπτρίζει το struct passwd διευρυμένο με τα BSD extras:
my ($name, $passwd, $uid, $gid, $quota,
$comment, $gcos, $dir, $shell, $expire) = getpwnam($login);
$name- όνομα σύνδεσης (η ίδια συμβολοσειρά που περάσατε)$passwd- κρυπτογραφημένος κωδικός πρόσβασης, ή"x"/"*"σε συστήματα shadow-password. Tainted υπό-T.$uid- αριθμητικό ID χρήστη$gid- αριθμητικό ID πρωτεύουσας ομάδας$quota- όριο δίσκου, ή$change/$ageσε ορισμένα συστήματα. Κενή συμβολοσειρά όταν δεν υποστηρίζεται.$comment- διαχειριστικό σχόλιο, μερικές φορές$class. Κενή συμβολοσειρά όταν δεν υποστηρίζεται.$gcos- πεδίο GECOS (συνήθως το πραγματικό όνομα μαζί με άλλες πληροφορίες χρήστη). Tainted υπό-Tεπειδή οι χρήστες μπορούν να το επεξεργαστούν.$dir- αρχικός κατάλογος$shell- κέλυφος σύνδεσης. Tainted υπό-T.$expire- λήξη λογαριασμού / κωδικού, όταν υποστηρίζεται.
Βαθμωτό περιβάλλον επιστρέφει μόνο το $uid. Για τη getpwnam - μια αναζήτηση κατά όνομα - το βαθμωτό περιβάλλον σας δίνει «το άλλο πράγμα», ταιριάζοντας τον κανόνα που τεκμηριώνει το upstream για όλες τις συναρτήσεις getpw* / getgr* / gethost* / getnet* / getproto* / getserv*.
Σε αποτυχία αναζήτησης και τα δύο περιβάλλοντα επιστρέφουν την κενή λίστα / undef. Ελέγχετε πάντα την επιστροφή πριν το αποπακετάρισμα.
Καθολική κατάσταση που επηρεάζει#
Θέτει την
$!σε αποτυχία κλήσης συστήματος (σπάνια - η «μη εύρεση χρήστη» δεν είναι αποτυχία, είναι κενή επιστροφή).Υπό
-T(taint mode), τα$passwd,$gcosκαι$shellεπιστρέφουν tainted. Δείτε τοperlsecγια το πώς να τα καθαρίσετε.Μοιράζεται την ίδια υποκείμενη κατάσταση επαναλήπτη με τις
getpwent,setpwentκαιendpwent. Μια κλήσηgetpwnamδεν διαταράσσει έναν εν εξελίξει βρόχοgetpwentστη glibc, αλλά φορητός κώδικας δεν θα έπρεπε να το υποθέτει αυτό.
Παραδείγματα#
Βασική αναζήτηση ονόματος-σε-UID σε βαθμωτό περιβάλλον:
my $uid = getpwnam("root"); # 0
Πλήρης εγγραφή σε περιβάλλον λίστας, με αμυντικό έλεγχο:
my @pw = getpwnam($user)
or die "$user: not in passwd database";
my ($name, undef, $uid, $gid, undef, undef, $gcos, $home, $shell) = @pw;
print "$name ($uid) -> $home, shell $shell\n";
Μοτίβο εκχώρησης από το upstream - άμεσο αποπακετάρισμα με or die:
my ($login, $pass, $uid, $gid) = getpwnam($user)
or die "$user not in passwd file";
Σύγκριση ιδιοκτησίας αρχείου με ονομασμένο χρήστη χωρίς χειρόγραφη ευρετηρίαση πεδίων, μέσω της παράκαμψης User::pwent:
use User::pwent;
use File::stat;
my $is_theirs = (stat($filename)->uid == getpwnam($whoever)->uid);
Το use User::pwent αντικαθιστά την getpwnam με μια έκδοση που επιστρέφει blessed αντικείμενο με accessors ->name, ->uid, ->gid, ->dir, ->shell - βολικό όταν θέλετε ένα πεδίο και δεν θέλετε να μετράτε κόμματα. Οι δύο μορφές δεν αναμειγνύονται: μέσα σε μία εμβέλεια χρησιμοποιήστε είτε την παράκαμψη είτε τη built-in, όχι και τις δύο.
Αλυσίδα εφεδρείας για το «ως ποιος εκτελούμαι»:
my $login = getlogin() || getpwuid($<) || "unknown";
Η getpwuid είναι το αντίστοιχο κατά UID· η getlogin διαβάζει την εγγραφή του ελέγχοντος tty και μπορεί να ψεύδεται σε αποσπασμένες διεργασίες, οπότε είναι η πρώτη επιλογή, όχι η μόνη.
Οριακές περιπτώσεις#
Δεν υπάρχει τέτοιος χρήστης επιστρέφει κενή λίστα σε περιβάλλον λίστας και
undefσε βαθμωτό περιβάλλον. Αυτό δεν είναι σφάλμα - η$!δεν τίθεται. Διακρίνετε «λείπει χρήστης» από «αποτυχία αναζήτησης» ελέγχοντας την$!μόνο όταν θέλετε να αναφέρετε απρόσμενη αποτυχία, όχι όταν αποφασίζετε αν ο χρήστης υπάρχει.Το
$passwdσπάνια είναι χρήσιμο. Σε σύγχρονα συστήματα Linux και BSD η πραγματική τιμή κατακερματισμού βρίσκεται στο/etc/shadow, αναγνώσιμη μόνο από τον root. Εδώ παίρνετε"x"ή"*". Χρησιμοποιήστε PAM ή το άρθρωμαAuthen::PAMγια ταυτοποίηση αντί να συγκρίνετε με αυτό το πεδίο.Φορητότητα
$quota,$comment,$expire. Αυτά τα πεδία είναι κενά ή χωρίς νόημα σε Linux. Το POD του upstream απαριθμεί τιμέςConfig(d_pwquota,d_pwage,d_pwchange,d_pwcomment,d_pwexpire) που μπορείτε να ελέγξετε αν χρειάζεται να γνωρίζετε κατά τον χρόνο εκτέλεσης αν η πλατφόρμα τα συμπληρώνει.Tainted πεδία υπό
-T. Τα$passwd,$gcos,$shellείναι tainted επειδή οι χρήστες μπορούν να τα τροποποιήσουν (μέσωchsh,chfnή άμεσων επεξεργασιών/etc/passwdσε προνομιούχα περιβάλλοντα). Περάστε τα μέσα από σύλληψη regex για να τα καθαρίσετε πριν τη χρήση τους σε κλήση συστήματος.Η τιμή επιστροφής είναι μια «μοναδική άνευ νοήματος αληθής τιμή» σε λογικό βαθμωτό περιβάλλον όταν η εγγραφή υπάρχει αλλά θέλατε περιβάλλον λίστας. Η τεκμηριωμένη επιστροφή σε βαθμωτό περιβάλλον για τη
getpwnamείναι το UID, που για τονrootείναι0- ψευδής τιμή. Ηif (getpwnam("root")) { ... }ως εκ τούτου αποτυγχάνει για τον root. Χρησιμοποιήστεdefinedή περιβάλλον λίστας:if (defined getpwnam("root")) { ... } # correct if (my @pw = getpwnam("root")) { ... } # also correct
Το όνομα είναι συμβολοσειρά, όχι UID. Η
getpwnam(0)μετατρέπει το0σε συμβολοσειρά και αναζητά τον κυριολεκτικό χρήστη ονόματι"0", που σχεδόν ποτέ δεν υπάρχει. Χρησιμοποιήστε τηνgetpwuidγια αριθμητικές αναζητήσεις.Μεγάλοι κατάλογοι (LDAP / NIS / SSSD). Η
getpwnamπερνά από το NSS, οπότε το κόστος κλιμακώνεται όπως απαντά ο τοπικός αναλυτής. Μια αστοχία έναντι ενός λάθος ρυθμισμένου διακομιστή LDAP μπορεί να μπλοκάρει για δευτερόλεπτα. Κάντε cache τα αποτελέσματα σε πίνακα κατακερματισμού αν αναζητάτε πολλούς χρήστες σε στενό βρόχο.Threads. Το upstream σημειώνει ότι η
getpwnam_rχρησιμοποιείται αυτόματα όπου η πλατφόρμα την παρέχει· η επανάληψηgetpwent, αντιθέτως, παραμένει ανά διεργασία. Όχι ανησυχία υπό pperl (χωρίς ithreads), αλλά αξίζει να το γνωρίζετε αν μοιράζεστε κώδικα με την perl5.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getpwuid- ίδια εγγραφή, αναζήτηση κατά αριθμητικό UID· συνδυάστε με τηgetpwnamόταν χρειάζεται να πάτε UID → όνομαgetpwent- επανάληψη όλης της βάσης passwd· χρησιμοποιήστε όταν χρειάζεστε κάθε χρήστη, όχι κάποιον συγκεκριμένοgetgrnam- αντίστοιχο της βάσης ομάδων· χρειάζεται για να αναλυθεί το πεδίο$gidαυτής της εγγραφής πίσω σε όνομα ομάδαςgetlogin- φθηνή αναζήτηση «ποιος είναι σε αυτό το tty»· επιστροφή στιςgetpwnam/getpwuidόταν επιστρέφει κενήUser::pwent- περιτύλιγμα αντικειμένου με ονομασμένους accessors· καταφύγετε σε αυτό όταν θέλετε->uidαντί να μετράτε θέσεις λίστας