symlink(7)

الاسم
symlink - معالجة الروابط الرمزية

الوصف
الروابط الرمزية هي ملفات تعمل كمؤشرات لملفات أخرى. لفهم سلوكها، يجب أولاً فهم كيفية عمل الروابط الثابتة.

الرابط الثابت لملف لا يمكن تمييزه عن الملف الأصلي لأنه مرجع للكائن الأساسي لاسم الملف الأصلي. (للدقة: كل رابط ثابت لملف هو مرجع لنفس رقم العقدة، حيث رقم العقدة هو فهرس في جدول العقد، الذي يحتوي على بيانات وصفية عن جميع الملفات في نظام الملفات. انظر stat(2).) التغييرات على ملف مستقلة عن الاسم المستخدم للإشارة إلى الملف. لا يجوز للروابط الثابتة الإشارة إلى الدلائل (لمنع احتمالية وجود حلقات داخل شجرة نظام الملفات، مما قد يربك العديد من البرامج) ولا يجوز لها الإشارة إلى ملفات على أنظمة ملفات مختلفة (لأن أرقام العقد ليست فريدة عبر أنظمة الملفات).

الرابط الرمزي هو نوع خاص من الملفات محتواه سلسلة نصية هي اسم مسار ملف آخر، الملف الذي يشير إليه الرابط. (يمكن قراءة محتوى الرابط الرمزي باستخدام readlink(2).) بعبارة أخرى، الرابط الرمزي هو مؤشر لاسم آخر، وليس لكائن أساسي. لهذا السبب، يمكن للروابط الرمزية الإشارة إلى الدلائل وعبور حدود أنظمة الملفات.

لا يوجد شرط بوجود اسم المسار المشار إليه بواسطة رابط رمزي. الرابط الرمزي الذي يشير إلى اسم مسار غير موجود يُسمى رابط معلق.

نظرًا لتعايش الرابط الرمزي والكائن المشار إليه في فضاء أسماء نظام الملفات، قد ينشأ ارتباك في التمييز بين الرابط نفسه والكائن المشار إليه. في الأنظمة القديمة، اعتمدت الأوامر واستدعاءات النظام اصطلاحاتها الخاصة لمتابعة الروابط بطريقة غير منتظمة. القواعد لنهج أكثر توحيدًا، كما هي مطبقة على لينكس وأنظمة أخرى، موضحة هنا. من المهم أن تلتزم التطبيقات المحلية أيضًا بهذه القواعد، بحيث تكون واجهة المستخدم متسقة قدر الإمكان.

  الروابط السحرية
