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

getgrgid#

Αναζητά μια εγγραφή ομάδας με βάση το αριθμητικό ID ομάδας.

Η getgrgid ρωτά τη βάση δεδομένων ομάδων του συστήματος για την εγγραφή της οποίας το gid είναι GID και επιστρέφει ό,τι βρει. Είναι το αριθμητικό αντίστοιχο της getgrnam και αντικατοπτρίζει την κλήση getgrgid(3) της βιβλιοθήκης C. Σε περιβάλλον λίστας λαμβάνετε τα αποπακεταρισμένα πεδία της εγγραφής· σε βαθμωτό περιβάλλον λαμβάνετε το όνομα της ομάδας.

Σύνοψη#

my ($name, $passwd, $gid, $members) = getgrgid($gid);
my  $name                           = getgrgid($gid);

Τι επιστρέφεται#

Σε περιβάλλον λίστας, τέσσερις τιμές αποπακεταρισμένες από τη struct group:

#    0       1         2      3
my ( $name,  $passwd,  $gid,  $members ) = getgrgid($gid);
  • $name - το όνομα της ομάδας.

  • $passwd - το πεδίο κωδικού πρόσβασης της ομάδας. Σε σύγχρονα συστήματα είναι τυπικά "x" ή κενό· τα πραγματικά hashes βρίσκονται σε μια shadow βάση δεδομένων.

  • $gid - το αριθμητικό ID ομάδας (ο ίδιος αριθμός που περάσατε, επιστρεφόμενος από την εγγραφή).

  • $members - μία μοναδική συμβολοσειρά διαχωρισμένη με κενά των ονομάτων σύνδεσης των μελών, όχι λίστα. Διαχωρίστε την εσείς όταν χρειάζεστε πίνακα:

    my @users = split / /, (getgrgid($gid))[3];
    

Σε βαθμωτό περιβάλλον, μόνο το όνομα της ομάδας:

my $name = getgrgid(0);    # "root" on most Linux systems

Αν δεν υπάρχει ομάδα με το δοθέν GID, η συνάρτηση επιστρέφει την κενή λίστα σε περιβάλλον λίστας και undef σε βαθμωτό περιβάλλον. Μια αποτυχία σε επίπεδο συστήματος (π.χ. μη προσπελάσιμο backend NSS) αναφέρεται με τον ίδιο τρόπο· ελέγξτε το $! αν χρειάζεται να διακρίνετε.

Καθολική κατάσταση που επηρεάζει#

  • $! - τίθεται σε αποτυχία σε επίπεδο συστήματος της υποκείμενης κλήσης getgrgid(3). Δεν τίθεται όταν το GID απλώς δεν έχει αντίστοιχη εγγραφή· αυτό αποτελεί κανονικό «δεν βρέθηκε», όχι σφάλμα.

  • Ο δρομέας επανάληψης της βάσης δεδομένων ομάδων σε επίπεδο διεργασίας τον οποίο διατηρεί η libc. Η getgrgid δεν προωθεί ούτε επαναφέρει τον δρομέα που χρησιμοποιούν οι getgrent, setgrent και endgrent, αλλά μοιράζεται τον ίδιο υποκείμενο περιγραφέα αρχείου στις περισσότερες υλοποιήσεις - η ανάμειξη άμεσων αναζητήσεων με επανάληψη είναι φορητή θεωρητικά και εκπληκτική στην πράξη.

Παραδείγματα#

Αναζητήστε το όνομα της κύριας ομάδας για την τρέχουσα διεργασία:

