Πληροφορίες χρηστών και ομάδων

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· χρησιμοποιήστε όταν χρειάζεστε κάθε χρήστη, όχι κάποιον συγκεκριμένο

  • endpwent - κλείσιμο του επαναλήπτη passwd μετά από getpwent

  • getgrnam - αντίστοιχο της βάσης ομάδων· χρειάζεται για να αναλυθεί το πεδίο $gid αυτής της εγγραφής πίσω σε όνομα ομάδας

  • getlogin - φθηνή αναζήτηση «ποιος είναι σε αυτό το tty»· επιστροφή στις getpwnam/getpwuid όταν επιστρέφει κενή

  • User::pwent - περιτύλιγμα αντικειμένου με ονομασμένους accessors· καταφύγετε σε αυτό όταν θέλετε ->uid αντί να μετράτε θέσεις λίστας