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

محمد أحمد العيل

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

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

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

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

    27

كل منشورات العضو محمد أحمد العيل

  1. نعم يُمكن ذلك عبر ضبط إعدادات كتلة Server. المثال التّالي يُقدّم خطوطًا عامّة لهذا الإعداد: server { listen 80; server_name www.domain1.com; root /var/www/domain1; } server { listen 80; server_name www.domain2.com; root /var/www/domain2; } توجد ملفّات الموقع www.domain1.com في المجلّد var/www/domain1/، أمّا الموقع www.domain2.com فتوجد ملفّاته في المجلّد var/www/domain2/. عند طلب الموقع www.domain.com فإنّ Nginx يختار كتلة Server الأولى لتتولّى التّعامل مع الطّلب، بالنّسبة لwww.domain2.com فإنّ الاختيّار يقع على الكتلة الثّانيّة. للمزيد راجع هذا المقال
  2. يمكِن لـِ Nginx، أحد أكثر خواديم الويب انتشارًا؛ التّعاملُ بنجاح مع عملاء عدّة يتّصلون بالتّزامن، كما يُمكنه العمل بوصفه خادوم ويب، خادوم بريد أو وسيطًا عكسيًّا Reverse proxy. سنتطرّق في هذا الدّليل إلى بعض كواليس الآليّة الّتي تحدّد كيف يتعامل Nginx مع طلبات العملاء Client requests. يُساعد فهمُ هذه الآليّة في معرفة كيف تعمل إعدادات الكتلة (Block configurations) في خادوم ويب Nginx وخصوصًا كتلتَيْ Server (الخادوم) وLocation (الموقع). كما أنّه يجعل من تعامل Nginx مع طلبات العملاء أكثر قابليّةً للتّوقّع والتخمين. إعدادات كتلة Nginxيقسّم Nginx إعداداتِ تقديم المحتوى إلى كُتل تنتظِم في بنية شجريّة Hierarchical. يبدأ Nginx عندما يتلقّى طلبًا إجراءاتِ تقرير كُتَل الإعداد الّتي يجب استخدامُها للتّعامل مع الطّلب. سنتحدّث في هذا الدّليل عن آليّة التّقرير هذه. يتحدّث الجزء الأوّل من هذا الدّليل عن كتلة Server، أمّا الثّاني فيتناول كتلة Location. تعرّف كتلة Server، وهي مجموعة فرعيّة من إعدادات Nginx، خادومًا افتراضيًّا يتعامل مع طلباتٍ من نوع محدَّد. يعرّف مدراء الخواديم عادةً كتلَ خادوم عدّة ثمّ يضبطونها للتّعامل مع الطّلبات حسب اسم النّطاق Domain name، أو المنفذ Port، أو عنوان IP الذي يأتي عبره الطّلب. تقبع كتلة Location ضمن كتلة من نوع Server (كتلة خادوم)، وتُستخدَم لتعريف الكيفيّة الّتي سيتعامل بها خادوم ويب Nginx مع الطّلبات على موارد الخادوم والمعرّفات الكليّة لهذه الموارد Universal Resource Identifier, URI. يُمكن أن تُقسَّم مساحة المعرّفات الكليّة للموارد URIs بالطّريقة الّتي يراها المدير عن طريق استخدام كتل Location، فنموذج الكتل مرن للغاية. كيف يقرّر Nginx كتلة Server الّتي ستتعامل مع الطّلب؟يحتاج Nginx، ما دام يسمح بتعريف كُتَل Server عدّة تعمل على أنّها خواديم ويب افتراضيّة متفرّقة، يحتاج لوسيلة يعرف بها كتلة Server الّتي ستتولّى تلبيّة الطّلب. يُعرّف خادوم ويب Nginx نظامَ فحص يُستخدَم للعثور على كتلة Server الأكثر مُطابقةً للطّلب. يهتم Nginx أثناء عمليّة الفحص بتعليمتَيْن Directives على مستوى كتلة الخادوم، وهما listen وserver_name. 1- تحليل تعليمة listen بحثًا عن تطابقات ممكنةينظُر Nginx أوّلًا إلى عنوان IP الطّلب ومنفَذه؛ ثمّ يبحث عن تطابق بين هاتين المعلومتيْن مع محتوى تعليمة listen في كلّ كتلة خادوم. يُنشئ Nginx إثر هذه الخطوة قائمةً بكُتل الخواديم الّتي يُمكن أن تلبّي الطّلب. تعرّف تعليمة listen عنوان IP والمنفَذ الّذيْن ستُجيب كتلة الخادوم الطّلبات الآتيّة منهما. إذا لم تتضمّن كتلة الخادوم تعليمة listen فإنّ المعطيات 0.0.0.0:80 تُمنح للتّعليمة بشكل افتراضيّ (أو 0.0.0.0:8080 إذا كان مستخدم عاديّ غير المستخدم الجذر هو من يشغّل خادوم ويب Nginx). تسمح هذه المعطيات لكتلة الخادوم بالإجابة عن طلبات عبر المنفذ 80 على كلّ الواجهات Interfaces؛ إلّا أنّ المعطيات الافتراضيّة لا تمثّل ثقلًا كبيرًا في عمليّة اختيّار الخادوم. يُمكن ضبطُ تعليمة listen: بذكر عنوان IP ومنفَذ.بذكر عنوان IP فقط؛ في هذه الحالة يُستخدم المنفذ الافتراضيّ 80.بذكر منفَذ فقط؛ في هذه الحالة تستجيب لأي طلب يأتي عبر هذا المنفذ على كلّ الواجهات.بتحديد مسار إلى مقبس يونكس Unix socket.سيقتصر تأثير الخيّار الأخير - غالبًا - على الطّلبات الّتي تمرّر بين مجموعة خواديم. يقرّر Nginx كتلة الخادوم الّتي سيُرسل إليها الطّلب اعتمادًا على خصوصيّة تعليمة listen وذلك وفقًا للقواعد التّاليّة: تُكمَّل الأجزاء غير المكتملة من تعليمة listen بالقيّم الافتراضيّة. الأمثلة التّاليّة توضّح كيف تُكمّل تعليمة listen: كتلة خادوم لا توجد بها تعليمة listen ستستعمل القيمة 0.0.0.0:80.كتلة خادوم مضبوطة على العنوان 111.111.111.111 ولا تعرّف منفذًا تستعمل القيمة 111.111.111.111:80.كتلة خادوم مضبوطة على المنفذ 8888 دون عنوان IP، تستخدم القيمة 0.0.0.0:8888.يكوّن Nginx قائمة بكتل الخواديم الّتي تُطابق الطّلب، وبالتحديد عنوان IP والمنفذ. يعني هذا أنّ أيّة كتلة تستخدم عنوان 0.0.0.0 (مطابقة كلّ الواجهات) لن تُختار إن وُجدت كتلة تستخدم عناوين IP تُطابق الطّلب. في جميع الحالات يجب أن تُطابقَ الكتلة المنفذ بالضّبط. إذا وُجدت كتلة واحدة تُطابق الطّلب، ولم توجد أخرى بنفس المستوى من المُطابقة، فستُستخدَم للإجابة على الطّلب؛ أمّا إذا وُجدت عدّة كتل مع نفس المستوى من المطابقة فإنّ Nginx يبدأ بالنّظر في قيمة تعليمة server_name بالنّسبة لكلّ كتلة خادوم. يجب الانتباه إلى أنّ Nginx لن ينظُر في قيمة تعليمة server_name إلّا إذا احتاج للتّفريق بين كتل خواديم لديها تعليمة listen بنفس المستوى من المطابقة للطّلب. على سبيل المثال؛ إذا كان example.com مُستضافًا على المنفذ 80 من 192.168.1.10 فـإنّ كتلة الخادوم الأولى فقط في المثال أدناه، هيّ من سيستجيب للطّلبات الموّجّهة إلى example.com، على الرّغم من أنّ تعليمة server_name في الكتلة الثّانيّة تحوي القيمة example.com. server { listen 192.168.1.10; . . . } server { listen 80; server_name example.com; . . . }أمّا إذا وُجِدت أكثر من كتلة خادوم تُطابق بنفس المستوى من التّحديد الطّلب؛ فإنّ الخطوة التّاليّة هي فحص محتوى تعليمة server_name. 2- تحليل تعليمة server_name للاختيّار بين التّطابقاتالخطوة المواليّة، في حال وجود كتل خواديم عدّة بنفس المستوى من التّحديد توافق الطّلب، هي تحليل تعليمة server_name. يتحقّق Nginx من ترويسة Header في الطّلب تُسمّى Host (المستضيف). تحوي ترويسة Host اسم النّطاق أو عنوان IP الّذي يُريد العميل الوصول إليه. يُحاول Nginx إيجاد كتلة الخادوم الأكثر مطابقةً لترويسة Host من بين كتل الخواديم المتبقيّة بعد تحليل تعليمة listen. يتبع Nginx الوصفة التّاليّة لإيجاد الكتلة المناسبة: يبحث خادوم الويب عن كتلة خادوم تكون قيمة تعليمة server_name مطابقةً تمامًا لترويسة Host الموجودة في الطّلب. إذا عثر على تعليمة server_name يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. إذا كانت هناك عدّة تعليمات مطابقة فإنّ أوّل كتلة خادوم هيّ الّتي ستُختار. إن لم يعثُر على مطابقة تامّة يبحث Nginx عن كتلة خادوم تبدأ قيمة تعليمة server_name فيها بحرف بَدَل Wildcard (يُشار إليه بعلامة * في بداية الاسم) بحيث توافق التّعليمة ترويسة المستضيف في الطّلب. إذا عثر على تعليمة server_name يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. أمّا إذا كانت هناك عدّة تعليمات فإنّ التّعليمة ذات التّطابق الأطول (عدد الأحرف) هيّ الّتي ستُختار. إن لم يُعثُر على مُطابقة باستخدام حرف بدل في بداية قيمة التّعليمة فإنّ Nginx يبحث عن تعليمة server_name تنتهي بحرف بدل (يُشار إليه بعلامة * في نهاية الاسم) بحيث توافق التّعليمة ترويسة المستضيف في الطّلب. إذا عثر على تعليمة server_name يتحقّق فيها الشّرط فإنّ الكتلة المرتبطة بها هي الّتي تُستخدَم. أمّا إذا كانت هناك عدّة تعليمات فإنّ التّعليمة ذات التّطابق الأطول (عدد الأحرف) هيّ الّتي ستُختار. إن لم يعثُر Nginx على مُطابقة باستخدام حرف بدل في نهاية قيمة التّعليمة فإنّه يبحث عن كتلة خادوم تعرّف تعليمة server_name عن طريق تعبير نمطيّ Regular expression (يُشار إليه بعلامة ~ قبل الاسم). يستخدِم Nginx أوّل كتلة خادوم يُوافق تعبير تعليمة server_name النّمطيّ فيها ترويسة المستضيف. إن لم يوجد تطابُق باستخدام التّعبير النّمطيّ يختار Nginx كتلة الخادوم الافتراضّية لعنوان IP والمنفَذ المستخدَم. يوجد لكلّ ثنائيّ عنوان IP/منفذ كتلة خادوم مبدئيّة Default تُستخدَم إن لم تؤدِّ الآليّة الموصوفة أعلاه للعثور على كتلة خادوم. كتلة الثّنائيّ عنوان IP/منفذ المبدئيّة هيّ الكتلة الأولى في الإعداد أو تلك الّتي تحوي خيّار default_server ضمن تعليمة listen (يغلِب مفعول خيّار default_server، إذا كان موجودًا، مفعول الكتلة الأولى). لا يُمكن أن يوجد خيّار default_server في أكثر من مرّة بالنّسبة لكلّ عنوان IP/منفذ. نشرح في الفقرة التّاليّة كلّ نقطة من آليّة العمل أعلاه. 3- أمثلةإذا وجدت تعليمة server_name تُطابق تمامًا ترويسة المستضيف فسيقع على الكتلة المرتبطة بها الاختيّار للإجابة على الطّلب. إذا كانت ترويسة Host الموجودة في الطّلب تحوي host1.example.com فإنّ الخادوم الثّاني في المثال أدناه هو الّذي سيقع عليه الاختيّار: server { listen 80; server_name *.example.com; . . . } server { listen 80; server_name host1.example.com; . . . }إن لم يوجد تطابق كامل يبحثُ Nginx عن تعليمة server_name تبدأ بحرف بَدَل ويتحقّق من توافقها مع المستضيف في الطّلب. يختار خادوم الويب أطول قيمة في server_name من بين تلك الّتي تُطابق الطّلب. في المثال التّالي يختار Nginx كتلة الخادوم الثّانيّة إذا كان العميل يطلُب المستضيف www.example.org: server { listen 80; server_name www.example.*; . . . } server { listen 80; server_name *.example.org; . . . } server { listen 80; server_name *.org; . . . }ملحوظة: كلّ من الكتلة الثّانيّة والثّالثة توافق المستضيف في الطّلب (www.example.org)؛ إلّا أنّ قيمة server_name في الكتلة الثّانيّة أطول. تُقرأ قيمة الكتلة الثّانيّة في المثال أعلاه “جميع المستضيفات الّتي تنتهي بexample.org. أمّا الكتلة الثّالثّة فتقرأ قيمة server_name “جميع المستضيفات الّتي تنتهي بorg.. يُمكن ملاحظة أنّ قيمة server_name في كتلة الخادوم الثّانيّة أكثر تحديدًا. إذا لم يجد Nginx كتلة الخادوم المناسبة في قيّم server_name الّتي تبدأ بحرف بدل، فإنّه يبحث في كتل الخادوم الّتي تنتهي قيّم server_name فيها بحرف بدل. مثل ما يحدُث في الحالة السّابقة، يختار خادوم الويب أطول قيمة في server_name من بين تلك الّتي تُطابق الطّلب. إذا كان المستضيف المحدّد في الطّلب هو www.example.com فإنّ Nginx سيختار، في المثال التّالي، كتلة الخادوم الثّالثة. server { listen 80; server_name host1.example.com; . . . } server { listen 80; server_name example.com; . . . } server { listen 80; server_name www.example.*; . . . }ملحوظة: تُقرأ قيمة server_name في كتلة الخادوم الثّالثة في المثال أعلاه “جميع المستضيفات الّتي تبدأ ب.www.example. مجدّدًا، إذا لم يعثُر Nginx على تطابق باستخدام أحرف البدل في نهاية قيمة التّعليمة فإنّه سينتقل إلى محاولة مطابقة قيمة Host في ترويسة الطّلب بقيّم server_name المعرّفة بتعابير نمطيّة ويختار أوّل كتلة خادوم تُطابق فيها قيمة server_name قيمة Host. إذا كانت قيمة Host هي www.example.com فإنّ Nginx سيختار، في المثال التّالي، كتلة الخادوم الثّالقة للإجابة على الطّلب: server { listen 80; server_name example.com; . . . } server { listen 80; server_name ~^(www|host1).*\.example\.com$; . . . } server { listen 80; server_name ~^(subdomain|set|www|host1).*\.example\.com$; . . . }ملحوظة: يُقرأ التّعبير النّمطيّ أعلاه “يبدأ اسم المستضيف بإحدى الكلمات التّاليّة set، www، host1 أو subdomain؛ قد يتبعها حرف أو عدد غير محدّد من الحروف، ثمّ نقطة ثم كلمة example ثمّ نقطة ثمّ com.“. للمزيد حول التّعابير النّمطيّة راجع درس مقدمة في التعابير النمطية Regular Expressions. إذا لم يتمكّن Nginx من العثور على أي تعليمة server_name مُطابقة لقيمة Host عبر الإجراءات السّابقة فإنّه يختار الخادوم المبدئي الموافق للثّنائي عنوان IP/المنفَذ الّذي أتى عليه الطّلب.
  3. توجد ثلاث حالات للمتغيّرات في Bash: - متغيّر غير معرَّف (لم تُعطَ له قيمة) - متغيّر معرَّف وقيمته سلسلة محارف خاويّة (طولها يُساوي صفرًا) - متغيّر معرَّف وقيمته سلسلة محارف غير خاويّة (طولها يُساوي واحدًا أو أكثر). إذا كنت لا تهتمّ بالتفريق بين ما إذا كان المتغيّر غير معرَّف وما إذا كان فارغًا يُمكن استخدام الصّيغة (الاختبار صحيح في الحالتين الأولييْن): if [ -z "$var" ]أمّا إذا كنت تهتم بالتّفريق بين الاثنين فاستخدم الاختبار التّالي لمعرفة هل المتغيّر معرَّف (الاختبار صحيح إذا كان المتغير غير معرّف): if [ -z ${var+x} ]الاختبار التّالي صحيح إذا كان المتغيّر معرّفًا وقيمته فارغة (لاحظ الفرق بين الاثنين، علامة - بدلا من +): if [ -z ${var-x} ]وبالنّسبة للحالة الأخرى (معرَّف وقيمته سلسلة محارف غير فارغة): if [ -n "$var" ]سكربت قصير لتجربة هذه الحالات الأربع على التّوالي: #!/bin/bash VAR="VARIABLE" echo "$VAR" if [ -z "${VAR}" ]; then echo "VAR is unset or set to the empty string" fi if [ -z "${VAR+set}" ]; then echo "VAR is unset" fi if [ -z "${VAR-set}" ]; then echo "VAR is set to the empty string" fi if [ -n "$VAR" ]; then echo "VAR is set to a non emty string" fi جرّب قيّمًا عدّة للمتغيّر VAR (أعطه قيمة فارغة مرة، واحذفه مرة وأعطه قيمة غير فارغة مرة).
  4. على العموم ليست لدى العمليّة Process بحدّ ذاتها صلاحيّات ولكنّها تعمل بصلاحيّات المستخدم الّذي يُشغّلها. إذا أرادت العمليّة قراءة أو تغيير ملفّ فإنّ نظام التّشغيل ينظُر في صلاحيّات المستخدِم الّذي نفّذ العمليّة ثمّ يقرّر هل يسمح لها بذلك أم لا. تشغيل العمليّات بصلاحيّات وصول عاليّة يعني تشغيلها بمستخدم لديه صلاحيّات عاليّة (المستخدم الجذر Root مثلا). بالنسبة للأخطار فهي كثيرة، ويكفي أن أذكر بعض الأمثلة: - افترض أنّه في أحد البرامج توجد ثغرة تحذف الملفّات الّتي يُتاح له الوصول إليها (في عالم البرمجة لا يوجد برنامج خال من الثّغرات 100%، هذه من المسلّمات): إذا كان يعمل بصلاحيّات غير محدودة فستُحذَف جميع ملفّاتك. - استخدم أحدهم ثغرة للوصول إلى خادوم الويب، إذا كان خادوم الويب يعمل بصلاحيّات عاليّة فسيُمكن للمتسلّل الدّخول إلى كامل النّظام بدلا من حصر الخسائر في خادوم الويب.
  5. توجد خيّارات عدّة للتّعامل مع سجلّ الأوامر في الطّرفيّة: - لتجاهل أمر واحد وعدم حفظه في سجلّ الأوامر يُمكن أن تضبُط ملفّ bashrc. بحيث لا يحفظ الأوامر الّتي تبدأ بمسافة: nano ~/.bashrc export HISTCONTROL='ignoreboth:erasedups' ثمّ الخروج من الطّرفيّة وفتحها من جديد لاعتماد التّغييرات. كلّ ما عليك فعله لكي لا يُحفظ الأمر في سجلّ الأوامر هو إضافة مسافة أمامه. - لتجاهل أوامر جلسة Session كاملة، نفّذ الأمر التّالي في الطّرفيّة: export HISTSIZE=0 - لتجاهل أوامر معيّنة يُمكن تنفيذ الأمر التّالي ليسري مفعوله على الجلسة الحاليّة فقط أو إضافته إلى ملفّ bashrc. وإعادة تشغيل الطّرفيّة ليكون المفعول دائمًا: export HISTIGNORE="ls:passwd: " في المثال لن تُحفظ أوامر ls وpasswd في سجلّ الأوامر.
  6. ما تريده يتطلّب البحث عن المجلّدات الفارغة، ولا أفضل من find لهذه المهمّة: find -depth -type d -empty -exec rmdir {} \; يبحث الأمر عن المجلّدات (type d-) الفارغة (empty-) ثمّ يحذفها (أمر rmdir يُستخدم لحذف المجلّدات الخاويّة فقط). هناك خيّار مهمّ آخر في الأمر أعلاه وهو خيّار depth-: يطلب هذا الخيّار معالجة محتوى المجلّد أوّلًا قبل التّعامل مع المجلّد نفسه؛ يعني هذا أنّه إذا كان لديك مجلّد Folder1 به مجلّدان فرعيّان Folder1A وFolder1B فإنّ أمر find سيُعالج محتوى Folder1A وFolder1B أوّلًا، أيّ ف حالتنا يحذف المجلّد إذا كان خاويًّا. لو لم نستخدم depth- لظهرت رسائل خطأ نظرًا أنّ rmdir لا يحذف سوى المجلّدات الفارغة (لا يوجد بها ملفّ أو مجلّدات فرعيّة).
  7. عرضنا في الجزء الأول من هذا الدّليل بعض المفاهيم الأساسيّة في مجال الشّبكات. نستكمل الحديث في هذا المقال بالتطرّق إلى ماهيّة الواجهات في الشّبكة والبروتوكولات المستخدَمة لربط الشّبكات. الواجهاتالواجهات هي نقاط الاتّصال بالنّسبة لحاسوبك. تُربَط كلّ واجهة بجهاز طرفيّ ملموس أو افتراضيّ. توجد عادةً واجهة شبكة قابلة للإعداد لكلّ بطاقة Ethernet أو بطاقة شبكة لا سلكيّة على الخادوم. تُعرَّف واجهة شبكة افتراضيّة تُسمّى loopback (الاسترجاع) أو localhost (المستضيف المحلّي) لكلّ بطاقة شبكة. تُستخدَم هذه الواجهة لتوصيل العمليّات أو التّطبيقات العاملة على نفس الجهاز في ما بينها. تظهر هذه الواجهة في العديد من الأدوات باسم lo. يُعدّ مدراء الشّبكات في الغالب واجهة لخدمة البيانات القادمة من شبكة الإنترنت وأخرى للشّبكة المحليّة أو الخاصّة. على سبيل المثال، يضبُط مزّودو الخدمات السّحابيّة Cloud services الخواديم الخاصّة الافتراضيّة Virtual private server, VPS للعمل بواجهتيْ شبكة (إضافة إلى الواجهة المحليّة lo): الأولى باسم eth0 مضبوطة لمعالجة البيانات القادمة من الإنترنت، والثّانيّة eth1 للاتّصال بالشّبكة الخاصّة بمزوّد الخدمة. البروتوكولاتيعمل ربط الشّبكات عن طريق تركيب مجموعة من البروتوكولات فوق بعضها. بهذه الطّريقة يُمكن إرسال قطعة بيانات باستخدام بروتوكولات مختلفة يغلّف كلٌّ منها الآخر. سنعرض لبعض البروتوكولات شائعة الاستخدام مع محاولة شرح الفروق في ما بينها إضافةً إلى السّيّاق والمستوى الّذي تتدخّل فيه. نبدأ بالبروتوكولات الّتي تعمل في الطّبقات الدّنيا من الشّبكة ونصعد إلى البروتوكولات الأكثر تجريدًا (الطّبقات العليا). 1- التّحكّم في الوصول إلى الوسائط Media Access Control, MACيُستخدَم لتمييز الأجهزة الطّرفيّة. يُفترَض أن يكون لدى كلّ جهاز طرفيّ عنوان وحيد يُمنَح له عند تصنيعه؛ يُسمَّى عنوان MAC، ويُمكّن من تعريفه ضمن الشّبكة. تسمح عنونة العتاد عن طريق عناوين MAC بالإشارة إلى الجهاز الطّرفيّ بقيمة وحيدة لا تتغيّر حتّى ولو استخدمت البرامج اسمًا آخر لتعريف الجهاز أثناء عملها. يعمل بروتوكول التّحكّم في الوصول إلى الوسائط ضمن طبقة الوصلة، وربّما يكون البروتوكول الوحيد من هذا المستوى الّذي ستجد الفرصة للتّعامل معه دوريًّا. 2- بروتوكول الإنترنت Internet protocol, IPوهو أحد البروتوكولات الأساسيّة الّتي تعمل عليها شبكة الإنترنت. يعمل بروتوكول الإنترنت مع عناوين IP، وهي فريدة في كلّ شبكة، ممّا يسمح للأجهزة بالتّواصل في ما بينها عبر الشّبكة. يُنفَّذ ابروتكول الإنترنت على مستوى طبقة التّوصيل ضمن نموذج TCP/IP. يجب عند ربط الشّبكات في ما بينها، توجيه البيانات عند عبورها حدود الشّبكة. يفترض ابروتكول الإنترنت أنّ الشّبكة غير موثوقة؛ ووجود مسارات متعدّدة يُمكن التّغيير ديناميكيًّا بينها للوصول إلى الوجهة. يُنفَّذ ابرتوكول IP عمليًّا بصيّغ عديدة أشهرها اليوم هو الإصدار الرّابع من البروتوكول IPv4، إلاّ أنّ الإصدار السّادس IPv6 يزداد شعبيةً يومًا بعد يوم نظرًا للشّح المتزايد في عناوين الإصدار الرابع المتوفّرة، والتّحسينات المُضافة إلى إمكانيّات البروتوكول. 3- بروتوكول رسائل التّحكّم في الإنترنت Internet control message protocol, ICMPيُستخدَم لإرسال رسائل بين الأجهزة الطّرفيّة للإشعار بحالتها من حيث التّوفّر ووجود أخطاء وطبيعتها. تُستخدَم حزم ICMP في أدوات تشخيص الشّبكة مثل traceroute وping. تُرسَل حزم ICMP عادةً عند ما تواجه حزمة من نوعيّة أخرى مشكلة أثناء النّقل، أيّ أنّ حزم ICMP هي في الواقع آليّة للتّعليق على الاتّصالات عبر الشّبكة. 4- بروتوكول التّحكّم في الإرسال Transmission control protocol, TCPيُؤسّس بروتوكول TCP لاتّصالات موثوقة ويعمل في طبقة النّقل من نموذج TCP/IP. يغلّف بروتوكول TCP البياناتِ ضمن حزم ثمّ يرسلها إلى المستقبِل على الطّرف الآخر من الاتّصال عبر الوسائل المتوفّرة في الطّبقات الأدنى. يتأكّد ابروتوكول TCP في الطّرف المستقبل من عدم وجود أخطاء أثناء النّقل وقد يُعيد طلب بعض الحزم ثمّ يُجمّع البيانات في رسالة واحدة لإرسالها إلى طبقة التّطبيق. يُنشئ بروتوكول TCP، قبل البدء بنقل البيانات، اتّصالًا عبر آليّة تُعرَف بالمصافحة الثّلاثية Three-way handshake. تمكّن هذه الآلية طرفيْ الاتّصال من الإقرار باستلام الطّلبات والاتّفاق على طريقة لضمان موثوقيّة البيانات. بعد اكتمال نقل البيانات يُنهى الاتّصال عبر آليّة مشابهة تُدعَى المصافحة الرّباعيّة. تعتمد الكثير من استخدامات الإنترنت على بروتوكول TCP. نذكر منها الويب WWW، نقل الملفّات عبر FTP، والبريد الإلكتروني. يُمكن القول دون كثير من المجازفة أنّ الإنترنت الّتي نعرفها اليوم لم تكن لتوجد لولا ابروتوكول TCP. 5- بروتوكول مخطَّط بيانات المستخدِم User datagram protocol, UDPيعمل مثل TCP في طبقة النّقل. الفرق الأساسيّ بين الاثنين أنّ UDP ،على العكس من TCP، لا يضمن موثوقيّة النّقل؛ فلا يتأكّد من استلام الطّرف الآخر في الاتّصال للبيانات. قد يبدو من الوهلة الأولى ألّا فائدة من بروتوكول UDP، فهو لا يوفّر آليّة لضمان الموثوقيّة؛ إلّا أنّه مهمّ جدًّا لتأديّة بعض الوظائف. بروتوكول UDP أسرع بكثير من TCP، فهو لا يحتاج للانتظار للتّأكّد من استلام حزمة البيانات، وإعادة إرسالها في حال عدم الاستلام. كما أنّه لا يؤسّس لاتّصال مع وِجهة البيانات بل يكتفي بإلقائها إليه ولا يهتمّ هل يقبلها أم لا. تُفيد سهولة المعاملة الّتي يعرّفها UDP في التّواصل غير المعقَّد مثل طلب موارد على الشّبكة. لا يحتفظ ابروتوكول بمعلومات عن حالة الاتّصال ممّا يجعل منه خيّارًا مناسبًا لإرسال البيانات من جهاز واحد إلى عملاء عديدين في الوقت الحقيقي Real time clients. تجعل هذه الميزات من UDP الخيّار الأمثل لبرامج VoIP (الصّوت عبر ابروتوكول الإنترنت، Voice over IP)، الألعاب، والتّطبيقات الأخرى الّتي لا تحتمل الانتظار. 6- بروتوكول نقل النّصوص التّشعبيّة Hypertext transfer protocol, HTTPيعرَّف هذا البروتوكول على مستوى طبقة التّطبيق، ويكوّن الأساس للتّواصل عبر الويب. يعرّف HTTP دوالّ مختلفة لإخبار النّظام البعيد مالّذي يطلُبه المستخدِم. نذكر منها على سبيل المثال POST، GET و DELETE الّتي تتعامل كلّها مع البيانات المطلوبة ولكنّ بطُرق مختلفة. 7- بروتوكول نقل الملفّات File transfer protocolيعمل على مستوى طبقة التّطبيق، ويوفّر طريقة لنقل ملفّات كاملة من مستضيف إلى آخر. يجب الانتباه إلى أنّ بروتوكول FTP غير آمن ويجب ألّا يُستخدَم في أي شبكة معروضة للعموم إلّا إذا كان على خادوم لا يقبل سوى تنزيل الملفّات. 8- نظام أسماء النّطاقات Domain name system, DNSيُنفَّذ على مستوى طبقة التّطبيق من أجل تعريف آليّة توفّر تسميّات يسهُل تذكّرها للموارد على شبكة الإنترنت. تعطي هذه الآليّة إمكانيّة ربط اسم نطاق بعنوان IP وتسمح بتصفّح موقع عبر إدخال اسمه في المتصفّح. للمزيد راجع مقال مقدّمة إلى مُصطَلحات وعناصر ومفاهيم نظام أسماء النطاقات 9- بروتوكول الصّدفة الآمنة Secure Shell, SSHيعمل بروتوكول SSH على مستوى طبقة التّطبيق ويُستخدَم للتّواصل مع خادوم بعيد بطريقة آمنة تُعمّي Encrypt البيانات. تعتمد تقنيّات عديدة على SSH نظرًا لتوفّره على التّعميّة من طرف إلى طرف End-to-end وشيوع استخدامه. توجد الكثير من البروتوكولات الأخرى المهمّة الّتي لم تُذكَر في هذا الدّرس؛ إلّا أنّ المذكور منها هنا يُعطي نظرة عامّة حول أهم التّقنيّات الّتي تجعل من الإنترنت واقعًا وتسمح للأجهزة بالتّواصل في ما بينها. خاتمةيجب أن تُدرك بانتهاء هذا الدّليل بعض المفهيم الأساسيّة لعمل الشّبكات ممّا يمنحك القدرة على فهم كيف تتواصل مختلف عناصر الشّبكات في ما بينها؛ الأمر الّذي يُساعدك على فهم مقالات أخرى عن الموضوع أو مستندات التّوثيق الموجودة في النّظام. ترجمة بتصرّف لمقال An Introduction to Networking Terminology, Interfaces, and Protocols.
  8. الأحوط هو أن تتّبع الخطوات التّالية: - اعرض قائمة بالمستخدمين: select user,host from mysql.user; - اعرض امتيّازات مستخدم معيّن: show grants for 'user'@'host'; - قبل تغيير امتيّازات مستخدم، ألغِ الامتيّازات الموجودة: revoke all privileges on *.* from 'user'@'host'; - امنح الامتيّازات المطلوبة للمستخدم (مثال: SELECT, INSERT, UPDATE و DELETE): grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'user'@'host'; - اعتمد التّعديلات: flush privileges;
  9. باستخدام أداة yum على النّحو التّالي: yum list installed bind إذا لم يكُن البرنامج مثبَّتًا فستحصل على خطأ: Error: No matching Packages to list
  10. استخدم أمر find: find path_to_source -mtime +365 -exec mv "{}" path_to_destination \; حيث path_to_source مسار المجلّد الّذي توجد به السّجلّات Logs، و path_to_destination مسار المجلّد الّي تُريد نقلها إليه. mtime- تعني أنّ البحث سيكون عن الملفّات حسب تاريخ التّعديل، 365+ تعني أنّ تاريخ التّعديل يجب أن يكون سنة أو أكثر. للمزيد حول استخدام find راجع هذا الدّرس.
  11. اسم المالك يوجد في العمود الثّالث. ​أضيف على ما قاله الأخ عمّار أنّك إذا كنت تريد عرض اسم المالك فقط (لاستخدامه في سكربت مثلا) فيمكن استخدام الأمر التّالي: ls filename.txt -la | cut -d " " -f3
  12. يُعدّ إعداد وربط الشّبكات من الأمور المهمّة لكلّ من يريد إدارة الخواديم. ليس إعداد الشّبكات فقط أساسيًّا لتوفير خدمات على الويب ولكنّه يمنح أيضًا إدراكًا يُساعد في تشخيص المشاكل. يقدّم هذا الدّليل، المكوَّن من جزأيْن، نظرة عامّة على المصطلحات الأكثر شيوعًا في مجال ربط الشّبكات Networking؛ إذ سيتطرّق إلى المفاهيم القاعديّة، والبروتوكولات الأكثر انتشارًا؛ إضافةً إلى مسؤوليّات الطّبقات Layers الموجودة في الشّبكة وخصائصها. رغم أنّ هذا الدّليل مستقلّ عن نظام التّشغيل المُستخدَم، إلّا أنّه سيكون مفيدًا جدًّا عند إضافة خدمات وميزات تستخدم الشّبكة على خادومك. مصطلحات الشّبكاتيجب، قبل الدّخول في عمق الموضوع، تعريفُ بعض المصطلحات الشّائعة الّتي ستقرأها في هذا الدّليل أو أيّ دليل آخر أو توثيق يتعلّق بربط الشّبكات. اتّصال Connection: يُحيل الاتّصال، ضمن مجال الشّبكات، إلى أجزاء مترابطة من المعلومات تُنقَل عبر الشّبكة. يُستنتج من ذلك أنّ الاتّصال عمومًا يُنشَأ قبل الشّروع في نقل البيانات (باتّباع إجراءات مُعرَّفة في ابروتوكول)، ثمّ يُفكَّك - أي الاتّصال - بعد الانتهاء من نقل البيانات. حزمة Packet: وهي الوحدة الصّغرى المنقولة عبر الشّبكة. تغلّف الحزمُ قطعَ البيانات لنقلها من طرف إلى آخر أثناء التّواصل عبر الشّبكة. لدى الحزمة ترويسة Header تحوي معلومات عن الحزمة؛ منها: المصدَر والوِجهة، الختم الزّمنيّ Timestamp، القفزات Hops (أجزاء المسار بين المصدَر والوِجهة)،… إلخ. بينما يحوي الجزء الأكبر من الحزمة البيانات الفعلية المنقولة، ويُسمَّى أحيانًا بالمتن Body أو الحمولة Payload. واجهة شبكة Network interface: يُمكن أن تُحيل واجهة شبكة إلى أيّ نوع من الرّبط بين البرمجيّات Software والعتاد Hardware. على سبيل المثال، إذا كانت لدى الخادوم بطاقتا شبكة، فيُمكن التّحكّم في كلّ واحدة منهما وإعدادها بشكل مستقلّ عن طريق إعداد الواجهة المرتبطة بها.يُمكن أن تكون واجهة الشّبكة مرتبطة بجهاز طرفيّ Device ملموس، أو أن تكون تمثيلًا لواجهة افتراضيّة. الجهاز الطّرفي loopback (يُستخدم للتّخاطب بين البرامج الموجودة على نفس الجهاز) مثال على الواجهات الافتراضيّة. شبكة منطقة محليّة Local area network,LAN: يُطلَق عليها أحيانًا الشّبكة المحليّة. تُشير إلى شبكة - أو جزء من شبكة - لا يُتاح لعموم المستخدمين عبر الإنترنت الوصول إليها. الشّبكة الموجودة في المنزل أو المكتب مثال على الشّبكات المحليّة. شبكة واسعة Wide area network, WAN: وتعني شبكة أكثر اتّساعًا بكثير من شبكة محليّة. يُستخدَم مصطلح الشّبكة الواسعة أحيانًا للدّلالة على شبكة الإنترنت ككلّ، رغم أنّه يُشير في الأصل إلى الشّبكات الواسعة والمتفرّقة عمومًا. إذا وُصِفت واجهة بأنّها متّصلة بشبكة واسعة (WAN) فالمقصود - عادةً - هو أنّها متّصلة بالإنترنت. ابروتوكول Protocol: البروتوكول هو مجموعة من القواعد والمعايير Standards الّتي تعرّف لغةً يُمكن للأجهزة الطّرفيّة استخدامُها للتّخاطب. تُستخدَم ابروتوكولات عديدة في ربط الشّبكات، وتُنفَّذ عادةً على هيئة طبقات مختلفة.أمثلة على ابروتوكولات المستويات الدّنيا: IP، UDP ، TCP وICMP. الأمثلة التّاليّة هي لتطبيقات مبنيّة على طبقات من البروتكولات الأدنى مستوى: HTTP (للوصول إلى صفحات الويب)، TLS/SSL، SSH وFTP. منفذ Port: المنفذ هو عنوان ضمن الجهاز يُمكن ربطه ببرنامج محدّد. المنفذ ليس واجهة ملموسة أو موقِعًا، بل هو طريقة تجعل من الجهاز (الخادوم) قادرًا على التّواصل باستخدام أكثر من تطبيق. جدار ناريّ Firewall: الجدار النّاريّ هو برنامج يُقرّر السّماح لحركة البيانات - القادمة إلى الخادوم أو الخارجة منه - بالمرور أو يمنعها من ذلك. يعمل الجدار النّاري اعتمادًا على قواعد تحدّد نوعيّة البيانات المقبولة والمنافذ المسموح للبيانات بالمرور عبرها. تحظر الجدران النّارية عادةً منافذ الخادوم غير المستخدمة من طرف أيّ تطبيق. ترجمة عناوين الشّبكة Network address translation, NAT: وهي طريقة لإرسال الطّلبات القادمة إلى خادوم توجيه Routing إلى الأجهزة الطّرفيّة المُناسبة أو إلى الخواديم داخل الشّبكة المحليّة الّتي لديها معلومات عن وِجهة الطّلبات. تُستخدم ترجمة عناوين الشّبكة في الشّبكات المحليّة لتوجيه طلبات قادمة على نفس عنوان IP إلى الخواديم الخلفيّة المناسبة. الشّبكات الخاصّة الافتراضيّة Virtual private network, VPN: الشّبكات الخاصّة الافتراضيّة هي طريقة لتوصيل شبكات محليّة مختلفة عبر الإنترنت، مع الحفاظ على الخصوصيّة. تُستخدم هذه الطّريقة لتوصيل أنظمة متباعدة كما لو كانت في نفس الشّبكة المحليّة، لأسباب أمنيّة غالبًا. يجب أن تكون لديك الآن نبذة عن المفاهيم الأساسيّة في مجال ربط الشّبكات. توجد مصطلحات أخرى عديدة، يُمكن أن تُصادفك، لم تُذكَر في اللّائحة أعلاه. سنشرح مصطلحات أخرى في هذا الدّليل فورَ احتيّاجنا إليها. طبقات الشّبكةتُقدّم الشّبكات غالبًا وفق بنيتها الأفقيّة، بين المستضيفات Hosts؛ إلّا أنّ تنفيذ الشّبكة يتمّ وفقا لطبقات على مستوى حاسوب أو حواسيب عدّة. يعني عملُ الشّبكات على طبقات وجودَ تقنيّات متعدّدة تُبنى كلّ واحدة منها فوق الأخرى من أجل أن يعمل التّواصل بطريقة سلِسة. تُجرِّد Abstract كلُّ طبقة البياناتِ الخامّ القادمة من الطّبقة الأدنى، تجرّدها أكثر وتجعل من التّعامل معها أسهل بالنّسبة للتّطبيقات والمستخدمين. يُساعد تنظيم الشّبكة على طبقات في تسهيل استخدام الطّبقات الدّنيا بطرُق جديدة دون بذل الجهد في تطوير ابروتوكولات وتطبيقات تتعامل مع صيّغ البيانات الموجودة في هذه الطّبقات. تختلف طريقة وصف تخطيط طبقات الشّبكة كثيرًا حسب النموذج Model المستخدَم. لا يتغيّر المسار الّذي تأخذه البيانات في الشّبكة رغم اختلاف النّماذج. تبدأ البيانات رحلَتها، عند إرسالها من الجهاز، من قمّة كومة Stack الطّبقات متّجهة إلى الطّبقات الدّنيا. يحدُث نقل البيانات بين الأجهزة فعليًّا في المستوى الأدنى. تُعيد البيانات بعد النّقل رحلتها عبر طبقات الجهاز المستقبِل ولكن في الاتّجاه المعاكس: من الطبقة الدّنيا إلى القمّة. تُضيف كلّ طبقة غلافًا على حزمة البيانات عندما تصل إليها من الطّبقة الأعلى منها، وهو ما يُساعد الطّبقات المواليّة لها في معرفة ما يتوجّب عليها فعلُه بالبيانات. عند الاستقبال تنزع الطّبقة على الجهاز المستقبِل غلاف الطّبقة المكافئة لها على الجهاز المُرسِل. 1- نموذج OSIنموذج OSI (اختصار ل Open Systems Interconnect: شبكة وصل الأنظمة المفتوحة) هو أحد الطُّرُق الأولى لوصف الطّبقات المختلفة في الشّبكة. يُعرّف نموذج OSI سبعَ طبقات هي: التّطبيق Application: وهي الطّبقة الّتي يتفاعل معها المستخدمون وتطبيقات المستخدمين. يكثُر استخدام مصطلحات مثل توفّر الموارد Availability of resources، شركاء للتّخاطب معهم، مزامنة البيانات Data synchronization لوصف الاتّصال على هذا المستوى. التّقديم Presentation: طبقة التّقديم هي المسؤولة عن تعيين الموارد وتعريف السّيّاق Context. تُستخدم لترجمة بيانات المستويات الأدنى إلى صيغة يُمكن للتّطبيقات التّعامل معها. الجلسة Session: وهي مُداوِل Handler الاتّصال: تُنشئ، تُحافظ على، وتنهي الاتّصال بين المُتخاطبَيْن بطريقة مستمرّة. النّقل Transport: مسؤوليّتها إحالة اتّصال موثوق للطّبقات الموجودة فوقها (التّطبيق، التّقديم، والجلسة). تعني موثوقيّةُ الاتّصال في هذا الإطار القدرةَ على التّحقّق من وصول كلّ جزء من البيانات سليمًا إلى الطّرف الآخر من الاتّصال. يُمكن لهذه الطّبقة إعادة إرسال البيانات المفقودة أو المشوَّهة كما أنّ بإمكانها إبلاغ الأجهزة البعيدة بتسلّم البيانات القادمة منها. الشّبكة Network: تُستخدَم هذه الطّبقة لتوجيه البيانات بين مختلف العُقَد Nodes الموجودة في الشّبكة. تسخدم طبقة الشّبكة عنواين لمعرفة الجهاز الّذي ستُرسَل إليه البيانات. يُمكن لهذه الطّبقة أيضًا تقسيمُ الرّسائل ذات الحجم الكبير إلى قطع أصغر تُجمَّع على الطّرف الآخر من الاتّصال - بعد استلامه لها - لإنشاء الرّسالة الأصليّة. وصلة البيانات Data link: تُنفَّذ هذه الطّبقة بحيث تُنشئ وتُحافظ على وصلات موثوقة بين مختلف العُقد والأجهزة الموجودة في الشّبكة باستخدام اتّصالات ملموسة. الاتّصال الملموس Physical: وهي الطّبقة المسؤولة عن معالجة الأجهزة الطّرفية الفعليّة المُستخدَمة للاتّصال. تستدعِي هذه الطّبقةُ البرنامجَ الّذي يُدير الاتّصالات الملموسة والعتاد (مثل Ethernet). توجد إذن العديد من الطّبقات الّتي يُمكن الحديث عنها انطلاقًا من قربها من العتاد والوظيفة الّتي تقدّمها. 2- نموذج TCP/IPيشيع استخدام تعبير حزمة ابروتوكلات الإنترنت Internet protocol suite للحديث عن هذا النّموذج الأسهل والأكثر تبنيًّا. يُعرِّف نموذجُ TCP/IP أربع طبقات، يتداخل بعضٌ منها مع طبقات نموذج OSI: التّطبيق: وهي الطّبقة المسؤولة - في هذا النّموذج - عن إنشاء وإرسال بيانات المستخدِم بين التّطبيقات. يُمكن أن توجد التّطبيقات على أنظمة متباعدة، ويجب أن تظهر وكأنّها تعمل محلّيًّا لدى المستخدِم.يوصف الاتّصال بأنّه يحدُث بين النّظراء Peers. النّقل: وهي الطّبقة المسؤولة عن الاتّصال بين العمليّات Processes. يستخدِم هذا المستوى من الشّبكة المنافذَ لعنونة مختلف الخدمات. يُمكن لطبقة النّقل إنشاء اتّصالات موثوقة أو غير موثوقة حسب نوعيّة البروتوكول المستخدَم. التّوصيل Internet: مسؤوليّتها نقل البيانات من عقدة على الشّبكة إلى أخرى. تعرف هذه الطّبقة طرفيْ الاتّصال ولكنّها لا تهتمّ بالاتّصال الفعليّ المُستخدَم للانتقال من طرف إلى آخر. تُعرَّف عناوين IP على هذا المستوى بوصفها طريقة للوصول إلى الأنظمة البعيدة. الوصلة Link: تُنفّذ طبقة الوصلة مخطَّط الشّبكة المحليّة الّذي يسمح لطبقة التّوصيل بتقديم واجهة بعناوين. تنشئ هذه الطّبقة الاتّصالات بين العقد المتجاورة بهدف إرسال البيانات بينها نموذج TCP/IP أكثر تجريدًا وسلاسة من سابقه؛ ممّا جعله أكثر سهولةً للتّنفيذ وبالتّالي الطريقة الأكثر انتشارًا لتقسيم الطّبقات في الشّبكات.
  13. يُمكن استخدام أمر find لهذا الغرض. على افتراض أنّك موجود في الملفّ حيثُ توجد الملفّات، نفّذ الأمر التّالي: find . -type f ! -iname "*.mp3" -deleteتُشير النّقطة (.) إلى أنّ البحث يجري في المجلّد الحالي. خيّار type f- يحدّد نوعيّة الملفّات الّتي نُريد حذفها (ملفّات عاديّة وليست ومجلّدات). علامة ! تُشير إلى نفي المعيار الموجود بعدها، وهو أنّ اسم الملفّ ينتهي بmp3. وdelete- تحدّد الإجراء المطبّق على نتيجة البحث. يُقرأ الأمر "ابحث عن الملفّات الموجودة في المجلّد الحالي والمجلّدات المتفرّعة منه الّتي لا تنتهي أسماؤها بmp3 واحذفها".
  14. الأمر الأوّل يُضيف امتيّاز تنفيذ الملفّ لمالكه فقط. الأمر الثّاني لا يحدّد مَن يُعطى هذا الامتيّاز، في هذه الحالة يُصبِح بإمكان الجميع تنفيذه. الأمر الأخير مكافئ ل: chmod a+x fileتعني a الجميع (All) أيّ المالِك، المجموعة والآخرون. للمزيد درس مقدّمة إلى أذونات لينكس Linux Permissions
  15. يوجد أمر diff، تُمكن مقارنة مجلدين عبر الأمر التّالي: diff -r folder1 folder2 حيث folder1 وfolder2 مسارا المجلّدين.
  16. تُشير التّعليمة الأولى من سكربت Shell إلى المفسّر الطلوب استخدامه لتنفيذ الأوامر الموجودة في السكربت. توجد عدّة مفسّرات Shell، ومن بينها Bash وSh وأخرى. Bash هو في الواقع تطوير لSh، ويجب أن يعمل أيّ برنامج Sh على Bash دون مشاكل. في بعض توزيعات لينوكس /bin/sh هو وصلة لمفسّر آخر. للتأكّد من Shell الذي يُحيل إليه bin/sh/ نفّذ الأمر التّالي: ls -l /bin/sh في أوبنتو النّتيجة هي :lrwxrwxrwx 1 root root 4 Jul 18 2014 /bin/sh -> dashيعني هذا أنّك عند وضع bin/sh/!# في بداية السّكربت على أوبنتو فإنه يستخدم Shell يُسمّى Dash لتنفيذه.
  17. ينصبّ الاهتمام عند إعداد بنية تحتيّة Infrastructure - عادةً - على جعل التّطبيقات تعمل بالطّريقة المرجوّة. ما لا ينتبه له الكثيرون أنّ التّركيز على عمل التّطبيقات دون الاهتمام الكافيّ بالاحتيّاجات الأمنيّة للبنية التحتيّة يُمكن أن تنتُج عنه نتائج كارثيّة في حال حدوث عمليّات اختراق. سنشرح في هذا الدّليل بعض التّصرّفات الأمنيّة الأساسيّة الّتي ينبغي تنفيذها قبل إعداد تطبيقاتك أو أثناءه. مفاتيح SSH تُستخدَم مفاتيح SSH بديلًا عن الاستيثاق المعتمد على كلمات السّرّ Password-based authentication للاتّصال بخادوم SSH؛ وهي عبارة عن زوج من المفاتيح، علنيّ Public وسريّ Private، تُنشأ قبل الاستيثاق. يحتفظ المستخدم بالمفتاح السّرّي ولا يُشاركه مع أيّ كان، في حين يُمكن مشاركة المفتاح العلنيّ. يجب وضع المفتاح العلنيّ للمستخدِم ضمن مجلَّد خاصّ على الخادوم حتى يُمكنَ استخدامُ الاستيثاق عن طريق مفاتيح SSH. يطلُب الخادوم، عند محاولة المستخدِم الاتّصال به، دليلًا على أنّ العميل Client يمتلك المفتاح السّري الموافق للمفتاح العلنيّ الموجود على الخادوم. يستخدم عميل SSH طريقة تُثبت للخادوم امتلاكه للمفتاح السّرّي للمستخدِم؛ فيسمح الخادوم للمستخدِم بالولوج دون كلمة سرّ. 1- كيف تحسّن مفاتيح SSH من الأمان؟ تُعمّى Encryption تمامًا كلّ إجراءات الاستيثاق، بما فيها الاستيثاق عن طريق كلمة السّر، عند استخدام SSH. في المقابل، يُمكن لسيّئي النّيّات - عند السّماح بالاستيثاق عن طريق كلمات السّرّ - محاولة الولوج إلى الخادوم مرارًا وتكرارًا عبر تخمين كلمة السّرّ. تمنح القدرات الحاليّة للحواسيب المهاجمين على تشغيل محاولات الاختراق آليًّا إلى أن يُعثَر على كلمة السّرّ الصّحيحة. يسمح إعداد استيثاق يعتمد على مفاتيح SSH بتعطيل الاستيثاق عن طريق كلمات السّرّ؛ إذ تحوي مفاتيح SSH عمومًا محارف أكثر بكثير من أيّ كلمة سرّ وهو ما يعني وجود إمكانيّات أكثر يجب على المُهاجم تجربتها. تعدّ الكثير من خوارزميّات غير قابلة للكسر، لسبب بسيط هو أنّ العتاد المتوفّر حاليًّا سيستغرق عقودًا أو أكثر للمرور بجميع الاحتمالات الممكنة. 2- ما مدى صعوبة إعداد الاستيثاق اعتمادًا على مفاتيح SSH؟ ضبط مفاتيح SSH سهلٌ جدًّا، كما أنّها الطّريقة الّتي يُنصَح بها للولوج عن بعد إلى خواديم لينكس ويونكس. يُمكن في ظرف دقائق إنشاء زوج من مفاتيح SSH على جهازك الشّخصيّ ثمّ نقل المفتاح العلنيّ إلى الخواديم. إذا كنت تشعر أنّك تحتاج للاستيثاق بالاعتماد على كلمات السّر فمن الجيّد استخدام حلول مثل fail2ban على خادومك للحدّ من إمكانيّة تخمين كلمة السّرّ. الجدران النّاريّة Firewalls الجدار النّاري عبارة عن برنامج (أو عتاد) يتحكّم في الخِدْمات المعروضة عبر الشّبكة. يعني هذا حظر أو تقييد الوصول إلى أي منفَذ Port لا يدخل ضمن المنافذ المتاحة للعموم. توجد بعض الخدمات الّتي تُشغَّل افتراضيًّا في الكثير من الخواديم. يُمكن تقسيم هذه الخِدْمات إلى المجموعات التّاليّة: الخِدْمات العموميّة الّتي يُمكن لأيّ كان الوصول إليها عبر الإنترنت، غالبًا بصفةِ مجهول. خادوم الويب مثال جيّد على هذه المجموعة، إذ يسمح عادةً للجميع بالوصول إلى موقع الويب. الخِدْمات الخاصّة الّتي لا يُمكن الوصول إليها لغير مجموعة حسابات مُرخَّص لها أو من أماكن محدَّدة . لوحة التّحكّم في قاعدة البيانات مثال على هذه المجموعة من الخِدْمات. الخِدْمات الدّاخليّة الّتي يمكِن الوصول إليها فقط من الخادوم نفسِه؛ دون أن تُعرَض للعالم الخارجيّ. قاعدة بيانات لا تقبل سوى الاتّصالات المحليّة (من الخادوم) مثال على هذه المجموعة. تتأكد الجدران النّاريّة من أنّ الوصول إلى برنامجك مقيّد وفقًا للمجموعات أعلاه. تُترك الخِدمات العموميّة مفتوحةً ومتاحةً للجميع بينما يُحصَر الوصول إلى الخِدْمات الخاصّة اعتمادا على معايير محدَّدة. بالنّسبة للخِدمات الدّاخليّة فيُمكن جعلُها غير مرئيّة تمامًا من خارج الخادوم. تمنع أغلب إعدادات الجدران النّاريّة تمامًا الوصولَ إلى المنافذ غير المستعملة. 1- كيف تحسّن الجدران النّاريّة من الأمان؟ الجدران النّاريّة جزء أساسيّ من إعداد أيّ خادوم. يُشكّل الجدار النّاري طبقة حماية إضافيّة، حتى ولو كانت البرامج الّتي تستخدمها تطبّق تدابير أمنيّة أو تقتصِر على الواجهات الّتي تريد لهذه البرامج العمل عليها. يمنع جدار ناريّ مضبوط بطريقة صحيحة الوصول إلى جميع الخِدمات ما عدا تلك الّتي تحتاج إلى أن تبقى مفتوحة. يقلّل عرض مجموعة برامج قليلة من الجوانب الّتي يُمكن إتيان الخادوم منها ممّا يعني قابليّةً أقلّ للتّعرّض للثّغرات الأمنيّة. 2- ما مدى صعوبة إعداد الجدران النّاريّة؟ توجد جدران ناريّة كثيرة على أنظمة لينكس، تختلف في صعوبة التّعامل معها. بصفة عامّة، يجب ألّا تتجاوز مدّة ضبط الجدار النّاري بضع دقائق؛ كما أنّه عمليّة تُجرى عند الإعداد الابتدائيّ للخادوم أو عند تغيير الخِدمات المتاحة عبر الخادوم. جدار UFW خيّار سهل. توجد أيضًا خيّارات أخرى مثل استخدام iptables أو جدار CSF النّاريّ. الشّبكات الخاصّة الافتراضيّة VPN والتّشبيك الخاصّ Private Networking الشّبكات الخاصّة هي شبكات متاحة لبعض الخواديم أو المستخدمين فقط؛ أمّا الشّبكات الخاصّة الافتراضيّة Virtual private network (أو VPN) فهي طريقة لإنشاء اتّصالات آمنة بين جهازيْن متباعديْن بحيث يظهر الاتّصال كما لو أنّه في شبكة خاصّة محليّة. تُتيح الشّبكات الخاصّة الافتراضيّة طريقة لإعداد خِدمات موجودة على خواديم متباعدة بحيثُ تظهر وكأنّها في شبكة خاصّة كما أنّها تؤمّن الاتّصالات بين خواديم متباعدة. 1- كيف تحسّن الشّبكات الخاصّة من الأمان؟ يُنصح دائمًا بتفضيل الشّبكات الخاصّة بدلًا من العموميّة في الاتّصالات الدّاخليّة كل ما كان ذلك ممكنًا. مع ذلك يجب تطيق تدابير أمنيّة إضافيّة لتأمين الاتّصالات بين الخواديم والحؤول دون وصول مستخدمي الشّبكة الدّاخليّة غير المرخَّص لهم إلى خواديمك. يُعدّ استخدام شبكات خاصّة افتراضيّة طريقة ذات فعاليّة لوضع شبكة خاصّة لا تُمكن لغير رؤيتها خواديمك؛ ستكون الاتّصالات خاصّة ومؤمّنة تمامًا. يُمكن ضبطُ بقيّة التّطبيقات لتمرير بياناتها عبر الواجهات الافتراضيّة الّتي يعرضها برنامج الشّبكات الخاصّة الافتراضيّة. لا تُعرض في هذا الإعداد عبر شبكة الإنترنت سوى سوى الخدمات الموجهة للعملاء العموميين. 2- ما مدى صعوبة إعداد الشّبكات الخاصّة الافتراضيّة؟ من السّهل استخدام الشّبكات الخاصّة في مراكز البيانات Data centers الّتي لديها هذه القدرة، إذ يقتصر الأمر على تفعيل واجهات الشّبكة أثناء إنشاء الخادوم وإعداد التّطبيقات والجدار النّاريّ لاستخدام الشّبكة الخاصّة. انتبه إلى أنّ الشّبكات الخاصّة الّتي تمتدّ عبر مركز البيانات تشترك في نفس الشّبكة مع بقيّة الخواديم. بالنّسبة للشّبكات الخاصّة الافتراضيّة فإنّ الإعداد الابتدائيّ أكثر تعقيدًا؛ إلّا أنّ الرّفع من مستوى الأمان يُعوّض الجهد في أغلب الحالات. يتطلّب إعداد شبكات خاصّة افتراضيّة تثبيت وضبط إعداد الأمان المشتركة على كلّ خادوم؛ ثمّ بعد إطلاق وتشغيل الشّبكة الخاصّة الافتراضيّة، إعداد التّطبيقات لاستخدامها. البنية التّحتيّة للمفاتيح العلنيّة PKI والتّعميّة بواسطة SSL/TLS تُحيل البنية التّحتيّة للمفاتيح العلنيّة Public key infrastructure (أو PKI) إلى نظام مُصمّم لإنشاء، إدارة والتحقق من شهادات Certificates تحديد الهويّة وتعميّة الاتّصال. يُمكن استخدام شهادات SSL أو TLS لتوثيق عناصر من النّظام لدى أخرى. يمكن - بعد الاستيثاق - استخدام الشّهادات لتعميّة الاتّصال. 1- كيف تحسّن البنية التّحتيّة للمفاتيح العلنيّة من الأمان؟ يُمكّن التّأسيس لسلطة شهادات Certificate authority وإدارتها ضمن خواديمك كلَّ عنصُر داخل بنيتك التّحتيّة من التّحقّق من هويّة بقيّة العناصر وتعميّة البيانات المتلادلة معها. يُمكن أن تمنع هذه الآليّة هجمات من نوع “رجل في الوسط” Man-in-the-middle الّتي يحاكي فيها المهاجم أحد الخواديم ضمن بنيتك التّحتيّة بهدف التقاط حركة البيانات. يُمكن ضبط كلّ خادوم ليثق في سلطة شهادات مركزيّة بحيث تُصبح أي شهادة تُوقّع عليها السّلطة المركزيّة موثوقة. إذا كانت التّطبيقات والبروتوكولات الّتي تستخدمها للاتّصال تدعم التّعمية بواسطة TLS/SSL، فإنّ هذه طريقة لتعميّة النّظام دون إغراق الاتّصال عن طريق شبكة خاصّة افتراضيّة (يدخل SSL غالبًا في آليّة عمل الشّبكات الخاصّة الافتراضيّة). 2- ما مدى صعوبة إعداد بنية التّحتيّة للمفاتيح العلنيّة؟ قد يحتاج إعداد سلطة شهادات وتثبيت بقيّة البنية التّحتيّة للمفاتيح العلنيّة في البداية لكثير من المجهود. علاوةً على ذلك فإنّ إدارة الشّهادات قد تزيد عبئًا إضافيًّا عند الحاجة لإنشاء شهادات جديدة، توقيعها أو إبطالها. لن يُشكّل تنفيذ بنية تحتيّة متكاملة للمفاتيح العلنيّة إضافةً محسوسة للكثير من المستخدمين إلّا عند زيادة احتيّاجاتهم. ربّما يكون تأمين الاتّصال بين عناصر البنية التّحتيّة عبر شبكات خاصّة افتراضيّة إجراءً مناسبًا إلى أن يصلوا إلى المرحلة الّتي تُصبح فيها بنية المفاتيح العلنيّة تعوّض الجهد الإضافيّ المبذول لإدارتها. فحص الخدمات Service auditing تطرّقنا حتى الآن لتقنيّات يُمكن اللّجوء إليها للرّفع من مستوى الأمان. يقبع جزء مهمّ من الأمان في تحليل الأنظمة المستخدَمة، فهم الجوانب الّتي يُمكن أن تُؤتَى منها، وقفل العناصر حسب إمكاناتك. يُشير فحص الخدمات إلى العمليّة الّتي تكتشف عن طريقها الخدمات العاملة في البنية التّحتيّة. يُضبط - غالبًا - نظام التّشغيل ليبدأ تشغيل خدمات معيّنة عند الإقلاع Boot. قد تجرّ البرامج الإضافيّة اعتماديّات Dependencies تُشغَّل هي الأخرى آليًّا عند الإقلاع. يسمح فحص الخدمات بمعرفة الخدمات العاملة على النّظام، المنافذ المستخدمة للاتّصالات، والبروتوكولات المقبولة. تُساعد هذه المعلومات في ضبط إعدادات الجدار النّاريّ. 1- كيف يُحسّن فحص الخدمات من الأمان؟ تُشغّل الخواديم عمليّات Processes عديدة لأداء أعمال داخليّة في الخادوم أو للتّعامل مع عملاء خارجيّين. يُمثّل كلّ واحد من هذه العناصر وسيلةً محتملة قد يستغلّها مستخدمون ذوو نيّات خبيثة لمهاجمة الخادوم؛ فكلّ ما زادت الخدمات الّتي تشغّلها زاد احتمال وجود ثغرات في البرامج الّتي تستخدمها. يُمكن أن تبدأ تحليل الخدمات الموجودة على جهازك فور حصولك على فكرة جيّدة عنها. في ما يلي بعض الأسئلة الّتي يجب أن تطرحها لكلّ واحدة من هذه الخِدمات: هل أحتاج لهذه الخدمة؟ هل تعمل الخدمة على واجهات لا تحتاج إليها؟ هل يحب تحديدها بعنوان IP واحد؟ هل قواعد الجدار النّاريّ معدّة بطريقة تسمح للبيانات المرخَّص لها بالمرور إلى الخدمة؟ هل يمنع الجدار النّاريّ الوصول غير المرخَّص إلى الخدمة؟ هل لديك وسيلة تحصُل بها على إشعارات عن الثّغرات المُكتشفة في البرنامج؟ يجب أن يكون فحص الخدمة تدبيرًا قيّاسيًّا عند إعداد أي خادوم جديد. 2- ما مدى صعوبة إعداد فحص الخدمات؟ الفحص الأساسيّ للخدمة سهلٌ جدًّا، إذ يعرض أمر netstat الخدمات الّتي تُنصِت لحركة البيانات عبر منافذ كلّ واجهة. في ما يلي مثال يعرض اسم البرنامج، معرّف العمليّة PID والعناوين المستخدَمة لحركة البيانات وفقًا لبروتوكول نقل البيانات (TCP أو UDP): sudo netstat -plunt ستكون المُخرجات مقاربة للتّاليّة: Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 887/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 919/nginx tcp6 0 0 :::22 :::* LISTEN 887/sshd tcp6 0 0 :::80 :::* LISTEN 919/nginx الأعمدة الأساسيّة الّتي يجب عليك الانتباه إليها هي Porto (المنفذ) ، Local Address (العنوان المحلّي)، ومعرّف العمليّة/البرنامج (PID/Program). إذا كان عنوان IP الّذي تستقبل الخدمة عليه الاتّصالات هو 0.0.0.0 فهذا يعني أنّ الخدمة تقبل الاتّصالات من جميع الواجهات. فحص الملفّات وأنظمة الكشف عن التّطفّل Intrusion detection systems نعني بفحص الملفّات العمليّة الّتي بموجبها نُقارن وضعيّة النّظام الحاليّة بسجلّ لملفّات النّظام وخصائصها عندما كان في وضعيّة تُعرف بأنّها جيّدة. يُستخدم فحص الملفّات للتّعرّف على التّغييرات الّتي يُمكن أن يكون النّظام قد سمح بها. نظام الكشف عن التّطفّل (IDS اختصارًا) هو برنامج يُراقب نظام التّشغيل أو الشّبكة بحثًا عن أنشطة غير مسموح بها. تعتمد الكثير من أنظمة الكشف عن التّطفّل المُستضافة على الخادوم على طريقة فحص الملفّات للتّحقّق من وجود تعديلات في نظام التّشغيل. 1- كيف تُحسّن أنظمة الكشف عن التّطفّل وفحص الملفّات من الأمان؟ إذا كنت مهتمًّا بالرّفع من مستوى أمان بنيتك التّحتيّة فمن المفيد إجراء فحوص على مستوى الملفّات، مثلها مثل الخدمات. يُمكن أن يكون هذا الإجراء دوريًّا، يؤدّيه المسؤول؛ أو آليًّا ضمن نظام للكشف عن التّطفّل. تعدّ هذه الوسائل من الطّرق القليلة الّتي تتأكّد من خلالها أنّ نظام الملفّات Filesystem لم يغيِّره أو يُعدِّل عليه مستخدم أو برنامج. يُفضّل المتطفّلون في كثير من الأحيان، لأسباب مختلفة، البقاء متخفّين للاستمرار في استغلال الثّغرات الموجودة في النّظام لمدّة أطول. يُمكن لمن يستغلّ ثغراتٍ في النّظام أن يُبدل ملفّات تنفيذيّة بنُسخ مُعدَّلة منها؛ سيُخبرك فحص نظام الملفّات بالملفّات المُعدًّل عليها إن وُجدت ممّا يُساعد في التّأكّد من تكامل بيئة الخادوم. 2- ما مدى صعوبة إعداد فحص الملفّات وأنظمة الكشف عن التّطفّل؟ قد يكون تثبيت نظام للكشف عن التّطفّل أو إجراء فحص للملفّات عمليّة إضافيّة تأخذ جهدًا لا بأس به. يتضمّن الإعداد الابتدائيّ إخبارَ نظام الكشف عن التّطفّل يكلّ التّغييرات غير القياسيّة الّتي أجريتها على الخادوم، وتحديدَ مسارات قد تُستثنى لإنشاء خطّ مرجعيّ للاعتماد عليه. تجعل أنظمة الكشف عن التّطفّل من عمليّات الإدارة اليوميّة أكثر تكرارًا وتعقّد من تحديث البرامج ونظام التّشغيل، حيث ستحتاج لإعادة التّحقّق من النّظام قبل تنفيذ التّحديثات ثمّ إعادة إنشاء الخطّ المرجعيّ بعد تنفيذ التّحديثات لرصد أي تغييرات على إصدارات البرامج. يجب أيضًا نقل تقارير الكشف إلى مكان آخر غير النّظام الّذي حدث فيه الكشف لمنع المتطفّلين من تعديلها للتّغطيّة على آثارهم. ستزيد أنظمة الكشف عن التّطفّل بلا شكّ من عبْء الإدارة، ولكنّ مقارنة حالة النّظام الحاليّة بأخرى تعرف أنّها جيّدة هيّ الطّريقة الوحيدة للتّأكّد من أنّ الملفّات لم يُعدَّل عليها من دون علمك. Tripwire وAide من أكثر أنظمة الكشف عن التّطفّل انتشارًا. بيئات تنفيذ Execution environments معزولة يُحيل مفهوم “بيئة التّنفيذ المعزولة” إلى أيّ طريقة تشغيل تعمل بموجبها العناصر في مساحات عمل مخصَّصة لها. يُمكن أن تُعدّ بيئة تنفيذ معزولة بتشغيل عناصر التّطبيقات في خواديم خاصّة بها، أو بإعداد الخدمات للعمل في بيئات chroot أو حاويّات Containers. يعتمد مستوى العزل إلى حدّ بعيد على متطلّبات تطبيقاتك وواقع بنيتك التّحتيّة. 1- كيف يُحسّن عزل بيئات التّنفيذ من الأمان؟ يزيد عزل العمليّات في بيئات تنفيذ مستقلّة من قدرتك على تحديد المشاكل الأمنيّة الّتي يُمكن أن تتعرّض لها. يحُدّ الفصل بين العناصر المستقلّة في البنية التّحتيّة من وصول المخترقين إلى بقيّة العناصر في البنية التّحتيّة. 2- ما مدى صعوبة عزل بيئات التّنفيذ؟ تتوقّف صعوبة - أو سهولة - عزل التّطبيقات على طريقة الفصل الّتي تختارها. يُمكن عبر تحزيم التّطبيقات في حاويّات مستقلّة، الحصول بسرعة على مستوى من عزل التّطبيقات؛ ولكن يجب الانتباه إلى أنّ Docker لا يتعامل مع إعداد الحاويّات على أنّه ميزة أمنيّة. قد يوفّر إعداد بيئة Chroot لكلّ عنصُر مستوى من العزل هو الآخر، لكنّ هذه الطّريقة ليست مضمونةً بالكامل لعزل التّطبيقات؛ إذ توجد دائمًا وسيلة لكسر بيئات Chroot. يوفّر نقل العناصر إلى أجهزة مُخصَّصة أفضل مستوى من العزل، كما أنّه الوسيلة الأسهل في كثير من الأحيان؛ ولكنّه في المقابل الخيّار الأغلى نظرًا لثمن الأجهزة الإضافيّة. خاتمة قدّمنا في هذا الدّليل بعض التّحسينات الممكنة، وليس كلّها، من أجل الرّفع من مستوى الأمان في البنية التّحتيّة. تقلّ فعاليّة التّدابير الأمنيّة كلّ ما طال الانتظار في إجرائها. لا يجوز النّظر إلى التّدابير الأمنيّة على أنّها ملحقات، ويجب تنفيذها من البداية إلى جانب الخدمات والتّطبيقات. ترجمة بتصرّف لمقال 7 Security Measures to Protect your Servers.
  18. تعليمة client_max_body_size تحدد الحجم الأقصى الّذي يمكن للمستخدم رفعه إلى الخادوم. في المثال التّالي نحدد 10 ميغابايت حدًّا أقصى للملفّات المرفوعة على الخادوم، ونُضيف صفحة خطأ server { server_name example.com; client_max_body_size 10m; error_page 413 =403 /error.html; } ينبغي أيضًا تغيير قيمة تعليمتيْ upload_max_filesize (القيمة الافتراضيّة 2 ميغابايت) و post_max_size (القيمة الافتراضيّة 8 ميغابايت) في ملفّ php.ini
  19. الأمر التّالي يحذف الحزم الأساسيّة ومتعلقاتها: sudo apt-get purge mysql-server apache2 php5 يكفي في أغلب الحالات تنفيذ الأمر السّابق للحصول على خادوم "نظيف" من حزم LAMP.
  20. يهدِف هذا الدّليل إلى شرح طريقة كتابة سكربتات Shell لتحقيق أغراض مختلفة. يُمكن أن تُستخدم سكربتات Shell لتنفيذ أوامر عديدة، أمر واحد بمعطَيات Arguments كثيرة معقَّدة، أو واجهات أكثر سهولةً في الاستخدام لتوزيع عملك. في الأساس، تُستخدَم سكربتات Shell لتسهيل بعض الأعمال بتشغيلها آليًّا دون اللّجوء لإعادة كتابتها في كلّ مرة تحتاجها. أساسيّات كتابة سكربتات Shell1- تهيئة مجلّد العملمن الجيّد، قبل البدء في كتابة سكربتات Shell، إعدادُ مجلّد لوضعها فيه. يُنصَح بوضع السكربتات الشّخصيّة في مجلّد يوجد على المسار bin/~. ننشئ هذا المجلّد عبر الأمر التّالي: mkdir ~/binنُضيف مسار المجلّد إلى المتغيّر PATH وذلك بتعديل ملفّ etc/profile/ على النّحو التّالي: sudo nano /etc/profileونُضيف الأسطُر التّالية إلى الملفّ: PATH=$PATH:$HOME/bin export PATHاستخدم زرّي CTRL وO لحفظ التّعديلات، وCTRL+X للخروج من محرّر النّصوص nano. ثمّ نعتمد التّغييرات عبر تنفيذ الأمر: source /etc/profileبعض توزيعات لينكس لا تدعم أمر source، في هذه الحالة ينبغي إعادة تشغيل النّظام لاعتماد التّعديلات: sudo rebootملحوظة: للتّأكّد من اعتماد التّغييرات استخدِم الأمر التّالي: printenv PATHوتأكّد من وجود مسار مجلّد السكربتات ضمن المسارات العروضة (يُفصَل بين المسارات بنقطتيْن عموديّتيْن هكذا :). 2- إنشاء ملفّينبغي إنشاء ملفّ تنفيذيّ Executable file حتى يُمكن تشغيل السكربت. الأمران التّاليّان يؤدّيان هذه المهمّة؛ الأوّل ينشِئ ملفًّا والثّاني يجعله قابلًا للتّنفيذ: touch ~/bin/firstscript chmod +x ~/bin/firstscriptنفتح الملفّ بمحرّر نصوص nano للبدْء في إضافة الأوامر إلى السكربت: nano ~/bin/firstscriptتجب إضافة السّطر التّالي في بداية الملفّ حتّى يعرف النّظام أنّه سكربت Shell وبالتّالي ينفّذ الأوامر الموجودةَ فيه بالطّريقة الصّحيحة: #!/bin/shأصبح الملفّ الآن جاهِزًا ليستقبل أي أمر من أوامر لينكس، مثلًا: clear echo "Hello World!"نحفظ الملفّ (CTRL+O) ثمّ نخرج من محرّر النّصوص (CTRL+X). تكفي الآن كتابة اسم السكربت ثم الضّغط على Enter لتنفيذه: firstscriptلا يهمّ من أيّ المسارات نفّذت السكربت، مادام مجلّد العمل موجودًا ضمن متغيّر البيئة PATH. ينبغي أن تحصُل على النّتيجة التّاليّة: 3- مثال لسكربتيُعدّ التّشغيل الآليّ للأعمال المتكرّرة أحد أكثر المجالات الّتي تُستخدَم فيها سكربتات Shell. على سبيل المثال؛ إذا كنت دائمًا تنقل الكثير من الملفّات إلى مجلّد نسخ احتيّاطي Backup، وليكن backup/~، فإنّ بإمكانك إعداد سكربت ينقل أي ملفّ تحدّده إلى المجلّد المطلوب. بهذه الطّريقة يمكن أن تكتُب: filebackup file-name1 file-name2 ...فلنلقِ نظرة على ما نحتاج لمعرفته، قبل البدْء في كتابة السكربتات. أوّل ملحوظة هي أنّ سكربتات Shell لا تستخدم التّرميز الصّلب Hard coding. يعني هذا، في إطار مثالنا، أنّه يمكنك بسهولة تغيير مجلّد النّسخ الاحتيّاطي إذا أردت. كلّ ما عليك فعله هو تعديل أحد الأسطُر الأولى في ملفّ السكربت؛ حيثُ سيظهر المتغيّر الّذي سيخزّن مسار المجلّد مرةً واحدة فقط. لن تحتاج لتعديل ملفّ السكربت لتجربة التّعامل مع المتغيّرات، يمكن ذلك مباشرةً في سطر الأوامر عن طريق كتابة ما يلي: testvariable=teststringأعطينا القيمة teststring للمتغيّر testvariable. يطبع أمر echo محتوى المتغيّر (لاحِظ استخدام $ أمام اسم المتغيّر): echo $testvariableستظهر في سطر الأوامر قيمة المتغيّر testvariable أيّ teststring. يمكننا الآن بعد هذا الاختبار البسيط لعمل المتغيّرات البدءُ في كتابة السّكربت؛ الخطوات هي نفسُها الّتي تحّثنا عنها أعلاه: إنشاء الملفّ، جعله قابلًا للتّنفيذ، ثمّ البدْء في تحريره: touch ~/bin/filebackup chmod +x ~/bin/filebackup nano ~/bin/filebackupينبغي الانتباه إلى أنّ أي سطر يبدأ بعلامة # تعليق، أي أنّه لن يؤثّر على عمل السكربت إلا إذا أُتبعت # بعلامة تعجّب ! في السّطر الأوّل من برنامجك؛ في هذه الحالة يُطلق عليها اسم shebang والّتي شرحنا سابقًا أنّ نظام التّشغيل يعرف عن طريقها أنّ هذا الملفّ سكربت Shell ويُنفّذ الأوامر الموجودة فيه. يأخذ السكربت الشّكلَ التّالي: #!/bin/sh #Backup script #Description: makes a copy of any given file at the backup folder #Author: Your Name #Date: 8/10/2013 #Backup folder; set this variable to any folder you have write permissions on BACKUPFOLDER=~/backup #The script will make sure the folder exists mkdir -p $BACKUPFOLDER #Now the script will copy the given file to the folder cp -a $@ $BACKUPFOLDERنشرح، بعد حفظ الملفّ (CTRL+O) والخروج من محرّر النّصوص (CTRL+X)، عمل السكربت. الأسطُر الأولى كلّها تعليقات؛ عرّفنا بعدها متغيّرًا باسم BACKUPFOLDER نضع فيه مسار المجلّد حيث نُريد نسخ الملفّات. ننفّذ بعدها الأمر mkdir -p $BACKUPFOLDER الّذي يُنشئ مجلّدًا في المسار الموجود في المتغيّر BACKUPFOLDER، إذا كان المجلّد موجودًا مسبقًا لن تظهر أي رسالة خطأ نظرًا لاستخدام خيّار p-. تدلّ علامة @$ في الأمر التّالي، cp، على المعطيات الّتي يمرّرها المستخدِم أثناء تنفيذ السّكربت. لتمرير المعطيات للسكربت فإنّ المستخدِم يكتبها مباشرةً بعد اسم السكربت. يوجد مجلّد الحفظ (وِجهة النّسخ، في هذه الحالة قيمة المتغيّر BACKUPFOLDER) مباشرةً بعد المعطيات الّتي يمرّرها المستخدِم. لتجربة السكربت نفّذ ما يلي، على اعتبار أنّ file1 وfile ملفّان يوجدان في المجلّد حيثُ تنفّذ السكربت: filebackup file1 fileيمكنك إضافة ملفّات بالعدد الّذي تريد، بكتابة أسمائها بعد اسم السكربت، وستُنقَل جميعها إلى مجلّد النّسخ الاحتيّاطيّ. أوامر أساسيّة في Shellتوجد بعض الأوامر الأساسيّة لعرض المعلومات للمستخدِم، ولأخذها منه أيضًا. 1- أمر echoيُستخدَم أمر echo لعرض معلومات للمستخدِم، سواءٌ كانت هذه المعلومات نصًّا أو متغيّرات أو خليطًا من الاثنين. يُمكن استخدام الخيّاريْن n- وe- مع أمر echo؛ يمنع خيّار n- طباعة سطر جديد بعد النّصّ المعروض، أما خيّار e- فيُفعّل استخدام مجموعة الرموز التّالية داخل النّصّ: a\: صوت تحذير - Alert soundb\: فراغ للخلف Backspacec\: لا تطبع سطرًا جديدًاe\: مِحرف الخلوص Escape charactern\: سطر جديدr\: رجوع إلى السّطرt\: جدولة أفقيّة0xx\: محرف ASCII\\: خط مائل عكسي Backslash.على سبيل المثال، يؤدّي الأمران التّاليّان نفس الشّيئ بالضّبط (لاحِظ وجود النّص بين علامتيْ اقتباس): echo -e “Text\c” echo -n “Text”لعرض قيمة متغيّر عن طريق أمر echo أضف اسم المتغيّر مسبوقًا بعلامة $: string=World! echo "Hello $string"يُمكنك خلط نص، أوامر ومتغيّرات في سلسلة محارف String واحدة. يمكنك أيضًا كتابة أمر من سطر واحد يعرض نصًّا من أسطر عديدة؛ كلّ ما عليك فعله هو كتابة n\ في المكان الّذي تُريد بدْءَ سطرٍ جديد منه. 2- تهيئة النّصوص باستخدام أمر echoيُمكن لأمر echo عرض النّصوص وتهيئتها بألوان وأساليب متنوّعة؛ ولكنّ نتائج هذه التّهيئة قد لا تكون دومًا متشابهة في الطّرفيّات الموجودة. يجب الانتباه إلى أنّ بعض المستخدمين قد لا يرون نتيجة تهيئة النّصوص بنفس الطّريقة الّتي تظهر لديك. لا يُشكّل هذا الأمر، بما أنّ التّغيير ظاهريّ أساسًا، مشكلًا كبيرًا في غالب الأوقات. يُعرَّف كلُّ تخصيص (جعل الخطّ عريضًا Bold، وضع خطّ تحت النّص، أو تلوينه) بمتتاليّة من محارف الخلوص Escape characters، وهي مجموعة من الرّموز تتبع المِحرف `e\’، على النّحو التّالي: echo -e "This is \e[1mBold"ينتُج عن الأمر السّابق كتابة الجملة This is Bold مع تمييز كلمة Bold بخط عريض. يوضّح الجدول التّالي بعض الرّموز شائعة الاستخدام: خطّ عريضخطّ عاديّخطّ تحت النّصّعكس الألوانe[1m\e[2m\e[4m\e[7m\ يُمكن استخدام هذه الرّموز معًا للحصول على نصّ عريض ومخطوط تحته، ثمّ إعادة تعيين التّأثيرات باستخدام الرّمز e[0m\: echo -e "\e[4mThis \e[1mis\e[0m \e[7man example \e[0mstring"جرّب الأمر وشاهد عمل الرّموز. يعمل تلوين النّصوص بنفس الطّريقة حيثُ يوجد رمز لكلّ لون. تُدرج رموز الألوان مثل ما تُدرج رموز تهيئة النّص المذكورة في الفقرة السّابقة. يوضّح الجدول التّالي رموز الألوان الأكثر شيوعًا. يوجد رمز للون النّص وآخر لخلفيّته. أسودe[30m\e[40m\أحمرe[31m\e[41m\أخضرe[32m\e[42m\أصفرe[33m\e[43m\أزرقe[34m\e[44m\أرجوانيّe[35m\e[45m\سماويّe[36m\e[46m\رمادي فاتحe[37m\e[47m\اللّون الافتراضيّe[39m\e[49m\إن أردنا مثلًا نصًّا بلون أحمر فالرّمز هوe[31m\، أمّا إذا أردنا خلفيّة بلون أحمر فالرّمز هو e[41m\. يُمكنك استخدام ألوان مختلفة لكلّ من النّص والخلفيّة، كما أنّ بإمكانك استخدام رموز تهيئة النّصّ المذكورة في الفقرة السّابقة إلى جانب رموز ألوان النّصّ والخلفيّة. 3- أمر readيُستدعى أمر read لأخذ بيانات من المستخدِم. يسجّل أمر read كلّ ما يكتبه المستخدِم ابتداءً من استدعاء الأمر إلى أن يضغط على زرّ ENTER، يسجّله في متغيّر. يوجد معطًى واحد للاستخدام مع أمر read وهو اسم المتغيّر الّذي سيُحتفظ فيه بما يكتبه المستخدِم. في ما يلي مثال لسكربت مختصَر يُنشئ مجلّدًا بالاسم الّذي يختاره المستخدِم: #!/bin/bash read foldername mkdir foldernameيُمكن ملاحظة أنّ السكربت السّابق لا يمتلك أيّ واجهة للتّفاعل مع المستخدم. كيف يُمكن للمستخدِم أن يعرف مالّذي عليه كتابته؟ 4- مثال على سكربتسنطبّق، عبر المثال التّالي، كلّ ما تعلّمناه حتى الآن. سنعرِض رسائل مخصَّصة ومنسَّقة للمستخدِم، ثمّ نأخذ منه البيانات الّتي نحتاجها. عرضنا في بداية هذا الشّرح مثالًا لسكربت ينسخ احتيّاطيًّا مجموعة من الملفّات؛ سنعيد كتابة هذا السّكربت لنطلُب من المستخدِم مالملفّات الّتي يُريد نسخَها. نعدّ بدايةً الملفّ ونفتحه للتّحرير: touch ~/bin/filebackup2 chmod +x ~/bin/filebackup2 nano ~/bin/filebackup2ونُعيد كتابته بحيث تكون لديه واجهة مع المستخدِم: #!/bin/bash #Backup script 2.0 #Description: makes a copy of any given file at the backup folder #Author: Your Name #Date: 5/27/2015 #Request the backup folder from the user: echo -e "\e[1m\e[32mFile Backup Utility\n\e[39m\e[0mPlease input your backup folder:" read BACKUPFOLDER #The script will make sure the folder exists mkdir -p $BACKUPFOLDER #Request files to be backed up: echo -e "\e[47m\e[30mWhich files do you want backed up?\e[39m\e[49m" read FILES cp -a $FILES $BACKUPFOLDERيُظهر السكربت رسالة للمستخدِم، بطريقة منسَّقة، تدعوه أوّلًا لإدخال اسم المجلّد الّذي ستُحفَظ فيه النّسخ الاحتيّاطيّة ويحتفظ باسم المجلّد في المتغيّر BACKUPFOLDER، ثمّ يُنشئ السكربت المجلّد إن لم يكن موجودًا. الخطوة التّاليّة هيّ إظهار رسالة تطلُب من المستخدم إدراج أسماء الملفّات المُراد نسخُها ويحفظها في متغيّر باسم FILES. الخطوة الأخيرة هي نسخ الملفّات إلى المجلّد عبر الأمر cp. غطّينا في الفقرات السّابقة الأوامر الأساسيّة الّتي تُمكِّن من كتابة سكربتات تتفاعل مع المستخدِم حتّى يعلم بالضّبط كيف يعمل السكربت ومالمعلومات الّتي يطلُبها. ليست كلّ السكربتات تحتاج إلى واجهة مستخدِم؛ السكربت الأوّل الّذي كتبناه أسرع من الثّاني وأفضل في كثير من الأحيان. لا تُضِف واجهة استخدام إلّا للسكربتات الّتي يحتاج المستخدِم للمساعدة في استخدامها، في هذه الحالة ستحتاج لأمر echo. التّعليمات الشّرطيّة Conditional statementsتُعدّ التّعليمات الشّرطيّة من الأمور الّتي لا غنى عنها لأيّ لغة برمجة متكاملة. سنتطرّق في هذا الجزء من الدّرس لطريقة وضع شروط وتنفيذ أوامر عند تحقّق - أو عدم تحقّق - هذه الشّروط. 1- أمر ifتُستخدَم التّعليمات الشّرطيّة لوضع شروط تُنفَّذ عند تحقّقها إجراءات معيّنة. يوجد في Shell أمر if الّذي يُتبَع بعبارة ستُختَبَر صحّتها. يُمكن لهذا العبارة أن تكون عبارة منطقيّة، رمز خروج Exit code لأمر أو بعض الأمور الأخرى. عند العمل على رموز الخروج من أوامر فإن استخدامَها مباشِر: if ls folder then echo "Folder exists" fiإذا وُجد ملفّ باسم folder فإنّ السّكربت السّابق سيُنفّذ الأمر echo "Folder exists" لأنّ رمز الخروج من أمر ls في هذه الحالة هو 0 (يُشير الرّمز 0 إلى أنّه لا توجد أخطاء في تنفيذ الأمر). أمّا إذا لم يوجد المجلَّد فلن تُعرَض الرّسالة. يجب أن تتبع كلَّ تعليمة if بthen ,وتُختَم بfi. إذا أردت التّعامل مع عبارات منطقيّة في تعليمة if فستحتاج لأمر test. توجد في Shell العوامل Operators التّاليّة لمقارنة الأعداد: eq-: يُساويne-: لا يُساويlt-: أصغر منle-: أصغر من أو يُساويgt-: أكبر منge-: أكبر من أو يُساويتوجد طريقتان لكتابة أمر test: if test 4 -gt 3أو: if [ 4 -gt 3]تؤدّي الكتابتان نفس العمل تمامًا، كما أنّهما تحتاجان أيضًا لthen وfi. مثال: if [ 20 -lt 10 ] then echo "What?" fiإذا جرّبت تنفيذ السكربت السّابق فستُلاحِظ ألّا شيءَ يُعرَض على الشّاشة؛ لأنّ الشّرط غير متحقّق، فالعدد 20 ليس أصغر من 10. ماذا لو أردنا عرض رسالة للزّائر في حال عدم تحقّق الشرط، مثل ماهو الحال في المثال السّابق؟ 2- أمر elseتُضيف else بديلًا يُنفَّذ عند عدم تحقّق الشّرط في تعليمة if. طريقة الاستخدام: if [ 20 -lt 10 ] then echo "What?" else echo "No, 20 is greater than 10." fiفي هذا المثال نتحقّق من شرط “20 أصغر من 10”، في حال كان صحيحًا نطبع كلمة “?What”، أمّا إذا لم يكن صحيحًا فنطبع عبارة “No, 20 is greater than 10.” (أي لا، 20 أكبر من 10). يُمكن، إلى جانب العبارات المنطقيّة، مفارنة سلسلة محارف ضمن تعليمة if/else. تتطلّب مقارنة المحارف صيغةً مختلفة قليلًا عن مقارنة الأعداد، ولكنّها تسخدم أمر test أيضًا. في ما يلي صيغة مقارنة سلسلة محارِف: string = string: تكون العبارة صحيحة عندما تكون السّلسلتان متساويّتيْنstring != string: تكون العبارة صحيحة عندما لا تكون السّلسلتان متساويّتيْن.string: سلسلة غير خاويّة أو غير معرَّفةn string-: سلسلة معرَّفة وغير خاويّةz string-: سلسلة معرَّفة وغير خاويّةتوجد أيضًا طُرُق لاختبار خصائص الملفّات: s file-: تكون العبارة صحيحة إذا كان الملفّ file غير فارغ.f file-: عبارة صحيحة إذا كان الملفّ file موجودًا وليسd folder-: العبارة صحيحة إذا كان folder مجلّدًا وليس ملفًّا.w file-: عبارة صحيحة إذا كان يُمكن الكتابة في الملف filer file-: يتحقّق الشّرط عندما يكون الملفّ file للقراءة فقط.x file-: تختبر هل الملفّ قابل للتّنفيذ.3- تعليمات if متداخلة Nested if’sيُمكن كتابة تعليمة if كاملة ضمن تعليمة if أخرى، في ما يُعرف بتعليمات if متداخلة. نتعرّف على عمل بتعليمات if المتداخلة في المثال التّالي بالاستعانة بأمر read: #!/bin/bash echo "Input which file you want created" read file if [ -f $file ] then echo "The file already exists" else touch $file if [ -w $file ] then echo "The file was created and is writable" else echo "The file was created but isn't writable" fi fiيطلُبُ السكربت من المستخدِم إدخال اسم ملفّ ليُنشئه، ويخزّن اسم الملفّ في المتغيّر file؛ ثمّ يختبر إن كان الملفّ موجودًا f $file-، ويُظهر رسالة بذلك إن كانت نتيجة التّحقّق إيجابيّة وإلّا يُنشئ الملفّ (touch $file). بعد إنشاء الملفّ يختبر هل يُمكن الكتابة عليه (w $file-) وإذا كانت الإجابة نعم يطبع الرّسالة The file was created and is writable وإلّا يطبع رسالة مغايِرة The file was created but isn't writable. 4- مثال على سكربتنُكمل مع سكربت النّسخ الاحتيّاطي لتحسينه. تتضمّن هذه النّسخة اختبارًا لمعرفة ما إذا كان مجلّد النّسخ موجودًا (d $BACKUPFOLDER-) وما إذا كان لدى المستخدِم امتيّاز Privilege إنشاء مجلّد. نبدأ بإنشاء السّكربت وإعداده: touch ~/bin/filebackup3 chmod +x ~/bin/filebackup3 nano ~/bin/filebackup3ثمّ تحريره: #!/bin/bash #Backup script 3.0 #Description: makes a copy of any given file at the backup folder #Author: Your Name #Date: 9/29/2013 #Request the backup folder from the user: echo -e "\e[47m\e[1m\e[32mFile Backup Utility\n\e[39m\e[0m\e[47mPlease input your backup folder:" read BACKUPFOLDER #The script will make sure the folder exists if [ -d $BACKUPFOLDER ] then echo "You backup folder exists and will be used." else mkdir $BACKUPFOLDER if [ -d $BACKUPFOLDER ] then echo "Backup folder created successfully." else echo -e "I do not have the rights to create your backup folder.\nThis script will now exit." exit 1 #exit 1 is a command that exits the script with an error code fi fi #Request files to be backed up: echo -e "\e[30mWhich files do you want backed up?\e[39m\e[49m" read FILES if [ -n $FILES ] then cp -a $FILES $BACKUPFOLDER else echo "File does not exist." fiلاحِظ أمر exit الّذي يُستخدَم لإيقاف السّكربت مع رمز خطأ. يعرض السّكربت رسالة عندما لا يوجد مجلّد للنّسخ الاحتيّاطيّ، عند إنشائه، إن لم يكن بالإمكان إنشاؤه، وعند كتابة سلسلة محارف خاويّة لأسماء الملفّات. خاتمةيضع هذا الدّرس اللّبنات الأساسيّة الّتي تمكّن من كتابة سكربتات Shell يُمكن للمستخدِم التّفاعل معها. لا زال هناك الكثير لتعلّمه من أجل كتابة برامج Shell بإمكانيّات أكبر وحلول أكثر إبداعًا، إلّا أنّ إتقان المحتوى الموجود هنا خطوة أولى في الطّريق. ترجمة بتصرّف لسلسلة مقالات An Introduction to Shell Scripting
  21. استخدِم الأمر التّالي (بعد الدّخول إلى سطر أوامر MySQL): SHOW GRANTS FOR 'user'@'host'; حيث user اسم المستخدِم وhost المستضيف.
  22. تُضبط إعدادات DNS في خادوم أوبنتو بالتّعديل على الملفّ etc/network/interfaces/. يُشبه محتوى هذا الملفّ ما يلي: # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.X.X netmask 255.255.255.0 gateway 192.168.X.X dns-nameservers X.X.X.X تحدّد التّعليمة الأخيرة عناوين خواديم DNS الّتي يستخدمها نظام التّشغيل. تُمكن كتابة أكثر من خادوم DNS بالفصل بين عناوين IP بمسافة: dns-nameservers X.X.X.X Y.Y.Y.Y أضف عنوان خادوم DNS التّابع للشّبكة في هذه التّعليمة، مع العلم أنّ نظام التّشغيل يُرسل الطّلب للخواديم حسب ترتيب عناوينها.
  23. يُمكن الحصول على هذه المعلومة عبر النّظر في تاريخ آخر تعديل على الملفّ (var/lib/apt/periodic/update-success-stamp/). نستخدِم أمر stat لهذا الغرض: stat /var/lib/apt/periodic/update-success-stamp النّتيجة عندي (انظُر التّاريخ في الأسطُر الأخيرة): File: ‘/var/lib/apt/periodic/update-success-stamp’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 805h/2053d Inode: 4457074 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-05-27 10:23:45.862888072 +0000 Modify: 2015-05-27 10:23:45.862888072 +0000 Change: 2015-05-27 10:23:45.862888072 +0000 Birth: -
  24. الأمر التّالي يؤدّي المهمّة: zcat file.sql.gz | mysql -u USER -p DATABASEحيثُ USER اسم المستخدِم وDATABASE اسم قاعدة البيانات الّتي سيُستورد إليها الملفّ. يفكّ أمر zcat ضغط الملفّ ونمرّر نتيجة الأمر zcat إلى mysql.
×
×
  • أضف...