الجمعة، 20 مارس 2009

سطر الأوامر نظرة عن قرب أكثر 01

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

وإن شاء الله الموضوع مقسم إلى قسمين الأول للموضوع ذاته وسيكون هنا والآخر لوضع الردود والاستفسارات على هذا الرابط:

http://www.linuxac.org/forum/showthread.php?t=1603

حتى يكون الموضوع مسلسل ويخرج إن شاء الله بصورة مشرفة .

فى البداية حينما يتبادر إلى الأذهان سطر الاوامر تجد أفكار غريبة لدى الأشخاص بخصوص هذا الموضوع منها عمليات معقدة وأوامر صعبة لا يعرف كيفية استخدامها إﻻ المحترفين وإلخ من هذه الأفكار .قد يكون الموضوع من جهة صحيح ولكن بالفعل وعن تجربتى الشخصية لاستخدام اللينوكس ﻻ يمكن الفرار من سطر الأوامر سواء كنت مبتدىء أو متوسط المستوى أو محترف .فمثلا سطر الأومر يُمكنّكَ بمجرد كتابة أمر واحد أن تنفذ ما ﻻ يمكن تنفيذه من خلال الواجهات الرسومية مهما كانت قوة الواجهة الرسومية المستخدمة سواء كانت Gnome او KDE أو أين كانت الواجهة.


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

يوجد بعض الأنواع من الطرفية أو الشل أو سطر الأوامر مسميات لمعنى واحد الواجهة التى تقوم أنت بكتابة ما يحلو لك من اوامر فيها مثل طرفية csh , tcsh , zsh ولكن الطرفية التى سوف نعمل عليها من خلال الشرح بإذن الله هى طرفية bash والتى ترمز إلى Bourne again shell وسوف نتناول شرح مفصل وبالتدريج لأوامر كثيرة ومفيدة بإذن الله .


الجزء الأول : أساسيات لابد من الإلمام بها
فى هذا الجزء إن شاء الله سوف نقوم باستعراض بعض الأساسيات المهمة والتى ينبغى لمستخدم اللينوكس اليومى معرفتها والإلمام بها ونقسمها فى عناصر تالية :

1- كل شىء فى عالم اللينوكس يعتبر ملف ( ﻻ تقلق سوف أقوم بشرح كل عنصر على حده )
2- أقصى طول لأسماء الملفات على اللينوكس
3-الأسماء على لينوكس حساسة تجاه الحروف الكبيرة والصغيرة
4- بعض العلامات الخاصة تتجنب كتابتها فى أسماء الملفات
5- ال WildCards وما ظيفتها ؟

طبعا من القراءة الأولية للعناصر ﻻ يستطيع الفرد العادى من معرفة المراد منها ولذلك نبدأ أوﻻ مع أول عنصر :

- كل شىء فى عالم اللينوكس ملف -
فى هذا البند غموض ما بمعنى البعض يتعامل بشكل يومى مع أنظمة التشغيل المختلفة سواء كانت أنظمة لينوكس أو ماك أو حتى ويندوز وﻻ يعلم غير شىء وحيد وهو أن ما يسمى ملف هى الملفات التى يمكن تحريرها سواء كانت بالكتابة ، آخرون قد يعلمون أن الصوتيات والفيديوهات تعتبر ملفات ، آخرون يعلمون أن الصور ملفات وهكذا .... وهذا صحيح ولكن ما أود أن أصل إليه أنهم يعتقدون أن هذه هى الملفات فقط وﻻ شىء سواها على سبيل المثال القرص الصلب من معناه الظاهرى كتلة من تركيبة معادن ﻻ يمكن التعامل معها إﻻ من خلال أسلاك الData وال power وﻻ يمكن التغيير فى بيانات الهارد من خلال استخدام نظام التشغيل!

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

البعض قد يسغرب ذلك ولكن كيف للينوكس أن يقوم بذلك ؟

