Πληροφορίες χρηστών και ομάδων
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 |
| Όνομα ομάδας (π.χ. |
1 |
| Κωδικός ομάδας, συνήθως |
2 |
| Αριθμητικό gid ομάδας |
3 |
| Συμβολοσειρά ονομάτων σύνδεσης μελών διαχωρισμένων με κενά |
Όταν η επανάληψη φτάσει στο τέλος, η επιστροφή είναι η κενή λίστα. Αν γράψετε 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- κλείνει τη βάση δεδομένων και απελευθερώνει τους πόρους που κρατά ανοιχτούς η βιβλιοθήκη Cgetpwent- ο παράλληλος επαναλήπτης πάνω από τη βάση δεδομένων passwd· συνδυάστε μεgetgrentόταν επιλύετε πλήρεις σχέσεις χρήστη-προς-ομάδαscalar- επιβάλλει βαθμωτό περιβάλλον όταν χρειάζεστε μόνο το όνομα ομάδας και θέλετε να παρακάμψετε τα άλλα πεδία