الاثنين، 23 أغسطس 2021

دورة تعلم Bash : الجزء الاول

 بسم الله الرحمن الرحيم

يعتبر تعلم التحكم بالطرفية (Terminal) في نظام لينكس من الأمور المهمة جداً , خاصة للمهتمين بالأمن الأكتروني بخاصة , لكون معظم الأدوات المستخدمة في هذا المجال تعمل على هذا نظام لينكس , و كون التعامل مع هذه الأدوات يتم بالغالب باستخدام الواجهة النصية .


  • ما هو الـــ"Bash" ؟
  •  

    Bash   هو برنامج يعمل كواجهة نصية للمستخدم لتوجيه الأوامر لنظام لينكس  أو ما يسمى بشيل لينكس (Linux Shell), كما يعمل كمترجم للبرنامج المكتوبة باللغة الأوامر الخاصة به , تم تصميمه كبديل لـــ (Bourne Shell) في نظام يونكس المملوك لشركة AT&T  الامريكية , حتى أن الاسم هو أختر لــــ (Borune Again Shell)  كبديل لبرنامج Bourne Shell  الذي كان يتم توزيعه بترخيص من شركة AT&T , و تم من فترة تم جعل برنامج Bourne Shell أو كما في موجه الاوامر sh مجاني و مفتوح المصدر , لكن لا يضاهي برنامج Bash و خصائص المتطورة مثال :

    1. القدرة على انشاء المصفوفات و التعامل معها .
    2. وجود بنى التحكم في سير البرنامج
    3. هنالك متغيرات خاصة في باش مثل RANDOM$  و FUNCNAME$
    4. وجود الأمر history الذي يسجل جميع الأوامر التي تم تنفيذها .

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

    يعتبر هو البرنامج الافتراضي في معظم توزيعات لينكس، ويحتوي على العديد من المميزات مثل:

    1.        التحكم في العمليات (Jobs control).

    2.       عرض الأوامر السابقة وإمكانية استدعاءها بحسب التسلسل.

    3.        المصفوفات (Array)

    4.        العمليات الحسابية (Shell Arithmetic).

    5.        إمكانية انشاء اختصارات للأوامر (Aliases).

     

    رغم كون برنامج Bash هو البرنامج الافتراضي في معظم توزيعات لينكس , لكن يوجد برامج متعددة تعتبر منافسة لهذا البرنامج و منها

    1.   sh : أو الاسم البديل (Borune Shell) مسمى على اسم مطوره Stephen Borune  , هذا هو برنامج الأصلي .

    2. csh  : اختصار لي (C Shell)

     

  • كيف أحصل على الــ"Bash" ؟
مع كل توزيعة لينكس تحصل على Bash بشكل افتراضي , و هنا في توزيعة يوبتو Ubuntu طريقة التشغيل ببساطة 
 

في التوزيعات الأخرى ابحث عن برنامج بالأسم Terminal , و للمستخدمي نظام ويندوز قم بتنزيل نظام لينكس الفرعي باتباع الشرح في هذه التدوينة على هذا الرابط .

  • ما معنى هذه الشاشة  ؟

تراه في الشاشة مؤشر يومض هذا المؤشر في انتظار ادخال الأوامر , سنطبع أول امر لنا اكتب التالي :

whoami

هذا الأمر سيطبع لك اسم المستخدم الذي يستخدم قام بتشغيل الأمر :

يجب أن تنتبه نظام لينكس حساس لحالة الأحرف جرب الأن أن تكتب الامر السابق كالتالي Whoami :


ستطبع لك رسالة تبين لك عدم وجود الأمر , لذا انتبه عند طباعة الاوامر , لك ما هو هذا الأمر , الأمر whoami هو مجرد برنامج يتواجد في نظامك لكي تعرف اين يتواجد اطبع الأمر التالي :

whereis whoami

 سيطبع لك سطر الأوامر مسار الملف و أين يوجد في الملف التنفيذي اولا ثم مسار ملف التعليمات (manual)  :


  • المجلد الحالي (Current working directory) : أين أنا ؟
عندما يبدأ موجه الأوامر الخاص بك يكون في مجلد افتراضي , في الغالب يكون المجلد الخاص بالمستخدم في المسار home/username/ , لمعرفة المجلد الحالي فقط اكتب الأمر pwd و اضغط  Enter  , الأمر pwd اختصار للجملة (print working directory) اطبع المجلد العامل .