الإجابة على هذا السؤال بسيطة جدا وهى أن أى شىء يقوم لينوكس بالتعامل معه يعتبره مجرد سيل من ال bits وال bytes وﻻ شىء سوىء ذلك ولكن على النقيض البرامج هى التى تتولى معرفة الأشياء مثلا محررات النصوص هى عبارة عن ملفات بالنسبة للينوكس ولكن محرر النصوص هو من صُمم لكى يتعامل مع الملفات الكتابية وكيفية حفظها والتعديل عليها إلخ من هذه الأمور ، كذلك وصلات الشبكة المختلفة يتعامل لينوكس معها على أساس أنها ملفات مكونة من bits و bytes ولكن تطبيقات الانترنت هى من تعلم كيفية التعامل مع الوصلات الشبكية وهكذا .

-العنصر الثانى وهو الطول الأقصى لأسماء الملفات على أنظمة اللينوكس -


لنرجع قليلا بذاكرتنا إلى الخلف حين كنا نستخدم نظام Ms-Dos ولنتذكر كم كان أقصى طول للملفات ؟ الإجابة بسيطة جدا وهو ثمانية أحرف بالإضافة إلى ثلاثة أحرف هى امتداد ونوع الملف إذا كان نصى يأخذ الشكل txt. وإذا كان فيديو مثلا يأخذ الشكل wmv. وهكذا ولكى تلاحظ ذلك مثلا أنت تستخدم ويندوز قم بتسمية ملف نصى جديد بأى اسم ولكن راعى أن يكون الإسم طويلا مثل communication theory وتأكد من عدد أحرف الكلمة ستجدها عشرون حرفا ( البعض يندهش يقول هى تسعة عشر حرفا ) صحيح عدد الحرف تسعة عشر حرفا ولكن لو تمعنا قليلا سوف نجد أننا قمنا بتحرير مسافة بين كلمة communication وكلمة theory ونظام التشغيل يتعامل معها على أساس أنها حرف من حروف الكلمة . والآن قم بعمل إعادة تشغيل الجهاز والدخول إلى نظام التشغيل Ms-Dos عن طريق قرص اقلاع ذاتى أو قرص مرن . لنفرض الآن أنك على محث الأوامر الخاص بال Dos ويأخذ الشكل التالى مثلا <\:A بعد ذلك قم بالدخول إلى القسم الذى قمت بإنشاء الملف النصى عليه أوﻻ قم بكتابة اسم القسم وليكن :E ثم اضغط زر التأكيد Enter ثم قم باستعراض الملفات الموجودة على القسم باستخدام الأمر dir . الآن مثلا ظهرت الملفات الفرعية على القسم ماذا تلاحظ ؟ ...... سوف تلاحظ أن الDos قام باختزال اسم الملف من communication theory إلى الشكل التالى commun~1.txt وظهرت علامة جديدة هى ~ وتفيد بإن هناك تكملة للإسم ، أما أنظمة Pre-Os X Macs فالطول الأقصى لأسماء الملفات فيها كبير نسبيا بالمقارنة بنظام Ms-Dos وهو واحد وثلاثين حرفا (31) .

أما عند الحديث عن أنظمة اللينوكس واليونكس بصفة عامة فحدث وﻻ حرج تستطيع الطرفية أن تتعامل مع أسماء ملفات طولها الحرفى يصل إلى 255 حرف ويعتبر طول مناسب جدا لوصف ما يحلو لك لأسماء ملفاتك عند التعامل معها من خلال الطرفية !

ولكن من المفضل عند كتابة أسماء الملفات أﻻ يزيد طول الإسم على ثمانون حرفا كى يسهل عليك الأمر عند التعامل معه من خلال الطرفية حتى ﻻ يحدث انكسار للاسم فى سطر آخر هذه نصيحة فضلا ﻻ أمراً أمامك كل الخيارات مئتان فما أعلى !!!

-العنصر الثالث وهو حساسية الاسماء تجاه الحروف الكبيرة والصغيرة او (Captial and Small) -


