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

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 είναι το UID 0 (ψευδής τιμή), η βαθμωτή επιστροφή της 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) και αναζητά το UID 0. Χρησιμοποιήστε 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 όταν χρειάζεται να μεταβείτε από όνομα → UID

  • getpwent - επαναλάβετε σε ολόκληρη τη βάση passwd· χρησιμοποιήστε όταν χρειάζεστε κάθε χρήστη, όχι κάποιον συγκεκριμένο

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

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

  • getlogin - φθηνή αναζήτηση «ποιος βρίσκεται σε αυτό το tty»· επανέλθετε στην getpwuid($<) όταν επιστρέφει κενό

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