اذهب إلى المحتوى

Hassan Hedr

الأعضاء
  • المساهمات

    2852
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    38

كل منشورات العضو Hassan Hedr

  1. لأنه يمكن ببساطة لأي شخص كان أن يقوم بإرسال Cookie تحتوي على معرّف مستخدم آخر، هذا يعني أنه سيستطيع الدخول لحسابات أشخاص آخرين بكل سهولة، لذا كطبقة أمان أنت تقوم بالتوقيع على تصريح المستخدم (مثلا بتضمينه داخل JWT في حالتك) وعندما يدعي شخص بأنه مستخدم ما عندها يمكنك التحقق فعلًا من صحة إدعاءه عبر التحقق من التوكن والتأكد أنك من قمت بالتوقيع على محتواها وبالتالي إرسال البيانات التي يطلبها الشخص لأنه الشخص نفسه فكر في JWT على أنه بيانات + توقيعك عليها، أي شخص يسلمك بيانات يمكنك التحقق من التوقيع لتتحقق أنها صادرة من قبلك وليس هو من قام بكتابتها مثلا أو التغيير بمحتواها، تستفيد من ذلك عندما يقوم شخص بتسجيل دخول ترسل له توكن فيها بيانات عن هويته، لن يستطيع أي شخص آخر لاحقا الإدعاء أنه نفس الشخص طالما لم يرسل مع طلبه التوكن نفسها الموقعة من قبلك، ببساطة الفكرة هي ضمان حماية البيانات من التزوير أو العبث بمحتواها.
  2. يمكنك استخدام التابع mt_rand في PHP لتوليد عدد عشوائي بين قيمتين كالتالي: mt_rand(0, 999999); // 521866 استخدم نفس التابع لتوليد أعداد بفواصل كالتالي: mt_rand(0, 10) / 10; // 0.8 تشفير كلمات السر يتم عن طريق خوارزمية Hashing وهي تقوم بتحويل أي نص إلى نص آخر محدد ليس له معنى يتم تخزينه في قاعدة البيانات بدلا من كلمة السر بشكل صريح ويستخدم لمطابقته لاحقا عند محاولات تسجيل الدخول اللاحقة للتأكد من صحة كلمة المرور
  3. بما أنك تحاول إدارة ملفات مشتركة لا يمكلها تطبيقك سيحتاج التطبيق للصلاحية التالية: android.permission.MANAGE_EXTERNAL_STORAGE يمكنك التحقق من سماح المستخدم لتلك الصلاحية باستدعاء التابع التالي Environment.isExternalStorageManager()
  4. الصلاحية هي الفكرة الأساس أساس نظام الصلاحيات هو الصلاحية المفردة (صلاحية رؤية مورد ما - صلاحية تعديل مورد - صلاحية حذف مورد ...) يمكنك بناء نظام الصلاحيات كاملًا حوله وتقوم بربط كل مستخدم بالصلاحيات الممنوحة له والتحقق منها عند قيام أي مستخدم بطلب أي فعل ما داخل مشروعك الأدوار هي طبقة فوق الصلاحيات المفردة بسبب التكرار في منح مجموعة متماثلة من الصلاحيات لعدة مستخدمين، يظهر لدينا فكرة الدور وهي ليست إلا تجميعة من الصلاحيات يتم إدارتها ومنحها وسحبها معا من عدة مستخدمين، توفر الأدوار مرونة أكثر في الصيانة والمتابعة في حال كان عدد الصلاحيات كبير نسبيًا أو لا يوجد استثناءات للمستخدمين تجعل من الضروري اعطائهم صلاحية خاصة متميزة عن غيرهم من نفس الفئة متى استخدم كل منهما في مشروعي حسب حالة مشروعك جرب البدء فقط بتضمين صلاحيات ومنحها للمستخدمين، واستخدم لاحقا فكرة الأدوار في حال وجدت حاجة لها داخل مشروعك كتكرار لعمليات منح نفس الصلاحيات دومًا أو ظهر لك دور ما مع الاستعمال الطويل لمشروعك يمكنك انشاء دور وربط عدة صلاحيات به وربط المستخدمين مع الدور مباشرة وليس مع الصلاحيات.
  5. قبل API إصدار 23 كان يعتمد كما ذكرت فقط على ذكر الصلاحيات المطلوبة للتطبيق في Manifest وعند تثبيت التطبيق فإن كل الصلاحيات المذكورة يكون المستخدم قد وافق عليها ضمنيا. بينما في API إصدار 23 وما بعد فقد تم تغيير تجربة المستخدم من حيث السماح للصلاحيات، حيث يتم الموافقة على الصلاحيات من داخل التطبيق وعند احتياجها فقط مع اجبار التطبيق على إظهار رسالة لكل صلاحية يطلبها التطبيق وقد يوافق المستخدم عليها وقد لا يوافق. السبب في ضرورة حاجتك لاستخدام أصناف Compat هو أنك تستهدف API 23 وما فوق في بناء تطبيقك، ولكنك تدعم إصدارات أقدم فيجب عليك الاستعانة بتصنيفات Compat حتى يتم توفير توافقية في حال كان المستخدم على إصدار أقدم من 23
  6. المنبة لا يعمل بطريقة BroadcastReciever بل يستخدم مدير التنبيهات AlarmManager، المشكلة لا يمكنك التحكم متى سيذهب تطبيقك لحالة Sleep من قبل النظام، يعتمد ذلك على العمل الذي ترغب في فعله فقد تجد طريقة أخرى لتنفيذه
  7. Activity: هو صنف يوفر كل المزايا المتاحة على إصدار أندرويد المستهدف في مشروعك AppCompatActivity: هو صنف يوفر المزايا المتاحة على إصدار أندرويد المستهدف في مشروعك وأيضا يهتم بتوفير تلك المزايا بطريقة ما على الإصدارات الأقدم (لغاية إصدار قديم معين لا يوفر توافقية قبله) AndroidX: مثل AppCompat يهتم بتوفير التوافقية مع الإصدارات الأقدم من أندويد، واختلافه فقط بتنظيم الأصناف داخله حيث يصبح أسهل على المطور اختيار نسخة من صنف معين داخله واستخدامها يفضل دائما تفضيل استخدام الأصناف التي توفر توافقية مع الاصدارات القديمة، هذا سيؤدي أن تطبيقك النهائي سيدعم شريحة أكبر من الأجهزة، حاول ترتيب أولوية الاختيار بينهم بالترتيب التالي: AndroidX (توافقية أكبر + تنظيم الأصناف داخله أفضل) AppCompat (توافقية أكبر) Android App
  8. لغة الآلة هي لغة برمجة قطع العتاد وتكون متخصصة بالقطعة التي نحاول برمجتها وعادة لا نتعامل بها بل نبرمج بلغات برمجة عالية المستوى وتترجم عبر المترجمات إلى لغة الآلة أظن أنك تقصد تعلم الآلة وليس لغة الآلة. تعلم الآلة ينقسم لعدة مجالات، كل مجال يحتاج منك لمعرفة خوارزميات معينة، ثم تضمين تلك الخوارزميات في لغات برمجة معينة (مثلا Pascal في حال كنت خبيرًا بها) مثل Python وهي الأشيع استعمالًا في هذا المجال أنصحك بقراءة سلسلة مقالات مدخل للذكاء الاصطناعي، فهي تقدم لك مقدمة جيدة جدًا لتكوّن نظرة عامة عن هذا المجال
  9. المشكلة هي في محاولة اندرويد تحسين الأداء وتوفير الطاقة بشكل عام، حيث قد تكون عدة تطبيقات على الهاتف قد عينت BroadcastReciever لنفس الحدث فعند كل تشغيل أو إغلاق للواي فاي سيتم استدعاء مثلا 30 BroadcastReciever معا مما يؤدي لضعف في أداء الهاتف. لذا اندرويد (بدءا من API المستوى 26 وفوق) لا يقوم باستدعاء ال BroadcastReciever الخاص بأي تطبيق إذا كان نائما (في حالة Sleep) فقط عندما يكون التطبيق يعمل سيستقبل الحدث
  10. تتشارك أغلب لغات البرمجة في العديد من المزايا. من أفضل الطرق لتعلم لغة برمجة جديدة هي كتابة برنامج مألوف. في هذا المقال، سنتعلم كيف ننشئ لعبة "احزر الرقم" باستخدام لغة البرمجة Awk لنشرح من خلالها مفاهيم مألوفة. عند تعلم البرمجة بلغة برمجة جديدة، من المهم التركيز على أكثر المفاهيم التي تشترك بها لغات البرمجة: المتغيرات: مكان يُخزن فيه المعلومات. التعابير: طرق لحساب الأشياء. الصياغات: طرق التعبير عن تغير الحالة داخل البرنامج. هذه المفاهيم هي أساس معظم لغات البرمجة. حالما تستوعب جيدا تلك المفاهيم، ستكون قادرًا على استيعاب البقية منها. مثلا أغلب لغات البرمجة تمتلك "طريقة لفعل الأشياء" مدعومة بطريقة تصميم اللغة، وهذه الطرق تختلف من برنامج لآخر. هذه الطرق تتضمن إنشاء الوحدات (تجميع العمليات المتقاربة مع بعضها)، الصيغة التصريحية وصيغة الأمر، والتوجه الغرضي، والمزايا النحوية عالية ومنخفضة المستوى، وما إلى ذلك. مثال يألفه العديد من المبرمجين وهو "المراسم" ويعني كمية التحضيرات اللازمة قبل البدء بحل المشكلة. لغة جافا تتطلب كمية مراسم كبيرة، متجذرة في تصميمها، والذي يتطلب أن تكون كل الشيفرات معرفة ضمن أصناف. بالرجوع إلى الأساسيات. لغات البرمجة تتشارك بعدة تشابهات. حالما تتعرف على لغة برمجة واحدة، ابدأ بتعلم أساسيات لغة برمجة أخرى وستجد نفسك تقدّر الاختلافات في تلك اللغة الجديدة. طريقة جيدة للبدء تكون في إنشاء برنامج اختبار بسيط. أحد تلك البرامج قد يكون برنامج "احزر الرقم". يقوم الحاسب باختيار رقم بين واحد ومئة ويسألك أن تحزر ذلك الرقم. يعيد البرنامج الكرّة إلى أن تحزر الرقم. برنامج "احزر الرقم" سيُدربك على عدة مفاهيم في لغات البرمجة: المتغيرات. الدخل. الخرج. التقييم الشرطي. الحلقات التكرارية. هذا مثال عملي تجريبي رائع لتعلم لغة برمجة جديدة. احزر الرقم باستخدام awk لنبدأ بكتابة لعبة "احزر الرقم" كبرنامج في Awk. Awk لغة برمجة نصية ديناميكية النوع موجهة لتحويل البيانات، ولديها دعم جيد من ناحية الاستخدام التفاعلي. Awk موجودة منذ عام 1970، بدأت كقسم من نظام يونكس. إذا كنت لا تعلم عن Awk ولكنك تحب جداول البيانات فهذه فأنت في المكان الصحيح للتعرف عليها. يمكنك بدء الاستكشاف عبر كتابة نسخة من لعبة "احزر الرقم". التالي تضمين للعبة (مع ترقيم الأسطر حتى نتمكن من الإشارة إليها لاحقًا): 1 BEGIN { 2 srand(42) 3 randomNumber = int(rand() * 100) + 1 4 print "random number is",randomNumber 5 printf "guess a number between 1 and 100\n" 6 } 7 { 8 guess = int($0) 9 if (guess < randomNumber) { 10 printf "too low, try again:" 11 } else if (guess > randomNumber) { 12 printf "too high, try again:" 13 } else { 14 printf "that's right\n" 15 exit 16 } 17 } يمكن الملاحظة مباشرة التشابه بين بنى التحكم في Awk ومثيلاتها في لغات أخرى مثل سي C وجافا JAVA، ولا تشبه تلك التي في بايثون. في التعابير مثل if-then-else أو while، يمكن أن تأخذ تعبيرًا واحدًا أو مجموعة من التعابير محاطة بقوسين معقوصين { و }. ومع ذلك يوجد فرق واحد كبير في Awk يجب فهمه منذ البداية: ماذا يعني ذلك؟ معظم برامج Awk هي مقاطع من الشيفرات التي تتلقى دخل، تقوم بعمل ما على البيانات، ثم تكتبها إلى الخرج. لغة Awk توفر افتراضيًا كل احتياجات التحويل والتوصيل لذلك. لنستكشف ذلك معا من خلال البرنامج السابق ونسأل السؤال التالي: أين بنية "القراءة من الطرفية"؟ الجواب أنها مبنية في داخل اللغة نفسها. تحديدا في الأسطر 7 - 17 نخبر Awk ماذا يفعل بكل سطر من الدخل. سيصبح واضحا أن الأسطر 1 - 6 تنفذ قبل أن يتم قراءة أي شيء. تحديدا الكلمة المفتاحية BEGIN في السطر الأول هي نمط مكرر، في حالتنا هذه فإنها تخبر Awk قبل قراءة أي شيء أن ينفذ ما بين القوسين {...}. ومثلها الكلمة المفتاحية END، لم نستخدمها هنا لكنها تدل Awk على التعليمات التي يجب أن ينفذها بعد أن يتم قراءة كل شيء. بالعودة للأسطر 7 - 17، فهي تمثل كتلة واحدة ستنفذ معًا، لكن لا يوجد قبلها كلمة مفتاحية. لذا يقوم Awk بتنفيذ هذه الأسطر على كل سطر يتم تلقيه من الدخل وفي حالتنا هذه هي محاولات المستخدم لحزر الرقم. لنلق الآن نظرة على الشيفرة التي تنفذ، بدايةً هناك المقدمة التي تنفذ قبل كل قراءة للدخل. في السطر 2، نعرّف رقما عشوائيا من واحد إلى 42. السطر 3 يقوم بحساب رقم بين 1 و 100، السطر 4 يطبع هذه الرقم لنا فقط للتأكد من وجود أي خطأ. السطر 5 يسأل المستخدم أن يحزر رقمًا. لاحظ هنا استخدمنا التابع printf وليس print فهو مثل التابع الموجود في C، ويأخذ أول معامل ويكون قالب نصي يستخدم لتنسيق الخرج. الآن بعد أن تم سؤال المستخدم البرنامج ينتظر الإدخال، بعد أن يدخل المستخدم تخمينه، يمرر Awk ذلك الادخال الى الاسطر 7 - 17، كما ذكرنا سابقًا. السطر 1 يحول الدخل الى نوع عدد صحيح؛ 0$ تعني سجل الدخل كاملًا، بينما 1$ تعني أول حقل من سجل الدخل 2$ تعني الحقل الثاني، وهكذا. يقوم Awk بتقسيم الدخل إلى حقول تلقائيا مستخدمًا الفاصل المحدد مسبقًا، والذي تكون قيمته الافتراضية المساحة الفارغة. الأسطر 9 - 15 تقارن جواب المستخدم مع العدد العشوائي المخزن سابقًا، ويطبع الجواب المناسب. إذا كان الجواب صحيحًا، السطر 15 سيخرج من البرنامج وينهي سلسلة معالجة الدخل، بهذه البساطة. بالأخذ بالحسبان بنية Awk الغريبة التي يتميز بها، فهو يتكون من مقاطع برمجية تتجاوب مع أسطر دخل بإعدادات معينة وتقوم بفعل الأشياء بها، لننظر الآن إلى بنية مختلفة لنرى كيف يعمل قسم التصفية: 1 BEGIN { 2 srand(42) 3 randomNumber = int(rand() * 100) + 1 4 print "random number is",randomNumber 5 printf "guess a number between 1 and 100\n" 6 } 7 int($0) < randomNumber { 8 printf "too low, try again: " 9 } 10 int($0) > randomNumber { 11 printf "too high, try again: " 12 } 13 int($0) == randomNumber { 14 printf "that's right\n" 15 exit 16 } الأسطر 1 - 6 لم تتغير عن البرنامج السابق لكن نلاحظ أن الشيفرة في الأسطر 7 - 9 ستنفذ في حال كان جواب المستخدم أقل من الرقم العشوائي الذي يحاول تخمينه، والأسطر 10 - 12 كذلك ستنفذ في حال كان جواب المستخدم أكبر من الرقم العشوائي الذي يحاول المستخدم تخمينه، والشيفرة في الأسطر 13 - 16 ستنفذ في حال كان جواب المستخدم مساويًا لذلك الرقم. قد يبدو ذلك غريبًا، لماذا نقوم بتكرار حساب int($0)‎ عند كل تحقق؟ فهي طريقة غريبة لحل المشكلة. لكن هذه الأنماط هي طريقة رائعة لفصل معالجة التحقق من الإجابة حيث يمكن توظيف استخدام التعابير النظامية أو أي بنية مدعومة من قبل Awk عند كل كتلة من كتل التحقق تلك بشكل منفصل. يمكننا أيضا استخراج الحسابات المتكررة وفصلها بمكان واحد، عن أماكن التحقق منها للحالات المختلفة، التالي نسخة ثالثة من البرنامج توضح ذلك: 1 BEGIN { 2 srand(42) 3 randomNumber = int(rand() * 100) + 1 4 print "random number is",randomNumber 5 printf "guess a number between 1 and 100\n" 6 } 7 { 8 guess = int($0) 9 } 10 guess < randomNumber { 11 printf "too low, try again: " 12 } 13 guess > randomNumber { 14 printf "too high, try again: " 15 } 16 guess == randomNumber { 17 printf "that's right\n" 18 exit 19 } لاحظ أنه مهما كانت القيمة المدخلة من قبل المستخدم، يجب تحويلها إلى عدد صحيح، تم إضافة الأسطر 7 - 9 لفعل ذلك. الآن الثلاث مجموعات من الأسطر 10 - 12، 13 - 15 و 16 - 19، تشير إلى متغير معرّف مسبقًا باسم guess بدلًا من تحويل الدخل عندها في كل مرة. لنقم بمراجعة لما كنا قد نوينا تعلمه سابقًا: المتغيرات: Awk يحتوي عليها؛ يمكننا الملاحظة أن بيانات الدخل تأتي إلى البرنامج على شكل نص ولكن يمكننا تحويلها إلى قيمة عددية عند الحاجة. الدخل: يقوم Awk بإرسال الدخل عبر طريقته "سلسلة معالجة البيانات" لقراءة الدخل. الخرج: قمنا باستخدام توابع Awk الإجرائية التالية print و printf لكتابة الأشياء إلى الخرج. التقييم الشرطي: تعلمنا عن كتلة if-then-else في Awk وتصفية الدخل التي تتجاوب مع إعدادات مختلفة لأسطر الدخل. الحلقات: لم نحتج إلى الحلقات في مثالنا هذا، لكن بفضل طريقة Awk في معالجة البيانات عبر "سلسلة معالجة البيانات" فإن الحلقات موجودة من طبيعة تصميم اللغة نفسها. لكن يمكن للمستخدم الخروج من تلك السلسلة في أي وقت عبر إرسال إشارة "نهاية الملف" إلى Awk (بالضغط على Ctrl+D عند استعمال طرفية لينكس). من المهم ملاحظة عدم حاجتنا للحلقات لمعالجة الدخل. أحد أهم الأسباب التي جعلت Awk يبقى طويلًا هي أن برامجه تكون عادةً قصيرة، وأحد أسباب كونها قصيرة هي أنه لا يوجد شيفرة متداولة مكررة كثيرا وضرورية للقراءة من الطرفية أو من ملف مثلًا. لننفذ البرنامج: $ awk -f guess.awk random number is 25 guess a number between 1 and 100: 50 too high, try again: 30 too high, try again: 10 too low, try again: 25 that's right $ من الأشياء التي لم نذكرها هي التعليقات. التعليق في Awk يبدأ بمحرف المربع (#) وينتهي عند نهاية سطر التعليق. الختام Awk لغة قوية ومثالنا السابق "لعبة احزر الرقم" هو بداية جيدة لبدء تعلم البرمجة بتلك اللغة. وهي البداية وليست نهاية طريق تعلمك لها، يمكنك أيضا القراءة عن تاريخ لغة Awk و Gawk (إصدار awk لجنو)، وهي إصدار موسع من Awk وعلى الأغلب هو الإصدار المتواجد على حاسبك إذا كنت تعمل على نظام لينكس، أو يمكنك. ترجمة -وبتصرف- للمقال Learn awk by coding a "guess the number" game لصاحبه Chris Hermansen. اقرأ أيضًا أفضل 5 لغات برمجة لـ DevOps تعرف على أشهر لغات برمجة الألعاب كيف تتعلم البرمجة ما هي البرمجة ومتطلبات تعلمها؟
  11. يمكنك طباعة التقارير أولا ببناء التقرير بصيغة HTML كما تقوم عادة ببناء العروض views، وعملية الطباعة الورقية لتلك الصفحة ليست إلا تنفيذ الأمر التالي سواء آاليا أو بعد الضغط على زر ما داخل الصفحة بعد فتح صفحة التقرير: window.print() يمكن أيضا الضغط على Ctrl + P لنفيذ أمر الطباعة يمكنك الاستفادة من الإجابة التالية لمعرفة طريقة تضمين بناء التقارير وطباعتها في لارافل قد يتم لاحقا تحديث المسارات وإضافة دروس تتعلق ببناء جداول التقارير وطباعتها
  12. حاول اتباع تنفيذ الأوامر السابقة واختبر الاتصال مجددًا قد تحل المشكلة
  13. حاول تغيير إعدادات مدير الشبكة باتباع الخطوات التالية قد ينجح الأمر: نفذ الأمر التالي لتحرير الإعدادات: sudo gedit /etc/NetworkManager/NetworkManager.conf قم بنسخ الأسطر التالية لنهاية الملف وقم بحفظه: [device] wifi.scan-rand-mac-address=no أعد تشغيل خدمة مدير الشبكة بتنفيذ الأمر التالي: sudo systemctl restart NetworkManager
  14. الصداع هو أمر ستواجهه أثناء العمل المكتبي وخصوصًا الذي يحتاج لجلوس لفترات طويلة، سببه الأساسي هو وضعية الجلوس الخاطئة وخاصة احناء الرأس إلى الأمام دون الشعور بذلك لفترات طويلة أنصحك بتعديل وضعية جلوسك وخاصة الانتباه لانحناء الرأس إلى الأمام وتعديلها دوما بحيث يكون مستوى الأذنين فوق الكتفين مباشرة طوال الوقت ما أمكن إلى أن تعتاد على وضعية الجلوس الصحيحة تلك. هناك تمارين خاصة بالعمل المكتبي يجب عليك الاعتياد على تنفيذها مع الوقت ستشعر بالراحة أثناء الجلوس لفترات طويلة. راجع دليل حسوب لوضعية الجلوس الصحيحة، و دليل الإعداد الصحيح لمكان العمل. راحتك الجسدية والنفسية ليست من الكماليات، بل هي أساس عملك المكتبي كمطور، حاول الاهتمام بها قدر الإمكان وسينعكس ذلك على انتاجيتك.
  15. مهما كنت منظمًا في ترتيب ملفاتك ومجلداتك، ستجد نفسك في بعض الأحيان تحاول البحث عن ملف ما ولا تستطيع إيجاده. ربما تكون قد نسيت اسم الملف أو أحيانا تتذكر اسم الملف، ولكن تنسى أين قمت بحفظه. أحيانًا تحاول الوصول لملف لم تنشئه أنت أصلًا. مهما كان المأزق الذي تمرّ به، على نظام POSIX ستجد دومًا الأمر find لمساعدتك. تثبيت الأمر find الأمر find معرَّف ضمن معايير POSIX، والتي تحدد المقاييس المفتوحة التي تتبعها أنظمة POSIX. وببساطة عند استخدامك لأحد أنظمة التشغيل التي تتبع تلك المعايير ومنها لينكس، و BSD، وماك فالأمر find مثبت لديك مسبقًا. مع ذلك ليست كل أوامر find متماثلة. مثلا الأمر نفسه في جنو يحوي مزايا غير موجودة في ذات الأمر find على أنظمة BSD أو بيزي بوكس Busybox أو سولاريس Solaris أو قد يحتوي على مزايا متماثلة لكن طريقة تضمينها مختلفة. في هذا المقال سنستخدم الأمر find الخاص بجنو الموجود في حزمة findutils بسبب سهولة توافرها وشعبيتها الكبيرة. معظم الأوامر التي سنشرحها في هذا المقال تعمل مع تضمينات أخرى للأمر find. ولتفادي الحصول على نتائج مختلفة نزِّل نسخة جنو من الأمر وثبتها لديك. بحث عن ملف بالاسم يمكنك العثور على ملف بالاسم عبر اسم الملف بالكامل أو أجزاء منه مع استخدام التعابير النمطية. الأمر find يحتاج أن تمرر له مسار المجلد الذي تريد البحث داخله، خيارات لتحديد الخاصية التي سيتم البحث من خلالها (مثلًا الخيار name- للبحث بإسم الملف حسّاس للحالة)، ثم نص البحث. افتراضيا سيتم معاملة نص البحث حرفيًا: الأمر find سيبحث عن الملفات التي تطابق تماما النص المُدخل بين علامتي اقتباس إلّا إذا كنت تستخدم صيغة التعبير النمطي. بفرض أن مجلد مستنداتك يحوي أربع ملفات: Foo و foo و foobar.txt و foo.xml. يبحث الأمر التالي عن ملف باسم "foo" حرفيًا: $ find ~ -name "foo" /home/tux/Documents/examples/foo يمكن جعل البحث غير حساس لحالة الأحرف عبر تمرير الخيار iname-: $ find ~ -iname "foo" /home/tux/Documents/examples/foo /home/tux/Documents/examples/Foo محارف البدل Wildcards يمكنك استخدام محارف البدل الأساسية للصدفة لتتمكن من العثور على باقي الملفات، محرف النجمة (*) يمثل أي عدد من الحروف والأرقام: $ find ~ -iname "foo*" /home/tux/Documents/examples/foo /home/tux/Documents/examples/Foo /home/tux/Documents/examples/foo.xml /home/tux/Documents/examples/foobar.txt محرف إشارة الاستفهام (?) يمثل محرفًا واحدًا: $ find ~ -iname "foo*.???" /home/tux/Documents/examples/foo.xml /home/tux/Documents/examples/foobar.txt هذه ليست صيغة التعابير النمطية، لذا في المثال السابق محرف النقطة (.) يمثل النقطة حرفيًا. التعابير النمطية Regular expressions يمكنك أيضا استخدام التعابير النمطية. على عكس الخيارين iname- و name- الذين يعبران عن الحالة الحساسة لحالة الأحرف والحالة الغير حساسة لحالة الأحرف على اسم الملف، الخيارين regex- و iregex- يطبقان على كامل مسار الملف، وليس فقط اسم الملف. هذا يعني أنك إذا قمت بالبحث عن foo، لن تحصل على نتيجة لأن foo لا تطابق المسار home/tux/Documents/foo/. بدل من ذلك يمكنك إما البحث عن المسار بشكل كامل، أو استخدام سلسلة محارف البدل في بداية نص البحث: $ find ~ -iregex ".*foo" /home/tux/Documents/examples/foo /home/tux/Documents/examples/Foo إيجاد ملف تم تعديله الأسبوع الماضي لإيجاد ملف تم تعديله الأسبوع الماضي، استخدم الخيار mtime- مع عدد سالب يعبر عن عدد الأيام السابقة: $ find ~ -mtime -7 /home/tux/Documents/examples/foo /home/tux/Documents/examples/Foo /home/tux/Documents/examples/foo.xml /home/tux/Documents/examples/foobar.txt إيجاد ملف تم تعديله خلال مدة محددة من الأيام يمكنك دمج استخدام الخيار mtime- عدة مرات لإيجاد ملف تم تعديله خلال مدة محددة من الأيام. للمعامل للخيار mtime- الأول مرر قيمة أقرب يوم تم تعديل الملف فيه، للمعامل للخيار الثانِ مرر قيمة أكبر عدد من الأيام في الماضي. في المثال التالي سيتم البحث عن الملفات التي تم تعديلها قبل يوم واحد مضى، ولكن ليس قبل سبعة أيام: $ find ~ -mtime +1 -mtime -7 تحديد البحث بنوع الملف من الشائع تحديد نتيجة البحث بواسطة find حسب نوع الملف الذي ت قوم بالبحث عنه. لا يجب استخدام هذا الخيار في حال كنت لست متأكد من نوع الملف الذي تبحث عنه، لكن إذا كنت تبحث تحديدا عن ملف وليس مجلد أو العكس مجلد وليس عن ملف، فهذا الخيار سيصفي النتائج كما تحتاج تمامًا. الخيار هو type-، ومعاملاته هي أحرف رموز تمثل عدة أنواع من البيانات. الأشيع منها هو: d - مجلد f - ملف l - وصلة رمزية s - مقبس p - أنبوب مسمّى (تستخدم ل FIFO) b - كتلة خاصة (عادة كون قرص صلب باسم) التالي بعض الأمثلة: $ find ~ -type d -name "Doc*" /home/tux/Documents $ find ~ -type f -name "Doc*" /home/tux/Downloads/10th-Doctor.gif $ find /dev -type b -name "sda*" /dev/sda /dev/sda1 ضبط نطاق البحث الأمر find افتراضيا يعمل بشكل تكراري، أي أنه يقوم بالبحث في المجلدات داخل المجلدات داخل المجلدات (وهكذا دواليك). يمكن للأمر أن يكون مزعجًا بعض الشيء في أنظمة الملفات الكبيرة، يمكنك عندها استخدام الخيار maxdepth- للتحكم بعدد الطبقات التي تريد الأمر find أن يقوم بالبحث داخلها في هيكلية الملفات لديك: $ find /usr -iname "*xml" | wc -l 15588 $ find /usr -maxdepth 2 -iname "*xml" | wc -l 15 الاستنتاج في هذا المقال غطينا الاستخدامات الأساسية فقط للأمر find. وهي أداة رائعة للبحث عن الملفات والمجلدات، وهناك الكثير من الأسباب لتعلم الأمر find فهو متواجد على أغلب الأنظمة وستواجه العديد من الحالات التي ستحتاج فيها للبحث عن ملف أو قائمة من الملفات. ترجمة -وبتصرف- للمقال Find files and directories on Linux with the find command لصاحبه Seth Kenlon. اقرأ أيضًا تعلم فك ضغط ملفات tar.gz باستعمال الأمر tar في لينكس تعديل الصور والتلاعب بها عبر سطر الأوامر في لينكس 4 أدوات مفتوحة المصدر من أجل مراقبة نظام لينكس النسخة الكاملة من كتاب أنظمة التشغيل للمبرمجين
  16. صيغة JWT النهائية تكون عبارة عن معلومات وتوقيع الجهة التي أصدرتها، عند تلقيها في تطبيقك يجب عليك فك ترميزها والتحقق من التوقيع اذا كان صحيحا ثم يمكنك اعتماد المعلومات داخلها المعلومة التي تريدها في تطبيقك هي معرّف المستخدم userId، بما أنك تستخدم JWT للتوثيق فهذه هي الطريقة الوحيدة لديك طرق أخرى تكون عبر استخدام معلومات الجلسة Session لكل مستخدم في تطبيقك وإما تخزين هذه البيانات في ال Cookies أو على الخادم وإرسال معرف بيانات الجلسة للمستخدم أيضا عبر Cookie، هذه الطريقة الشائعة الاستخدام في تطبيقات الخادم - عميل، بينما JWT مناسبة أكثر للتوثيق بين عدة خدمات مع بعضها، أو في التطبيقات ذات البنية متعددة الخوادم.
  17. يمكنك التحقق من حالة ال WIFI في حال كان يعمل أم لا داخل ال BroadcastReciever وتنفيذ المطلوب أو تجاهل التنفيذ كليًا بحسب الحالة المطلوبة كالتالي: public class bbb extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int wifiStateExtra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); // يعمل WIFI if(wifiStateExtra == WifiManager.WIFI_STATE_ENABLED) { Toast.makeText(context," السلام عليكم ",1).show(); } } } لا يمكن ذلك تقريبا بشكل مباشر لانه يعتبر تسريب لمعلومات عن المستخدم واستخدامه للتطبيقات الأخرى، لكن قد يمكنك التحقق من التطبيقات التي تعمل حاليًا (أثناء تشغيل تطبيقك) كالتالي: ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); for (int i = 0; i < runningAppProcessInfo.size(); i++) { if(runningAppProcessInfo.get(i).processName.equals("com.the.app.you.are.looking.for") { // التطبيق المستهدف يعمل حاليا } } ويجب إضافة الساحية التالية: <uses-permission android:name="android.permission.GET_TASKS" /> لكن بعد نسخة Android L أصبح من غير الممكن ذلك
  18. التطوير باستخدام بروتوكول HTTPS سيحل المشكلة: أوقف الخادم المحلي إذا كان يعمل في ملف env. في جذر المشروع يجب إضافة سطر جديد القيمة التالية HTTPS=true الآن يمكنك الوصول للموقع عبر بروتوكول HTTPS، عادة عبر الرابط التالي https://localhost:3000 (بدل رقم المنفذ إذا كان مغايرًا)
  19. لديك خطأ في ذكر الملف admin/theme/css.blade.php فهو يجب أن يذكر كالتالي <?php @include('admin/theme/css') نفس الخطأ السابق إضافة إلى خطأ بذكر اسم الملف admin/theme/js.blade.php فهو يجب أن يذكر أيضا كالتالي <?php @include('admin/theme/js') الفرق هو بالبروتوكول المستخدم في الرابط الذي سينشأ: asset: تستخدم إما HTTP أو HTTPS بحسب بروتوكول الطلب الوارد secure_asset: تستخدم حصرًا HTTPS بغض النظر عن بروتوكول الطلب الوارد
  20. تأكد من تضمينك للمحمّلات المناسبة لملفات التنسيق CSS في ملف إعداد webpack، يجب أن تكون قاعدة ملفات التنسيق كالتالي: { test: /\.(s*)css$/, use: [ 'style-loader', 'css-loader', 'sass-loader' ] } تأكد من تنصيب هذه المحمّلات بحسب متطلبات نسخة webpack لديك
  21. ما هي العروض؟ العروض هي فقط ملفات PHP منفصلة، وعند استخدامك للتابع المساعد view هو فقط يقوم باستدعاء ملف العرض باستخدام require كيف نشارك متغيرات مع ملفات PHP ؟ أولا تقوم بتعريف وتعيين قيمة للمتغير قبل استدعاء الملف، ممكن أن تكون القيم معرفة يدويا أو يتم جلبها من مكان ما (في حالتك من قاعدة البيانات)، ثم تستدعي الملف حينها ستكون الشيفرة داخل الملف قادرة على الوصول للمتغيرات المعرفة سابقًا، كالتالي: <?php // controller.php $x = 5; require 'view.php'; // view.php echo '<div>'. $x .'</div>'; // $x يمكننا الوصول للمتغير كيف نمرر المتغيرات في Laravel العملية السابقة نفسها لكن بدل استدعاء ملف العرض بدلالة مساره النسبي أو المطلق، فإن الدالة view تساعدنا على ذلك بذكر مسار ملف العرض نسبة للمجلد views ومفصولة قطع مساره بنقاط، ولمشاركة متغيرات معينة مع ملف العرض هذا نمررها كمعامل ثان للدالة view (على شكل مصفوفة ارتباطات)، ليصبح المثال السابق كالتالي: <?php // controller.php $x = 5; return view('view', ['x' => $x]); // view.php echo '<div>'. $x .'</div>'; // $x يمكننا الوصول للمتغير يمكنك القراءة أكثر عن العروض في Laravel وكيفية استخدامها في المقال التالي:
  22. سنتعلم في هذا المقال كيف نقوم بضغط الملفات وإنشاءها واستخراجها من ملفات tar المضغوطة. إذا كنت أحد مستخدمي البرامج مفتوحة المصدر، فغالبًا ما صادفت ملفات من نوع tar. يعود تاريخ انشاء أداة الأرشفة مفتوحة المصدر tar إلى العام 1979، لذا فهي واسعة الانتشار في عالم POSIX. هدفها بسيط: أخذ ملف أو مجموعة من الملفات وتغليفها في ملف واحد، يدعى أرشيف أشرطة التسجيل tar archive. وقد سمي بذلك لأنه عندما تم اختراع tar كان يستخدم لتخزين البيانات على أشرطة التسجيل. من يتعرف على صيغة tar حديثا فسوف يقوم بتشبيهها بملفات zip.، لكن على عكسها فعليا ملفات tar ليست مضغوطة. صيغة tar تقوم فقط بإنشاء حاوية للملفات، لكن يمكننا ضغط الملفات باستخدام أدوات أخرى. طرق الضغط الشائعة التي تطبق على ملف tar. هي Gzip وbzip2، وxz. هذا هو سبب ندرة مصادفتك لملف بصيغة tar. فقط وعادة ما تصادف الملفات بالصيغ الشائعة tar.gz. أو tgz. تثبيت الأمر tar سيكون الأمر tar على لينكس و BSD و إيلوموس و وحتى ماك مثبتًا لديك مسبقًا. على ويندوز أسهل طريقة للتعامل مع الملفات من النوع tar. هي عبر تنصيب الأداة ‎7-Zip المفتوحة المصدر برخصة LGPL. اسم الأداة يوحي أنها أداة للتعامل مع الصيغة zip، لكن يمكنها التعامل أيضا مع ملفات الأرشيف من النوع tar، وتوفر أيضا واجهة أوامر لموجه الأوامر cmd. إذا كنت تريد أداة للتعامل مع tar فقط على ويندوز، فيمكنك تثبيت جنو tar عبر WSL على ويندوز 10 وما فوق عبر Cygwin. إنشاء ملف أرشيف tarball ملفات الأرشيف من النوع tar عادة ما يشار إليها بالاسم tarball، وذلك فقط اختصارًا لاسمها باللغة الإنجليزية، حيث كلمة tarball أقصر من كتابة tar archive، والتي تعني أرشيف tar. إنشاء ملف tar باستخدام واجهة المستخدم المرئية GUI، يحتاج لثلاث خطوات على الأكثر. سنستخدم في مثالنا هذا KDE، العملية ستكون مشابهة على كل من جنوم و XFCE: أنشئ مجلدًا. ضع ملفاتك في ذلك المجلد. اضغط بالزر الأيمن للفأرة على المجلد واختر "ضغط". العملية مشابهة أيضًا في الصَدفَة، لجمع عدة ملفات في ملف أرشيف واحد، ضع ملفاتك في مجلد ثم نفذ الأمر tar، ومرر له اسم ملف الأرشيف الذي تريد إنشاءه ثم المجلد الذي تريد أرشفته: $ tar --create --verbose --file archive.tar myfiles تتميز الأداة tar عن باقي الأوامر عادةً أنها لا تحتاج لوجود إشارة السالب (-) قبل اختصارات الخيارات الممررة لها، مما يتيح للمستخدم اختصار عدة أوامر مقعدة كالتالي: $ tar cvf archive.tar myfiles يمكنك أيضا عدم وضع الملفات في مجلد قبل أرشفتها، لكنها تُعَد عادةً سيئة، لأنه لا أحد تقريبًا يرغب أن يجد خمسين ملفًا فجأة مبعثرين على سطح المكتب لديه بعد فك ضغط ذلك الأرشيف. هذا النوع من ملفات الأرشيف يدعى عادة قنبلة tar أو tarbomb -شبهوا الأمر بعملية رمي قنبلة- وليس ذلك دائما بمعنى سلبي. قنابل tar مفيدة لعمليات الترقيع patching وأدوات تنصيب البرامج؛ فالأمر يعتمد على معرفتك متى تستطيع استخدام تلك الطريقة من عدمه. ضغط ملف الأرشيف عند إنشاء ملف tar فلن تكون الملفات داخله مضغوطة، فهو فقط سيجعل تلك الملفات كتلة واحدة يكون من السهل نقلها معًا. يمكننا لضغط ذلك الملف استدعاء Gzip أو bzip: $ tar --create --bzip2 --file foo.tar.bz2 myfiles $ tar --create --gzip --file foo.tar.gz myfiles من أشيع اللواحق لملفات الأرشيف tar المضغوطة عبر Gzip هي tar.gz. و tgz.، و للملفات المضغوطة عبر bzip هي tar.bz2. و tbz.. استخراج الملفات من الأرشيف إذا كان قد وصل إليك ملف tar من صديقك أو من مشروع برمجي ما، يمكنك استخراج محتوياته إما عبر الواجهة المرئية أو من خلال الصدفة. في الواجهة المرئية قم بالضغط بالزر الأيمن للفأرة على ملف الأرشيف واختر "استخراج". مدير ملفات دولفين Dolphin يوفر ميزة التعرف التلقائي على الملفات المستخرجة من الأرشيف اذا كانت محتواة في مجلد أو يجب إنشاء مجلد حاوي لها. تفيد هذه الميزة في تفادي مشكلة قنابل tar، حيث سينشئ مجلدًا جديدًا سيحوي بداخله كل الملفات المستخرجة. عبر الصدفة، أمر استخراج الملفات من ملف الأرشيف بديهي للغاية: $ tar --extract --file archive.tar.gz يمكنك اختصار الخيارات للأمر السابق كالتالي: $ tar xf archive.tar.gz يمكنك أيضا استخدام أداة tar لفك ضغط ملفات zip.: $ tar --extract --file archive.zip أوامر tar متقدمة أدوات tar قوية وعملية جدًا فحالما تعتاد على المبادئ الأساسية لها، ستبني عليها لاكتشاف مزايا أخرى. إضافة ملف أو مجلد إلى ملف tar في حال كنت تملك ملف tar وتريد إضافة ملف جديد داخله، يمكنك فعل ذلك دون الحاجة لاستخراج محتوياته ثم إعادة أرشفتها فقط لإضافة الملف الجديد. معظم أنظمة سطح مكتب لينكس و BSD تأتي مع واجهة مرئية للتعامل مع ملفات الأرشيف، يمكنك استخدامها والتعامل مع ملف الأرشيف وكأنه مجلد عادي آخر، يمكنك رؤية محتوياته، استخراج ملفات معينة منه، إضافة ملفات جديدة إليه، وحتى استعراض الملفات النصية والصور داخله. أداة الأرشفة آرك Ark عبر الصدفة، يمكنك إضافة ملف أو مجلد إلى ملف أرشيف tar طالما أنه غير مضغوط بعد، إذا كان ملف الأرشيف مضغوطًا يجب عليك أولًا فك ضغطه فقط وليس استخراج ملفات الأرشيف داخله. على سبيل المثال، إذا كان ملف الأرشيف مضغوطًا بواسطة Gzip: $ gunzip archive.tar.gz $ ls archive.tar الآن بعدما أصبح لديك ملف tar غير مضغوط، يمكنك إضافة الملف أو المجلد الجديد إليه: $ tar --append --file archive.tar foo.txt $ tar --append --file archive.tar bar/ اختصارًا يمكن تنفيذ الأمر السابق كالتالي: $ tar rf archive.tar foo.txt $ tar rf archive.tar bar/ مشاهدة قائمة بالملفات داخل ملف tar لمشاهدة الملفات داخل ملف أرشيف، سواء كان مضغوطًا أم لا، يمكنك استخدام الخيار list--: $ tar --list --file archive.tar.gz myfiles/ myfiles/one myfiles/two myfiles/three bar/ bar/four foo.txt النسخة المختصرة تكون كالتالي $ tar tf archive.tar.gz استخراج ملف واحد أو عدة ملفات أو مجلدات من أرشيف tar أحيانًا لا تريد استخراج كل الملفات من الأرشيف، وفقط تريد استخراج ملف واحد أو بضعة ملفات منه. بعد عرضك لمحتويات ملف أرشيف tar، استخدم الأمر tar لفك الضغط كالمعتاد ولكن مع إضافة مسار الملف الذي تريد استخراجه بمفرده: $ tar xvf archive.tar.gz bar/four bar/four الآن تم استخراج الملف "four" إلى مجلد جديد يدعى "bar". إذا كان المجلد "bar" موجود مسبقًا، فسيتم وضع الملف "four" داخله. ولاستخراج عدة ملفات أو مجلدات سننفذ نفس الأمر السابق تقريبًا: $ tar xvf archive.tar.gz myfiles/one bar/four myfiles/one bar/four يمكنك أيضا استخدام المحارف البديلة wildcards: $ tar xvf archive.tar.gz --wildcards '*.txt' foo.txt استخراج الملفات من ملف tar إلى مجلد ذكرنا سابقًا أن بعض ملفات tar هي قنابل tar تترك خلفها بعد استخراج محتوياتها الكثير من الملفات المبعثرة. إذا نظرت لمحتويات ملف tar ولاحظت أن الملفات داخله غير محتواة داخل مجلد، يمكنك تحديد مجلد الوجهة ليتم استخراجها مباشرة إليه: $ tar --list --file archive.tar.gz foo bar baz $ mkdir newfiles $ tar xvf archive.tar.gz -C newfiles الأمر السابق يستخرج محتويات الملف "archive.tar.gs" إلى المجلد الجديد newfiles بشكل مرتب. خيار مجلد الوجهة له فوائد أخرى غير ترتيب الملفات المستخرجة في مجلد واحد، مثلًا لتوزيع الملفات لنسخها في بنية مجلدات موجودة مسبقًا. إذا كنت تعمل على تطوير موقع إلكتروني وتريد إرسال ملفات جديدة لصاحب الموقع، يمكنك القيام بذلك بعدة طرق. الطريقة البديهية هي إرفاق تلك الملفات داخل بريد إلكتروني وإرسالها له مع شرح عن مكان نسخ كل من تلك الملفات: "ملف index.php المرفق يجب وضعه داخل المجلد /var/www/example.com/store، والملف vouchers.php يجب وضعه داخل /var/www/example.com/deals... ". الطريقة الأجدى لتنفيذ ذلك تكون بإنشاء أرشيف tar لهذه الملفات: $ tar cvf updates-20170621.tar.bz2 var var/www/example.com/store/index.php var/www/example.com/deals/voucher.php var/www/example.com/images/banner.jpg var/www/example.com/images/badge.jpg var/www/example.com/images/llama-eating-apple-pie.gif متضمنة بنية المجلدات والملفات داخلها، الآن ليس على صاحب الموقع سوى استخراج الملفات من ملف الأرشيف مباشرة داخل مجلد الجذر على خادمه. أداة tar تتحقق من تواجد المجلد var/www/example.com/ وكذلك المجلدات داخله store و deals و images، وتقوم بتوزيع الملفات في مجلداتها المناسبة. يمكن اعتبار هذه الطريقة نسخ ولصق لكن بسرعة وبسهولة. الفرق بين نسخة tar من جنو ومن BSD تنسيق tar هو مجرد تنسيق، وهو مفتوح المصدر، لهذا السبب يمكن لعدة أدوات أن تقوم بإنشائه. هناك أداتي tar شائعتين: أداة جنو tar، والتي تأتي مثبتة افتراضيًا على بعض أنظمة لينكس، وأداة tar التابعة لأنظمة BSD، والمثبتة بشكل افتراضي على BSD، ماك، وبعض أنظمة لينكس الأخرى. للاستخدام العام، كلا الإصدارين سيكون كافيًا. كل الأمثلة المذكورة في هذا المقال ستعمل على كلا الإصدارين. لكن هناك اختلافات بسيطة بينهما. حالما تعتاد على واحدة منهما يمكنك تجربة الأخرى, غالبًا ستحتاج لتثبيت الإصدار "الآخر" من الأمر tar يدويًا. لتفادي الخلط بين الأداتين، أداة جنو tar تسمى gtar وأداة BSD tar تسمى bsdtar، على أن يكون الأمر tar هو وصلة رمزية أو اسم بديل لأحد تلك الأداتين المثبتة مسبقا على جهازك. ترجمة -وبتصرف- للمقال How to unzip a tar.gz file لصاحبه Seth Kenlon. اقرأ أيضًا احترف الأمر ls في لينكس ما الفروق بين الأوامر grep وegrep fgrep مدخل إلى الأمر ss في لينكس كيف تستخدِم أمرَي find و locate للبحث عن الملفّات على Linux النسخة الكاملة من كتاب أنظمة التشغيل للمبرمجين
  23. يمكنك الوصول للحل بالتفكير بطريقة الحل بالشكل التالي: هناك تكرار، طباعة سطر خمسة مرات عند كل سطر هناك تكرار آخر، طباعة عدد معين من النجوم عدد النجوم متزايد، أو متعلق برقم السطر التي هي فيه صيغة حلقة for تكون كالتالي: for(var i = 0/* العدد الابتدائي */; i < 10 /* شرط نهاية الحلقة*/; i++ /* الخطوة الواحدة */){ // التعليمات التي ستنفذ كل مرة } يمكنك القراءة عن حلقة for أكثر في المقالات التالية:
  24. يمتلك الأمر ls في لينكس العديد من الخيارات الرائعة التي ستعطيك معلومات مهمة عن ملفاتك. الأمر ls يقوم بعرض قائمة بالملفات على أنظمة POSIX وهو أمر سهل وبسيط، عادة ما يقلل من شأنه لأن مهمته بسيطة (فهو فعليًا يفعل مهمة واحدة فقط)، ولكن يمكنك تعديل استخدامك له لتحصل على الكثير منه. من بين أهم أوامر لينكس التي يجب أن تعرفها، يحتل الأمر ls المرتبة الثالثة ربما بينها، لأن الأمر ls ليس فقط يعرض قائمة بالملفات، بل أيضا يعرض لك معلومات مهمة عنها. مثل من يملك الملف أو المجلد، متى تم تعديل الملف آخر مرة، وحتى نوع الملف، وهو أمر مهم يبيّن لك أين تقف الآن وما الملفات والأغراض المتاحة في المسار الحالي وماذا يمكنك أن تفعل بهم. إذا كانت خبرتك مع الأمر ls مقتصرة على الاسم البديل لهذا الأمر التي يأتي جاهزًا مع توزيعتك في ملف bashrc.، فربما فاتك الكثير. جنو أو BSD؟ قبل أن نلقي نظرةً على خفايا الأمر ls، يجب أن تحدد أي إصدار من ls لديك. أشهر إصدارين هما إصدار جنو، الذي يأتي ضمن حزمة coreutils ضمن جنو، وإصدار BSD. إذا كنت تعمل على لينكس، فعلى الأغلب الأمر ls مثبت لديك أما إذا كنت تعمل على BSD أو نظام ماك، فأنت تملك نسخة إصدار BSD فهناك فروقات، سنغطيها في هذا المقال. يمكنك معرفة النسخة التي لديك باستخدام الخيار version--: $ ls --version إذا كان الخرج يحتوي على معلومات عن حزمة coreutils الخاصة بجنو، فلديك الإصدار الخاص بجنو، أما إذا ظهر لك خطأ فأنت تملك نسخة BSD (يمكنك تنفيذ الأمر man ls | head للتأكد). يجب عليك التحقق أيضا من الإعدادات المسبقة التي قد تأتي مع توزيعتك. التخصيصات في الأوامر عادة تكون موجودة داخل الملف HOME/.bashrc$ أو HOME/.bash_aliases$ أو داخل HOME/.profile$، وعادة تكون موجودة لإعطاء اسم بديل للأمر ls يتضمن خصائص أكثر تعقيدًا، مثال: alias ls='ls --color' التخصيصات التي تأتي مع التوزيعة مفيدة، ولكن تجعل من الصعب التمييز بين عمل الأمر ls بمفرده وما تقدمه الخيارات الإضافية من مزايا. إذا كنت تريد تنفيذ الأمر ls بمفرده وتجاهل أي تسمية بديلة يمكنك استخدام محرف الهروب الخط المائل العكسي (\) قبل الأمر: $ \ls التصنيف عند تنفيذ الأمر ls بمفرده سيعرض قائمة بالملفات موزعة على أعمدة بقدر العرض المتوفر على الطرفية لديك: $ ls ~/example bunko jdk-10.0.2 chapterize otf2ttf.ff despacer overtar.sh estimate.sh pandoc-2.7.1 fop-2.3 safe_yaml games tt المعلومات التي ستظهر مفيدة، لكن بدون رموز تفيد التمييز بين أنواع الملفات (مجلد - ملف نصي - صورة - الخ…) فلن تفيدنا كثيرًا. يمكنك استخدام الخيار F- (أو classify-- في نسخة جنو) لعرض رمز بعد كل اسم ملف لتمييز نوعه: $ ls ~/example -F bunko jdk-10.0.2/ chapterize* otf2ttf.ff* despacer* overtar.sh* estimate.sh pandoc@ fop-2.3/ pandoc-2.7.1/ games/ tt* الرموز بعد أسماء الملفات تدل على نوع الملف، وتحمل الدلالات التالية: خط مائل عكسي (/) يدل على نوع المجلد. محرف النجمة (*) يدل أن الملف تنفيذي. يتضمن ذلك الملفات الثنائية (الشيفرة المصرّفة) وكذلك النصوص البرمجية (الملفات النصية التي تملك صلاحية التنفيذ). المحرف (@) يدل على وصلة رمزية (أو اسم بديل). محرف المساواة (=) يدل على مقبس. على BSD، محرف إشارة النسبة المئوية (%) يدل على أن الملف مشار إليه كمحذوف whiteout (وهي طريقة لحذف الملفات على بعض الأنظمة). على جنو، محرف إشارة الأصغر (<) يدل على باب (طريقة للتواصل بين الإجرائيات على ايلوموس و سولاريس) محرف الخط العمودي (|) يدل على FIFO. نسخة أبسط من هذا الخيار هي p-، وهي تبيّن فقط الفرق بين الملفات والمجلدات. عرض قائمة تفاصيل طويلة نحتاج في كثير من الأحيان إلى عرض تفاصيل أكثر عن الملفات من خرج الأمر ls، لذا العديد من التوزيعات تُعِّين اسمًا بديلا على شكل ll تكون قيمته ls -l. تعرض القائمة الطويلة العديد من الخصائص المهمة لنا مثل الصلاحيات، المستخدم مالك الملف، المجموعة التي ينتمي إليها الملف، حجم الملف بالبايت، وتاريخ آخر تعديل على الملف: $ ls -l -rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh -rwxrwxr-x. 1 seth users 662 Apr 29 22:27 factorial -rwxrwx---. 1 seth users 20697793 Jun 29 2018 fop-2.3-bin.tar.gz -rwxrwxr-x. 1 seth users 6210 May 22 10:22 geteltorito -rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh [...] إذا كانت وحدة البايت مربكة لك، أضف الخيار h- (أو الخيار human-- على جنو) ليتم ترجمة الحجوم الى صيغة مقروءة بشكل أفضل: $ ls --human -rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh -rwxrwxr-x. 1 seth seth 662 Apr 29 22:27 factorial -rwxrwx---. 1 seth users 20M Jun 29 2018 fop-2.3-bin.tar.gz -rwxrwxr-x. 1 seth seth 6.1K May 22 10:22 geteltorito -rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh يمكنك تخفيف المعلومات الظاهرة عبر إظهار فقط عمود مالك الملف باستخدام الخيار o- أو فقط عمود المجموعة المالكة للملف عبر الخيار g-: $ ls -o -rwxrwx---. 1 seth 455 Mar 2 2017 estimate.sh -rwxrwxr-x. 1 seth 662 Apr 29 22:27 factorial -rwxrwx---. 1 seth 20M Jun 29 2018 fop-2.3-bin.tar.gz -rwxrwxr-x. 1 seth 6.1K May 22 10:22 geteltorito -rwxrwx---. 1 seth 177 Nov 12 2018 html4mutt.sh يمكنك دمج الخيارين لإخفاء كلا العمودين. صيغة الوقت والتاريخ صيغة قائمة التفاصيل الطويلة للأمر ls تكون عادةً على الشكل التالي: -rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh -rwxrwxr-x. 1 seth users 662 Apr 29 22:27 factorial -rwxrwx---. 1 seth users 20697793 Jun 29 2018 fop-2.3-bin.tar.gz -rwxrwxr-x. 1 seth users 6210 May 22 10:22 geteltorito -rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh لا يمكن ترتيب أسماء الشهور بهذه الصيغة بسهولة، لا حسابيا (حسب اذا كنت تفضل أسماء الشهور أو رقم يدل على ترتيبها) ولا إدراكيًا. يمكنك تغيير صيغة عرض العلامة الزمنية عبر الخيار time-style-- إضافة إلى اسم الصيغة. الصيغ المتاحة هي: (1970-01-01 21:12:00) full-iso. long-iso (1970-01-01 21:12). iso (01-01 21:12). locale (سيتم استخدام إعداداتك المحلية). posix-STYLE (بدل كلمة STYLE بالمعرّف المحلي). يمكنك أيضا إنشاء صيغة مخصصة مماثلة للصيغ التي يدعمها الأمر date. الترتيب بحسب الوقت يرتب الأمر ls القائمة افتراضيًا حسب الترتيب الأبجدي. يمكنك تغيير الترتيب إلى الترتيب بحسب الوقت الذي تم فيه تعديل الملفات آخر مرة (الأحدث أولًا) باستخدام الخيار t-: $ touch foo bar baz $ ls bar baz foo $ touch foo $ ls -t foo bar baz نوع القائمة الخرج القياسي للأمر ls يوازن بين قابلية القراءة والتوفير في المساحة، لكن أحيانا تحتاج أن تكون قائمة الملفات بترتيب معين. ولتحديد تنسيق القائمة ليكون عناصر وبينها فاصلة، نستخدم الخيار m-: ls -m ~/example bar, baz, foo لإجبار وضع العناصر بحيث يكون كل ملف بسطر، نستخدم الخيار 1- (رقم واحد وليس حرف L صغير): $ ls -1 ~/bin/ bar baz foo لترتيب العناصر حسب اللاحقة لكل ملف وليس حسب اسم الملف، نستخدم الخيار X-: $ ls bar.xfc baz.txt foo.asc $ ls -X foo.asc baz.txt bar.xfc إخفاء الملفات من الخرج التي قد لا تحتاج لرؤيتها هناك بعض العناصر في خرج الأمر ls التي قد لا تهتم لرؤيتها، مثل المحارف الوصفية . و .. التي تدل على "المسار الحالي" و "مستوى واحد للخلف" على التوالي. اذا كان لديك معرفة بكيفية التنقل بين المجلدات داخل الطرفية، فأنت تعلم أن كل مسار يشير إلى نفسه كـ . وللمسار الأب كـ ..، لذ قد لا تحتاج لرؤية تلك الدلالات في كل مرة تستخدم بها الخيار a- لعرض الملفات المخفية. لعرض تقريبا كل الملفات المخفية (ما عدا . و ..) يمكنك استخدام A-: $ ls -a . .. .android .atom .bash_aliases [...] $ ls -A .android .atom .bash_aliases [...] هناك عُرف في العديد من أدوات يونكس أن يتم حفظ ملفات النسخ الاحتياطي باسم ملف متبوع بمحرف مميز ما. على سبيل المثال المحرّر Vim، يقوم بحفظ ملفات النسخ الاحتياطية باسم متبوع بالمحرف ~ . هذه الملفات ستنقذك في الكثير من المرات، لكن قد لا تحتاج لرؤيتها دومًا داخل قائمة الملفات، لإخفائها يمكنك استعمال الخيار B- أو igonre-backups-- وسيقوم الأمر ls بإخفاء ملفات النسخ الاحتياطي ذات اللواحق المشهورة (هذا الخيار غير متوفر في إصدار BSD للأمر ls): $ ls bar.xfc baz.txt foo.asc~ foo.asc $ ls -B bar.xfc baz.txt foo.asc ملفات النسخ الاحتياطي لازالت موجودة، فقط تم إخفائها من قائمة الملفات. جنو إيماكس GNU Emacs يحفظ ملفات نسخ احتياطي (إلا إذا تم تغيير إعدادات ذلك) عبر وضع محرف المربع # قبل وبعد اسم الملف. تطبيقات أخرى أيضا ستستخدم صيغ أخرى لأسماء الملفات تلك. لذا يمكنك تحديد نمط مخصص لاسم الملفات التي تود إخفاءها من الخرج عبر الخيار hide--: $ ls bar.xfc baz.txt #foo.asc# foo.asc $ ls --hide="#*#" bar.xfc baz.txt foo.asc عرض محتويات المجلدات لن يعرض الأمر ls محتويات المجلدات إلا إذا حددت له مجلدًا معينًا لعرض محتوياته، لذلك يمكنك استخدام الخيار R- لعرض شجرة محتويات كل المجلدات: $ ls -F example/ quux* xyz.txt $ ls -R quux xyz.txt ./example: bar.xfc baz.txt #foo.asc# foo.asc تبسيط استخدام الخيارات المكررة عبر الاسم البديل ربما يكون الأمر ls من أكثر الأوامر استخداما خلال الجلسة الواحدة. فهو كعينيك وأذنيك، يوضح لك السياق الحالي ويؤكد لك نتيجة وجود الملفات من عدمها وبينما يحتوي على الكثير من المزايا فهو سهل الاستخدام للغاية، حرفان فقط وزر Enter، وستعلم تماما أين أنت وماذا يوجد حولك، قد تعتاد على هذه البساطة وتنسى الاستفادة من خياراته المفيدة. الحل يكون بتحديد اسم بديل للأمر ls يتضمن الخيارات التي توفر لك المعلومات التي تحتاجها دومًا. لتعيين اسم بديل في جلسة باش Bash، أنشئ ملفًا في مجلد المنزل لحسابك بالاسم bash_aliases. (يجب وضع النقطة في بداية اسم الملف). في هذا الملف حدد قائمة الأوامر التي تريد تعيين اسمًا بديلا لها ثم قيمة هذا الاسم البديل. مثال: alias ls='ls -A -F -B --human --color' السطر السابق يجعل صدفة باش تترجم الأمر ls الى ls -A -F -B --human --color. ولست مقيدًا بتعيين أسماء بديلة للأوامر المتوفرة فقط. بل يمكنك إنشاء أسماء بديلة خاصة بك: alias ll='ls -l' alias la='ls -A' alias lh='ls -h' لكي تُفعّل تلك الأسماء البديلة، يجب على الصدفة أن تعلم بوجود ملف الإعدادات bash_aliases.. قم بفتح الملف bashrc. في محرر النصوص (أو قم بإنشائه، إن لم يكن موجودًا)، وضع داخله الشيفرة التالية: if [ -e $HOME/.bash_aliases ]; then source $HOME/.bash_aliases fi في كل مرة سيحمّل الملف bashrc. (أي في كل مرة سيتم فيها إنشاء جلسة صدفة جديدة)، سيقوم باش بتحميل الملف bash_aliases. إلى البيئة الحالية. يمكنك إغلاق وإعادة فتح الجلسة الحالية لتفعيل ذلك أو يمكنك إجبار تحميل الإعدادات عبر تنفيذ الأمر: $ source ~/.bashrc إذا نسيت بعد فترة ما إذا كنت قد قمت بتعيين اسم بديل لأمر ما أم لا، الأمر which سيخبرك بذلك: $ which ls alias ls='ls -A -F -B --human --color' /usr/bin/ls إذا كنت قد حددت اسما بديلا للأمر ls قيمته هو الأمر نفسه مع بضعة خيارات أخرى. وتريد تنفيذ الأمر بمفرده وتجاهل الاسم البديل المعين له يمكنك إسباق الأمر بمحرف الخط المائل العكسي (\). مثلا في الاسم البديل السابق استخدمنا الخيار B- لإخفاء ملفات النسخ الاحتياطي من الخرج، أما في حال أردت مشاهدة تلك الملفات وتجاهل الاسم البديل ينفذ الأمر كالتالي: $ ls bar baz foo $ \ls bar baz baz~ foo ختاما يحوي الأمر ls العديد من الخيارات المفيدة، العديد منها متخصصة بحالة معينة أو تعتمد على نوع الطرفية التي تستخدمها. يمكنك القراءة ومعرفة المزيد من الخيارات بتنفيذ الأمر info ls على أنظمة جنو، أو man ls على أنظمة جنو و BSD. قد تجد من الغريب على نظام شعاره الأساسي هو "قم بعمل واحد، وقم به جيدًا" أن يثقل أمرا واحدا بخمسين خيار. لكن حقيقةً أن الأمر ls يقوم بشيء واحد فقط: يظهر قائمة بالملفات. والخمسين خيار المتوفرين سيمكنوك من تحديد كيف تريد هذه القائمة، بالفعل ls يقوم بعمل واحد ويقوم به جيدًا. ترجمة -وبتصرف- للمقال Master the Linux ls command لصاحبه Seth Kenlon. اقرأ أيضًا ما الفروق بين الأوامر grep وegrep fgrep مدخل إلى الأمر ss في لينكس مقدمة إلى أمر tar في لينكس كيف تستخدِم أمرَي find و locate للبحث عن الملفّات على Linux النسخة الكاملة من كتاب أنظمة التشغيل للمبرمجين
  25. يقدم التخزين السحابي العديد من المزايا، لكن لن يغنيك ذلك عن امتلاكك لبياناتك على قرص صلب فيزيائي خاص بك. عندما تخزن بياناتك على القرص الصلب ستعلم تماما أين بياناتك، ويمكنك الوصول اليها دائما عند الحاجة. الأمر الأفضل من ذلك حتى أن تخزن بياناتك على قرص محمول، مثل ذاكرة اليو اس بي USB Drive، لست فقط على علم أين تقع بياناتك بل يمكنك حملها معك لأي مكان. إذا كنت مستخدم جديد للينكس، أو كنت تحاول التعامل مع نظام ملفات لينكس على قرص خارجي، قد تجد الأقراص الخارجية أمرا مربكًا، ستكون عرضة لأخطاء في الصلاحيات أو التضارب فيها، أو حتى خسارة البيانات الوصفية للملفات metadata، هناك إجابتين "صحيحتين" لذلك: نظام ملفات ExFAT وقوائم التحكم بالوصول ACL. نظام ملفات ExFAT رسميا، كان نظام ملفات ExFAT معرضًا لمخاطر قانونية كثيرة من قبل مايكروسوفت لأنها كانت تمتلك الشيفرة الخاصة به. قاموا بمقاضاة شركات ومنظمات عديدة من قبل دفاعًا عن ملكيتهم لنظام الملفات FAT، لذا كان الخوف مسيطرًا أنهم قد يعيدوا الكرّة مع نظام ExFAT. لكن مؤخرًا قامت مايكروسوفت بجعل معايير نظام ExFAT مفتوح المصدر. لم يوفروا برنامج تشغيل له ولكنه يوجد برنامج تشغيل حالي له على لينكس، وبعد أن توفر للمطورين إمكانية الوصول للمعايير بشكل كامل أصبح التطوير والتحسين عليها أمرًا حتميًا. محاسن نظام ExFAT أنه عابر للمنصات (ويندوز، ماك، والعديد من الأجهزة المحمولة تستخدمه)، وقد تم تصميمه دون اعتبار لنظام الصلاحيات على الملفات. حيث يمكنك توصيل محرك خارجي بتنسيق ملفات ExFAT لأي جهاز حاسوب، وكل الملفات ستكون متاحة للجميع. سيُعد هذا أمرا أيجابيًا أو سلبيًا بحسب طريقة استخدامك، لكن بالنسبة للاستعمال مع ملفات الوسائط المتعددة ذلك يعد أمرا إيجابيا جدًا. قوائم التحكم بالوصول ACL يمكنك -إن كنت تفضل- استخدام نظام ملفات لينكس على محرك الملفات المحمول، لكن لجعل مشاركة الملفات أمرا سلسًا يجب استخدام قوائم التحكم بالوصول ACL اختصارًا إلى Access control lists. عند إنشاء ملف أو مجلد على محرك ملفات، يوجد إعدادات افتراضية على نظامك ستحدد ما الصلاحيات التي سيحصل عليها هذا الملف أو المجلد. في معظم الحالات، الإعدادات الافتراضية تكون كافية ومنطقية، مثلا عند إنشائك لملف في مسار مجلد المنزل لحسابك الشخصي فعادةً أنت لا تريد إعطاء صلاحية الوصول إليه للمستخدمين الآخرين. لكن عندما تنشئ ملفًا في محرك خارجي، فأغلب الأحيان ستحتاج مشاركته مع الآخرين (حتى لو كان الشخص الآخر هو أنت لكن من جهاز حاسوب آخر). يمكنك إعادة تعريف الصلاحيات الافتراضية لمشاهدة الملفات عن طريق قائمة التحكم بالوصول، ويمكنك التحكم بوضع إنشاء الملفات عن طريق إضافة بت لاصق sticky bit. قائمة التحكم بالوصول هي طبقة من سياسات الحماية تقع في الخصائص الإضافية للمجلدات والملفات وتسمح لك بتحديد استثناءات على الصلاحيات المحددة من قبل نظام الملفات. وأكثر ما توفره هذه الطبقة، هي تجاوز نموذج المالك الوحيد والمجموعة المالكة الوحيدة لنظام صلاحيات يونكس التقليدي. على سبيل المثال، بينما حسابي بإسم حسان (بالمعرّف 1000) على جهازي المكتبي يملك مجلدًا على سطح المكتب، حساب آخر لي بإسم حسان على جهازي المحمول (بالمعرّف 500) من وجهة نظر نظام الملفات هو لا يملك نفس المجلد ولا يصل إليه، فقط لأن المعرّف لكل من الحسابين مختلف. نفس المشكلة مع نظام تملّك المجموعات، مجموعة بالمعرّف 1000 قد تملك مجلدًا على جهاز، مجموعة أخرى على جهاز آخر بمعرّف مغاير (500 أو 10922) لن تصل إلى نفس المجلد. قائمة التحكم بالوصول تستطيع حل المشكلة بإضافة مُلّاك أفراد أو مجموعات ثانويين للمجلدات والملفات. مشاهدة قائمة الوصول الحالية جميع المجلدات والملفات في أغلب أنظمة الملفات الشائعة على لينكس لديها قائمة تحكم بالوصول افتراضية وتكون مخزّنة في الخصائص الإضافية، وهي نوع من البيانات الوصفية لا تلاحظه عادةَ. يمكنك مشاهدتها عبر الطرفية بتنفيذ الأمر التالي: $ getfacl ./example # file: /run/media/drive/example # owner: hassan # group: users user::rwx group::rwx other::r-- أسطر التعليق الظاهرة هي مرجع فقط، تدل على أسم الملف وحساب المالك والمجموعة المالكة للملف الحالي الذي تستعرض معلومات عنه حاليًا. الأسطر اللاحقة لذلك تُظهر القواعد المطبقة على هذا الملف أو المجلد. في المثال السابق، صلاحيات المستخدم المالك مضبوطة للقيمة rwx، ومثلها للمجموعة المالكة rwx، وللباقي --r. هذه الصلاحيات تعكس الصلاحيات الافتراضية لقائمة التحكم بالوصول الافتراضية لنظام الملفات: $ ls -lA /run/media/drive drwxrwxr-- 26 hassan users 4096 Jan 16 21:04 example $ id uid=1000(hassan) gid=100(users) groups=100(users)... طالما أن حساب المستخدم hassan (بالمعرف 1000) أو حساب عضو في المجموعة users (بالمعرف 100) يتعاملون مع المجلد example، فلهم صلاحية وصول كاملة. أي حساب آخر سيمتلك صلاحية القراءة r فقط. تعيين قائمة التحكم بالوصول لتعديل قائمة التحكم بالوصول، يمكنك استخدام الأمر setfacl أو عبر استخدام مدير ملفات يدعم قوائم التحكم بالوصول. يمكنك التعميم أو التخصيص عندما تعيّن قائمة التحكم بالوصول. إذا كنت فقط تريد تعديل إعدادات صلاحيات نظام الملفات، يمكنك استخدام أحد الأمرين chmod أو setfacl وهي إعدادات تحكم بالوصول عامة لأنك لا تضيف صلاحيات جديدة عن تلك المتاحة ليونكس من معايير نظام الملفات. $ setfacl --modify g::r example $ getfacl ./example | grep "group::" group::r-- $ ls -l . | grep example drwxr--r-- 26 hassan users 4096 Jan 16 21:04 example العملية نفسها ممكنة عبر استعمال الأمر chmod: $ chmod g+x example $ getfacl ./example | grep "group::" group::r-x $ ls -l . | grep example drwxr-xr-- 26 seth users 4096 Jan 16 21:04 example إضافة مستخدمين ومجموعات للاستفادة من مزايا التي توفرها قوائم التحكم بالوصول يجب أن نستخدمها لإضافة صلاحيات إضافية مغايرة الصلاحيات الأصلية في يونكس. إذا سجلت الدخول على جهاز سطح المكتب من حسابي hassan ذو المعرّف 1000، وأعلم أنني أريد الوصول واستعمال مجلد مخزن على القرص المحمول من حساب hassan ذو المعرّف 500 من جهازي المحمول، لن يكون عندها كافيا أن أحدد مالك المجلد هو الحساب hassan فقط، لأن المعرّفين لكلا الحسابين ليسا متطابقين. يمكنك إضافة مستخدم أو معرّف مستخدم لقائمة تحكم بالوصول كالتالي: $ setfacl --modify u:500:rwx example $ getfacl example # file: /run/media/drive/example # owner: hassan # group: users user::rwx user:500:rwx [...] كما نلاحظ تم إضافة سطر قيد جديد خاص بالمستخدم ذو المعرّف 500 إلى قائمة التحكم بالوصول الخاصة بالمجلد. الآن أصبح من الممكن وصل مخزن الملفات المحمول الذي يحوي هذا المجلد على جهاز يونكس أو لينكس آخر وسيتم السماح للمستخدم بالمعرّف 500 بالوصول الى المجلد example. يمكنك أيضا إضافة حسابات مستخدمين آخرين عبر اسم الحساب، أو مجموعات عبر اسم المجموعة أو معرّف المجموعة. المعرّفات هي المهمة مع الصلاحيات، لكن إذا كنت في بيئة مختلطة (مثلا بيئة خوادم RHEL و العملاء البدائيين)، فيجب التحقق من معرّفات الحسابات والمجموعات التي تضيفها، فالحسابات في هذه البيئات قد تبدو متشابهة بالإسم ولكنها تختلف بمعرّفاتها. تعيين القواعد الافتراضية لقوائم التحكم بالوصول إذا تعاملت مع قوائم التحكم بالوصول على أنها إعدادات لمرة واحدة، فسريعًا ما ستواجه مشاكل عندما يبدأ المستخدمون الآخرون بإنشاء الملفات والمجلدات. أي ملف أو مجلد سيتم إنشاءه من أي مستخدم سيورث تلقائيا إعدادات الصلاحيات الافتراضية للنظام (وقائمة التحكم بالوصول). هذا يعني عندما يقوم حساب hassan على الحاسب المحمول ذي المعرّف 500 بإنشاء ملف داخل مجلد تم مشاركته معه، لن يتمكن حساب hassan الآخر ذو المعرّف 1000 على جهاز سطح المكتب من الوصول إليه، لأن مالك الملف سيتم تعيينه للحساب ذي المعرّف 500 فقط. يمكن تطبيق قائمة تحكم بالوصول افتراضية للمجلدات حيث أن أي ملف أو مجلد سيتم إنشاؤه داخل هذا المجلد سيورّث تلقائيا قائمة التحكم بالوصول للمجلد الأب. يمكنك تعيين قائمة تحكم بالوصول افتراضية لمجلد عبر تمرير الخيار default-- كالتالي: $ setfacl --default --modify u:500:rwx example $ setfacl --default --modify u:1000:rwx example $ getfacl --omit-header example user::rwx user:500:rwx group::rw- mask::rwx other::r-x default:user::rwx default:group::rw- default:group:500:rwx default:group:1000:rwx default:mask::rwx default:other::r-x الآن عندما يقوم مستخدم بإنشاء مجلد جديد داخل المجلد example، سيتم توريث قائمة التحكم بالوصول له لتكون نفسها للمجلد الأب: $ cd example $ mkdir penguins $ getfacl --omit-header penguins user::rwx group::rw- group:500:rwx group:1000:rwx mask::rwx other::r-x default:user::rwx default:group::rw- default:group:500:rwx default:group:1000:rwx default:mask::rwx default:other::r-x هذا يعني أن أي مجلد أو ملف سيرث تلقائيا نفس قائمة التحكم بالوصول، ولن يتم استثناء أي من الحسابين بالمعرّفات 500 أو 100 من الوصول للملفات أو المجلدات. قائمة تحكم بالوصول عملية لمحركات الأقراص الخارجية عند استخدام نظام ملفات لينكس على محرك أقراص خارجي، لضمان الوصول للملفات والمجلدات لكل المستخدمين الذين يتوقع استخدامهم له أسهل طريقة هي تعيين قائمة تحكم بالوصول واحدة على المجلد في أعلى مستوى. لنفرض مثلا لديك مخزن ملفات USB يدعى mydrive منسّق بنظام الملفات ext4. وتريد السماح بالوصول للملفات المخزنة فيه لكل من حساباتك على جهاز سطح المكتب والجهاز المحمول وأيضا زميلك أحمد. أولا قم بإنشاء مجلد في أعلى مستوى من في مخزن الملفات: $ mkdir /mnt/mydrive/umbrella ثم قم بتطبيق قائمة تحكم بالوصول على ذلك المجلد لضمان الوصول لكل حسابات المستخدمين الذي تريد: $ setfacl --modify \ u:500:rwx,u:1000:rwx,u:ahmad:rwx \ /mnt/mydrive/umbrella أخيرًا تقوم بتطبيق قائمة تحكم بالوصول افتراضية ليتم توريثها لكل الملفات والمجلدات المنشأة داخل الملف umbrella (الأمر التالي يستخدم اختصار خيار modify--): $ setfacl --default -m u:500:rwx,u:1000:rwx,u:ahmad:rwx \ /mnt/mydrive/umbrella تطبيق القواعد الافتراضية على نظام حالي إذا كنت تريد تطبيق قائمة تحكم بالوصول واحدة لعدة ملفات موجودة مسبقًا، يمكنك الاستعانة بالأمر find. أولا نقوم بالبحث عن المجلدات التي نريدها ثم نطبق عليها قائمة التحكم بالوصول: $ find /mnt/mydrive/umbrella -type d | \ parallel --max-args=6 setfacl \ --default -m u:500:rwx,u:1000:rwx,u:ahmad:rwx إن تطبيق صلاحية التنفيذ للملفات بشكل عشوائي أمر غير محبذ، لذا نبحث عن كل الملفات ونغير الصلاحيات لها إلى rw. الملفات التي تتطلب التنفيذ يمكن تعيين صلاحية التنفيذ لها إما بشكل يدوي أو عبر إضافة لاحقة لها: $ find /mnt/mydrive/umbrella -type f | \ parallel --max-args=6 setfacl \ --default -m u:500:rw,u:1000:rw,u:ahmad:rw يمكنك تغيير المعاملات الممررة للأوامر السابقة بحسب حاجتك (لا تقم بتنفيذ الأمر الذي يقوم بمسح صلاحية التنفيذ على المجلد user/، أو على مجلد يحتوي فقط على ملفات تنفيذية). المحركات الخارجية لا تدع الارتباك حول تحديد صلاحيات الملفات على المحركات الخارجية المشتركة يحدّك، ولا تحصر نفسك فقط في صلاحيات يونكس التقليدية. استفد من مزايا قوائم التحكم بالوصول لتتمكن من استخدام أنظمة ملفات لينكس أينما ذهبت. ترجمة -وبتصرف- للمقال Access control lists and external drives on Linux: What you need to know لصاحبه Seth Kenlon. اقرأ أيضًا التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر نصائح وحيل لاستخدام نظام CUPS للطباعة في لينكس تعديل الصور والتلاعب بها عبر سطر الأوامر في لينكس التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر [فيديو] الأذونات في نظام لينكس
×
×
  • أضف...