Πληροφορίες χρηστών και ομάδων
getpwent#
Επιστροφή της επόμενης εγγραφής από τη βάση δεδομένων κωδικών πρόσβασης του συστήματος.
Η getpwent διασχίζει τη βάση δεδομένων κωδικών πρόσβασης μία εγγραφή τη φορά. Η πρώτη κλήση ανοίγει τη βάση δεδομένων (τυπικά /etc/passwd, ενδεχομένως διευρυμένη μέσω NSS με LDAP, SSSD ή παρόμοιο)· κάθε επόμενη κλήση επιστρέφει την επόμενη εγγραφή. Όταν η επανάληψη εξαντληθεί, η κλήση επιστρέφει κενή λίστα σε περιβάλλον λίστας ή undef σε βαθμωτό περιβάλλον. Συνδυάστε την με setpwent για επαναφορά και endpwent για απελευθέρωση τυχόν πόρων που κρατά η βιβλιοθήκη βάσης δεδομένων.
Σύνοψη#
my @fields = getpwent;
my $name = getpwent; # scalar context: login name only
Τι επιστρέφεται#
Σε περιβάλλον λίστας, μια λίστα 10 στοιχείων που περιγράφει έναν λογαριασμό:
my ( $name, $passwd, $uid, $gid, $quota,
$comment, $gcos, $dir, $shell, $expire ) = getpwent;
# 0 1 2 3 4
# 5 6 7 8 9
$name- όνομα σύνδεσης.$passwd- το πεδίο κρυπτογραφημένου κωδικού πρόσβασης. Σε συστήματα με shadow passwords αυτό είναι συνήθως"x"ή"*"εκτός αν η διεργασία είναι προνομιούχα· η πραγματική τιμή κατακερματισμού βρίσκεται στο/etc/shadow. Tainted υπό-T.$uid,$gid- αριθμητικά ids χρήστη και πρωτεύουσας ομάδας.$quota- όριο δίσκου σε συστήματα που το υποστηρίζουν, αλλιώς κενή συμβολοσειρά. Σε ορισμένα συστήματα αυτή η θέση φέρει$changeή$age(δεδομένα παλαίωσης κωδικού).$comment- διαχειριστικό σχόλιο σε συστήματα που το υποστηρίζουν, αλλιώς κενό. Σε ορισμένα συστήματα αυτή η θέση φέρει$class.$gcos- το πεδίο GECOS, συμβατικά το πραγματικό όνομα του χρήστη. Εγγράψιμο από τον χρήστη σε πολλά συστήματα, επομένως tainted υπό-T.$dir- αρχικός κατάλογος.$shell- κέλυφος σύνδεσης. Tainted υπό-T.$expire- λήξη λογαριασμού ή κωδικού πρόσβασης σε συστήματα που το υποστηρίζουν, αλλιώς απουσιάζει.
Σε βαθμωτό περιβάλλον, επιστρέφεται μόνο το όνομα σύνδεσης. Όταν η επανάληψη εξαντληθεί, η βαθμωτή τιμή είναι undef και η τιμή λίστας είναι κενή.
Το αν τα $quota, $comment και $expire φέρουν ουσιαστικά δεδομένα στην τρέχουσα έκδοση εξαρτάται από το πώς ρυθμίστηκε η Perl· επιθεωρήστε τις τιμές Config d_pwquota, d_pwage, d_pwchange, d_pwcomment και d_pwexpire για να το ανακαλύψετε.
Καθολική κατάσταση που επηρεάζει#
Η getpwent διατηρεί τον δρομέα της σε ένα καθολικό σε επίπεδο διεργασίας μπλοκ κατάστασης που ανήκει στη βιβλιοθήκη, μέσα στις ρουτίνες pwd της βιβλιοθήκης C. Συνέπειες:
Δύο ανεξάρτητοι βρόχοι πάνω στη βάση δεδομένων στην ίδια διεργασία αλληλοεπηρεάζονται. Κάθε
getpwentπροωθεί τον έναν κοινόχρηστο δρομέα.Η
setpwentεπαναφέρει αυτόν τον δρομέα στην αρχή.Η
endpwentκλείνει τη βάση δεδομένων και αφήνει τυχόν πόρους (ανοιχτούς περιγραφείς αρχείων, κατάσταση αρθρώματος NSS) που κρατούσε η βιβλιοθήκη.Τα threads μοιράζονται επίσης τον δρομέα. Η
getpwentδεν είναι ασφαλής για ταυτόχρονη κλήση από πολλαπλά threads· αν δύο threads επαναλάβουν παράλληλα, κανένα από τα δύο δεν βλέπει κάθε εγγραφή.
Η getpwent δεν διαβάζει ούτε γράφει σε ειδικές μεταβλητές Perl.
Παραδείγματα#
Εκτύπωση κάθε ονόματος λογαριασμού και αρχικού καταλόγου:
while ( my @pw = getpwent ) {
print "$pw[0]\t$pw[7]\n";
}
endpwent;
Η αποδόμηση με ονομαζόμενα πεδία διαβάζεται πιο καθαρά από την αριθμητική ευρετηρίαση:
while ( my ($name, undef, $uid, $gid, undef, undef, $gcos, $dir) = getpwent ) {
next if $uid < 1000; # skip system accounts
print "$name ($gcos) uid=$uid home=$dir\n";
}
endpwent;
Το βαθμωτό περιβάλλον δίνει το όνομα σύνδεσης, χρήσιμο για απαρίθμηση χρηστών χωρίς αποπακετάρισμα των υπολοίπων:
my @users;
while ( defined( my $name = getpwent ) ) {
push @users, $name;
}
endpwent;
Επαναφορά στη μέση μιας διάσχισης με setpwent:
my @first_pass = (getpwent)[0];
setpwent; # back to the top
while ( my @pw = getpwent ) { ... }
endpwent;
Συλλογή όλων των εγγραφών σε πίνακα κατακερματισμού με κλειδί το uid, και έπειτα απελευθέρωση της βάσης δεδομένων:
my %by_uid;
while ( my @pw = getpwent ) {
$by_uid{ $pw[2] } = \@pw;
}
endpwent;
Οριακές περιπτώσεις#
Τέλος επανάληψης: επιστρέφει κενή λίστα σε περιβάλλον λίστας και
undefσε βαθμωτό περιβάλλον. Οιwhile (my @pw = getpwent)καιwhile (defined(my $name = getpwent))είναι οι ιδιωματικές μορφές βρόχου.Παράλειψη της
endpwent: διαρρέει όποιους περιγραφείς αρχείων ή κατάσταση NSS άνοιξε η βιβλιοθήκη μέχρι να τερματίσει η διεργασία. Δεν είναι σφάλμα ορθότητας, αλλά γίνεται αισθητό σε προγράμματα μακράς διαρκείας και σε λουριά δοκιμών.Η εμφωλευμένη επανάληψη είναι σπασμένη: δύο βρόχοι στην ίδια διεργασία μοιράζονται τον μοναδικό δρομέα της βιβλιοθήκης. Συλλέξτε μια διάσχιση σε δομή δεδομένων πριν ξεκινήσετε την επόμενη.
Shadow passwords: σε Linux και Solaris η πραγματική τιμή κατακερματισμού κωδικού βρίσκεται στο
/etc/shadow, αναγνώσιμη μόνο από τον root. Οι μη προνομιούχες διεργασίες βλέπουν"x"ή"*"στο$passwdκαι πρέπει να καλέσουν τις shadow-aware ρουτίνες (εκτός του πυρήνα της Perl) για να πάρουν την τιμή κατακερματισμού.Εκπλήξεις NSS: η βάση δεδομένων είναι ό,τι λέει το
/etc/nsswitch.conf. Σε έναν υπολογιστή δεμένο με LDAP ή SSSD, ηgetpwentμπορεί να επιστρέψει χιλιάδες λογαριασμούς καταλόγου, να πάρει αξιοσημείωτο χρόνο, και να αποτυγχάνει περιοδικά αν το δίκτυο είναι ασταθές. Σκεφτείτε να αναζητάτε λογαριασμούς ονομαστικά μεgetpwnamόταν ξέρετε ποιον θέλετε.Tainting υπό
-T: τα$passwd,$gcosκαι$shellεπιστρέφουν tainted επειδή οι χρήστες μπορούν να τα επηρεάσουν. Αφαιρέστε το taint με σκόπιμη αντιστοιχία regex αν χρειάζεται να τα χρησιμοποιήσετε σε ευαίσθητες λειτουργίες.Ασφάλεια threads: σε αντίθεση με τις
getpwnamκαιgetpwuid, δεν υπάρχειgetpwent_rσε POSIX που η Perl να μπορεί να υποκαταστήσει διαφανώς. Η ταυτόχρονη επανάληψη από πολλαπλά threads δεν είναι ασφαλής.Διεπαφή ονόματος: το
User::pwentυπερισχύει τηςgetpwentμε μια έκδοση που επιστρέφει αντικείμενο που εκθέτει πεδία ως μεθόδους ($pw->name,$pw->uid, …). Χρησιμοποιήστε το όταν το αποπακετάρισμα αριθμητικών θέσεων γίνεται δύσχρηστο.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getpwnam- αναζήτηση ενός λογαριασμού κατά όνομα σύνδεσης· η σωστή κλήση όταν ξέρετε ποιον χρήστη θέλετεgetpwuid- αναζήτηση ενός λογαριασμού κατά αριθμητικό uidsetpwent- επαναφορά του δρομέαgetpwentστην πρώτη εγγραφήendpwent- κλείσιμο της βάσης δεδομένων κωδικών και απελευθέρωση πόρων βιβλιοθήκης· καλέστε την όταν τελειώσει η διάσχισηgetgrent- το αντίστοιχο της βάσης ομάδων, ίδιο μοντέλο επανάληψηςUser::pwent- διεπαφή ονόματος που επιστρέφει αντικείμενο με ονομαζόμενους accessors αντί για λίστα 10 στοιχείων