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

getlogin#

Επιστρέφει το όνομα σύνδεσης του χρήστη που συσχετίζεται με το ελέγχον τερματικό.

Η getlogin τυλίγει την ομώνυμη συνάρτηση της βιβλιοθήκης C. Σε Linux συμβουλεύεται την εγγραφή του πυρήνα για το ποιος κατέχει το τρέχον ελέγχον τερματικό - παραδοσιακά καταγεγραμμένη στο /var/run/utmp - και επιστρέφει αυτό το όνομα ως συμβολοσειρά. Απαντάει στην ερώτηση «ποιος συνδέθηκε σε αυτό το tty;», που δεν είναι η ίδια ερώτηση με «ποιος τρέχει αυτή τη διεργασία;». Μια διεργασία που έχει αλλάξει το real ή το effective UID της, ή που δεν έχει καθόλου ελέγχον τερματικό (δαίμονας, cron job, entrypoint σε container), θα δει συνήθως την getlogin να επιστρέφει την κενή συμβολοσειρά ή undef.

Σύνοψη#

my $name = getlogin;

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

Μια συμβολοσειρά - το όνομα σύνδεσης που είναι καταγεγραμμένο για το ελέγχον τερματικό - ή την κενή συμβολοσειρά / undef όταν δεν υπάρχει διαθέσιμη τέτοια εγγραφή. Αντιμετωπίστε τόσο την κενή συμβολοσειρά όσο και την απροσδιόριστη τιμή ως «άγνωστο» και επιστρέψτε σε αναζήτηση βασισμένη σε UID:

my $login = getlogin || getpwuid($<) || "Kilroy";

Η χρήση του || εδώ είναι σκόπιμη: η κενή συμβολοσειρά και η undef σημαίνουν και οι δύο «καμία απάντηση» και και οι δύο πρέπει να ενεργοποιήσουν την εφεδρεία.

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

  • Διαβάζει την $< έμμεσα μόνο μέσω της ιδιωματικής εφεδρείας getpwuid παραπάνω· η ίδια η getlogin δεν παίρνει ορίσματα και δεν συμβουλεύεται καμία μεταβλητή της Perl.

  • Θέτει την $! στις διαδρομές αποτυχίας της υποκείμενης κλήσης συστήματος που εκθέτει η βιβλιοθήκη C.

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

Το κανονικό μοτίβο ποιος-είναι-αυτός-ο-χρήστης, ανθεκτικό σε αποσπασμένες συνεδρίες και αλλαγές UID:

my $login = getlogin || getpwuid($<) || "Kilroy";
print "hello, $login\n";

Σκέτη κλήση σε σενάριο προσαρτημένο σε κέλυφος:

my $name = getlogin;
print defined $name && length $name
    ? "tty owner: $name\n"
    : "no controlling tty\n";

Contrast with getpwuid, which answers a different question

  • «who is the effective user running this code?»:

my $tty_user  = getlogin           // "";
my $proc_user = getpwuid($<);
print "tty=$tty_user proc=$proc_user\n";
# After `sudo -u bob script.pl`, tty_user is your login,
# proc_user is "bob".

Μέσα σε δαίμονα ή σε cron job δεν υπάρχει ελέγχον τερματικό, οπότε η getlogin δεν έχει τίποτα να αναφέρει:

# running from cron
my $name = getlogin;
# $name is "" or undef; always pair with a getpwuid fallback

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

  • Δεν υπάρχει ελέγχον τερματικό: δαίμονες, υπηρεσίες systemd, cron jobs, entrypoints σε container, και οτιδήποτε ξεκινάει χωρίς tty βλέπουν την κενή συμβολοσειρά ή undef. Αυτή είναι η συνηθισμένη περίπτωση εκτός διαδραστικών κελυφών - παρέχετε πάντα εφεδρεία.

  • sudo και su: η getlogin επιστρέφει το αρχικό όνομα σύνδεσης (τον ιδιοκτήτη του tty), όχι τον χρήστη-στόχο. Μετά από sudo -u bob script.pl παίρνετε το δικό σας login, ενώ η getpwuid με $< επιστρέφει bob. Διαλέξτε αυτό που ταιριάζει στην ερώτηση που πραγματικά κάνετε.

  • Όχι πρωτογενής λειτουργία ταυτοποίησης: η εγγραφή που διαβάζει η getlogin μπορεί να είναι πλαστογραφημένη ή παλιά· μια διεργασία που κληρονομεί tty από άσχετη συνεδρία μπορεί να δει όνομα που δεν έχει καμία σχέση με τα δικά της διαπιστευτήρια. Ποτέ μη φιλτράρετε προνομιακή συμπεριφορά με βάση την τιμή επιστροφής. Χρησιμοποιήστε την getpwuid πάνω στη $< / $> αντί γι” αυτό.

  • Κενή συμβολοσειρά έναντι undef: οι πλατφόρμες διαφέρουν στο ποιο επιστρέφουν όταν δεν υπάρχει εγγραφή. Η εφεδρεία || χειρίζεται και τα δύο· ένας έλεγχος μόνο με defined όχι.

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

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

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

  • getpwuid - επιλύει τη $< ή τη $> σε όνομα, και είναι το σωστό δομικό στοιχείο για το «ποιος τρέχει αυτή τη διεργασία;»

  • getpwnam - η αντίστροφη αναζήτηση όταν έχετε ήδη όνομα σύνδεσης και χρειάζεστε την εγγραφή passwd

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

  • $< - real UID· το φυσικό όρισμα προς την getpwuid στο ιδίωμα εφεδρείας της getlogin

  • $> - effective UID· χρησιμοποιήστε αυτό αντί για $< όταν σας ενδιαφέρει η ταυτότητα υπό την οποία θα τρέξουν πραγματικά οι προνομιακές λειτουργίες