chown(2)

الاسم
chown, fchown, lchown, fchownat - تغيير ملكية ملف

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

#include <fcntl.h>           /* تعريف ثوابت AT_* */
#include <unistd.h>

int fchownat(int dirfd, const char *path,
             uid_t owner, gid_t group, int flags);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

fchown(), lchown():
    /* منذ glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
        || _XOPEN_SOURCE >= 500
        || /* glibc <= 2.19: */ _BSD_SOURCE

fchownat():
    منذ glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    قبل glibc 2.10:
        _ATFILE_SOURCE

الوصف
تغير استدعاءات النظام هذه مالك الملف ومجموعته. تختلف استدعاءات النظام chown() و fchown() و lchown() فقط في كيفية تحديد الملف:

•   يغير chown() ملكية الملف المحدد بواسطة path، والذي يتم إلغاء مرجعه إذا كان رابطًا رمزيًا.

•   يغير fchown() ملكية الملف المشار إليه بواسطة واصف الملف المفتوح fd.

•   lchown() يشبه chown()، لكنه لا يلغي مرجع الروابط الرمزية.

فقط عملية مميزة (لينكس: واحدة تملك القدرة CAP_CHOWN) قد تغير مالك الملف. يجوز لمالك الملف تغيير مجموعة الملف إلى أي مجموعة يكون ذلك المالك عضوًا فيها. قد تغير عملية مميزة (لينكس: مع CAP_CHOWN) المجموعة بشكل تعسفي.

إذا تم تحديد owner أو group كـ -1، فلن يتم تغيير ذلك المعرف.

عندما يتم تغيير مالك أو مجموعة ملف قابل للتنفيذ بواسطة مستخدم غير مميز، يتم مسح بتات الوضع S_ISUID و S_ISGID. لا تحدد POSIX ما إذا كان يجب أن يحدث هذا أيضًا عندما يقوم الجذر بـ chown()؛ يعتمد سلوك لينكس على إصدار النواة، ومنذ لينكس 2.2.13، يتم معاملة الجذر مثل المستخدمين الآخرين. في حالة ملف غير قابل للتنفيذ من قبل المجموعة (أي، ملف لم يتم تعيين بت S_IXGRP له)، يشير بت S_ISGID إلى القفل الإلزامي، ولا يتم مسحه بواسطة chown().

عندما يتم تغيير مالك أو مجموعة ملف قابل للتنفيذ (بواسطة أي مستخدم)، يتم مسح جميع مجموعات القدرات للملف.

  fchownat()
يعمل استدعاء النظام fchownat() بنفس الطريقة تمامًا مثل chown()، باستثناء الاختلافات الموصوفة هنا.

إذا كان path نسبيًا، فسيتم تفسيره بالنسبة إلى الدليل المشار إليه بواسطة واصف الملف dirfd (بدلاً من نسبته إلى دليل العمل الحالي للعملية المستدعية، كما يفعل chown() لاسم مسار نسبي).

إذا كان path نسبيًا وكان dirfd هو القيمة الخاصة AT_FDCWD، فسيتم تفسير path بالنسبة إلى دليل العمل الحالي للعملية المستدعية (مثل chown()).

إذا كان المسار path مطلقاً، فُيتجاهل dirfd.

وسيطة flags هي قناع بت يتم إنشاؤه بواسطة ORing معًا 0 أو أكثر من القيم التالية؛

AT_EMPTY_PATH (منذ لينكس 2.6.39)
    إذا كان path سلسلة فارغة، فسيُعمل على الملف الذي يشير إليه dirfd (والذي ربما تم الحصول عليه باستخدام الراية O_PATH في open(2)). في هذه الحالة، يمكن لـ dirfd أن يشير إلى أي نوع من الملفات، وليس فقط المجلدات. وإذا كان dirfd هو AT_FDCWD، فسيُنادى على مجلد العمل الحالي. هذه الراية خاصة بلينكس؛ عرّف _GNU_SOURCE للحصول على تعريفها.

