chown#
משנה את הבעלים והקבוצה של רשימת קבצים.
chown מקבל מזהה משתמש מספרי, מזהה קבוצה מספרי, ורשימת קבצים, ומקצה מחדש בעלות על כל קובץ שהתהליך הקורא רשאי לגעת בו. שני האלמנטים הראשונים של LIST הם ה־UID וה־GID החדשים, בסדר הזה; כל אלמנט לאחריהם הוא שם קובץ (או, במערכות התומכות ב־fchown(2), מטפל קובץ). ערך של -1 באחד מחריצי המזהה משמעו ״להשאיר את המזהה הזה ללא שינוי״ - שימושי כאשר רוצים לשנות רק את הקבוצה, או רק את הבעלים.
תקציר#
chown UID, GID, LIST
chown $uid, $gid, $file
chown $uid, $gid, @files
chown -1, $gid, @files # change group only
מה מקבלים בחזרה#
מספר הקבצים שבעלותם הוחלפה בהצלחה, כמספר שלם פשוט. לא בוליאני - קריאה על עשרה קבצים שמצליחה בשבעה מחזירה 7. יש לבדוק כנגד אורך הרשימה כאשר נדרשת סמנטיקה של הכול־או־כלום:
my @files = ('a', 'b', 'c');
my $ok = chown $uid, $gid, @files;
$ok == @files
or die "chown failed on ", scalar(@files) - $ok, " files: $!";
כאשר קובץ בודד נכשל, $! מחזיק את ה־errno מהקריאה הכושלת האחרונה. ערך החזרה הקטן מ־scalar @files הוא האות האמין של ״משהו השתבש״; $! אומר לכם מה היה הכישלון האחרון, לא כל כישלון.
מצב גלובלי שהוא נוגע בו#
$!- נקבע ל־errno של קריאת ה־chown(2)הבסיסית האחרונה שנכשלה. ללא שינוי כאשר כל קובץ מצליח.
מזהים מספריים בלבד#
chown אינו מקבל שמות משתמש או קבוצה. העברת המחרוזת "root" במקום שמצופה uid נותנת המרה מספרית של 0 (עם אזהרת Argument … isn't numeric תחת use warnings) - כמעט אף פעם לא מה שרוצים. יש לתרגם שמות למספרים באמצעות getpwnam ו־getgrnam:
my $uid = getpwnam('alice') // die "no such user";
my $gid = getgrnam('staff') // die "no such group";
chown $uid, $gid, @files;
ההחזרה בהקשר רשימה של getpwnam נותנת את רשומת ה־passwd המלאה; בהקשר סקלר היא נותנת רק את ה־uid, שזה בדרך כלל מה ש־chown רוצה.
כללי הרשאה#
בלינוקס ובכל מערכת POSIX אחרת, רק super-user יכול לתת קובץ לבעלים שונה. משתמש לא־מורשה יכול לשנות את הקבוצה של קובץ שבבעלותו, אבל רק לאחת מקבוצות המשנה שלו. ניסיון לעשות יותר מכך מחזיר כישלון עם $! מוגדר ל־EPERM.
chown 0, 0, 'passwd.new'
or warn "need root to chown: $!";
ההגבלה נאכפת על־ידי הקרנל, לא על־ידי Perl - אין בדיקה מקדימה שתחסוך קריאת מערכת כושלת. יש להסתמך על ערך ההחזרה.
דוגמאות#
שינוי בעלים וקבוצה על קובץ בודד:
chown $uid, $gid, '/var/log/app.log'
or die "chown failed: $!";
שינוי הקבוצה בלבד, השארת הבעלים ללא שינוי:
chown -1, $gid, @files;
תרגום שמות למזהים מספריים לפני הקריאה:
my ($login, $pass, $uid, $gid) = getpwnam('www-data')
or die "www-data not in passwd file";
chown $uid, $gid, glob('/var/www/*');
ספירה של כמה קבצים אכן הוקצו מחדש:
my @targets = glob('/srv/data/*.dat');
my $changed = chown $uid, $gid, @targets;
warn "only $changed of ", scalar(@targets), " files changed: $!"
if $changed != @targets;
chown לפי מטפל קובץ במערכת התומכת ב־fchown(2). מטפל הקובץ חייב להיות glob או הפניה ל־glob - bareword מטופל כשם קובץ:
open my $fh, '>', '/tmp/out' or die $!;
chown $uid, $gid, $fh;
מקרי קצה#
רשימת קבצים ריקה:
chown $uid, $gid;- אין קבצים לפעול עליהם, מחזיר0, לא נוגע ב־$!.-1במיקום מזהה: סנטינל POSIX סטנדרטי שמשמעו ״להשאיר את המזהה הזה ללא שינוי״. עובד בכל פלטפורמה נתמכת.מזהה מחרוזת: מחרוזת לא־מספרית הופכת בשקט ל־
0(root / wheel) לאחר ההמרה המספרית הרגילה. תחתuse warningsתקבלו אזהרתArgument isn't numeric, אבל אין שגיאה קשה. יש להעביר תמיד מספר שלם.קובץ לא־קיים: נחשב לכישלון, לא מבטל את הקריאה. הקבצים הנותרים עדיין מעובדים.
יעד symlink:
chownעוקב אחרי symlink-ים ומשנה את הקובץ שאליו מצביעים. כדי לבצע chown על הקישור עצמו, יש להשתמש ב־lchown(2)דרךsyscallאו מודול שחושף אותה - Perl הליבתי אינו עושה זאת.צורת מטפל קובץ: במערכות ללא
fchown(2)(נדיר בפועל בלינוקס), העברת מטפל קובץ מעלה חריגה. bareword-ים ברשימת הקבצים מטופלים תמיד כשמות קבצים - יש להשתמש ב־\*FHאו ב־my $fhכדי להתכוון ל״מטפל זה״.הגבלת נתינה: במערכות POSIX עם
_PC_CHOWN_RESTRICTEDמוגדר לנתיב היעד, רק root יכול לשנות את הבעלים בכלל. ניתן לבדוק עם:use POSIX qw(pathconf _PC_CHOWN_RESTRICTED); my $restricted = pathconf($path, _PC_CHOWN_RESTRICTED);
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
chmod- משנה ביטי הרשאה של קובץ; מקבל את אותה הצורה של ״מצב, ואחר־כך רשימת קבצים״ ומחזיר את אותה ספירה של מספר־קבצים־שהוחלפוstat- קוראים את הבעלים, הקבוצה, והמצב הנוכחיים של קובץ לפני שמחליטים מה לשנותumask- קביעת מסכת ההרשאות של ברירת המחדל עבור קבצים שנוצרו על־ידי תהליך זה; משלימה אתchownעבור קבצים שנוצרו לאחרונהgetpwnam- תרגום שם משתמש ל־uid המספרי ש־chownדורשgetgrnam- תרגום שם קבוצה ל־gid המספרי ש־chownדורש$!- מחזיק את ה־errno שלchown(2)הכושל האחרון לכל־קובץ כאשר ספירת ההחזרה נמוכה מאורך הרשימה