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

getgrnam#

מחפש קבוצת Unix לפי שם ומחזיר את רשומת /etc/group שלה.

getgrnam עוטף את getgrnam(3) של ספריית C. בהינתן שם קבוצה כמו "wheel" או "staff", הוא מחזיר את הרשומה התואמת ממסד נתוני הקבוצות של המערכת - השם, מציין־המקום של הסיסמה המוצפנת, ה־GID המספרי, ורשימת שמות ההתחברות של החברים. השתמשו בו כשיש בידכם שם קבוצה ואתם צריכים את ה־GID או את רשימת החברות; השתמשו ב־getgrgid לחיפוש ההפוך.

תקציר#

my ($name, $passwd, $gid, $members) = getgrnam NAME
my $gid = getgrnam NAME

מה מקבלים בחזרה#

הקשר רשימה מניב רשימה בת ארבעה אלמנטים:

my ($name, $passwd, $gid, $members) = getgrnam "wheel";

אינדקס

שדה

משמעות

0

$name

שם קבוצה קנוני (זהה ל־NAME בעת התאמה)

1

$passwd

שדה סיסמת קבוצה, בדרך כלל "x" או ריק

2

$gid

מזהה קבוצה מספרי

3

$members

מחרוזת שמות התחברות של חברים מופרדת ברווח

$members הוא סקלר בודד, לא מערך. פצלו אותו בעצמכם כשרוצים רשימה:

my @logins = split /\s+/, (getgrnam("wheel"))[3];

הקשר סקלר מניב את ה־GID המספרי (״הדבר האחר״, מאחר שהחיפוש היה לפי שם):

my $gid = getgrnam "wheel";

אין קבוצה כזו: הקשר רשימה מחזיר את הרשימה הריקה; הקשר סקלר מחזיר undef. בדקו ערכי החזרה סקלריים למוגדרות ולא לאמת - GID 0 (root) הוא התאמה תקפה שגם שקרית:

defined(my $gid = getgrnam $group) or die "no group '$group'";

מצב גלובלי שהוא נוגע בו#

דבר ישירות. getgrnam הוא חיפוש חסר־מצב - בניגוד ל־getgrent, הוא אינו מקדם את האיטרטור של מסד נתוני הקבוצות, ו־setgrent / endgrent אינם משפיעים עליו. הוא כן, עם זאת, חולק את buffer התוצאה הסטטי של ספריית C עם קריאות getgr* אחרות בפלטפורמות ללא וריאנטים בטוחים־thread; העתיקו את השדות שאתם רוצים לפני קריאה לפונקציית getgr* אחרת.

דוגמאות#

פתרו שם קבוצה ל־GID שלה:

my $gid = getgrnam "wheel";
defined $gid or die "no 'wheel' group on this system";
print "wheel GID = $gid\n";

רשמו את חברי הקבוצה:

my @fields = getgrnam "staff"
    or die "no 'staff' group";
my @members = split /\s+/, $fields[3];
print "staff has ", scalar(@members), " members: @members\n";

השתמשו בשם קבוצה כדי לקבוע את ה־GID האפקטיבי (דורש הרשאה):

my $gid = getgrnam "video"
    // die "no 'video' group";
$) = "$gid $gid";                   # effective + supplementary

בדקו האם משתמש רשום כחבר בקבוצה. שימו לב שהקבוצה הראשית (ה־GID של המשתמש ב־/etc/passwd) אינה ב־$members - בדקו את שניהם:

sub in_group {
    my ($user, $group) = @_;
    my @g = getgrnam $group or return 0;
    return 1 if grep { $_ eq $user } split /\s+/, $g[3];
    my @u = getpwnam $user or return 0;
    return $u[3] == $g[2];          # primary group match
}

צורה מונחת־עצמים דרך User::grent, אשר עוקפת את הבנוי־מראש ברשומה לפי־שם:

use User::grent;
my $g = getgrnam "wheel";
printf "wheel: gid=%d members=%s\n", $g->gid, "@{$g->members}";

מקרי קצה#

  • קבוצה חסרה: הקשר רשימה מחזיר (), סקלר מחזיר undef. if (getgrnam $g) חשוף בסדר בהקשר רשימה אך שגוי בהקשר סקלר כאשר ה־GID יכול להיות 0:

    if (defined(my $gid = getgrnam $g)) { ... }   # correct
    if (my $gid = getgrnam $g)           { ... }  # wrong for GID 0
    
  • Members היא מחרוזת, לא רשימה. שכחה של זה וכתיבת scalar @members = getgrnam $g (או אינדוקס $members[0]) נותנת תוצאות שגויות בשתיקה. תמיד עשו split /\s+/ על השדה הרביעי.

  • חברי קבוצה ראשית נעדרים מהרשימה. משתמש שה־GID שלו ב־/etc/passwd תואם לקבוצה הוא חבר בעיני הקרנל אך לא יופיע ב־$members. חיפושים שמסווגים משתמשים לפי קבוצה חייבים להתייעץ גם עם getpwnam.

  • שדה הסיסמה אינו סיסמה. בכל לינוקס מודרני השדה השני הוא "x" (הפניית shadow) או ריק. הוא לעולם לא הטקסט הגלוי או ה־hash של סיסמת קבוצה. אל תסתמכו על הפורמט שלו.

  • רגישות לאותיות: שמות קבוצה הם רגישים לאותיות גדולות וקטנות בלינוקס. getgrnam "Wheel" לא מוצא את wheel.

  • שם עם רווח לבן או נקודתיים מוטמעים: פורמט מסד נתוני הקבוצות אינו מתיר אף אחד מהם, ולכן שמות כאלה לא יכולים להתקיים; החיפוש פשוט נכשל.

  • Backends של NSS: במערכות שמוגדרות עם LDAP, SSSD, או מודולים אחרים של name-service switch, getgrnam מתייעץ גם איתם וגם עם /etc/group. התוצאות לפיכך תלויות ב־/etc/nsswitch.conf וב־backends המוגדרים, לא ב־/etc/group בלבד.

  • Taint: השדות מגיעים מחוץ לתוכנית, ולכן תחת -T הם מוכתמים וחייבים להישטף לפני שימוש בפעולות רגישות.

  • בטיחות thread: pperl מחליף אוטומטית ב־getgrnam_r הבטוח־thread כאשר הפלטפורמה מספקת אותו. בפלטפורמות שאין בהן כזה, קריאות getgr* בו־זמניות בין threads עלולות לדרוס זו את תוצאות זו.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • getgrgid - חיפוש הפוך לפי GID מספרי; בחרו בו כשיש בידכם את ה־GID ואתם רוצים את שם הקבוצה או את רשימת החברים

  • getgrent - איטרציה על כל קבוצה במסד הנתונים כאשר אינכם יודעים את השם או את ה־GID מראש

  • setgrent - מחזיר את האיטרטור getgrent לאחור לתחילת מסד נתוני הקבוצות

  • endgrent - סוגר את file descriptor של מסד נתוני הקבוצות שנפתח על־ידי איטרציה

  • getpwnam - הקריאה המקבילה למסד נתוני המשתמשים; השתמשו לצד getgrnam כשאתם צריכים לפתור את הקבוצה הראשית של משתמש

  • User::grent - עטיפה מונחת־עצמים שעוקפת את getgrnam כך שתחזיר עצם רשומה עם accessors בעלי שם (name, passwd, gid, members) במקום רשימה מיקומית