my $group = getgrgid($();           # $( is the real GID
print "running as group: $group\n";

Επιλύστε το ID ομάδας ενός αρχείου σε όνομα, με μια λογική εφεδρεία για ορφανά GIDs (αρχεία που ανήκουν σε ομάδα που δεν υπάρχει πλέον):

my $gid   = (stat $file)[5];
my $name  = getgrgid($gid) // "<unknown gid $gid>";

Αποπακετάρετε την πλήρη εγγραφή και απαριθμήστε τα μέλη:

if (my ($name, undef, $gid, $members) = getgrgid(100)) {
    my @users = split / /, $members;
    print "group $name ($gid) has ", scalar(@users), " members\n";
}

Προφυλαχθείτε ρητά από την περίπτωση «δεν υπάρχει τέτοια ομάδα» - η κενή λίστα σε λογικό περιβάλλον / περιβάλλον λίστας είναι ήδη ψευδής, οπότε ένα if αρκεί:

unless (my @gr = getgrgid($gid)) {
    die "no group with gid $gid\n";
}

Συνδυάστε με την getpwuid για να αποδώσετε τις στήλες ιδιοκτήτη και ομάδας μιας λίστας καταλόγου:

my @st   = stat $path                 or die "stat $path: $!";
my $user = getpwuid($st[4]) // $st[4];
my $grp  = getgrgid($st[5]) // $st[5];
printf "%-8s %-8s %s\n", $user, $grp, $path;

Οριακές περιπτώσεις#

  • Έχει σημασία βαθμωτό έναντι περιβάλλοντος λίστας. Η getgrgid($gid) σε βαθμωτό περιβάλλον αποδίδει μόνο το όνομα της ομάδας· περιτυλίξτε σε παρενθέσεις ή εκχωρήστε σε λίστα για να λάβετε την πλήρη εγγραφή:

    my $name    = getgrgid(0);              # "root"
    my @record  = getgrgid(0);              # four-element list
    my $gid_out = (getgrgid(0))[2];         # the gid field
    
  • Το $members είναι συμβολοσειρά, όχι πίνακας. Η μορφή με ένωση κενών είναι ιστορική και ταιριάζει με την έξοδο pp_gpwent / pp_ggrent του perl5. Ο διαχωρισμός με / / (ένα κενό) είναι το κανονικό ιδίωμα· ο διαχωρισμός με /\s+/ είναι ελαφρώς πιο επιεικής αν κάποιο backend χρησιμοποιεί στηλοθέτες.

  • Οι κενές ομάδες επιστρέφουν το $members ως κενή συμβολοσειρά. Η split / /, "" αποδίδει την κενή λίστα, που είναι αυτό που συνήθως θέλουν οι καλούντες.

  • Αριθμητικός εξαναγκασμός. Το GID περνά στην κλήση C ως ακέραιος. Ένα μη αριθμητικό βαθμωτό εξαναγκάζεται: το "0root" γίνεται 0. Περάστε καθαρό ακέραιο.

  • Επικάλυψη χώρου ονομάτων GID. Πολλαπλές εγγραφές ομάδων με το ίδιο gid επιτρέπονται στο /etc/group και στο NSS. Η getgrgid επιστρέφει μία από αυτές - ποια ορίζεται από το backend. Μη βασίζεστε στο ποιο όνομα επιστρέφει όταν τα GIDs συγκρούονται· χρησιμοποιήστε την getgrnam για την αντίστροφη κατεύθυνση όταν έχει σημασία το όνομα.

  • NSS / nsswitch.conf. Η αναζήτηση ακολουθεί τον επιλογέα υπηρεσιών ονομάτων του συστήματος - files, sss, ldap κ.λπ. Μια επιτυχημένη αναζήτηση σε ένα πλαίσιο δοκιμών σε έναν host μπορεί να αποτύχει σε άλλον με διαφορετική διαμόρφωση NSS. Αυτή είναι ιδιότητα της βιβλιοθήκης C, όχι της Perl.

  • Μεγάλες ομάδες. Πολύ μεγάλες λίστες μελών ομάδας (εκατοντάδες μέλη) μπορεί να φτάνουν αποκομμένες αν ο εσωτερικός ενταμιευτής του backend είναι μικρότερος από την αποδιδόμενη γραμμή. Αυτό είναι περιορισμός της libc / NSS· η Perl αναδεικνύει πιστά ό,τι επέστρεψε το σύστημα.

  • Builds με threads. Σε συστήματα που παρέχουν την getgrgid_r, η perl καλεί διαφανώς την επανεισερχόμενη παραλλαγή. Οι καλούντες δεν βλέπουν διαφορά.

  • Taint. Υπό -T, τα $passwd και $members επιστρέφουν μολυσμένα (tainted) - το πρώτο επειδή μπορεί να κωδικοποιεί διαπιστευτήρια, το δεύτερο επειδή οι διαχειριστές μπορούν να το αλλάξουν. Τα $name και $gid δεν είναι μολυσμένα.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • getgrnam - η αντίστροφη αναζήτηση: εγγραφή ομάδας με όνομα αντί για gid

  • getgrent - επαναλάβετε κάθε εγγραφή ομάδας όταν χρειάζεστε σάρωση αντί για αναζήτηση

  • setgrent και endgrent - επαναφέρετε και απελευθερώστε τον δρομέα επανάληψης που χρησιμοποιεί η getgrent

  • getpwuid - το αντίστοιχο από την πλευρά passwd· συνδυάστε με την getgrgid για να αποδώσετε στήλες ιδιοκτήτη/ομάδας

  • User::grent - αντικείμενο προσπέλασης ανά όνομα που υπερκαλύπτει την getgrgid όταν προτιμάτε το $gr->name αντί για αποπακετάρισμα κατά θέση