pwd

 

  • عرض محتويات المجلدات : ماذا يوجد هنا ؟
في الأنظمة ذات الواجهه الرسوميه يجود برنامج يعرض لك الملفات و المجلدات بشكل رسومي سهل و تتفاعل مع الملفات و المجلدات بأستخدام الماوس في الغالب , و لكن كيف يمكن أن تعرض قائمة الملفات و المجلدات في الواجهة النصية الخاصة بــBash .
 
صورة للواجهة الخاصة بمستعرض الملفات في نظام يبنتو لينكس

يتوافر في نظام لينكس الأمر ls أختصار لكلمة list , اطبع في موجه الأوامر الأمر ls فقط و اضغط Enter :

ls
 
سيتم طباعة محتويات المجلد الحالي , الذي تعرفنا عليه باستخدام الأمر pwd :
 

 تلاحظ بأن الأمر طبع لنا الملفات و المجلدات الموجود و تم تميز المجلدات باللون الأزرق , لكن تستطيع اضافة / في نهاية المجلد كتميز للمجلدات :

ls -F
 
انتبه للمسافة مابين ls و F- , سيطبع لك كالتالي :
 

 الملفات و المجلدات المخفية في نظام لينكس يبدأ اسمها بالنقطة . , و لعرضها فقط أكتب الأمر ls كالتالي :

ls -a
 
 



تستطيع دمج المعاملين a- و F-  كالتالي :

ls -aF
 
أو كالتالي :

ls -Fa
 
لا يهم الترتيب في المعاملات (parameters) , لكن في بعض الحالات يجب ان تراعي الترتيب ,  سيكون مخرجات الأمر كالتالي :


تلاحظ وجود مجلدين في بداية القائمة هما :
.  : المجلد الذي يحمل اسم بالنقطة فقط هو المجلد الحالي .
.. : المجلد الذي يحمل النقطتين هو المجلد الاعلى من المجلد الحالي , في مسار المجلد , كمثال اذا كنت في المجلد  home/abgoor/ سيكون المجلد الاعلى هو home/  .

و لعرض محتويات أي مجلد فقط اضف مسار المجلد بعد الأمر ls و معاملاته كهذا المثال التالي الذي يعرض محتويات المجلد الجذر / :

ls -F /
 


تلاحظ وجود رموز بعد اسماء بعض الملفات :

@ : يدل على أن هذا الملف أو المجلد هو رابط (link) أو ما يسمى في ويندوز باختصار (shortcut) .
*   : يدل على ان الملف تنفيذي , يمكن تشغيله كبرنامج 

سوف نشرح هذه الأذونات الخاصة بنظام لينكس بالتفصيل في الدروس القادمة ( أن شاء الله ) .

  • التحرك بين المجلدات 
لتغير المجلد الحالي تستطيع تنفيذ الأمر cd  مع مسار المجلد الذي تريد الذهاب إليه , كمثالنا التالي , قبل تنفيذ الأمر نفذ الأمر pwd


pwd
cd ..
pwd
 
نفذه هذه الأوامر بتتابع و لاحظ التغير لديك , ستلاحظ بأنك المجلد الحالي تغير للمجلد الأعلى في المسار كالتالي :
 

كما ذكرنا سابقا المجلد بالاسم ".." دائما يشير للمجلد الأعلى في مسار المجلد الحالي , "." يشير للمجلد الحالي . , و الأن للنتقل للمجلد tmp/ الخاص بالملفات المؤقتة في نظام لينكس فقط اكتب الأمر cd ثم مسافة ثم مسار المجلد :


cd /tmp
 
و الأن لنعد لمجلد المستخدم الحالي و الذي يسمى في نظام لينكس بالمجلد البيت "Home folder" , فقط اكتب الامر cd ثم مسافة و الرمز ~ كالتالي :

cd ~
 
تذكر أذا اردت ان تعرف المجلد الحالي نفذ الأمر pwd .
 
  • التعامل مع الملفات و المجلدات 

1. أنشاء المجلدات 

للانشاء المجلدات سوف نستخدم الأمر mkdir فقط اكتب الامر قم اسم المجلد :

