מחשבון chmod
ממיר הרשאות קבצים של יוניקס בין אוקטלי (755), סימבולי (rwxr-xr-x) ורשת תיבות סימון, כולל setuid, setgid וביט sticky.
| מחלקה | קריאה | כתיבה | הרצה |
|---|---|---|---|
| בעלים | |||
| קבוצה | |||
| אחרים |
chmod 644 filechmod u=rw,g=r,o=r file-rw-r--r--מה הכלי הזה עושה
לכל קובץ במערכת יוניקס יש אוסף הרשאות שקובע מי רשאי לקרוא אותו, לשנות אותו או להריץ אותו. הפקודה chmod מגדירה אותן, והיא מקבלת את ההרשאות בשני איותים שונים למדי — מספר אוקטלי בן שלוש ספרות ומחרוזת של אותיות — שמתארים בדיוק את אותו הדבר. הכלי הזה מחזיק את שני האיותים, ובנוסף רשת של תיבות סימון, מסונכרנים זה עם זה, כך שאפשר להתחיל מהצורה שיש לכם ולהעתיק את זו שאתם צריכים.
הכל רץ בדפדפן שלכם וזו אריתמטיקה טהורה: אין שרת, ושום דבר שאתם מקלידים לא נשלח לשום מקום. זהו מחשבון ומקור עיון, לא דרך לשנות הרשאות במכונה אמיתית — לשם כך מעתיקים את פקודת ה־chmod שהוא מייצר ומריצים אותה בעצמכם.
שלוש קבוצות, שלוש הרשאות
ההרשאות מאורגנות כשלוש קבוצות של שלוש. שלוש הקבוצות הן הבעלים של הקובץ, הקבוצה שמחזיקה בו, וכל השאר — «אחרים». בתוך כל קבוצה יש שלוש הרשאות: קריאה, כתיבה והרצה.
- קריאה (r) — לצפות בתוכן הקובץ, או להציג את רשימת הפריטים בתיקייה.
- כתיבה (w) — לשנות את הקובץ, או להוסיף ולהסיר פריטים בתיקייה.
- הרצה (x) — להריץ את הקובץ כתוכנית, או להיכנס לתיקייה ולהגיע לקבצים שבתוכה.
להרצה יש משמעות שונה בתיקייה ובקובץ, וזה מפיל אנשים: תיקייה שאתם יכולים לקרוא אבל לא להריץ מאפשרת לראות את שמות הדברים שבתוכה, אך לא לפתוח אף אחד מהם.
איך המספר האוקטלי עובד
שלוש ההרשאות של כל קבוצה נדחסות לספרה אוקטלית אחת על ידי חיבור ערכים קבועים: קריאה היא 4, כתיבה היא 2, הרצה היא 1. קריאה-כתיבה-הרצה היא 4+2+1 = 7; קריאה-הרצה היא 4+1 = 5; קריאה-כתיבה היא 4+2 = 6. שלוש קבוצות נותנות שלוש ספרות.
755 7 = 4+2+1 # בעלים: קריאה + כתיבה + הרצה 5 = 4+0+1 # קבוצה: קריאה + הרצה 5 = 4+0+1 # אחרים: קריאה + הרצה
כך ש־755 הוא «הבעלים יכול הכל, כל השאר יכולים לקרוא ולהריץ אבל לא לשנות», וזה המצב הרגיל לתוכנית או לתיקייה. 644 — קריאה-כתיבה לבעלים, קריאה בלבד לכל השאר — הוא המצב הרגיל לקובץ רגיל. ברגע שהתבנית מוכרת, המצבים הנפוצים נקראים במבט אחד.
המחרוזת הסימבולית
האיות השני הוא זה ש־ls -l מדפיס: תשעה תווים, שלושה לכל קבוצה, כל אחד הוא או האות שלו או מקף. 755 הוא rwxr-xr-x; 644 הוא rw-r--r--. הוא נושא בדיוק את אותו מידע כמו המספר האוקטלי, רק פרוס כך שרואים כל הרשאה במקום לחבר ספרות בראש.
לשורת ls -l יש תו עשירי בהתחלה — d לתיקייה, מקף לקובץ רגיל, l לקישור סימבולי. התו הפותח הזה הוא סוג הקובץ, לא הרשאה, ו־chmod אינו יכול לשנות אותו. אפשר להדביק כאן שדה הרשאות שלם מ־ls -l ותו הסוג פשוט יתעלם.
הביטים המיוחדים: setuid, setgid ו־sticky
מעל תשעת הביטים הרגילים יושבים שלושה מיוחדים, שנכתבים כספרה אוקטלית רביעית אופציונלית בהתחלה — setuid (4), setgid (2) וביט ה־sticky (1). אין להם עמודה משלהם; במקום זאת כל אחד מהם מוטמע במשבצת הרצה במחרוזת הסימבולית, וזה המקור לאותיות הגדולות שאנשים מוצאים מבלבלות.
- setuid על קובץ הרצה גורם לו לרוץ בזהות הבעלים של הקובץ ולא בזהות המשתמש שהפעיל אותו. כך passwd יכול לעדכן קובץ מערכת שאתם לא רשאים לכתוב אליו ישירות — ולכן תוכנית setuid עם באג היא חור אבטחה רציני.
- setgid על קובץ הרצה מריץ אותו עם הקבוצה של הקובץ. על תיקייה הוא עושה משהו שימושי ובטוח יותר: קבצים חדשים שנוצרים בתוכה יורשים את קבוצת התיקייה במקום את קבוצת היוצר.
- ביט ה־sticky על תיקייה אומר שרק הבעלים של קובץ יכול למחוק או לשנות את שמו, גם כשלכולם יש הרשאת כתיבה לתיקייה. זה מה שמשאיר את /tmp משותף ובטוח. על קובץ רגיל הוא לא עושה דבר.
במחרוזת הסימבולית ביט מיוחד דלוק הופך את משבצת ההרצה שלו לאות: s במשבצת הבעלים עבור setuid, s במשבצת הקבוצה עבור setgid, ו־t במשבצת האחרים עבור sticky. גודל האות מספר לכם אם גם ההרצה דלוקה — אות קטנה פירושה כן, אות גדולה פירושה לא.
rwsr-xr-x 4755 # setuid, והבעלים מריץ rwSr-xr-x 4655 # setuid, אך הבעלים אינו מריץ rwxrwxrwt 1777 # sticky, ואחרים מריצים rwxrwxrwT 1776 # sticky, אך אחרים אינם מריצים
אות S או T גדולה היא כמעט תמיד טעות: היא אומרת שביט מיוחד הודלק על קובץ שאינו בר-הרצה, ולכן אין לביט על מה לפעול.
אוקטלי או סימבולי בשורת הפקודה
chmod מקבל את שתי הצורות, והכלי הזה כותב את שתיהן. הצורה האוקטלית מגדירה את כל הביטים בבת אחת: chmod 755 file. צורת ה־= הסימבולית עושה את אותו הדבר באופן מוחלט — chmod u=rwx,g=rx,o=rx file — ומפרטת כל קבוצה, כך שהתוצאה אינה תלויה במה שהיה לקובץ קודם.
יש צורה שלישית, יחסית, שהמחשבון אינו זקוק לה אך תיתקלו בה: chmod +x file מוסיף הרצה לכולם, chmod g-w file מסיר כתיבה מהקבוצה, ו־chmod o= file מנקה הכל עבור אחרים. הצורה הזו משנה ביטים ביחס למצב הנוכחי במקום להגדיר את כולו, וזה נוח בשורת הפקודה אבל אין לו «תוצאה» יחידה להצגה.
מצבים שעדיף לא להגדיר
כלי הרשאות צריך גם לומר מתי מצב הוא רעיון רע. שניים עולים כל הזמן:
- 777 נותן לכל משתמש קריאה, כתיבה והרצה. זהו התיקון האוטומטי כשמשהו «לא עובד», והוא כמעט תמיד מחליף בעיה קטנה בחור אבטחה אמיתי. המצב הנכון כמעט תמיד צר יותר — בדרך כלל 755 או 644.
- כל קובץ שניתן לכתיבה על ידי כולם (הספרה האחרונה כוללת 2) מאפשר לכל חשבון במכונה לשכתב את תוכנו. לכל דבר שמורץ, נטען או נסמך עליו, זו דרך פנימה. תנו הרשאת כתיבה לקבוצה במקום, או השאירו אותה לבעלים בלבד.
הכלי מסמן את אלה כשהם מופיעים. הוא אינו יכול לדעת אם היעד שלכם הוא קובץ או תיקייה, ולכן הוא מנסח אותם כדברים ששווים מבט שני ולא כשגיאות — ביט ה־sticky נכון על תיקייה וחסר טעם על קובץ, ורק אתם יודעים מה מהם יש לכם.
מה chmod 755 אומר
זהו המצב שכמעט כל סקריפט, תוכנית ותיקייה מגיעים אליו, והוא נקרא קבוצה אחת בכל פעם. כל ספרה היא שלוש ההרשאות של אותה קבוצה מחוברות יחד — קריאה 4, כתיבה 2, הרצה 1 — כך ש־7 הוא שלושתן ו־5 הוא קריאה ועוד הרצה, בלי כתיבה.
- בעלים — 7 = 4+2+1. קריאה, כתיבה והרצה: אתם יכולים לערוך את הקובץ ולהריץ אותו.
- קבוצה — 5 = 4+0+1. קריאה והרצה, בלי כתיבה: חברי הקבוצה של הקובץ יכולים לקרוא אותו ולהריץ אותו, ואינם יכולים לשנות אותו.
- אחרים — 5 = 4+0+1. אותו הדבר שוב: כל חשבון אחר במכונה יכול לקרוא אותו ולהריץ אותו, ואף אחד מהם אינו יכול לשנות אותו.
כתוב במלואו זה rwxr-xr-x, והפקודה היא chmod 755 file — או chmod u=rwx,g=rx,o=rx file אם נוח לכם עם האותיות. בתיקייה אותם ביטים נקראים אחרת, כי שם הרצה פירושה שאפשר להיכנס ולהגיע למה שבפנים: 755 היא תיקייה שכל אחד יכול להציג ולהיכנס אליה, ורק הבעלים יכול להוסיף או להסיר פריטים. המחשבון אינו אומר דבר על 755, וזה בכוונה — זהו המצב הצר ביותר שעדיין מאפשר לחשבונות אחרים להריץ את מה שכתבתם. אם הקבוצה צריכה גם לערוך את הקובץ, המצב שמוסיף כתיבה לקבוצה הוא 775, ולא 777.
מה chmod 644 אומר, ולמה לקבצים שלכם יש אותו מכבר
644 הוא 755 בלי כל ביטי ההרצה: 6 = 4+2 לבעלים, ואחר כך 4 = 4+0+0 לקבוצה ושוב 4 לאחרים, כלומר rw-r--r--. אף אחד אינו יכול להריץ אותו, וזה בדיוק מה שנכון לכל דבר שרק נקרא — מסמך, דף HTML, קובץ הגדרות, קובץ מקור שתוכנית אחרת מהדרת. בתיקייה הוא אינו מגביל אלא שבור: בלי הרצה שום דבר אינו יכול להיכנס, ולכן אפשר להציג את השמות שבפנים ואף אחד מהם אינו נפתח.
זהו גם המצב שיש בדרך כלל לקובץ חדש לפני שנוגעים בו, והסיבה היא umask. תוכנית שיוצרת קובץ מבקשת בדרך כלל 666 ותוכנית שיוצרת תיקייה מבקשת 777, וה־umask מנקה אחר כך את הביטים שהוא מציין, עוד לפני שהקובץ קיים. עם ה־umask הנפוץ 022 — כתיבה נמנעת מהקבוצה ומהאחרים — 666 הופך ל־644 ו־777 הופך ל־755, ולכן שני אלה נמצאים בכל מקום ולכן הם שני המצבים הראשונים שהכלי הזה מציע. הקלידו umask במעטפת כדי לראות את הערך שיש לכם.
- umask 022, ברירת המחדל הרגילה — קובץ חדש יוצא 644 ותיקייה חדשה 755.
- umask 002, שמוגדר במקומות שבהם לכל משתמש יש קבוצה משלו — 664 ו־775, כך שגם חברי הקבוצה יכולים לערוך.
- umask 077, ההגדרה הפרטית — 600 ו־700, שאיש מלבד הבעלים אינו יכול אפילו לקרוא.
כל שישה אלה הם מצבים מוכנים כאן, וזה לא צירוף מקרים: אלה שלושת מסכות ה־umask שאנשים מגדירים בפועל, מיושמות פעם על קובץ ופעם על תיקייה. לקרוא אותם כשלושה זוגות ולא כשישה ערכים היא הדרך המהירה ביותר להפסיק לחפש מצבים.
מה chmod 711 אומר: להיכנס, אבל לא להסתכל
711 הוא המצב הנפוץ שמחלק הרצה בלי קריאה: 7 = 4+2+1 לבעלים, ואחר כך 1 = 0+0+1 פעמיים, כלומר rwx--x--x. הוא מתחיל להיות מובן רק כשמפרידים שוב בין שתי הרשאות התיקייה — קריאה מציגה את השמות, הרצה מאפשרת לעבור דרכה — ולכן לתיקייה במצב 711 יכול להיכנס כל מי שכבר יודע את שם הדבר שהוא רוצה, ואיש אינו יכול להציג אותה.
- בתיקייה זה שימושי באמת. תיקיית בית במצב 711 מאפשרת לשרת אינטרנט, או לחשבון אחר במכונה משותפת, לפתוח את /home/you/public/report.pdf בעוד ls /home/you נדחה. שום דבר אינו מוסתר מהבעלים; פשוט אי אפשר למנות את השמות מבחוץ.
- בקובץ זה כמעט חסר תועלת. להריץ סקריפט מעטפת פירושו שמפרש פותח את הקובץ וקורא אותו, ולכן הרצה בלי קריאה נכשלת; רק קובץ בינארי מהודר, שהגרעין טוען בעצמו, עדיין רץ. אם התכוונתם לסקריפט שאחרים יריצו, רציתם 755.
המחשבון אינו אומר דבר גם על 711, כי הוא צר יותר מ־755 ולא רחב יותר: הוא אינו מעניק דבר ש־755 אינו מעניק. השכנים שלו מופיעים מאותה סיבה — 751 נותן לקבוצה את ההצגה שנמנעת מהאחרים, ו־700 מונע גם את המעבר, וזה מה שתיקייה שמיועדת לחשבון אחד צריכה.
777 ו־1777: ביט אחד ביניהם, ולא אותה המלצה
שני המצבים שתיקייה משותפת נוטה למשוך נבדלים בביט אחד, והכלי הזה עונה עליהם אחרת בכוונה. 777 הוא rwxrwxrwx וחוזר מסומן כסכנה; 1777 הוא rwxrwxrwt, חוזר כהערה פשוטה, והוא אחד מהמצבים המוכנים שלמעלה — זהו המצב שיש ל־/tmp באמת.
- 777 — כל ספרה היא 4+2+1: קריאה, כתיבה והרצה לבעלים, לקבוצה ולכל השאר. לא נשאר דבר להגן על שום דבר: כל חשבון יכול לשכתב את הקובץ, וכל חשבון יכול למחוק או להחליף פריט בתיקייה שנושאת אותו. זהו התיקון האוטומטי לבעיית הרשאות, והוא כמעט תמיד מחליף בעיה קטנה בבעיה אמיתית.
- 1777 — אותם תשעה ביטים בתוספת ביט ה־sticky, שמתיר מחיקה ושינוי שם של פריט רק לבעלים של אותו פריט. ההגבלה האחת הזאת היא מה שהופך תיקייה לבטוחה להשארה פתוחה לכתיבה לכולם, וזו הסיבה ש־/tmp עובד: כל אחד יכול ליצור שם קובץ ואיש אינו יכול להסיר קובץ של מישהו אחר.
ההבחנה מחזיקה רק כאשר גם לאחרים יש הרצה, והכלי מקפיד על כך. 1666 הוא rw-rw-rwT — ביט ה־sticky דלוק במצב שאין בו הרצה לאף קבוצה — ושום דבר בצורה הזאת אינו יכול להיות תיקייה שמישה, ולכן ביט ה־sticky אינו שומר על דבר והמצב מסומן כניתן לכתיבה על ידי כולם בחומרה מלאה, בדיוק כמו 666. ה־T הגדולה אומרת את אותו הדבר בתו אחד.
כך שתיקייה שחייבת להיות משותפת רוצה 1777, או טוב מזה 775 עם הקבוצה הנכונה, וקובץ שאינו נפתח הוא כמעט תמיד בעיית בעלות ולא מקרה שמצדיק 777.
שאלות נפוצות
- מה ההבדל בין 644 ל־755?
- 644 הוא קריאה-כתיבה לבעלים וקריאה בלבד לכל השאר, המצב הרגיל לקובץ רגיל. 755 מוסיף הרצה לשלוש הקבוצות, וזה מה שתוכנית צריכה כדי לרוץ ומה שתיקייה צריכה כדי שאפשר יהיה להיכנס אליה. השתמשו ב־644 למסמכים ולקובצי מקור, וב־755 לסקריפטים ולתיקיות.
- למה המצב שלי הציג S או T גדולה?
- כי ביט מיוחד הודלק על קבוצה שאין לה הרשאת הרצה. s או t קטנה פירושה שגם הביט המיוחד וגם ההרצה דלוקים; הצורה בגודל גדול פירושה שהביט המיוחד דלוק אך ההרצה כבויה, וזה בדרך כלל אומר שהמצב אינו מה שהתכוונתם אליו — למשל 4644 (rwSr--r--) הוא setuid על קובץ שאיש אינו יכול להריץ.
- מה chmod 777 עושה בפועל, ולמה לא מומלץ?
- הוא מעניק קריאה, כתיבה והרצה לבעלים, לקבוצה ולכל השאר — גישה מלאה לכל חשבון במערכת. לא מומלץ כי הוא מסיר כל הגנה בבת אחת; קובץ שכל אחד יכול לכתוב הוא קובץ שכל אחד יכול לחבל בו, ותיקייה שכל אחד יכול לכתוב אליה היא תיקייה שכל אחד יכול לשתול בה קבצים. כמעט כל מקרה שמושיט יד ל־777 נפתר עם 755 או 644 יחד עם הבעלות הנכונה.
- האם הספרה הפותחת חייבת להופיע?
- לא. כשאף אחד מהביטים המיוחדים אינו דלוק, המצב הוא פשוט שלוש ספרות — 755, לא 0755 — וזה מה שהכלי מציג. אפס פותח מתקבל ומשמעותו זהה; 4, 2 או 1 פותחים מדליקים setuid, setgid או ביט ה־sticky בהתאמה.
- אפשר להדביק שורה ישירות מ־ls -l?
- כן. הדביקו את שדה ההרשאות בן עשרת התווים, כמו -rwxr-xr-x או drwxr-xr-x, והכלי יסיר את תו הסוג הפותח ויקרא את השאר. הסוג (קובץ, תיקייה, קישור) אינו הרשאה ו־chmod אינו יכול לשנות אותו, ולכן הוא מתעלם ממנו.
- האם משהו שאני מזין נשלח לשרת?
- לא. כל הכלי הוא אריתמטיקה שרצה בדפדפן שלכם. שום דבר אינו מועלה, נרשם או נשמר, וזו גם הסיבה שהוא עובד גם בלי חיבור רשת כלל.
- מה chmod 711 עושה?
- הוא נותן לבעלים הכל ונותן לקבוצה ולכל השאר הרצה בלבד — rwx--x--x. בתיקייה זה אומר שהם יכולים לעבור דרכה אל נתיב שהם כבר מכירים אבל אינם יכולים להציג את מה שיש בה, וזה מה שתיקיית בית במכונה משותפת בדרך כלל צריכה. בקובץ זה אינו שימושי: סקריפט מעטפת חייב להיקרא על ידי המפרש שלו כדי לרוץ, ולכן הרצה בלי קריאה פשוט נכשלת.
- מה ההבדל בין chmod 777 ל־chmod 1777?
- ביט אחד — ביט ה־sticky, שנכתב כ־1 פותח, והופך את התו האחרון מ־x ל־t. שניהם נותנים לכל חשבון קריאה, כתיבה והרצה; 1777 מתיר בנוסף רק לבעלים של פריט למחוק אותו או לשנות את שמו. לכן הכלי מסמן את 777 ככמעט אף פעם לא נכון, ואת 1777 הוא מכנה המצב הסטנדרטי של תיקייה משותפת כמו /tmp.
- למה קבצים חדשים יוצאים 644 ותיקיות חדשות 755?
- בגלל umask. תוכנית שיוצרת קובץ מבקשת 666 ותוכנית שיוצרת תיקייה מבקשת 777, וה־umask מנקה מזה ביטים עוד לפני שהקובץ קיים. הערך הרגיל, 022, מונע כתיבה מהקבוצה ומהאחרים, ומה שנשאר הוא 644 ו־755. הריצו umask במעטפת כדי לראות את שלכם: 002 נותן 664 ו־775, ו־077 נותן 600 ו־700.
- מה rwxr-xr-x אומר?
- זה 755 כתוב במלואו. קראו אותו שלושה תווים בכל פעם: rwx הוא הבעלים, עם קריאה, כתיבה והרצה; r-x היא הקבוצה, עם קריאה והרצה אבל בלי כתיבה; r-x שוב הוא כל השאר. מקף פירושו שההרשאה כבויה. הדביקו את המחרוזת בשדה «סימבולי» כאן ותיבת «אוקטלי» תציג 755.
כלים קשורים
- מחשבון CIDR ותת־רשתות
פירוק רשת, בדיקת הכלה, ופיצול לתת־רשתות.
- מסביר ביטויי cron
קריאה של ביטוי cron, ומתי הוא באמת רץ.
- מה כתובת ה־IP שלי
כתובות ה־IPv4 וה־IPv6 הציבוריות שלכם, ומי מהן נבחרה.
- ממיר Unix timestamp
המרת זמן epoch לתאריך, ובחזרה.