هناك فئة خاصة من الكائنات الشبيهة بالروابط الرمزية تُعرف باسم "الروابط السحرية"، والتي يمكن العثور عليها في بعض أنظمة الملفات الزائفة مثل proc(5) (تتضمن الأمثلة /proc/pid/exe و /proc/pid/fd/*). على عكس الروابط الرمزية العادية، لا يتم حل الروابط السحرية من خلال توسيع اسم المسار، بل تعمل كمراجع مباشرة لتمثيل النواة الخاص بمقبض الملف. ونتيجة لذلك، تسمح هذه الروابط السحرية للمستخدمين بالوصول إلى الملفات التي لا يمكن الإشارة إليها بمسارات عادية (مثل الملفات غير المرتبطة التي لا يزال برنامج قيد التشغيل يشير إليها).

نظرًا لقدرتها على تجاوز القيود العادية المستندة إلى mount_namespaces(7)، استُخدمت الروابط السحرية كنواقل هجوم في العديد من الاستغلالات.

  ملكية الرابط الرمزي، الأذونات، والطوابع الزمنية
يمكن تغيير المالك والمجموعة لرابط رمزي موجود باستخدام lchown(2). تهم ملكية الرابط الرمزي عند إزالة الرابط أو إعادة تسميته في دليل يحتوي على البت اللاصق (انظر inode(7))، وعند تعيين sysctl fs.protected_symlinks (انظر proc(5)).

يمكن تغيير الطوابع الزمنية لآخر وصول وآخر تعديل لرابط رمزي باستخدام utimensat(2) أو lutimes(3).

على لينكس، لا تُستخدم أذونات الرابط الرمزي العادي في أي عمليات؛ الأذونات دائمًا 0777 (قراءة، كتابة، وتنفيذ لجميع فئات المستخدمين)، ولا يمكن تغييرها.

ومع ذلك، لا تتبع الروابط السحرية هذه القاعدة. يمكن أن يكون لها وضع غير 0777، على الرغم من أن هذا الوضع لا يُستخدم حاليًا في أي فحوصات أذونات.

  الحصول على واصف ملف يشير إلى رابط رمزي
استخدام مجموعة العلمين O_PATH و O_NOFOLLOW مع open(2) ينتج واصف ملف يمكن تمريره كوسيطة dirfd في استدعاءات النظام مثل fstatat(2)، fchownat(2)، fchmodat(2)، linkat(2)، و readlinkat(2)، للعمل على الرابط الرمزي نفسه (بدلاً من الملف الذي يشير إليه).

بشكل مبدئي (أي إذا لم يُحدد العلم AT_SYMLINK_FOLLOW)، إذا طُبق name_to_handle_at(2) على رابط رمزي، فإنه ينتج مقبضًا للرابط الرمزي (بدلاً من الملف الذي يشير إليه). يمكن بعد ذلك الحصول على واصف ملف للرابط الرمزي (بدلاً من الملف الذي يشير إليه) بتحديد العلم O_PATH في استدعاء لاحق لـ open_by_handle_at(2). مرة أخرى، يمكن استخدام واصف الملف هذا في استدعاءات النظام المذكورة أعلاه للعمل على الرابط الرمزي نفسه.

  معالجة الروابط الرمزية بواسطة استدعاءات النظام والأوامر
تُعالج الروابط الرمزية إما بالعمل على الرابط نفسه، أو بالعمل على الكائن المشار إليه بالرابط. في الحالة الأخيرة، يُقال إن التطبيق أو استدعاء النظام يتبع الرابط. قد تشير الروابط الرمزية إلى روابط رمزية أخرى، وفي هذه الحالة يتم إلغاء الإشارة إلى الروابط حتى يُعثر على كائن ليس رابطًا رمزيًا، أو يُعثر على رابط رمزي يشير إلى ملف غير موجود، أو يُكتشف حلقة. (يتم اكتشاف الحلقة بوضع حد أعلى لعدد الروابط التي يمكن متابعتها، وينتج خطأ إذا تجاوز هذا الحد.)

هناك ثلاث مجالات منفصلة تحتاج إلى المناقشة. وهي كالتالي:

•   الروابط الرمزية المستخدمة كوسائط أسماء ملفات لاستدعاءات النظام.

•   الروابط الرمزية المحددة كوسائط سطر أوامر لأدوات لا تجتاز شجرة ملفات.

•   الروابط الرمزية التي تواجهها الأدوات التي تجتاز شجرة ملفات (إما محددة في سطر الأوامر أو مواجهة كجزء من التنقل في التسلسل الهرمي للملفات).

قبل وصف معالجة الروابط الرمزية بواسطة استدعاءات النظام والأوامر، نحتاج إلى بعض المصطلحات. بالنظر إلى اسم مسار بالصيغة a/b/c، يُسمى الجزء الذي يسبق الشرطة المائلة النهائية (أي a/b) المكون dirname، ويُسمى الجزء الذي يلي الشرطة المائلة النهائية (أي c) المكون basename.

  معالجة الروابط الرمزية في استدعاءات النظام
المنطقة الأولى هي الروابط الرمزية المستخدمة كوسائط أسماء ملفات لاستدعاءات النظام.

معالجة الروابط الرمزية داخل اسم مسار يُمرر إلى استدعاء نظام تكون كالتالي:

(1) داخل مكون اسم الدليل لاسم مسار، تُتبع الروابط الرمزية دائمًا في كل استدعاء نظام تقريبًا. (وهذا صحيح أيضًا للأوامر.) الاستثناء الوحيد هو openat2(2)، الذي يوفر أعلامًا يمكن استخدامها لمنع اتباع الروابط الرمزية في مكون اسم الدليل بشكل صريح.

(2) باستثناء ما هو مذكور أدناه، تتبع جميع استدعاءات النظام الروابط الرمزية في مكون الاسم الأساسي لاسم مسار. على سبيل المثال، إذا كان هناك رابط رمزي slink يشير إلى ملف يُسمى afile، فإن استدعاء النظام open("slink" ...) سيعيد واصف ملف يشير إلى الملف afile.

لا تتبع استدعاءات نظام متنوعة الروابط في مكون الاسم الأساسي لاسم مسار، وتعمل على الرابط الرمزي نفسه. وهي: lchown(2), lgetxattr(2), llistxattr(2), lremovexattr(2), lsetxattr(2), lstat(2), readlink(2), rename(2), rmdir(2), و unlink(2).

تتبع استدعاءات نظام أخرى معينة الروابط الرمزية في مكون الاسم الأساسي لاسم مسار بشكل اختياري. وهي: faccessat(2), fchownat(2), fstatat(2), linkat(2), name_to_handle_at(2), open(2), openat(2), open_by_handle_at(2), و utimensat(2); انظر صفحات دليلها للتفاصيل. لأن remove(3) هو اسم مستعار لـ unlink(2)، فإن دالة المكتبة تلك لا تتبع الروابط الرمزية أيضًا. عند تطبيق rmdir(2) على رابط رمزي، يفشل مع الخطأ ENOTDIR.

يستحق link(2) نقاشًا خاصًا. يحدد POSIX.1-2001 أن link(2) يجب أن يفك إشارة oldpath إذا كان رابطًا رمزيًا. ومع ذلك، لا يفعل Linux ذلك. (بشكل مبدئي، Solaris هو نفسه، ولكن يمكن الحصول على السلوك المحدد بواسطة POSIX.1-2001 مع خيارات مترجم مناسبة.) غير POSIX.1-2008 المواصفات للسماح بأي من السلوكين في تطبيق.

  أوامر لا تجتاز شجرة ملفات
المنطقة الثانية هي الروابط الرمزية، المحددة كوسائط أسماء ملفات سطر أوامر، للأوامر التي لا تجتاز شجرة ملفات.

باستثناء ما هو مذكور أدناه، تتبع الأوامر الروابط الرمزية المسماة كوسائط سطر أوامر. على سبيل المثال، إذا كان هناك رابط رمزي slink يشير إلى ملف يُسمى afile، فإن الأمر cat slink سيعرض محتويات الملف afile.

من المهم إدراك أن هذه القاعدة تتضمن أوامر قد تجتاز أشجار الملفات بشكل اختياري؛ على سبيل المثال، الأمر chown file مشمول في هذه القاعدة، بينما الأمر chown -R file، الذي يؤدي اجتياز شجرة، ليس كذلك. (الأخير موصوف في المنطقة الثالثة، أدناه.)

إذا كان المقصود صراحة أن يعمل الأمر على الرابط الرمزي بدلاً من اتباع الرابط الرمزي —على سبيل المثال، يُراد أن يغير chown slink ملكية الملف الذي هو slink، سواء كان رابطًا رمزيًا أم لا— فيجب استخدام الخيار -h. في المثال أعلاه، سيغير chown root slink ملكية الملف المشار إليه بواسطة slink، بينما سيغير chown -h root slink ملكية slink نفسه.

هناك بعض الاستثناءات لهذه القاعدة:

•   لا تتبع الأوامر mv(1) و rm(1) الروابط الرمزية المسماة كوسائط، بل تحاول إعادة تسميتها وحذفها على التوالي. (ملاحظة، إذا كان الرابط الرمزي يشير إلى ملف عبر مسار نسبي، فقد يتسبب نقله إلى دليل آخر في توقفه عن العمل، لأن المسار قد لا يكون صحيحًا بعد الآن.)

•   الأمر ls(1) هو أيضًا استثناء لهذه القاعدة. للتوافق مع الأنظمة التاريخية (عندما لا يقوم ls(1) باجتياز شجرة—أي، الخيار -R غير محدد)، يتبع الأمر ls(1) الروابط الرمزية المسماة كوسائط إذا كان الخيار -H أو -L محددًا، أو إذا كانت الخيارات -F أو -d أو -l غير محددة. (الأمر ls(1) هو الأمر الوحيد حيث تؤثر الخيارات -H و -L على سلوكه حتى لو لم يكن يقوم باجتياز شجرة ملفات.)

•   الأمر file(1) هو أيضًا استثناء لهذه القاعدة. لا يتبع الأمر file(1) الروابط الرمزية المسماة كوسيطة بشكل مبدئي. يتبع الأمر file(1) الروابط الرمزية المسماة كوسيطة إذا كان الخيار -L محددًا.

  أوامر تجتاز شجرة ملفات
الأوامر التالية إما تجتاز أشجار الملفات بشكل اختياري أو دائمًا: chgrp(1), chmod(1), chown(1), cp(1), du(1), find(1), ls(1), pax(1), rm(1), و tar(1).

من المهم إدراك أن القواعد التالية تنطبق بالتساوي على الروابط الرمزية التي تُواجه أثناء اجتياز شجرة الملفات والروابط الرمزية المدرجة كوسائط سطر أوامر.

تنطبق القاعدة الأولى على الروابط الرمزية التي تشير إلى ملفات غير الدلائل. تُنفذ العمليات التي تنطبق على الروابط الرمزية على الروابط نفسها، ولكن بخلاف ذلك تُتجاهل الروابط.

سيزيل الأمر rm -r slink directory slink، بالإضافة إلى أي روابط رمزية تُواجه في اجتياز الشجرة لـ directory، لأن الروابط الرمزية قد تُحذف. في أي حالة لن يؤثر rm(1) على الملف المشار إليه بواسطة slink.

تنطبق القاعدة الثانية على الروابط الرمزية التي تشير إلى دلائل. لا تُتبع الروابط الرمزية التي تشير إلى دلائل أبدًا بشكل مبدئي. يُشار إلى هذا غالبًا باسم اجتياز "مادي"، على عكس اجتياز "منطقي" (حيث تُتبع الروابط الرمزية التي تشير إلى دلائل).

تُتبع (يجب أن تُتبع) اتفاقيات معينة بأقصى قدر من الاتساق بواسطة الأوامر التي تؤدي اجتيازات شجرة ملفات:

•   يمكن جعل الأمر يتبع أي روابط رمزية مسماة على سطر الأوامر، بغض النظر عن نوع الملف الذي تشير إليه، بتحديد العلم -H (لـ "نصف منطقي"). يُقصد بهذا العلم جعل مساحة اسم سطر الأوامر تبدو مثل مساحة الاسم المنطقية. (ملاحظة، للأوامر التي لا تقوم دائمًا باجتيازات شجرة ملفات، سيُتجاهل العلم -H إذا لم يُحدد العلم -R أيضًا.)

    على سبيل المثال، سيجتاز الأمر chown -HR user slink التسلسل الهرمي للملفات المتجذر في الملف المشار إليه بواسطة slink. ملاحظة، -H ليس هو نفسه العلم -h الذي نوقش سابقًا. يتسبب العلم -H في فك إشارة الروابط الرمزية المحددة على سطر الأوامر لأغراض كل من الإجراء الذي سيُنفذ واجتياز الشجرة، وكأن المستخدم قد حدد اسم الملف الذي أشار إليه الرابط الرمزي.

•   يمكن جعل أمر يتبع أي روابط رمزية مذكورة في سطر الأوامر، بالإضافة إلى أي روابط رمزية تُواجه أثناء الاجتياز، بغض النظر عن نوع الملف الذي تشير إليه، بتحديد العلامة -L (لـ"منطقي"). تهدف هذه العلامة إلى جعل مساحة الأسماء بأكملها تبدو كمساحة الأسماء المنطقية. (ملاحظة، للأوامر التي لا تقوم دائمًا باجتياز شجرة الملفات، سيتم تجاهل العلامة -L إذا لم تُحدد العلامة -R أيضًا.)

    على سبيل المثال، سيؤدي الأمر chown -LR user slink إلى تغيير مالك الملف الذي يشير إليه slink. وإذا كان slink يشير إلى دليل، فسيقوم chown بتتبع التسلسل الهرمي للملفات الذي يبدأ من الدليل الذي يشير إليه. بالإضافة إلى ذلك، إذا عثر على أي روابط رمزية في أي شجرة ملفات يتتبعها chown، فإنها ستُعامل بنفس الطريقة التي يُعامل بها slink.

•   يمكن جعل أمر يوفر السلوك المبدئي بتحديد العلامة -P (لـ"فيزيائي"). تهدف هذه العلامة إلى جعل مساحة الأسماء بأكملها تبدو كمساحة الأسماء الفيزيائية.

بالنسبة للأوامر التي لا تقوم مبدئيًا باجتياز شجرة الملفات، يتم تجاهل العلامات -H و-L و-P إذا لم تُحدد العلامة -R أيضًا. بالإضافة إلى ذلك، يمكنك تحديد الخيارات -H و-L و-P أكثر من مرة؛ آخر خيار محدد يحدد سلوك الأمر. هذا يهدف إلى السماح لك بإنشاء أسماء مستعارة للأوامر لتعمل بطريقة أو بأخرى، ثم تجاوز هذا السلوك في سطر الأوامر.

الأمران ls(1) وrm(1) لهما استثناءات لهذه القواعد:

•   الأمر rm(1) يعمل على الرابط الرمزي، وليس الملف الذي يشير إليه، وبالتالي لا يتبع رابطًا رمزيًا أبدًا. الأمر rm(1) لا يدعم الخيارات -H أو -L أو -P.

•   للحفاظ على التوافق مع الأنظمة التاريخية، يعمل الأمر ls(1) بشكل مختلف قليلاً. إذا لم تحدد الخيارات -F أو -d أو -l، فإن ls(1) سيتبع الروابط الرمزية المحددة في سطر الأوامر. إذا تم تحديد العلامة -L، فإن ls(1) يتبع جميع الروابط الرمزية، بغض النظر عن نوعها، سواء تم تحديدها في سطر الأوامر أو مواجهتها في اجتياز الشجرة.

انظر أيضًا
chgrp(1), chmod(1), find(1), ln(1), ls(1), mv(1), namei(1), rm(1), lchown(2), link(2), lstat(2), readlink(2), rename(2), symlink(2), unlink(2), utimensat(2), lutimes(3), path_resolution(7)

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

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

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