اختلافا مع الويندوز وأنظمة الماك لينوكس عالم آخر !! نعم ففى هذا العنصر تجد دقة لينوكس المتناهية عند تحديد الأسماء والمسميات للملفات على النظام بمعنى أن لينوكس يتعامل بحساسية مفرطة مع أسماء الملفات التى تحتوى حروفا كبيرة وصغيرة ولفهم ذلك مثال :

يوجد لدينا ثلاثة ملفات بنفس الإسم ( لغويا ) وهم على الترتيب :

كود PHP:
*mysql.txt
*Mysql.txt
*MySQL.txt

فى المثال نجد ثلاثة ملفات نصية تحمل نفس الإسم من جهة اللغة ولكن من جهة لينوكس فالأمر مختلف جدا ، يتعامل لينوكس مع هذه الأسماء الثلاثة على أنها ثلاثة ملفات مختلفة كل منها ﻻ يمت للآخر بصلة ، أما لو كنت على أحد أنظمة التشغيل الأخرى مثل ويندوز وقمت مثلا بإنشاء الملف الاول mysql.txt وهممت بإنشاء الملف الثانى Mysql.txt سوف يقوم النظام بإعطاء رسالة تظهر أمامك مفادها " هذا الملف موجود مسبقا هل تريد وضع الملف الجديد مع استبداله بالملف القديم ؟ "

وأما الحساسية فأيضا تعنى أن كل شىء بلينوكس مختلف إذا تضّمن حروفا كبيرة وصغيرة ، بمعنى الأمر ls يختلف تماما عن Ls يختلف عن LS وهكذا قيس الأمور كلها على نفس هذا المنوال ولذلك يجب مراعاة هذه النقطة عند كتابتك لأمر ما أو ملف ما أن تقوم بكتابته بالشكل الصحيح حتى ﻻ يحدث ماﻻ يحمد عقباه مثلا قد تنوى حذف ملف معين كما ذكرنا بالأعلى مثل ملف mysql.txt ولكن عن طريق الخطأ قمت بإدخال اسم ملف آخر وهو Mysql.txt حينها سيستجيب لك النظام ويفعل ما تأمره به !! لأنك حينئذ ٍالسيد الآمر مملوكه بفعل مايريد تنبه !!!

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

-أما عن العنصر الرابع وهو علامات خاصة تتجنبها عند كتابتك لأسماء ملفاتك -
فنقول بحمدالله كل نظام تشغيل يحتوى على مجموعة من العلامات الخاصة تكون محجوزة للنظام فقط وﻻ يحق لأى مستخدم أن يقوم بوضعها فى أسماء الملفات على سبيل المثال عند تسمية ملف على نظام التشغيل ماك فلا يحق للمستخدم وضع(:) فى الأسم أو colon ،بالمثل مستخدمى ويندوز ﻻيحق لهم وضع ال (\) أو ال backslash،وبالتالى ينطبق هذا الأمر على لينوكس كونه ﻻ يعدو نظام تشغيل له خصوصياته ومن أهم العلامات الخاصة المحجوزة للينوكس هى ال (/) أو ال forward slash.

ولكى نستطيع فهم ذلك نضرب مثالا : نفترض أنك تريد استعراض محتويات ملف يحمل الإسم التالى books/to_buy.txt ستقوم بتنفيذ الأمر التالى :

كود PHP:
less /home/oem/books/to_buy.txt

على الفور ستظهر هذه الرسالة فى الطرفية مفادها :

كود PHP:
/home/oem/books/to_buy: No such file or directory

ولكن لماذا حدث ذلك مع العلم أننا قمنا بكتابة اسم الملف بطريقة صحيحة ؟

الإجابة حينما قمت أنت بكتابة اسم الملف المحتوى على ال/ قام الشل بالبحث عن اسم الملف بالترتيب من خلال المسار المعطى أوﻻ فى المجلد home/ ثم المجلد oem/ وجاء ليقوم بفتح الملف وجد مجلد آخر اسمه books/ غير موجود بالمسار لأن علامة / بينت للطرفية أن الto_buy ملف يندرج تحت مجلد آخر اسمه books/ .