AT_SYMLINK_NOFOLLOW
    إذا كان path رابطًا رمزيًا، فلا تلغِ مرجعه: بدلاً من ذلك، تعامل مع الرابط نفسه، مثل lchown(). (افتراضيًا، يلغي fchownat() مرجع الروابط الرمزية، مثل chown().)

انظر openat(2) لشرح الحاجة إلى fchownat().

قيمة الإرجاع
عند النجاح، يُعاد الصفر. وعند حدوث خطأ، يُعاد الرقم -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء
اعتماداً على نظام الملفات، قد تُرَد أخطاء أخرى غير تلك المذكورة أدناه.

الأخطاء الأكثر عمومية لـ chown() مدرجة أدناه.

EACCES
    أُذونات البحث مرفوضة في أحد مكونات بادئة المسار. (انظر أيضًا path_resolution(7).)

EBADF
    (fchown()) fd ليس واصف ملف مفتوحًا صالحًا.

EBADF
    (fchownat()) path نسبي لكن dirfd ليس AT_FDCWD ولا واصف ملف صالحًا.

EFAULT
    المسار path يشير إلى خارج مساحة العناوين التي يمكن الوصول إليها.

EINVAL
    (fchownat()) تم تحديد علم غير صالح في flags.

EIO (fchown()) حدث خطأ إدخال/إخراج منخفض المستوى أثناء تعديل inode.

ELOOP
    وُجد عدد كبير جدًا من الوصلات الرمزية أثناء تحليل path.

ENAMETOOLONG
    المسار path طويل جداً.

ENOENT
    الملف غير موجود.

ENOMEM
    ذاكرة النواة المتوفرة غير كافية.

ENOTDIR
    أحد مكونات بادئة المسار ليس دليلاً.

ENOTDIR
    (fchownat()) path نسبي و dirfd هو واصف ملف يشير إلى ملف غير دليل.

EPERM
    لم تمتلك العملية المستدعية الصلاحيات المطلوبة (انظر أعلاه) لتغيير المالك و/أو المجموعة.

EPERM
    الملف معلم بأنه غير قابل للتغيير أو للإلحاق فقط. (انظر FS_IOC_SETFLAGS(2const).)

EROFS
    الملف المسمى يقع في نظام ملفات للقراءة فقط.

الإصدارات
يمكن استخدام إصدار 4.4BSD فقط من قبل المستخدم الفائق (أي لا يمكن للمستخدمين العاديين التخلي عن الملفات).

المعايير
POSIX.1-2024.

التاريخ

chown()
    SVr4, POSIX.1-1988, 4.4BSD.

fchown()
    SVr4، 4.4BSD، SUSv1، POSIX.1-2001.

lchown()
    SVr4, 4.4BSD, SUSv1, POSIX.1-2001 XSI, POSIX.1-2008.

fchownat()
    POSIX.1-2008. لينكس 2.6.16،‏ glibc 2.4.

ملاحظات

  ملكية الملفات الجديدة
عند إنشاء ملف جديد (على سبيل المثال، بواسطة open(2) أو mkdir(2))، يُجعل مالكه مطابقًا لمعرف مستخدم نظام الملفات للعملية المنشئة. تعتمد مجموعة الملف على مجموعة من العوامل، بما في ذلك نوع نظام الملفات، والخيارات المستخدمة لوصل نظام الملفات، وما إذا كان بت وضع مجموعة المعرف (set-group-ID) مفعلًا في الدليل الأصلي أم لا. إذا كان نظام الملفات يدعم خيارات mount(8) مثل -o grpid (أو بشكل مترادف -o bsdgroups) و -o nogrpid (أو بشكل مترادف -o sysvgroups)، فإن القواعد تكون كما يلي:

•   إذا تم وصل نظام الملفات باستخدام -o grpid، فإن مجموعة الملف الجديد تُجعل مطابقة لمجموعة الدليل الأصلي.

•   إذا تم وصل نظام الملفات باستخدام -o nogrpid وتم تعطيل بت مجموعة المعرف (set-group-ID) في الدليل الأصلي، فإن مجموعة الملف الجديد تُجعل مطابقة لـ GID لنظام الملفات الخاص بالعملية.

