getlogin#
מחזיר את שם ההתחברות של המשתמש המשויך למסוף השולט.
getlogin עוטף את פונקציית ספריית ה־C בעלת אותו שם. ב־Linux היא מתייעצת ברשומת הקרנל של מי הבעלים של המסוף השולט הנוכחי - מסורתית נרשם ב־/var/run/utmp - ומחזירה את אותו שם כמחרוזת. היא עונה לשאלה ״מי התחבר ב־tty זה?״, שאינה אותה שאלה כמו ״מי מריץ את התהליך הזה?״. תהליך ששינה את ה־UID האמיתי או האפקטיבי שלו, או שאין לו מסוף שולט כלל (דמון, עבודת cron, נקודת כניסה של מכולה), בדרך כלל יראה ש־getlogin מחזיר את המחרוזת הריקה או undef.
תקציר#
my $name = getlogin;
מה מקבלים בחזרה#
מחרוזת - שם ההתחברות שנרשם עבור המסוף השולט - או המחרוזת הריקה / undef כשאין רשומה כזו זמינה. התייחס למחרוזת־ריקה ו־undefined כאחד כ־״לא ידוע״ ופנה לחיפוש מבוסס־UID:
my $login = getlogin || getpwuid($<) || "Kilroy";
השימוש ב־|| כאן הוא מכוון: המחרוזת הריקה ו־undef שתיהן אומרות ״אין תשובה״ ושתיהן צריכות להפעיל את הפנייה החלופית.
מצב גלובלי שהוא נוגע בו#
דוגמאות#
תבנית הקנונית של מי־זה־המשתמש, חסינה מול סשנים מנותקים ושינויי UID:
my $login = getlogin || getpwuid($<) || "Kilroy";
print "hello, $login\n";
קריאה חשופה בסקריפט המחובר ל־shell:
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 אין מסוף שולט, כך של־getlogin אין דבר לדווח:
# running from cron
my $name = getlogin;
# $name is "" or undef; always pair with a getpwuid fallback
מקרי קצה#
ללא מסוף שולט: דמונים, שירותי systemd, עבודות cron, נקודות כניסה של מכולות, וכל דבר שמופעל ללא tty רואים את המחרוזת הריקה או
undef. זהו המקרה הנפוץ מחוץ ל־shells אינטראקטיביים - תמיד ספק פנייה חלופית.sudoו־su:getloginמחזיר את שם ההתחברות המקורי (בעל ה־tty), לא את משתמש היעד. לאחרsudo -u bob script.plאתה מקבל את ההתחברות שלך עצמך, בעודgetpwuidעם$<מחזירbob. בחר את זה שמתאים לשאלה שאתה למעשה שואל.לא פרימיטיב אימות: הרשומה ש־
getloginקורא יכולה להיות מזויפת או מיושנת; תהליך שיורש tty מסשן לא־קשור עלול לראות שם שאין לו דבר עם תעודות הזהות שלו. לעולם אל תנעל התנהגות מורשית על ערך ההחזרה. השתמש ב־getpwuidעל$</$>במקום.מחרוזת ריקה לעומת
undef: פלטפורמות נבדלות באיזה מהם הן מחזירות כאשר אין רשומה. הפנייה החלופית||מטפלת בשניהם; בדיקתdefined־בלבד אינה.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
getpwuid- פותר את$<או$>לשם, והוא אבן הבניין הנכונה ל־״מי מריץ את התהליך הזה?״getpwnam- החיפוש ההפוך כשכבר יש לך שם התחברות וצריך את רשומת הסיסמהgetpwent- בצע איטרציה על כל מסד נתוני הסיסמאות כשצריך יותר מרשומה אחת$<- UID אמיתי; הארגומנט הטבעי ל־getpwuidבניב הפנייה החלופית שלgetlogin$>- UID אפקטיבי; השתמש בזה במקום ב־$<כשאכפת לך מהזהות שתחתיה פעולות מורשות יבוצעו בפועל