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 |
| שם קבוצה קנוני (זהה ל־ |
1 |
| שדה סיסמת קבוצה, בדרך כלל |
2 |
| מזהה קבוצה מספרי |
3 |
| מחרוזת שמות התחברות של חברים מופרדת ברווח |
$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) במקום רשימה מיקומית