Πληροφορίες χρηστών και ομάδων
getgrnam#
Αναζητά μια ομάδα Unix κατά όνομα και επιστρέφει την εγγραφή της από το /etc/group.
Η getgrnam τυλίγει την getgrnam(3) της βιβλιοθήκης C. Δοθέντος ενός ονόματος ομάδας όπως "wheel" ή "staff", επιστρέφει την εγγραφή που ταιριάζει από τη βάση δεδομένων ομάδων του συστήματος - το όνομα, το placeholder κρυπτογραφημένου κωδικού, το αριθμητικό GID και τη λίστα ονομάτων σύνδεσης των μελών. Χρησιμοποιήστε την όταν έχετε στα χέρια σας ένα όνομα ομάδας και χρειάζεστε το GID ή τη λίστα μελών· χρησιμοποιήστε getgrgid για την αντίστροφη αναζήτηση.
Σύνοψη#
my ($name, $passwd, $gid, $members) = getgrnam NAME
my $gid = getgrnam NAME
Τι επιστρέφεται#
Σε περιβάλλον λίστας προκύπτει λίστα τεσσάρων στοιχείων:
my ($name, $passwd, $gid, $members) = getgrnam "wheel";
Δείκτης | Πεδίο | Σημασία |
|---|---|---|
0 |
| κανονικοποιημένο όνομα ομάδας (ίδιο με το |
1 |
| πεδίο κωδικού ομάδας, συνήθως |
2 |
| αριθμητικό group ID |
3 |
| συμβολοσειρά ονομάτων σύνδεσης μελών διαχωρισμένων με κενά |
Το $members είναι ένα μεμονωμένο βαθμωτό, όχι πίνακας. Διασπάστε το οι ίδιοι όταν θέλετε λίστα:
my @logins = split /\s+/, (getgrnam("wheel"))[3];
Σε βαθμωτό περιβάλλον προκύπτει το αριθμητικό GID (το «άλλο», αφού η αναζήτηση έγινε κατά όνομα):
my $gid = getgrnam "wheel";
Δεν υπάρχει τέτοια ομάδα: το περιβάλλον λίστας επιστρέφει την κενή λίστα· το βαθμωτό περιβάλλον επιστρέφει undef. Ελέγξτε τις βαθμωτές επιστροφές για definedness αντί για αλήθεια - το GID 0 (root) είναι έγκυρη επιτυχημένη αναζήτηση που είναι ταυτόχρονα και ψευδής:
defined(my $gid = getgrnam $group) or die "no group '$group'";
Καθολική κατάσταση που επηρεάζει#
Καμία άμεσα. Η getgrnam είναι αναζήτηση χωρίς κατάσταση - σε αντίθεση με την getgrent, δεν προωθεί τον επαναλήπτη της βάσης δεδομένων ομάδων και οι setgrent / endgrent δεν την επηρεάζουν. Μοιράζεται όμως τον στατικό ενταμιευτή αποτελεσμάτων της υποκείμενης βιβλιοθήκης C με άλλες κλήσεις getgr* σε πλατφόρμες χωρίς thread-safe παραλλαγές· αντιγράψτε τα πεδία που σας ενδιαφέρουν πριν καλέσετε άλλη συνάρτηση getgr*.
Παραδείγματα#
Επίλυση ονόματος ομάδας σε GID:
my $gid = getgrnam "wheel";
defined $gid or die "no 'wheel' group on this system";
print "wheel GID = $gid\n";
Απαρίθμηση των μελών μιας ομάδας:
my @fields = getgrnam "staff"
or die "no 'staff' group";
my @members = split /\s+/, $fields[3];
print "staff has ", scalar(@members), " members: @members\n";
Χρήση ονόματος ομάδας για τον ορισμό του effective GID (απαιτεί προνόμια):
my $gid = getgrnam "video"
// die "no 'video' group";
$) = "$gid $gid"; # effective + supplementary
Έλεγχος αν ένας χρήστης εμφανίζεται ως μέλος ομάδας. Σημειώστε ότι η πρωτεύουσα ομάδα (το GID του χρήστη στο /etc/passwd) δεν βρίσκεται στο $members - ελέγξτε και τα δύο:
sub in_group {
my ($user, $group) = @_;
my @g = getgrnam $group or return 0;
return 1 if grep { $_ eq $user } split /\s+/, $g[3];
my @u = getpwnam $user or return 0;
return $u[3] == $g[2]; # primary group match
}
Αντικειμενοστραφής μορφή μέσω του User::grent, που υπερκαλύπτει την ενσωματωμένη συνάρτηση με εγγραφή κατά όνομα:
use User::grent;
my $g = getgrnam "wheel";
printf "wheel: gid=%d members=%s\n", $g->gid, "@{$g->members}";
Οριακές περιπτώσεις#
Ομάδα που λείπει: το περιβάλλον λίστας επιστρέφει
(), το βαθμωτό επιστρέφειundef. Ένα γυμνόif (getgrnam $g)είναι εντάξει σε περιβάλλον λίστας αλλά λάθος σε βαθμωτό περιβάλλον όταν το GID θα μπορούσε να είναι0:if (defined(my $gid = getgrnam $g)) { ... } # correct if (my $gid = getgrnam $g) { ... } # wrong for GID 0
Το members είναι συμβολοσειρά, όχι λίστα. Η λήθη αυτού και η συγγραφή
scalar @members = getgrnam $g(ή η ευρετηρίαση$members[0]) δίνει σιωπηρά λάθος αποτελέσματα. Πάνταsplit /\s+/στο τέταρτο πεδίο.Τα μέλη πρωτεύουσας ομάδας λείπουν από τη λίστα. Ένας χρήστης του οποίου το GID στο
/etc/passwdταιριάζει με την ομάδα είναι μέλος στα μάτια του πυρήνα αλλά δεν θα εμφανιστεί στο$members. Οι αναζητήσεις που κατηγοριοποιούν χρήστες κατά ομάδα πρέπει να συμβουλεύονται και τηνgetpwnam.Το πεδίο κωδικού δεν είναι κωδικός. Σε κάθε σύγχρονο Linux το δεύτερο πεδίο είναι
"x"(ανακατεύθυνση προς shadow) ή κενό. Δεν είναι ποτέ ο απλός κωδικός ή κατακερματισμός κωδικού ομάδας. Μη βασίζεστε στη μορφή του.Διάκριση πεζών-κεφαλαίων: τα ονόματα ομάδων διακρίνουν πεζά-κεφαλαία στο Linux. Η
getgrnam "Wheel"δεν βρίσκει τηνwheel.Όνομα με ενσωματωμένο κενό ή άνω-κάτω τελεία: η μορφή της βάσης δεδομένων ομάδων δεν επιτρέπει κανένα από τα δύο, οπότε τέτοια ονόματα δεν μπορούν να υπάρξουν· η αναζήτηση απλώς αποτυγχάνει.
NSS backends: σε συστήματα διαμορφωμένα με LDAP, SSSD ή άλλα αρθρώματα name-service switch, η
getgrnamσυμβουλεύεται και αυτά εκτός από το/etc/group. Τα αποτελέσματα συνεπώς εξαρτώνται από το/etc/nsswitch.confκαι τα διαμορφωμένα backends, όχι μόνο από το/etc/group.Taint: τα πεδία προέρχονται έξω από το πρόγραμμα, οπότε υπό
-Tείναι tainted και πρέπει να ξεπλυθούν πριν χρησιμοποιηθούν σε ευαίσθητες λειτουργίες.Ασφάλεια threads: η pperl αντικαθιστά αυτόματα με την thread-safe
getgrnam_rόταν την παρέχει η πλατφόρμα. Σε πλατφόρμες χωρίς αυτήν, ταυτόχρονες κλήσειςgetgr*σε διαφορετικά threads μπορούν να αλλοιώσουν τα αποτελέσματα μεταξύ τους.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getgrgid- αντίστροφη αναζήτηση κατά αριθμητικό GID· καταφύγετε σε αυτήν όταν έχετε το GID και θέλετε το όνομα ομάδας ή τη λίστα μελώνgetgrent- διατρέξτε κάθε ομάδα στη βάση δεδομένων όταν δεν γνωρίζετε εκ των προτέρων το όνομα ή το GIDsetgrent- επαναφέρει τον επαναλήπτη τηςgetgrentστην αρχή της βάσης δεδομένων ομάδωνendgrent- κλείνει τον περιγραφέα αρχείου της βάσης δεδομένων ομάδων που ανοίχτηκε από την επανάληψηgetpwnam- η παράλληλη κλήση για τη βάση δεδομένων χρηστών· χρησιμοποιήστε την παράλληλα με τηνgetgrnamόταν χρειάζεστε να επιλύσετε την πρωτεύουσα ομάδα ενός χρήστηUser::grent- αντικειμενοστραφές περιτύλιγμα που υπερκαλύπτει τηνgetgrnamώστε να επιστρέφει αντικείμενο εγγραφής με κατονομασμένους accessors (name,passwd,gid,members) αντί για λίστα κατά θέση