من ضمن العلامات الخاصة التى ﻻ يحق لمستخدم لينوكس استخدامها هى ال (-) أو ال dash فى بداية أسماء الملفات حيث أن استخدام هذه العلامة يحول الملف من ملف عادى ليكون فى صيغة جديدة وهى استخدام الملف كا option لأمر تقوم بتنفيذه من خلال الطرفية ولاستيعاب ذلك نفترض التالى :

تحاول إنشاء ملف جديد باسم books_to_buy.txt- وبالفعل قمت بانشاءه ولكن لسبب ما أردت حذفه لأنك لست فى حاجة إليه فمن الطبيعى أن تقوم باستخدام الأمر rm وهو الأمر الخاص بحذف الملفات وبالتالى ستكون صيغة الأمر التالى كالتالى :

كود PHP:
rm -books_to_buy.txt

سيظهر لك التالى فى الشل :

كود PHP:
rm: invalid option -- b

ومن ضمن المحظورات أيضا عند تسمية الملفات تجنب وضع مسافات بين كل كلمة فى اسم الملف مثلا يوجد الملف books to buy.txt أى يوجد مسافة بين كلمة books وكلمة to كذلك يوجد مسافة بين كلمة to وكلمة buy فلو أردت مثلا حذف هذا الملف فسيحدث خطأ ﻻ تتوقعه حيث أن الطرفية تتعامل مع المسافات وكأنها arguments مختلفة فعند حذف الملف ستقوم بتنفيذ الأمر التالى :

كود PHP:
rm books to buy.txt

ستتعامل الطرفية بالترتيب مع الأمر لتنفيذه كالتالى :

أوﻻ ستحاول الطرفية حذف الملف books ثم الملف to ثم الملف buy.txt وبالتالى قد يحدث ماﻻ تتوقعه وتقوم بحذف ملفات أخرى ﻻ تريد حذفها ووقتها ﻻ يفيد الندم على ما فات تنبه لذلك !!! :

