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

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

$name

κανονικοποιημένο όνομα ομάδας (ίδιο με το NAME σε επιτυχημένη αναζήτηση)

1

$passwd

πεδίο κωδικού ομάδας, συνήθως "x" ή κενό

2

$gid

αριθμητικό group ID

3

$members

συμβολοσειρά ονομάτων σύνδεσης μελών διαχωρισμένων με κενά

Το $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 - διατρέξτε κάθε ομάδα στη βάση δεδομένων όταν δεν γνωρίζετε εκ των προτέρων το όνομα ή το GID

  • setgrent - επαναφέρει τον επαναλήπτη της getgrent στην αρχή της βάσης δεδομένων ομάδων

  • endgrent - κλείνει τον περιγραφέα αρχείου της βάσης δεδομένων ομάδων που ανοίχτηκε από την επανάληψη

  • getpwnam - η παράλληλη κλήση για τη βάση δεδομένων χρηστών· χρησιμοποιήστε την παράλληλα με την getgrnam όταν χρειάζεστε να επιλύσετε την πρωτεύουσα ομάδα ενός χρήστη

  • User::grent - αντικειμενοστραφές περιτύλιγμα που υπερκαλύπτει την getgrnam ώστε να επιστρέφει αντικείμενο εγγραφής με κατονομασμένους accessors (name, passwd, gid, members) αντί για λίστα κατά θέση