mkdir test
 
قم بالدخول لهذا المجلد عبر الأمر cd سوف يكون هو مكان تجاربنا .

cd test
 
و لإنشاء مجلد يحتوي على مجلد فقط استخدام المعامل p- كالتالي :

mkdir -p test1/test
 
و لإنشاء عدد من المجلد في سطر واحد فقط اكتب اسماء المجلدات و تذكر وضع المسافة:

mkdir test1 test2 test3 test4
 
و لكن ماذا لو اردت أنشاء مجلد بأسم يوجد فيه اكثر من كلمة يفصل ما بينها مسافة فقط ضع الأسم بين " " علامتي التنصيص :

mkdir "This is test folder"
 
 و الأن إلى بعض الابداع , لنفترض بأنك تريد أنشاء مجلدات بالاسم A متبوعا برقم من 1 إلى 10 فقط ضع المجال في بين القوسين كالتالي {10..1} :

mkdir A{1..10}

ماذا لو اردت أن يكون بدل الارقام تكون حروف , تستطيع فقد ضع بدل الارقام مدى بالحروف , طبعا راعي ترتيب الحروف الإنجليزية و ان تكون حالة الأحرف مطابقة :

mkdir {B..Z}2
 
لنفترض بأنك تريد أن تنشأ مدى خاص بك ببساطة ضع المدى بين قوسين كالتالي :

mkdir test{"A","B","C"}
 
سيتنتج لك مجلدات بالاسم testA , testB , testC .

2. أنشاء الملفات 

 لإنشاء ملف يوجد الأمر touch , هذا الأمر ينشىء ملف فارغ فقط اكتب الأمر كالتالي :

touch myfile
 
 كما في الأمر mkdir تستطيع استخدام المدى و الأنماط كالتالي :

touch A{1..10}{A..C}
 
3. حذف الملفات و المجلدات 
 
لنبدأ بحذف أحد الملف الذي قمنا بأنشاءه في مثالنا السابق "myfile" :

rm myfile
 
في حالة ملفات متعددة تستطيع كتابتها في نفس السطر مع وجود مسافة:

rm A1A A2A A3A
  
كما في الأوامر السابقة تستطيع حذف باستخدام المدى , سنتخدم المدى الذي استخدمنها في السابق :

rm A{1..10}{A..C}
 
ستحصل على خطأ كالتالي :

rm: cannot remove 'A1A': No such file or directory
rm: cannot remove 'A2A': No such file or directory
rm: cannot remove 'A3A': No such file or directory
 
تذكر بأننا قد قمنا بحذف هذه الملفات في المثال السابق , لكي تجعل الأمر يتجاهل الملفات الغير الموجودة فقط أضف المعامل f- كالتالي:

rm -f A{1..10}{A..C}
 
و الأن لحذف المجلدات في حالة حذف المجلدات فتستطيع ذلك و لكن يجب عليك أضافة المعامل r- كما تستطيع دمجه مع المعامل f- كالتالي:

rm -fr {B..Z}2
 
هنالك الرمز * الذي تستطيع أما تحديد ملفات أو مجلدات تبدأ بحرف معين أو كلمة كــ "*A1" أو تحديد الكل فقط أكتب النجمة كالتالي (قبل تنفيذ هذا الأمر تأكد من أنك في المجلد الذي قمنا بإنشاءه من أجل هذه تجاربنا بأستخدام الأمر pwd ) :

rm *
 
4. قراءة الملفات النصية :

لقراءة الملفات النصية تستطيع استخدام الأمر cat , في مثالنا سوف تقرأ الملف hosts في المجلد etc/ , هذا المجلد يحتوي اعدادات النظام و البرامج :

cat /etc/hosts
 
5. معرفة نوع الملف 

بدون الامتداد تستطيع معرفة نوع الملف بواسطة الأمر file , الذي يعتمد على قيمة في بداية الملف تعتبر كتوقيع للأنواع الملف :

file /bin/echo
 

  • الأنابيب (pipeline) و تحويل سير البيانات (redirect)

كل شيء في نظام لينكس عبارة عن ملف , عندما يطبع برنامج رسالة على الطرفية (Terminal) , فهو يستخدم رقم يسمى file descriptor في حالة إدخال البيانات يكون القيمة 0 أو stdin , لطباعة البيانات يستخدم stdout و لرسائل الخطأ يستخدم stderr .

