מטפלי קובץ קבצים ספריות

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 על ברירת המחדל 0666

  • oct - המרת מחרוזת כמו "0027" לערך המספר השלם ש־umask מצפה לו

  • $! - נקבע על־ידי קריאות היצירה הצורכות את המסכה, לא על־ידי umask עצמו; בדקו אותו לאחר ה־open / sysopen / mkdir שנכשל