דילוג לתוכן
לינוקס ושורת הפקודה

הרשאות קבצים בלינוקס: chmod, chown ומה המספר 755 באמת אומר

הרשאות קבצים בלינוקס הן אחד הנושאים שנראים קטנים עד שהן עוצרות עבודה: סקריפט שלא רץ, קובץ שלא ניתן לעריכה, תיקייה שאי אפשר להיכנס אליה, או שרת שמחזיר שגיאה בגלל הרשאות לא נכונות. הפקודות chmod ו־chown הן הכלים המרכזיים לטיפול בזה, והמספרים כמו 755, 644 ו־600 הם לא קסם — הם פשוט דרך מקוצרת לתאר מי רשאי לקרוא, לכתוב ולהריץ.

במדריך הזה נבנה הבנה מעשית: איך לקרוא פלט של ls -l, מה ההבדל בין הרשאות לקובץ והרשאות לתיקייה, מתי משתמשים ב־chmod, מתי ב־chown, ומה עושים כשמקבלים הודעות כמו Permission denied. אם זו הפעם הראשונה שלך עם מסוף לינוקס, כדאי לפתוח במקביל גם את מדריך צעדים ראשונים כדי להרגיש בנוח עם פקודות בסיסיות.

מה צריך להכין מראש

כדי לעבוד עם הדוגמאות מספיק מסוף במערכת לינוקס. הדוגמאות נכתבו עבור Linux עם bash, והן משתמשות בתיקייה זמנית כדי לא לשנות קבצים חשובים. אין צורך בהרשאות מנהל עבור רוב הדוגמאות. כשמוזכרת הפקודה sudo, היא מופיעה כהסבר למצבים אמיתיים, לא כשלב חובה.

  • מסוף פתוח במערכת לינוקס.
  • משתמש רגיל, לא בהכרח root.
  • היכרות בסיסית עם cd, ls ו־pwd.
  • רצוי לדעת לערוך קובץ טקסט, אבל הדוגמאות כאן יוצרות קבצים בעצמן.

איך קוראים הרשאות עם ls -l

הדרך הנפוצה לראות הרשאות היא:

bash
ls -l

פלט טיפוסי נראה כך:

text
-rw-r--r-- 1 dana developers 128 notes.txt
drwxr-xr-x 2 dana developers 4096 scripts

העמודה הראשונה היא החשובה לנו כרגע. היא בנויה כך:

  • התו הראשון: סוג הפריט. - הוא קובץ רגיל, d הוא תיקייה, l הוא קישור סמלי.
  • שלושת התווים הבאים: הרשאות הבעלים.
  • שלושת התווים שאחריהם: הרשאות הקבוצה.
  • שלושת התווים האחרונים: הרשאות כל האחרים.

האותיות עצמן פשוטות:

אות משמעות בקובץ משמעות בתיקייה ערך מספרי
r קריאה רשימת שמות הקבצים בתיקייה 4
w כתיבה ושינוי תוכן יצירה, מחיקה ושינוי שמות בתוך התיקייה 2
x הרצה כניסה לתיקייה וגישה לפריטים שבתוכה 1

שימו לב לנקודה חשובה: הרשאת הרצה בתיקייה אינה אומרת “להריץ תיקייה”. היא אומרת שאפשר לעבור דרך התיקייה. לכן תיקייה בלי x עלולה להיות בלתי נגישה גם אם יש לה r.

מה המספר 755 אומר

המספר 755 מורכב משלוש ספרות: בעלים, קבוצה, אחרים. כל ספרה היא סכום של r=4, w=2, x=1.

  • 7 = 4+2+1 = קריאה, כתיבה והרצה.
  • 5 = 4+1 = קריאה והרצה, בלי כתיבה.
  • 5 = אותו דבר עבור אחרים.

לכן 755 פירושו: הבעלים יכול לקרוא, לכתוב ולהריץ; הקבוצה יכולה לקרוא ולהריץ; אחרים יכולים לקרוא ולהריץ. בפלט של ls -l זה ייראה כך:

text
drwxr-xr-x

עבור תיקיות, 755 הוא ערך נפוץ: הבעלים מנהל את התיקייה, ושאר המשתמשים יכולים להיכנס ולקרוא. עבור קובץ רגיל, במיוחד קובץ טקסט, לרוב לא צריך x. קובצי טקסט רגילים יהיו בדרך כלל 644: הבעלים קורא וכותב, אחרים רק קוראים.

דוגמה מלאה: יצירת קבצים ושינוי הרשאות עם chmod

