umask#
מגדיר או קורא את מסכת מצב יצירת הקבצים של התהליך.
umask שולט באילו ביטי הרשאה מנוקים מארגומנט ה־MODE של כל קריאת יצירת קובץ או ספרייה הנעשית על־ידי תהליך זה מעתה ואילך. זו תכונה של התהליך הרץ, לא של מטפל קובץ מסוים, והיא נירשת על־ידי תהליכי ילד. קראו umask EXPR כדי להתקין מסכה חדשה ולקבל את הקודמת; קראו umask חשוף כדי לקרוא את המסכה הנוכחית מבלי לשנותה.
תקציר#
umask EXPR
umask
מה מקבלים בחזרה#
ה־umask הקודם כמספר שלם, כך שתוכלו לשמור אותו ולשחזר אותו מאוחר יותר:
my $old = umask 0077;
# ... create private files ...
umask $old;
umask חשוף מחזיר את המסכה הנוכחית מבלי לשנותה. אם למערכת אין קריאת umask(2) והקורא מנסה להגביל גישה לעצמו ((EXPR & 0700) > 0), חריגה מועלית; אם הקריאה אינה ממומשת והקורא אינו מגביל את הגישה של עצמו, מוחזר undef. ב־Linux המקרה הזה לא מתעורר.
כיצד המסכה מוחלת#
המסכה היא מחסירה. כל ביט שנקבע ב־umask מנוקה מה־MODE המועבר ל־mkdir, sysopen, open במצבי יצירה, ולקריאות המערכת הבסיסיות creat(2) / mkdir(2). ההרשאות האפקטיביות של הקובץ החדש הן MODE & ~umask.
הרשאת Unix כמו rwxr-x--- היא שלוש קבוצות של שלושה ביטים, או שלוש ספרות אוקטליות - 0750. ה־0 המוביל מסמן את הליטרל כאוקטלי ואינו עצמו ספרת הרשאה. umask נכתב באותו אופן ושם את הביטים שאתם רוצים להשבית עבור קבצים חדשים שנוצרים.
דוגמה מפותחת. עם umask 0022, בקשה מ־sysopen ל־0666 יוצרת בפועל קובץ עם מצב 0644:
0666 &~ 0022 = 0644
rw-rw-rw- ----w--w- rw-r--r--
עם umask 0027 (קבוצה אינה רשאית לכתוב, אחרים אינם רשאים לקרוא, לכתוב, או להריץ), אותה בקשת 0666 מניבה 0640 (0666 & ~0027 == 0640).
מצב גלובלי שהוא נוגע בו#
המסכה עצמה היא מצב קרנל גלובלי־לתהליך הנקבע דרך umask(2). umask אינו קורא או כותב משתנה מיוחד של Perl ישירות, אך כל קריאת יצירה בתהליך צופה בו, ו־$! נקבע על־ידי קריאות המערכת הבסיסיות שהצורכות את המסכה (mkdir, sysopen, open), לא על־ידי umask עצמו. תהליכי ילד שנוצרים דרך fork, exec, או system יורשים את הערך הנוכחי.
דוגמאות#
התקנת מסכה המסתירה את הקובץ מכל אחד פרט לבעלים, תוך שמירת הערך הקודם לשחזור:
my $old = umask 0077;
open my $fh, ">", "secret.txt" or die "open: $!";
# secret.txt is created mode 0666 & ~0077 == 0600
close $fh;
umask $old;
קריאת המסכה הנוכחית מבלי לשנותה - שימושי לרישום או לאבחון:
printf "current umask: %04o\n", umask; # e.g. "current umask: 0022"
ערכים טיפוסיים להעברה - אלה שלוש המסכות בפועל בשימוש:
umask 0022; # group + other: read/execute, no write (default on most systems)
umask 0027; # group: read/execute; other: nothing
umask 0077; # owner-only; nothing for group or other
שינוי בתחום סביב בלוק של קוד יוצר־קבצים. ל־umask אין קסם local משלו - שמרו ושחזרו במפורש:
sub write_private_file {
my ($path, $data) = @_;
my $old = umask 0077;
open my $fh, ">", $path or do {
umask $old;
die "open $path: $!";
};
print $fh $data;
close $fh;
umask $old;
}
ליטרל אוקטלי לעומת מחרוזת - מלכודת שכיחה. umask הוא מספר, לא מחרוזת של ספרות אוקטליות. קריאת אחד מתצורה דורשת oct:
my $from_config = "0027"; # string
umask oct $from_config; # correct: 0027 as a number
umask $from_config; # WRONG: decimal 27 == 033 octal
מקרי קצה#
umaskחשוף בהקשר רשימה עדיין מחזיר מספר שלם יחיד. הפונקציה היא בעלת ערך סקלרי.ערכים שליליים או מחוץ לטווח מסוככים לתשעת ביטי ההרשאה הנמוכים על־ידי הקרנל; רק הביטים
0777שורדים. העברת0777משביתה את כל ההרשאות על כל קובץ חדש שנוצר, מה שכמעט אף פעם אינו מה שאתם רוצים.umaskאינו משפיע על קבצים קיימים. הוא מסנן רק את ארגומנט ה־MODEשל קריאות יצירה. כדי לשנות הרשאות של קובץ קיים השתמשו ב־chmod.umaskאינו משפיע עלopenעבור קובץ קיים - פתיחת קובץ שכבר קיים אינה מחילה מחדש את המסכה. היא חלה רק כאשר קובץ נוצר (O_CREATב־sysopen, או מצבי>/>>/+>היוצרים שם נתיב חדש ב־open).הורשה לאורך
fork/exec. ילדים מתחילים עם ה־umask הנוכחי של ההורה. הגדרת המסכה לפניsystemאוexecמשנה את הסביבה שהילד יורש; שחזרו אותה אחר כך אם להורה עדיין אכפת.Threads. ה־umask הוא תכונה לכל־תהליך בקרנל, ולכן במערכות שבהן threads של Perl חולקים תהליך (המקרה הרגיל) כל thread רואה את אותה מסכה. שינוי שלה ב־thread אחד משנה אותה לכולם.
umask(2)אינו ממומש. ה־POD מתעד נתיב נסיגה למערכות ללא ה־syscall: העלאת חריגה בניסיונות להגביל את הגישה של הבעלים עצמו, אחרת החזרתundef. לכל פלטפורמה ש־pperl מכוון אליה ישumask(2), ולכן הנתיב הזה למעשה בלתי נגיש כאן.הצגה אוקטלית. הדפיסו את המסכה עם
printf "%04o";%dברירת המחדל מדפיסה עשרוני, שאינו קריא כביטי הרשאה.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
chmod- שינוי הרשאות על קובץ קיים; המקבילה לסינון בזמן יצירה ש־umaskמבצעmkdir- קריאת יצירת ספרייה שארגומנט ה־MODEשלה מסונן דרך ה־umask הנוכחיsysopen- יצירת קובץ ברמה נמוכה שארגומנט ה־MODEשלה מסונן דרך ה־umask הנוכחי; המקום הקנוני שבו המסכה מורגשתopen- במצבי יצירה (>,>>,+>) ה־creat(2)הבסיסי מחיל את ה־umask על ברירת המחדל0666oct- המרת מחרוזת כמו"0027"לערך המספר השלם ש־umaskמצפה לו$!- נקבע על־ידי קריאות היצירה הצורכות את המסכה, לא על־ידיumaskעצמו; בדקו אותו לאחר ה־open/sysopen/mkdirשנכשל