•   إذا تم وصل نظام الملفات باستخدام -o nogrpid وتم تفعيل بت مجموعة المعرف (set-group-ID) في الدليل الأصلي، فإن مجموعة الملف الجديد تُجعل مطابقة لمجموعة الدليل الأصلي.

اعتبارًا من Linux 4.12، يتم دعم خيارات الوصل -o grpid و -o nogrpid بواسطة ext2 و ext3 و ext4 و XFS. تتبع أنظمة الملفات التي لا تدعم خيارات الوصل هذه قواعد -o nogrpid.

  ملاحظات glibc
على النوى القديمة حيث fchownat() غير متوفرة، تعود دالة الغلاف glibc إلى استخدام chown() و lchown(). عندما يكون path نسبيًا، تقوم glibc ببناء اسم مسار استنادًا إلى الرابط الرمزي في /proc/self/fd الذي يتوافق مع وسيطة dirfd.

  NFS
يتم انتهاك دلالات chown() عمدًا على أنظمة ملفات NFS التي لديها تعيين UID مفعل. بالإضافة إلى ذلك، يتم انتهاك دلالات جميع استدعاءات النظام التي تصل إلى محتويات الملف، لأن chown() قد يتسبب في إلغاء الوصول الفوري للملفات المفتوحة بالفعل. قد يؤدي التخزين المؤقت من جانب العميل إلى تأخير بين الوقت الذي تم فيه تغيير الملكية للسماح بالوصول لمستخدم والوقت الذي يمكن فيه للمستخدم الوصول الفعلي للملف على عملاء آخرين.

  تفاصيل تاريخية
استدعاءات النظام الأصلية في Linux chown() و fchown() و lchown() دعمت فقط معرفات المستخدم والمجموعة ذات 16 بت. لاحقًا، أضاف Linux 2.4 chown32() و fchown32() و lchown32() التي تدعم معرفات 32 بت. تتعامل دوال الغلاف glibc chown() و fchown() و lchown() بشفافية مع الاختلافات عبر إصدارات النواة.

قبل Linux 2.1.81 (باستثناء 2.1.46)، لم يتبع chown() الروابط الرمزية. منذ Linux 2.1.81، يتبع chown() الروابط الرمزية، ويوجد استدعاء نظام جديد lchown() لا يتبع الروابط الرمزية. منذ Linux 2.1.86، حصل هذا الاستدعاء الجديد (الذي له نفس دلالات chown() القديم) على نفس رقم استدعاء النظام، وحصل chown() على الرقم المُقدم حديثًا.

أمثلة
يقوم البرنامج التالي بتغيير ملكية الملف المسمى في وسيطته الثانية لسطر الأوامر إلى القيمة المحددة في وسيطته الأولى لسطر الأوامر. يمكن تحديد المالك الجديد إما كمعرف مستخدم رقمي، أو كاسم مستخدم (يتم تحويله إلى معرف مستخدم باستخدام getpwnam(3) لإجراء بحث في ملف كلمة السر النظامي).

  مصدر البرنامج
    #include <pwd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>

    int
    main(int argc, char *argv[])
    {
        char           *endptr;
        uid_t          uid;
        struct passwd  *pwd;

        if (argc != 3 || argv[1][0] == '\0') {
            fprintf(stderr, "%s <owner> <file>\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        uid = strtol(argv[1], &endptr, 10);  /* Allow a numeric string */

        if (*endptr != '\0') {         /* Was not pure numeric string */
            pwd = getpwnam(argv[1]);   /* Try getting UID for username */
            if (pwd == NULL) {
                perror("getpwnam");
                exit(EXIT_FAILURE);
            }

            uid = pwd->pw_uid;
        }

        if (chown(argv[2], uid, -1) == -1) {
            perror("chown");
            exit(EXIT_FAILURE);
        }

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
chgrp(1)، chown(1)، chmod(2)، flock(2)، path_resolution(7)، symlink(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.