הדוגמה הבאה בטוחה להרצה בלינוקס עם bash. היא יוצרת תיקייה זמנית, קובץ טקסט וסקריפט קטן, משנה הרשאות, ומדפיסה את התוצאה.

bash
#!/usr/bin/env bash
set -e

# Create a temporary working directory
workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT

# Create a regular text file
printf 'hello\n' > "$workdir/notes.txt"

# Create a small shell script
cat > "$workdir/hello.sh" <<'SCRIPT'
#!/usr/bin/env bash
echo "Hello from Linux permissions"
SCRIPT

# Set common permissions
chmod 644 "$workdir/notes.txt"
chmod 755 "$workdir/hello.sh"

# Show the result
ls -l "$workdir"

# Run the script
"$workdir/hello.sh"

מה קורה כאן? הקובץ notes.txt מקבל הרשאות 644, כלומר קריאה וכתיבה לבעלים וקריאה לאחרים. הקובץ hello.sh מקבל 755, ולכן ניתן להריץ אותו. פלט אפשרי ייראה כך:

text
-rwxr-xr-x 1 user user ... hello.sh
-rw-r--r-- 1 user user ... notes.txt
Hello from Linux permissions

המספרים, שם המשתמש והגודל יכולים להשתנות ממחשב למחשב, אבל דפוס ההרשאות צריך להיות דומה.

chmod: שינוי הרשאות במספרים ובסימנים

אפשר להשתמש ב־chmod בשתי צורות עיקריות: מספרית וסימבולית.

שיטה מספרית

זו הצורה הקצרה:

bash
chmod 755 script.sh
chmod 644 notes.txt
chmod 700 private-dir

הערך 700 אומר שרק הבעלים יכול לקרוא, לכתוב ולהיכנס או להריץ. זה מתאים לתיקיות פרטיות או קבצים רגישים. הערך 600 מתאים לקובץ שרק הבעלים צריך לקרוא ולכתוב, למשל קובץ הגדרות מקומי.

שיטה סימבולית

במקום לחשב מספרים, אפשר להגיד מה להוסיף או להוריד:

bash
chmod u+x script.sh
chmod go-w notes.txt
chmod a+r README.txt
  • u = הבעלים.
  • g = הקבוצה.
  • o = אחרים.
  • a = כולם.
  • + מוסיף הרשאה, - מסיר, = קובע בדיוק.

לדוגמה, chmod u+x script.sh מוסיף הרשאת הרצה רק לבעלים, בלי לשנות הרשאות אחרות. זו דרך זהירה יותר כשלא רוצים לדרוס מצב קיים.

דוגמה מלאה: תיקיות 755 וקבצים 644

בפרויקטים רבים רוצים שתיקיות יהיו נגישות לכניסה וקריאה, אבל שקובצי טקסט רגילים לא יהיו ניתנים להרצה. הדוגמה הבאה יוצרת מבנה קטן ומגדירה הרשאות מקובלות.

bash
#!/usr/bin/env bash
set -e

# Create a temporary project tree
project="$(mktemp -d)"
trap 'rm -rf "$project"' EXIT

mkdir -p "$project/bin" "$project/docs"

printf '#!/usr/bin/env bash\necho "Tool is running"\n' > "$project/bin/tool"
printf 'Project notes\n' > "$project/docs/readme.txt"

# Set directory permissions
find "$project" -type d -exec chmod 755 {} \;

# Set regular file permissions
find "$project" -type f -exec chmod 644 {} \;

# Make only the tool executable
chmod 755 "$project/bin/tool"

# Show permissions
find "$project" -maxdepth 2 -printf '%M %p\n'

# Run the executable tool
"$project/bin/tool"

הפלט יכלול שורות בסגנון:

text
drwxr-xr-x /tmp/tmp.xxxxx
drwxr-xr-x /tmp/tmp.xxxxx/bin
-rwxr-xr-x /tmp/tmp.xxxxx/bin/tool
drwxr-xr-x /tmp/tmp.xxxxx/docs
-rw-r--r-- /tmp/tmp.xxxxx/docs/readme.txt
Tool is running

כאן חשוב לראות את ההפרדה: תיקיות מקבלות 755, קבצים רגילים מקבלים 644, ורק הקובץ שאמור לרוץ מקבל 755. זה מונע מצב שבו כל קובץ בפרויקט מסומן בטעות כקובץ הרצה.

chown: שינוי בעלים וקבוצה

chmod משנה הרשאות. chown משנה בעלים וקבוצה. אלה שני דברים שונים. אם קובץ שייך למשתמש אחר, ייתכן שגם הרשאות “נכונות” לא יעזרו לך לערוך אותו.

