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

getgrent#

Διαβάζει την επόμενη εγγραφή από τη βάση δεδομένων ομάδων του συστήματος.

Η getgrent διατρέχει τη βάση δεδομένων ομάδων του υπολογιστή μία εγγραφή τη φορά, όπως θα τη διάβαζε ένας απλός βρόχος πάνω από το /etc/group γραμμή προς γραμμή, και επιστρέφει μια άποψη κάθε εγγραφής σε μορφή Perl. Είναι η μορφή επαναλήπτη των αναζητήσεων ομάδων - χρησιμοποιήστε την όταν θέλετε κάθε ομάδα, ή κάθε ομάδα που ικανοποιεί κάποιο κατηγόρημα. Για αναζήτηση μίας εγγραφής κατά όνομα ή gid, χρησιμοποιήστε καλύτερα την getgrnam ή την getgrgid.

Η πρώτη κλήση getgrent ανοίγει έμμεσα τη βάση δεδομένων. Η επανάληψη συνεχίζεται μεταξύ επόμενων κλήσεων μέχρι να εξαντληθεί η βάση δεδομένων, οπότε η getgrent επιστρέφει την κενή λίστα (ή undef σε βαθμωτό περιβάλλον). Καλέστε την setgrent για να επιστρέψετε στην αρχή, ή την endgrent για να κλείσετε τη βάση δεδομένων και να απελευθερώσετε τους πόρους που κρατά η βιβλιοθήκη C.

Σύνοψη#

my ($name, $passwd, $gid, $members) = getgrent;
my $name                            = getgrent;        # scalar context

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

Σε περιβάλλον λίστας, μια λίστα τεσσάρων στοιχείων - μία εγγραφή ανά ομάδα:

Δείκτης

Πεδίο

Σημασία

0

$name

Όνομα ομάδας (π.χ. "wheel")

1

$passwd

Κωδικός ομάδας, συνήθως "x" σε υπολογιστές με shadow passwords

2

$gid

Αριθμητικό gid ομάδας

3

$members

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

Όταν η επανάληψη φτάσει στο τέλος, η επιστροφή είναι η κενή λίστα. Αν γράψετε if (my @gr = getgrent) ο βρόχος τερματίζεται καθαρά στο τέλος της βάσης δεδομένων.

Σε βαθμωτό περιβάλλον, η getgrent επιστρέφει μόνο το $name. Όταν η βάση δεδομένων εξαντληθεί, επιστρέφει undef - το σήμα που ελέγχουν τα περισσότερα σενάρια για να τερματίσουν έναν βρόχο while.

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

my @logins = split ' ', $members;

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

Η getgrent διατηρεί κατάσταση επανάληψης ανά διεργασία μέσα στη βιβλιοθήκη C (νοητικά, μια θέση αρχείου μέσα στη βάση δεδομένων ομάδων). Δύο κλήσεις στην ίδια διεργασία μοιράζονται αυτή την κατάσταση· ένας εμφωλευμένος βρόχος που καλεί getgrent μέσα σε άλλον βρόχο getgrent θα μπερδέψει τις εγγραφές μεταξύ τους και θα χάσει τις περισσότερες. Σειριοποιήστε τα περάσματα, ή αποτυπώστε όλες τις εγγραφές πρώτα σε πίνακα:

my @all;
while (my @gr = getgrent) { push @all, [ @gr ] }
endgrent;

Ο επαναλήπτης δεν μηδενίζεται όταν επιστρέψει μια υπορουτίνα. Αν κώδικας βιβλιοθήκης που δεν ελέγχετε καλεί getgrent, μετακινεί τη θέση σας. Προστατέψτε με setgrent όταν χρειάζεστε καθαρή εκκίνηση.

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

Διατρέχει κάθε ομάδα και τυπώνει το όνομα και το πλήθος μελών:

while (my ($name, undef, $gid, $members) = getgrent) {
    my $n = length $members ? scalar(split ' ', $members) : 0;
    printf "%-16s gid=%d members=%d\n", $name, $gid, $n;
}
endgrent;

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

my $user = 'alice';
my @groups;
while (my ($name, undef, undef, $members) = getgrent) {
    push @groups, $name
        if grep { $_ eq $user } split ' ', $members;
}
endgrent;

Βαθμωτό περιβάλλον - απαριθμεί κάθε όνομα ομάδας, ένα ανά γραμμή:

while (defined(my $name = getgrent)) {
    print $name, "\n";
}
endgrent;