كود PHP:
rm: cannot remove `books': No such file or directory
rm: cannot remove
`to': No such file or directory
rm: cannot remove `buy'
: No such file or directory

كما رأيت حاول الأمر rm حذف الملفات بالترتيب ولكن ﻻ جدوى !!

ولكن سؤال يتبادر للأذهان وهو كيفية حذف ملف يحتوى اسمه على كلمات بينها مسافات ؟؟

يأتى هنا دور ال \ أو ال backslash حيث تقوم هذه العلامة باهمال المسافة الموجودة بين كل كلمة من كلمات اسم الملف ولتوضيح ذلك ، من المثال السابق تريد حذف الملف books to buy.tx ستقوم بعمل التالى فى الشل :

كود PHP:
rm books to buy.txt

وسيكون كل شىء على ما يرام ولكنها طريقة مرهقة فلذلك من الأفضل عدم وضع مسافات بين كلمات أسماء الملفات .

ولكن أﻻ توجد طريقة افضل من تلك ال \ ؟

بالفعل توجد طريقة أخرى نوعا ما أسهل لحذف ملفات تحتوى أسماؤها على مسافات بين كل كلمة وكلمة وهو وضع اسم الملف المراد حذفه بين علامتى
" " أى quotation marks مثال :

كود PHP:
rm "books to buy.txt"

ولكن مع مرور الوقت ستشعر بالإرهاق الشديد لكثرة استخدامك لل quotation makrs ولذلك من الأفضل كما أسلفنا عدم وضع مسافات سيكون خيار جيد أليس كذلك ؟!

وبعد أن استعرضنا بعض العلامات الخاصة بنظام لينوكس والتى ﻻ يمكن استخدامها عند تسمية الملفات ، يكون كل شىء متاح لك فى التسمية بدأ من استخدام حروف فقط سواء كانت حروف صغيرة أو كبيرة ، أو حروف مع أرقام ، أو حتى أرقام فقط .

-أما عن العنصر الخامس فهو ماهى ال WildCards وما وظيفتها ؟ -

تعال لنتخيل سويا أنك تمتلك ملف نصى و مجموعة من الصور لمناظر طبيعية خلابة من صنع الملك سبحانه وتعالى أشجار وجبال وسماء وأنهار ومافى الطبيعة من جمال ربانى وهذه الصور مثلا تأخذ ترتيبا رقميا تصاعدى وتريد مثلا حذف هذه الصور نظرا لوجود نسخة أخرى منها على القرص الصلب فكيف يمكنك عمل ذلك من خلال الطرفية ؟

الإجابة يقينا ستقوم باستخدام أمر الحذف rm ،ولكن هل ستقوم بحذف الصور صورة صورة أو دفعة واحدة ؟

طبعا من الممكن أن تقوم بحذف الصور عن طريق الواجهة الرسومية باستخدام الفأرة وذلك بعمل ضغطة يمنى على المجلد الموجود فيه الصور وتختار كلمة Delete، ولكن كيف لك أن تقوم بذلك من خلال الطرفية ؟

هنا يأتى دور ال Wildcards فى تنفيذ أمر ما على مجموعة ملفات دفعة واحدة وحينها لن تحتاج لتنفيذ الأمر أكثر من مرة ، وال Wildcards عبارة عن علامات خاصة أيضا مكونة من :

1- * أو ال asterisk
2- ? أو ال question mark
3- [] أو ال square brackets


والآن نستعرض كيفية الإستفادة من ال Wildcards :

على سبيل المثال الصور تاخد الترتيب التالى :

كود PHP:
mido1.jpg
mido2
.jpg
mido3
.jpg
mido4
.jpg
mido5
.jpg
mido6
.jpg
mido7
.jpg
mido8
.jpg
mido9
.jpg
mido10
.jpg
mido11
.jpg
mido12
.jpg
mido1
.txt

السؤال الأول : حذف الصور بالكامل ؟

نقوم باستخدام ال wildcard (*) لإهمال تأثير ما يأتى بعدها كالتالى :

كود PHP:
rm mido*.jpg

هنا قام الأمر بحذف الصور كاملة ولكن مع الأخذ فى الاعتبار أننا قمنا بكتابة الإمتداد حتى ﻻ نقوم بحذف الملف mido1.txt


السؤال الثانى : حذف الصور من رقم 10-12 ؟

كود PHP:
rm mido1*.jpg

هنا قام الأمر بحذف الصور المرقمة من 10-12 مع الأخذ فى الإعتبار أننا قمنا بكتابة الإمتداد حتى ﻻ نقوم بحذف الملف mido1.txt


السؤال الثالث : حذف الصور بما فيها الملف النصى ؟

كود PHP:
rm mido*

السؤال الرابع : حذف الملف النصى فقط ؟

كود PHP:
rm *.txt

السؤال الخامس : حذف المجلد بالكامل ؟

كود PHP:
rm *

كما رأينا كانت هذه بعض استخدامات ال * فى تنفيذ أمر عدة مرات بدون تكرار الأمر ونلاحظ السرعة فى تنفيذ الأوامر ولكن يجب الحذر حتى ﻻ نقع فى أخطاء تسبب مشاكل !!

أما عن ال wildcard الثانية وهى ال ? فلتوضيح كيفية استخدامها نقوم بعمل التالى :

السؤال الأول : حذف الصورة الرقمة من 10-12 ؟

كود PHP:
rm mido1?.jpg

السؤال الثانى : حذف الصور المرقمة من 1-9 ؟

كود PHP:
rm mido?.jpg

ﻻحظ هنا الفرق مابين ال ? ، * أن ال ? تقوم بحذف خانة واحدة بعدها فقط وليس كل ما يليها ولذلك الصور من 10-12 لن تكون فى نتائج الحذف ( جرب ذلك بنفسك )

السؤال الثالث : حذف الصور كلها بما فيها الملف النصى ؟

كود PHP:
rm mido?.*

هذه كانت أمثلة على استخدام ال ? فى تنفيذ أمر عدة مرات بدون تكرار أيضا مع ملاحظة الفارق بينها وبين ال* فى حالة السؤال الثانى.

والآن ننتقل إلى العلامة الثالثة والأخيرة وهى ال [] أو ال square brackets والتى تستطيع من خلالها تنفيذ أمر عدة مرات بدون تكرار ولنرى التالى :

السؤال الأول : حذف الصور 11 ، 12 فقط ؟
كود PHP:
rm mido1[12]

السؤال الثانى : حذف الصور من 10 - 12 ؟
كود PHP:
rm mido1[0-2]

وهكذا لتحديد خيارات الحذف أو الصور المراد حذفها يتم وضعها داخل ال []

وبعد أن استعرضنا بعض الأساسيات التى من الممكن احتياجها فى وقت ما سوف نستعرض أشياء أخرى تعتبر أساسية فى التعامل مع الطرفية وقد نقلتها من كتاب linux admin للكاتب أحمد نجيب الشهاوى لدعم الموضوع

أهم المفاتيح للتعامل مع الشل



space : به يتم الفصل بين الأمر والخيار الذى يتبعه .
‬‬‬
enter : ‫ هذا المفتاح هو الذى يخبر الشل‬ أنك انتهيت من كتابة الأمر لكى تبدأ‬ ‫فى التعامل مع الأمر .‬

backspace : ‫عند كتابة أمر أو خيار خطأ يتم به مسح الحروف الخاطئة .‬ ‬‬

tap : ‫يعتبر هذا المفتاح من أهم المفاتيح، فهو يظهر خاصية من أهم خصائص الطرفية أﻻ وهى إكمال الأمر .‬

مثلا إذا أردت الأمر‫ mkdir فما عليك إﻻ كتابة الأحرف ‬ mkd‬ ومن ثمّ‬ ستكمل لك الطرفية بقية الأمر إذا ضغطت ‪ tab‬مرتين .‬

أما إن كان هناك أكثر من أمر يبدأ ب ‪) mkd‬مثلا ‪ mkdir و ‪mkdev‬‬) ‫فسيتم عرضهم أمامك لكى تختار الأمر المناسب .‬

‫ويلاحظ أنه إذا تم الضغط على ال‪بدون كتابة أى أحرف فسيعرض عليك النظام عرض كل الأوامر الموجودة به tab‬ ،(يمكنك تجربة هذه الملاحظة) .‬
‬‬
shift+page up : ‫عند امتلاء الشاشة أﻣﺎﻣﻚ وأردت إسترجاع الجزء الذى اختفى بالأعلى‬ ‫فيمكننا بهذه المفاتيح رؤيتها.

shift+page down : عكس الذى قبله .

up or down : ‫الأسهم أعلى وأسفل ، هذه أيضا تُظهر خاصية من الخصائص الهامة لل ‫‪ shell‬ﻓﺎل ‪ up arrow ‬ يأتى لك ثانية بالأمر السابق دون الحاجة لإعادة كتابته ثانية .‬

ctrl+alt+F1 : ‫إذا كنت تعمل ﻋﻠﻰ الواجهة الرسومية ‬وأردت الانتقال اﻟﻰ الواجهة النصية ‬أى‬ ‫اﻟﺸﺎشة السوداء، فبهذه المفاتيح الثلاثة يمكنك اﻻنتقال اﻟﻴﻬﺎ .

(هناك 6 شاشات ‪ consol‬تبدأ من F1 ‬وحتى ‪ ، F6‬أما F7 ‬فترجع بك ‫ثانية إلى الواجهة الرسومية)

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

طبعا الموضوع طويل إن شاء الله وهيآخد وقت

وإن شاء الله أكمل السلسلة فى مشاركات أخرى فا صبرا عليا شوية علشان الموضوع يخرج فى أحسن صورة

السلام عليكم ورحمة الله وبركاته

ليست هناك تعليقات:

إرسال تعليق