מבנה הפקודה:

bash
chown user:group file

לדוגמה, אם קובץ צריך להיות שייך למשתמש הנוכחי ולקבוצה הראשית שלו:

bash
chown "$(id -un):$(id -gn)" file.txt

במערכות רבות שינוי בעלות לקובץ שאינו שלך דורש הרשאות מנהל. שינוי בעלות גורף עם sudo chown -R עלול לגרום נזק אם מפעילים אותו על נתיב שגוי, ולכן תמיד בודקים קודם את הנתיב עם pwd ו־ls.

דוגמה מלאה: בדיקת בעלים, קבוצה והרשאות

הדוגמה הבאה רצה בלינוקס עם bash. היא יוצרת קובץ זמני, מוודאת שהוא שייך למשתמש הנוכחי, מציגה בעלים וקבוצה, ומשנה הרשאות.

bash
#!/usr/bin/env bash
set -e

# Create a temporary file
workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT

file="$workdir/report.txt"
printf 'monthly report\n' > "$file"

# Set ownership to the current user and primary group
chown "$(id -un):$(id -gn)" "$file"

# Set readable permissions for a regular text file
chmod 644 "$file"

# Print owner, group, permissions, and path
stat -c '%U %G %A %n' "$file"

פלט אפשרי:

text
dana developers -rw-r--r-- /tmp/tmp.xxxxx/report.txt

שם המשתמש והקבוצה יהיו שונים אצלך. המטרה היא לראות שהקובץ שייך למשתמש הנוכחי, ושההרשאות הן -rw-r--r--, כלומר 644.

מה ההבדל בין הרשאות קובץ להרשאות תיקייה

זו אחת הנקודות שהכי מבלבלות מתחילים בלינוקס. בקובץ, r מאפשר לקרוא תוכן, w מאפשר לשנות תוכן, ו־x מאפשר להריץ. בתיקייה, המשמעות משתנה:

  • r מאפשר לראות את רשימת השמות שבתיקייה.
  • w מאפשר ליצור, למחוק ולשנות שמות — אבל בדרך כלל צריך גם x.
  • x מאפשר להיכנס לתיקייה ולגשת לפריטים אם יודעים את שמם.

לכן תיקייה עם 644 היא כמעט תמיד טעות. היא נראית “פתוחה לקריאה”, אבל בלי x אי אפשר להשתמש בה כמו שצריך. לתיקיות משתמשים לרוב ב־755 או 700, בהתאם לצורך.

בדיקת הרשאות עם Python

לפעמים רוצים לבדוק הרשאות מתוך סקריפט, למשל בכלי אוטומציה קטן או בדיקת תקינות לפרויקט. הנה דוגמה ב־Python 3, עם ספרייה סטנדרטית בלבד. אם אתם כותבים סקריפטים ראשונים, אפשר להיעזר גם במדריך פייתון באתר.

python
#!/usr/bin/env python3
import os
import stat
import tempfile
from pathlib import Path

# Create a temporary file
with tempfile.TemporaryDirectory() as tmp:
    path = Path(tmp) / "run-me.sh"
    path.write_text("#!/usr/bin/env bash\necho hello\n", encoding="utf-8")

    # Set executable permissions
    os.chmod(path, 0o755)

    # Read the mode and print it in a human-readable form
    mode = path.stat().st_mode
    print(stat.filemode(mode))
    print(oct(stat.S_IMODE(mode)))

פלט צפוי:

text
-rwxr-xr-x
0o755

שימו לב לכתיבה 0o755 בפייתון. זו דרך לציין מספר אוקטלי, כלומר בדיוק אותו בסיס שבו משתמשים בהרשאות לינוקס. בלי 0o, המספר לא יתפרש כפי שמתכוונים.

chmod -R: שימושי, אבל מסוכן

chmod -R מפעיל שינוי הרשאות בצורה רקורסיבית על תיקייה וכל מה שבתוכה. זה נוח, אבל עלול לקלקל הרשאות של הרבה קבצים בבת אחת.

טעות נפוצה היא להריץ:

bash
chmod -R 777 project

הערך 777 נותן לכולם קריאה, כתיבה והרצה. זה אולי “פותר” שגיאת הרשאה רגעית, אבל בדרך כלל יוצר בעיית אבטחה ובעיית תחזוקה. במקום זה, עדיף להגדיר בנפרד תיקיות וקבצים, כפי שראינו עם find.

אם צריך לתקן פרויקט מקומי, גישה בטוחה יותר היא:

bash
find project -type d -exec chmod 755 {} \;
find project -type f -exec chmod 644 {} \;

