מידע משתמש וקבוצה

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 - החיפוש ההפוך: רשומת קבוצה לפי שם ולא לפי gid

  • getgrent - מעבר על כל רשומת קבוצה כאשר צריך לסרוק ולא לחפש

  • setgrent ו־endgrent - איפוס ושחרור של סמן האיטרציה שמשמש את getgrent

  • getpwuid - המקבילה מצד passwd; משלבים עם getgrgid לעיבוד עמודות בעלים/קבוצה

  • User::grent - עצם accessor לפי־שם שעוקף את getgrgid כאשר מעדיפים $gr->name על פני פריסה לפי מיקום