pipeline هي طريقة نظام لينكس في نقل البيانات التي ترسل للملف stdout و تحويلها ما بين العمليات (Process) .

و الأن لمثال عملي :

ls | cat -n
 
سينفذ الأمر ls و يحول البيانات الناتجة إلى الأمر cat -n الذي سيطبع كل سطر مع رقمه .
 
و الأن إلى مثالنا التالي سنحاول عرض محتويات مجلد غير موجود , لنرى طريقة تصرف النظام :

ls not_existing | cat -n
 
سيطبع لك النظام رسالة خطأ من الأمر ls و لن يحول هذه الرسالة إلى البرنامج cat :

ls: cannot access 'not_existing': No such file or directory
 
السبب لهذا السلوك من النظام أن رسائل الخطأ يتم تحويلها إلى stderr و pipeline تحول فقط مخرجات stdout .

طبعا هنالك طريقة لتعديل هذا السلوك , ستتعرف له في بعد أن نطبق عملية تحويل سير البيانات , لنفترض أنك تريد أن تغير من ملف المخرجات الافتراضي stdout , الأمر بكل بساطة أستخدم < كالتالي:

ls > test.txt
 
كما تستطيع تنفيذ هذه العملية بشكل عكسي فقط استخدم > :

cat -n < test.txt
 
سيتم في تلك الحالة اعتبار الملف كبديل لــstdin , وقراءة البيانات الموجودة في الملف و ارسالها إلى الأمر cat .
 
و لنعد لمثالنا السابق الخاص بالمجلد الغير موجود , و الذي ادى لطبع رسالة الخطأ :

ls not_existing | cat -n
 
للارسال البيانات الخاصة برسالة الخطأ يجب أن تعيد توجيه دفق البيانات (data stream) من الملف الخاص stderr إلى stdout بواسطة 1&<2 كالتالي :

ls not_existing 2>&1 | cat -n
 
ستطبع لك الطرفية كالتالي ,  لاحظ بأن الأمر cat قام بترقيم السطر الخاص بالخطأ مما يدل على أن سيل البيانات (Stream) الخاص بالخطأ تم أرساله إلى اﻷمر  :

     1    ls: cannot access 'not_existing': No such file or directory
 
لكن لماذا نضع قبل الرقم واحد الخاص بالملف stdout الرمز & , لنجرب :

ls not_existing 1 | cat -n
 
الأن قم بتنفيذ الأمر ls , ستلاحظ وجود ملف يحمل الرقم 1 , أستخدم اﻷمر cat لعرض محتويات الملف :


يم اضافة الرمز & كتميز بين اسم ملف عادي و ملف stdout , و الأن لنقوم باستخدام الأمر cat في كتابة أول سكريبت لنا :

cat > hello
 
اضغط Enter ثم أكتب الأمر echo متبوعا بالجملة "Hello,World" بين علامتي تنصيص, واضغط Enter بعد انتهاءك ثم أضغط Ctrl + C (الزر Ctrl مع الحرف C ) .
 

و لتحويل الملف لملف تنفيذي استخدم الأمر chmod كالتالي :

chmod +x hello
 
و في الاخير لتنفيذ الملف أكتب قبل اسم الملف /. كالتالي :

./hello
 

و لنفترض انك تريد أن تضيف للملف hello أمر اخر , في هذه الحالة لا تستخدم < لأنك سوف تمسح جميع محتويات الملف و للأضافة أستخدم << (append) :

cat >> hello
 
و بنفس الطريقة اكتب سطر الأوامر و اضغط Enter ثم في Ctrl + C , اضف سطرا ينفذ الأمر pwd كمثال :



هذه نهاية الجزء الاول , في الجزء الثاني سوف نتعلم الأذونات الخاصة بالملفات و تعديلها بواسطة اﻷمر chmod .

في النهاية هذا الجزء اسأل الله العزيز الحكيم , أن يكون هذا المجهود المتواضع قد سهل وصول المعلومة عن اهم الأساسيات في نظام لينكس و هي الطرفية . و طلب لكل من يقرأ هذه الكلمات أذا صادفت أي خطأ أو أردت أضافت معلومة فلا تتردد .