Επαναφορά και επανανάγνωση, για παράδειγμα για να χτίσετε δύο ευρετήρια σε ένα πέρασμα έκαστο:

setgrent;
my %by_name = map { $_->[0] => $_ }
              map { [ getgrent ] } 1 .. ();   # collect…
# …or just loop twice with an explicit setgrent before each pass.
setgrent;
while (my @gr = getgrent) { ... }
endgrent;

Μετατροπή αριθμητικού gid από την stat σε όνομα ομάδας χωρίς δεύτερη αναζήτηση μέσω cache της εξόδου του επαναλήπτη:

my %name_of;
while (my ($name, undef, $gid) = getgrent) {
    $name_of{$gid} = $name;
}
endgrent;

my $gid = (stat $path)[5];
print "group: $name_of{$gid}\n";

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

  • Τέλος επανάληψης έναντι κανονικής εγγραφής: σε περιβάλλον λίστας, μια εξαντλημένη βάση δεδομένων επιστρέφει την κενή λίστα - η οποία ανατίθεται ως μηδέν στοιχεία, οπότε το my @gr = getgrent; @gr or last; είναι ο ιδιωματικός έλεγχος τερματισμού. Σε βαθμωτό περιβάλλον, ελέγξτε με defined αντί για αλήθεια, αφού ένα νόμιμο όνομα ομάδας θα μπορούσε καταρχήν να είναι η συμβολοσειρά "0".

  • Δεν υπάρχει πεδίο κωδικού στο σύγχρονο Linux: το $passwd είναι σχεδόν πάντα "x" (οι πραγματικοί κατακερματισμοί βρίσκονται στο /etc/gshadow). Μην ερμηνεύσετε τιμή διαφορετική του "x" ως «έχει οριστεί κωδικός» χωρίς να συμβουλευτείτε τη shadow βάση δεδομένων.

  • Κενό $members: ομάδες χωρίς ρητά μέλη (χρήστες που εμφανίζονται μόνο μέσω του πρωτεύοντος gid) έχουν το $members ως κενή συμβολοσειρά. Η split ' ', "" επιστρέφει κενή λίστα - ο ιδιωματικός τρόπος να πάρετε τα μέλη ως πίνακα χωρίς ειδική περίπτωση.

  • Η έμμεση συμμετοχή μέσω πρωτεύοντος gid δεν αναφέρεται: το $members απαριθμεί μόνο τους χρήστες που κατονομάζονται ρητά στην εγγραφή /etc/group της ομάδας. Ένας χρήστης του οποίου το πρωτεύον gid ταιριάζει με αυτή την ομάδα αλλά δεν αναφέρεται επίσης στο πεδίο members δεν εμφανίζεται. Διασταυρώστε με την getpwent αν χρειάζεστε και τα δύο είδη συμμετοχής.

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

  • Tainted κατάσταση: το πεδίο $passwd σημειώνεται ως tainted υπό -T, όπως και για την getpwent - αντιμετωπίστε το ως μη έμπιστη είσοδο παρότι η συνήθης τιμή είναι "x".

  • Καθολικό σε επίπεδο διεργασίας, όχι ανά thread: σε συστήματα χωρίς thread-safe παραλλαγές η κατάσταση επανάληψης είναι ανά διεργασία, όχι ανά thread. Δύο threads που διατρέχουν getgrent ταυτόχρονα θα χάσουν εγγραφές.

  • Η endgrent είναι προαιρετική αλλά ευγενική: το να αφήσετε τη βάση δεδομένων ανοιχτή ως την έξοδο του προγράμματος λειτουργεί, αλλά αν έχετε τελειώσει με την επανάληψη, καλέστε την endgrent ώστε η βιβλιοθήκη C να μπορεί να απορρίψει τους ενταμιευτές της.

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

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

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

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

  • getgrgid - μεμονωμένη αναζήτηση κατά αριθμητικό gid· ο συνήθης συνεργάτης της stat όταν χρειάζεστε όνομα ομάδας για ένα αρχείο

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

  • endgrent - κλείνει τη βάση δεδομένων και απελευθερώνει τους πόρους που κρατά ανοιχτούς η βιβλιοθήκη C

  • getpwent - ο παράλληλος επαναλήπτης πάνω από τη βάση δεδομένων passwd· συνδυάστε με getgrent όταν επιλύετε πλήρεις σχέσεις χρήστη-προς-ομάδα

  • scalar - επιβάλλει βαθμωτό περιβάλλον όταν χρειάζεστε μόνο το όνομα ομάδας και θέλετε να παρακάμψετε τα άλλα πεδία