getgrgid#
מחפש רשומת קבוצה לפי מזהה קבוצה מספרי.
getgrgid שואל את מסד נתוני הקבוצות של המערכת על הרשומה שה־gid שלה הוא GID ומחזיר את מה שמצא. הוא המקבילה המספרית של getgrnam ומשקף את קריאת ספריית C getgrgid(3). בהקשר רשימה מקבלים את שדות הרשומה הפרוסים; בהקשר סקלר מקבלים את שם הקבוצה.
תקציר#
my ($name, $passwd, $gid, $members) = getgrgid($gid);
my $name = getgrgid($gid);
מה מקבלים בחזרה#
בהקשר רשימה, ארבעה ערכים פרוסים מתוך struct group:
# 0 1 2 3
my ( $name, $passwd, $gid, $members ) = getgrgid($gid);
$name- שם הקבוצה.$passwd- שדה סיסמת הקבוצה. במערכות מודרניות זה בדרך כלל"x"או ריק; ההאשים האמיתיים חיים במסד נתוני shadow.$gid- מזהה הקבוצה המספרי (אותו מספר שהועבר, מהדהד בחזרה מהרשומה).$members- מחרוזת יחידה מופרדת ברווחים של שמות התחברות של חברים, לא רשימה. יש לבצע split בעצמכם כאשר נדרש מערך:my @users = split / /, (getgrgid($gid))[3];
בהקשר סקלר, רק שם הקבוצה:
my $name = getgrgid(0); # "root" on most Linux systems
אם אין קבוצה עם ה־GID הנתון, הפונקציה מחזירה רשימה ריקה בהקשר רשימה ו־undef בהקשר סקלר. כישלון ברמת המערכת (למשל backend של NSS אינו נגיש) מדווח באותו אופן; יש לבדוק את $! אם נדרש להבחין.
מצב גלובלי שהוא נוגע בו#
$!- נקבע בכישלון ברמת המערכת של קריאתgetgrgid(3)הבסיסית. אינו נקבע כאשר ל־GIDפשוט אין רשומה תואמת; זהו ״לא נמצא״ רגיל, לא שגיאה.סמן איטרציית מסד נתוני הקבוצות לכל־התהליך שמתוחזק על־ידי libc.
getgrgidאינו מקדם או מאפס את הסמן המשמש אתgetgrent,setgrent, ו־endgrent, אך הוא חולק את אותו file descriptor בסיסי ברוב המימושים - שזירת חיפושים ישירים עם איטרציה ניידת בתיאוריה ומפתיעה בפועל.
דוגמאות#
חיפוש שם הקבוצה הראשית של התהליך הנוכחי:
my $group = getgrgid($(); # $( is the real GID
print "running as group: $group\n";
פתרון של מזהה הקבוצה של קובץ לשם, עם נסיגה הגיונית עבור GIDs יתומים (קבצים בבעלות קבוצה שכבר אינה קיימת):
my $gid = (stat $file)[5];
my $name = getgrgid($gid) // "<unknown gid $gid>";
פריסת הרשומה המלאה ורישום החברים:
if (my ($name, undef, $gid, $members) = getgrgid(100)) {
my @users = split / /, $members;
print "group $name ($gid) has ", scalar(@users), " members\n";
}
הגנה מפורשת מפני המקרה ״אין קבוצה כזאת״ - הרשימה הריקה בהקשר בוליאני/רשימה כבר שקרית, ולכן if מספיק:
unless (my @gr = getgrgid($gid)) {
die "no group with gid $gid\n";
}
שילוב עם getpwuid לעיבוד עמודות הבעלים והקבוצה של רשימת ספריות:
my @st = stat $path or die "stat $path: $!";
my $user = getpwuid($st[4]) // $st[4];
my $grp = getgrgid($st[5]) // $st[5];
printf "%-8s %-8s %s\n", $user, $grp, $path;
מקרי קצה#
הקשר סקלר לעומת רשימה משנה.
getgrgid($gid)בהקשר סקלר מניב רק את שם הקבוצה; יש לעטוף בסוגריים או להשים לרשימה כדי לקבל את הרשומה המלאה:my $name = getgrgid(0); # "root" my @record = getgrgid(0); # four-element list my $gid_out = (getgrgid(0))[2]; # the gid field
$membersהיא מחרוזת, לא מערך. הצורה המחוברת ברווחים היא היסטורית ותואמת את פלטpp_gpwent/pp_ggrentשל perl5. פיצול על/ /(רווח יחיד) הוא המטבע הקנוני; פיצול על/\s+/סלחני מעט יותר אם backend אי פעם משתמש ב־tab.קבוצות ריקות מחזירות
$membersכמחרוזת הריקה.split / /, ""מניב את הרשימה הריקה, וזה מה שהקוראים בדרך כלל רוצים.המרה מספרית.
GIDמועבר לקריאת ה־C כמספר שלם. סקלר לא־מספרי מומר:"0root"הופך ל־0. יש להעביר מספר שלם נקי.חפיפת מרחב שמות GID. רשומות קבוצה מרובות עם אותו
gidהן חוקיות ב־/etc/groupוב־NSS.getgrgidמחזיר אחת מהן - איזה מהן מוגדר על־ידי ה־backend. אין להסתמך על איזה שם חוזר כאשר GIDs מתנגשים; יש להשתמש ב־getgrnamלכיוון ההפוך כאשר השם חשוב.NSS / nsswitch.conf. החיפוש עוקב אחר ה־name service switch של המערכת -
files,sss,ldap, וכו«. חיפוש מוצלח ב־test harness על מארח אחד עשוי להיכשל על אחר עם תצורת NSS שונה. זוהי תכונה של ספריית C, לא של Perl.קבוצות גדולות. רשימות חברים גדולות מאוד של קבוצה (מאות חברים) עשויות להגיע קטומות אם הבופר הפנימי של ה־backend קטן מהשורה המעובדת. זוהי מגבלה של libc / NSS; Perl חושף בנאמנות מה שהמערכת החזירה.
בנייה עם threads. במערכות שמספקות
getgrgid_r, perl קורא בשקיפות לווריאנט הריאנטרנטי. הקוראים אינם רואים הבדל.Taint. תחת
-T,$passwdו־$membersחוזרים tainted - הראשון משום שהוא עשוי לקודד אישורים, השני משום שמנהלי מערכת יכולים לשנותו.$nameו־$gidאינם tainted.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
getgrnam- החיפוש ההפוך: רשומת קבוצה לפי שם ולא לפיgidgetgrent- מעבר על כל רשומת קבוצה כאשר צריך לסרוק ולא לחפשsetgrentו־endgrent- איפוס ושחרור של סמן האיטרציה שמשמש אתgetgrentgetpwuid- המקבילה מצד passwd; משלבים עםgetgrgidלעיבוד עמודות בעלים/קבוצהUser::grent- עצם accessor לפי־שם שעוקף אתgetgrgidכאשר מעדיפים$gr->nameעל פני פריסה לפי מיקום