ואז להוסיף הרשאת הרצה רק לקבצים שבאמת אמורים לרוץ.

טעויות נפוצות והודעות שגיאה אמיתיות

bash: ./script.sh: Permission denied

הסיבה הנפוצה: לקובץ אין הרשאת הרצה. בדקו:

bash
ls -l script.sh

אם רואים משהו כמו -rw-r--r--, הוסיפו הרשאת הרצה:

bash
chmod u+x script.sh
./script.sh

אם הסקריפט מיועד לכל המשתמשים במערכת, ייתכן ש־chmod 755 script.sh מתאים יותר, אבל לקובץ אישי לרוב מספיק u+x.

chmod: cannot access 'app.sh': No such file or directory

הקובץ לא נמצא בנתיב הנוכחי, או שהשם שגוי. בדקו איפה אתם נמצאים:

bash
pwd
ls -l

אם הקובץ נמצא בתיקייה אחרת, השתמשו בנתיב מלא או עברו לתיקייה הנכונה עם cd.

chmod: changing permissions of 'notes.txt': Operation not permitted

בדרך כלל זה אומר שהקובץ אינו בבעלותכם, או שמערכת הקבצים מגבילה שינוי הרשאות. בדקו:

bash
ls -l notes.txt

אם הקובץ צריך להיות שלכם, בקשו ממי שמנהל את המערכת לתקן בעלות, או השתמשו בהרשאות מנהל רק אם ברור שזה נכון בסביבה שלכם. אל תריצו sudo chmod -R בלי להבין בדיוק על מה הוא פועל.

chown: changing ownership of 'notes.txt': Operation not permitted

משתמש רגיל לא תמיד רשאי לשנות בעלים. אם הקובץ כבר שלכם, ייתכן שתוכלו לשנות רק קבוצה לקבוצה שאתם חברים בה. אם הקובץ לא שלכם, צריך הרשאות מתאימות. בדקו קודם:

bash
id
ls -l notes.txt

הפקודה id מציגה את המשתמש והקבוצות שלכם, וכך אפשר להבין אם הקבוצה המבוקשת בכלל רלוונטית.

chown: invalid user: 'www-data:www-data'

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

מה לגבי umask, sticky bit ו־ACL

מעבר להרשאות הבסיסיות יש עוד שכבות. umask קובע אילו הרשאות יוסרו כברירת מחדל מקבצים ותיקיות חדשים. למשל, גם אם תוכנה יוצרת קובץ עם הרשאות רחבות, umask יכול לגרום לכך שהקובץ ייווצר בפועל כ־644 ולא כ־666.

יש גם ביטים מיוחדים כמו sticky bit, שמוכר מתיקיות זמניות משותפות, ו־setgid שיכול להשפיע על ירושת קבוצה בתיקיות. אם בפלט של ls -l מופיע סימן + בסוף ההרשאות, ייתכן שיש ACL — רשימות הרשאה מורחבות. אלה נושאים שימושיים, אבל כדאי לשלוט קודם ב־chmod, chown, ובמשמעות של 755.

כללי אצבע שכדאי לזכור

  • קובץ טקסט רגיל: לרוב 644.
  • סקריפט שצריך לרוץ: לרוב 755 או u+x.
  • תיקייה ציבורית לקריאה: לרוב 755.
  • תיקייה פרטית: לרוב 700.
  • קובץ פרטי: לרוב 600.
  • לא משתמשים ב־777 כפתרון קבוע. אם צריך 777, כנראה שצריך להבין מחדש מי הבעלים, מה הקבוצה, ומה התהליך שמנסה לגשת לקובץ.

סיכום מעשי

chmod עונה על השאלה “מה מותר לעשות עם הקובץ או התיקייה?”. chown עונה על השאלה “למי זה שייך?”. המספר 755 אומר שלבעלים יש הרשאות מלאות, ולקבוצה ולאחרים יש קריאה והרצה בלבד. עבור תיקיות זה נפוץ מאוד; עבור קבצים רגילים משתמשים בו רק אם צריך להריץ אותם.

כשנתקעים, אל תנחשו. התחילו מ־ls -l, בדקו מי הבעלים, מה הקבוצה, ומה ההרשאות בפועל. לאחר מכן בחרו שינוי קטן ומדויק: chmod u+x במקום שינוי גורף, 644 לקובץ רגיל, 755 לתיקייה, ו־chown רק כשבעיית הבעלות היא באמת הבעיה. זו הדרך הפשוטה והבטוחה להפוך הרשאות בלינוקס מכלי מתסכל לכלי עבודה ברור.