<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/page/8/?d=4</link><description>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</description><language>ar</language><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x628;&#x646;&#x649; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; (Flow Control) &#x641;&#x64A; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; (Shell Scripts) -&#xA0;&#x627;&#x644;&#x62C;&#x632;&#x621; 1</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-flow-control-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-%C2%A0%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-1-r260/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-scripts-if-test-exit.png.223c25f101b562a85f944b0b77b40cab.png" /></p>

<div id="wmd-preview-section-92">
	<p id="كيف-تستخدم-بنى-التحكم-flow-control-في-سكربتات-الصدفة-الجزء-الأول">
		سنتعلم في هذا الدرس من سلسلة <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D9%83%D8%AA%D8%A7%D8%A8%D8%A9+%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA+%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9" rel="">مدخل إلى كتابة سكربتات الصدفة</a> كيفية إضافة "ذكاء" إلى سكربتاتنا، فإلى الآن كان يحتوي مشروعنا على سلسلة من الأوامر التي يبدأ تنفيذها من بداية الملف ويستمر سطرًا بسطر إلى أن يصل إلى نهاية الملف. لكن إمكانيات أغلبية البرامج أكبر من ما سبق، حيث تستطيع "اتخاذ القرارات" وإجراء عمليات مختلفة بناءً على مجموعة من الشروط. 
	</p>

	<p style="text-align: center;">
		<img alt="shell-scripts-if-test-exit.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16746" data-unique="nkge0zi57" src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-scripts-if-test-exit.png.afbd8bea0758dba2779e485144d0298e.png"></p>

	<p>
		توفِّر الصَدَفة عدِّة أوامر يمكننا استخدامها للتحكم في جريان تنفيذ البرنامج، وسنتعلم في هذا الدرس: 
	</p>

	<ul>
<li>
			if 
		</li>
		<li>
			test 
		</li>
		<li>
			exit
		</li>
	</ul>
</div>

<div id="wmd-preview-section-93">
	<h2 id="if">
		الأمر if
	</h2>

	<p>
		أول أمر سنلقي عليه نظرةً هو الأمر <span style="font-family:courier new,courier,monospace;">if</span>، يبدو من أول وهلة أنَّ الأمر <span style="font-family:courier new,courier,monospace;">if</span> بسيط جدًا، لأنه يتخذ قرارًا بناءً على "حالة الخروج" (exit status) لأحد الأوامر. الشكل العام لأمر<span style="font-family:courier new,courier,monospace;"> if</span>:
	</p>
</div>

<div id="wmd-preview-section-94">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5677_9">
<span class="pln">if commands; then
commands
[elif commands; then
commands...]
[else
commands]
fi</span></pre>

	<p>
		حيث commands هي مجموعة أوامر. قد تبدو الأمور مربكةً بعض الشيء في البداية، لكن قبل شرح الأمر if بالتفصيل، لنلقِ نظرة على آلية معرفة الصَدَفة لنجاح أو فشل تنفيذ أمر ما.
	</p>
</div>

<div id="wmd-preview-section-95">
	<h2 id="حالة-الخروج">
		حالة الخروج
	</h2>

	<p>
		تُرسِل الأوامر (بما في ذلك السكربتات ودوال الصدفة التي نكتبها) قيمة إلى النظام عند انتهاء تنفيذها تُسمى "حالة الخروج" (exit status)؛ هذه القيمة (والتي هي عدد صحيح يتراوح ما بين 0 و 255) تُشير إلى نجاح أو فشل تنفيذ الأمر. من الأعراف البرمجية أن تكون القيمة 0 تعني نجاح التنفيذ وأي قيمة أخرى تعني فشله. 
	</p>

	<p>
		توفِّر الصَدَفة معاملًا (parameter) خاصًا لتفحص حالة الخروج لآخر أمر مُنفَّذ:
	</p>
</div>

<div id="wmd-preview-section-96">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5677_12">
<span class="pln">$ ls -d /usr/bin
/usr/bin
$ echo $?
0
$ ls -d /bin/usr
ls: cannot access /bin/usr: No such file or directory
$ echo $?
2</span></pre>

	<p>
		نفَّذنا -في المثال السابق- الأمر <span style="font-family:courier new,courier,monospace;">ls</span> مرتين، حيث نُفِّذ تنفيذًا سليمًا في أول مرة، فلو عرضنا قيمة المعامل ‎$?‎ فسنرى أنها تساوي الصفر؛ ثم نفَّذنا الأمر <span style="font-family:courier new,courier,monospace;">ls</span> مرةً أخرى لكنه عرض رسالة خطأ وعندما طبعنا قيمة المعامل ‎$?‎ مرةً أخرى فسنرى أنَّها تساوي 2، مما يشير إلى أنَّ آخر أمر قد نُفِّذ واجه مشكلةً. 
	</p>

	<p>
		تستعمل بعض الأوامر حالات خروج مختلفة لتوفير معلومات حول الخطأ، لكن العديد من الأوامر تستعمل الرقم 1 فقط للإشارة إلى باقي أنواع الأخطاء.
	</p>

	<p>
		تحتوي صفحات الدليل man عادةً على قسم مُعنوَن "Exit Status" يشرح ما هي أرقام حالات الخروج المحتملة، لكن تذكَّر أنَّ 0 تُشير دائمًا إلى نجاح التنفيذ. 
	</p>

	<p>
		توفِّر الصَدَفة أمرَين مُضمَّنين فيها بسيطين للغاية، كلُ ما يفعلانه هو الانتهاء بحالة خروج 0 أو 1. ينجح تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">true</span> دائمًا ويفشل تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">false</span> دائمًا:
	</p>
</div>

<div id="wmd-preview-section-97">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_8">
<span class="pln">$ true
$ echo $?
0
$ false
$ echo $?
1</span></pre>

	<p>
		يمكننا استخدام هذه الأوامر لتجربة عبارة <span style="font-family:courier new,courier,monospace;">if</span> الشرطية. ما تفعله عبارة <span style="font-family:courier new,courier,monospace;">if</span> هو أنَّها تتحقق من نجاح أو فشل تنفيذ الأوامر التي تليها:
	</p>
</div>

<div id="wmd-preview-section-98">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_10">
<span class="pln">$ if true; then echo "It's true."; fi
It's true.
$ if false; then echo "It's true."; fi
$</span></pre>

	<p>
		يُنفَّذ الأمر <span style="font-family:courier new,courier,monospace;">echo "It's true."‎</span> عندما يُنفَّذ الأمر الذي يلي كلمة <span style="font-family:courier new,courier,monospace;">if</span> بنجاح، ولن يُنفَّذ عندما يفشل تنفيذ الأمر الذي يلي كلمة <span style="font-family:courier new,courier,monospace;">if</span>.
	</p>
</div>

<div id="wmd-preview-section-99">
	<h2 id="test">
		الأمر test
	</h2>

	<p>
		يُستخدَم الأمر <span style="font-family:courier new,courier,monospace;">test</span> كثيرًا مع الأمر <span style="font-family:courier new,courier,monospace;">if</span> لإنتاج القيمة true أو false. هذا الأمر غير اعتيادي لأنَّ له شكلان مختلفان:
	</p>
</div>

<div id="wmd-preview-section-100">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_12">
<span class="pln"># الشكل الأول
test expression

# الشكل الثاني
[ expression ]</span></pre>

	<p>
		آلية عمل الأمر <span style="font-family:courier new,courier,monospace;">test</span> بسيطةٌ جدًا، فلو كان التعبير (expression) الذي يليه صحيحًا، فسينتهي تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">test</span> بحالة خروج تساوي الصفر؛ فيما عدا ذلك سينتهي بحالة خروج تساوي 1. 
	</p>

	<p>
		من أهم مميزات الأمر <span style="font-family:courier new,courier,monospace;">test</span> تنوع التعابير التي تستطيع كتابتها فيه؛ هذا مثالٌ بسيط:
	</p>
</div>

<div id="wmd-preview-section-101">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_14">
<span class="pln">if [ -f .bash_profile ]; then
    echo "You have a .bash_profile. Things are fine."
else
    echo "Yikes! You have no .bash_profile!"
fi</span></pre>

	<p>
		استخدمنا في المثال السابق التعبير ‎<span style="font-family:courier new,courier,monospace;"> -f .bash_profile</span> الذي يقول: "هل الملف <span style="font-family:courier new,courier,monospace;">‎.bash_profile </span>موجود؟" فإن كان موجودًا فسينتهي الأمر <span style="font-family:courier new,courier,monospace;">test</span> بحالة خروج تساوي الصفر (أي true) وسيُنفِّذ الأمر <span style="font-family:courier new,courier,monospace;">if</span> الأوامر التي تتبع الكلمة then؛ وإذا لم يكن الملف موجودًا فسينتهي الأمر <span style="font-family:courier new,courier,monospace;">test</span> بحالة خروج تساوي الواحد (أي false) وسيُنفِّذ الأمر <span style="font-family:courier new,courier,monospace;">if</span> الأوامر التي تلي الكلمة <span style="font-family:courier new,courier,monospace;">else</span>. 
	</p>

	<p>
		هذه قائمة مختصرة بالتعابير التي يمكن استعمالها في الأمر <span style="font-family:courier new,courier,monospace;">test</span>. ولمّا كان الأمر <span style="font-family:courier new,courier,monospace;">test</span> مُضمَّنًا في الصَدَفة (shell builtin)، فتستطيع استخدام <span style="font-family:courier new,courier,monospace;">help</span> <span style="font-family:courier new,courier,monospace;">test</span> لرؤية القائمة الكاملة. 
	</p>

	<ul>
<li>
			<strong><span style="font-family:courier new,courier,monospace;">‎-d dir</span></strong>: الناتج هو true إذا كان dir مجلدًا. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">-e file</span></strong>: الناتج هو true إذا كان file موجودًا. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">‎-f file</span></strong>: الناتج هو true إذا كان file ملفًا عاديًا موجودًا. 
		</li>
		<li>
			‎-<strong><span style="font-family:courier new,courier,monospace;">L file</span></strong>: الناتج هو true إذا كان file وصلةً رمزيةً (symbolic link). 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">‎-r file</span></strong>: الناتج هو true إذا كنت تستطيع قراءة الملف file. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">-w file</span></strong>: الناتج هو true إذا كنت تستطيع الكتابة على الملف file. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">-x file</span></strong>: الناتج هو true إذا كنت تستطيع تنفيذ الملف file. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">file1 -nt file2</span></strong>: الناتج هو true إذا كان الملف file1 أحدث (وفقًا لوقت التعديل [modification time]) من الملف file2. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">file1 -ot file2</span></strong>: الناتج هو true إذا كان الملف file1 أقدم من file2. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">-z string</span></strong>: الناتج هو true إذا كنت السلسلة النصية string فارغة. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">‎-n string</span></strong>: الناتج هو true إذا لم تكن السلسلة النصية string فارغة. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">string1 = string2</span></strong>: الناتج هو true إذا كانت السلسلة النصية string1 مساويةً للسلسلة النصية string2. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">string1 != string2</span></strong>: الناتج هو true إذا لم تكن السلسلة النصية string1 مساويةً للسلسلة النصية string2. 
		</li>
	</ul>
<p>
		قبل أن نواصل أريد أن أشرح بقية المثال السابق لأنه يبرز عددًا من الأفكار المهمة. 
	</p>

	<p>
		رأينا في بداية السكربت الأمر <span style="font-family:courier new,courier,monospace;">if</span> متبوعًا بالأمر <span style="font-family:courier new,courier,monospace;">test</span> متبوعًا بفاصلة منقوطة وفي النهاية الكلمة then. اخترت استعمال الشكل <span style="font-family:courier new,courier,monospace;">[ expression ]</span> للأمر <span style="font-family:courier new,courier,monospace;">test</span> لأنَّ أغلبية الناس يرون أنَّ قراءته أسهل. لاحظ أنَّ الفراغات مطلوبة بين قوس البداية ] وبداية التعبير، وكذلك الفراغ بين نهاية التعبير وقوس الإغلاق [. 
	</p>

	<p>
		تعمل الفاصلة المنقوطة كفاصل بين الأوامر، مما يسمح بوضع أكثر من أمر في نفس السطر. مثلًا:
	</p>
</div>

<div id="wmd-preview-section-102">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_16">
<span class="pln">$ clear; ls</span></pre>

	<p>
		سيؤدي إلى مسح الشاشة ثم تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">ls</span>. 
	</p>

	<p>
		استخدمتُ الفاصلة المنقوطة في عبارة <span style="font-family:courier new,courier,monospace;">if</span> السابقة لأنني أريد وضع الكلمة <span style="font-family:courier new,courier,monospace;">then</span> في نفس سطر الأمر <span style="font-family:courier new,courier,monospace;">if</span> لأنني أرى أنَّها قراءتها أسهل بهذه الطريقة. 
	</p>

	<p>
		سنشاهد صديقنا القديم <span style="font-family:courier new,courier,monospace;">echo</span> في السطر الثاني، لكنك ستلاحظ وجود محاذاة (أي فراغات قبل الأمر)، وهذا لغرض تسهيل قابلية القراءة، ومن التقاليد البرمجية أن نحاذي جميع الأوامر داخل العبارة الشرطية <span style="font-family:courier new,courier,monospace;">if</span> (أي جميع الأسطر التي ستُنفَّذ عند تحقيق شرط معيّن). تذكَّر أنَّ الصَدَفة لا تتطلَّب فعل ذلك، لكننا نفعله لجعل قراءة الشيفرة أسهل. 
	</p>

	<p>
		بعبارة أخرى، يمكننا كتابة الشيفرات الآتية وسنحصل على نفس النتيجة:
	</p>
</div>

<div id="wmd-preview-section-103">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_18">
<span class="pln"># Alternate form

if [ -f .bash_profile ]
then
    echo "You have a .bash_profile. Things are fine."
else
    echo "Yikes! You have no .bash_profile!"
fi

# Another alternate form

if [ -f .bash_profile ]
then echo "You have a .bash_profile. Things are fine."
else echo "Yikes! You have no .bash_profile!"
fi</span></pre>

	<h2>
		الأمر exit
	</h2>
</div>

<div id="wmd-preview-section-104">
	<p>
		لكي نكتب سكربتات صدفة جيدة، فعلينا ضبط حالة خروج عندما ينتهي تنفيذ السكربت، ونستعمل الأمر <span style="font-family:courier new,courier,monospace;">exit</span> لفعل ذلك، الذي يؤدي إلى إيقاف تنفيذ السكربت فوريًا وضبط حالة الخروج إلى القيمة المُمرَّرة كوسيط إليه. على سبيل المثال، الأمر الآتي:
	</p>
</div>

<div id="wmd-preview-section-105">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_20">
<span class="pln">exit 0</span></pre>

	<p>
		سيؤدي إلى إيقاف تنفيذ السكربت وضبط حالة الخروج إلى 0 (أي نجاح التنفيذ)، بينما:
	</p>
</div>

<div id="wmd-preview-section-106">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_22">
<span class="pln">exit 1</span></pre>

	<p>
		سيؤدي إلى إيقاف تنفيذ السكربت وضبط حالة الخروج إلى 1 (أي فشل التنفيذ).
	</p>
</div>

<div id="wmd-preview-section-107">
	<h2 id="التحقق-من-أن-المستخدم-المشغل-للسكربت-هو-الجذر">
		التحقق من أن المستخدم المشغل للسكربت هو الجذر
	</h2>

	<p>
		آخر مرة تركنا فيها السكربت كنا نحتاج إلى تشغيله بامتيازات الجذر، وذلك لأنَّ الدالة <span style="font-family:courier new,courier,monospace;">home_space </span>تحتاج إلى معرفة المساحة التخزينية التي تستهلكها مجلدات المنزل للمستخدمين. 
	</p>

	<p>
		لكن ماذا سيحدث لو حاول مستخدمٌ عادي تشغيل السكربت؟ سيؤدي ذلك إلى إظهار الكثير من رسائل الخطأ القبيحة. لكن ماذا لو وضعنا شيئًا في السكربت يمنع تنفيذه من المستخدم العادي؟ 
	</p>

	<p>
		الأمر<span style="font-family:courier new,courier,monospace;"> id</span> يخبرنا من هو المستخدم الحالي، وعند تمرير الخيار ‎<span style="font-family:courier new,courier,monospace;">-u</span> إليه فسيطبع قيمة عددية لمُعرِّف المستخدم (user ID) الحالي.
	</p>
</div>

<div id="wmd-preview-section-108">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_24">
<span class="pln">$ id -u
501
$ su
Password:
# id -u
0</span></pre>

	<p>
		فلو نفَّذ المستخدم الجذر الأمر <span style="font-family:courier new,courier,monospace;">id -u</span> فسيكون الناتج هو 0، ويمكننا أن نستثمر هذه المعلومة لكي تكون الأساس الذي سنبني عليه الاختبار الذي سنضعه في السكربت:
	</p>
</div>

<div id="wmd-preview-section-109">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_26">
<span class="pln">if [ $(id -u) = "0" ]; then
    echo "superuser"
fi</span></pre>

	<p>
		تحققنا في المثال السابق أنَّ ناتج الأمر id -u مساوٍ للسلسلة النصية "0" ثم طبعنا العبارة "superuser". 
	</p>

	<p>
		وعلى الرغم من أنَّ الأمر السابق يكتشف إن كان المستخدم هو المستخدم الجذر، إلا أنَّه لم يحل المشكلة بعد. إذ نريد أن يتوقف تنفيذ السكربت إن لم يكن المستخدم المُشغِّل له هو الجذر، لذلك نكتب الشيفرة الآتية:
	</p>
</div>

<div id="wmd-preview-section-68">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_28">
<span class="pln">if [ $(id -u) != "0" ]; then
    echo "You must be the superuser to run this script" &gt;&amp;2
    exit 1
fi</span></pre>

	<p>
		نتحقق في الشيفرة السابقة أنَّ ناتج الأمر <span style="font-family:courier new,courier,monospace;">id -u </span>لا يساوي "0"، ثم سيطبع السكربت رسالة خطأ مفهومة، ثم ينتهي تنفيذه بحالة خروج مساوية للواحد، لكي يخبر النظام أنَّه لم يتم التنفيذ بنجاح. 
	</p>

	<p>
		لاحظ وجود ‎<span style="font-family:courier new,courier,monospace;">&gt;&amp;2</span> في نهاية الأمر <span style="font-family:courier new,courier,monospace;">echo</span>، الذي هو شكلٌ من أشكال إعادة توجيه الدخل والخرج (I/O redirection)، وسترى هذا التعبير عادةً في نهاية الأوامر التي تطبع رسائل خطأ، لأننا لو لم نُعِد توجيه مجرى الخطأ هنا، فسترسَل رسالة الخطأ إلى مجرى الخرج القياسي (standard output stream)، لكننا نريد أن تظهر رسائل الخطأ بمعزل عن مخرجات السكربت، لأننا نعيد توجيه مجرى الخرج القياسي الناتج من تنفيذ السكربت إلى ملف. 
	</p>

	<p>
		علينا أن نضع الأسطر السابقة في بداية السكربت لكي نتمكن من تحديد هوية المستخدم المُشغِّل قبل أن يقع الخطأ، لكننا نريد في الوقت نفسه أنَّ يمكن المستخدمون العاديون من تشغيل السكربت، لذلك سنعدِّل الدالة <span style="font-family:courier new,courier,monospace;">home_space</span> لكي تتأكد من امتيازات المستخدم كالآتي:
	</p>
</div>

<div id="wmd-preview-section-69">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3889_30">
<span class="pln">function home_space
{
    # Only the superuser can get this information

    if [ "$(id -u)" = "0" ]; then
        echo "</span><span class="tag">&lt;h2&gt;</span><span class="pln">Home directory space by user</span><span class="tag">&lt;/h2&gt;</span><span class="pln">"
        echo "</span><span class="tag">&lt;pre&gt;</span><span class="pln">"
        echo "Bytes Directory"
            du -s /home/* | sort -nr
        echo "</span><span class="tag">&lt;/pre&gt;</span><span class="pln">"
    fi

}   # end of home_space</span></pre>

	<p>
		بهذه الطريقة سيتمكن المستخدم العادي من تشغيل السكربت، وسيتم تجاوز الشيفرة التي قد تتسبب بخطأ بدلًا من تنفيذها وإظهار رسالة للمستخدم. 
	</p>

	<p>
		ترجمة -وبتصرّف- للمقال <a href="http://linuxcommand.org/lc3_wss0080.php" rel="external nofollow">Flow Control - Part 1</a> لصاحبه William Shotts.
	</p>
</div>
]]></description><guid isPermaLink="false">260</guid><pubDate>Tue, 24 May 2016 19:29:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; &#x641;&#x64A; &#x633;&#x643;&#x631;&#x628;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; (Shell Scripts)</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r257/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-scripts-functions.png.ab42070568b4dd305aee52c7b8cee26c.png" /></p>

<p dir="rtl">
	عندما يزداد طول البرامج وتعقيدها، فستزداد صعوبة تصميمها وبرمجتها وصيانتها؛ لذا من المفيد عادةً تقسيم المهام الكبيرة إلى سلسلة من المهام الأصغر.
</p>

<p dir="rtl">
	سنُقسِّم في هذا الدرس السكربت الذي كنا نعمل عليه إلى عدد من الدوال (functions) المنفصلة.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="16527" data-unique="4xdxf2esu" src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-scripts-functions.png.a4a87e83ec15f406108cda3197abb446.png" alt="shell-scripts-functions.png"></p>

<p dir="rtl">
	لكي نتعرف على مفهوم الدوال، فلنحاول وصف طريقة القيام بمهمة يومية: الذهاب إلى السوق وشراء الطعام. تخيل أننا سنصف العملية إلى كائنات فضائية آتية من المريخ.
</p>

<p dir="rtl">
	سيبدو الوصف العام لعملية شراء الطعام كالآتي:
</p>

<ol dir="rtl">
<li>
		غادر المنزل
	</li>
	<li>
		قد السيارة إلى السوق
	</li>
	<li>
		اركن السيارة
	</li>
	<li>
		ادخل السوق
	</li>
	<li>
		اشترِ طعامًا
	</li>
	<li>
		قد السيارة إلى المنزل
	</li>
	<li>
		اركن السيارة
	</li>
	<li>
		ادخل إلى المنزل
	</li>
</ol>
<p dir="rtl">
	سيُغطِّي الشرح السابق الآلية العامة للذهاب إلى السوق؛ لكن تلك الكائنات الفضائية ستحتاج مزيدًا من التفاصيل، فمثلًا يمكن وصف المهمة الفرعية "اركن السيارة" كالآتي:
</p>

<ol dir="rtl">
<li>
		اعثر على مكان فارغ لركن السيارة
	</li>
	<li>
		قد السيارة إلى ذاك المكان
	</li>
	<li>
		أطفئ المحرك
	</li>
	<li>
		"ارفع" المكابح اليدوية
	</li>
	<li>
		اخرج من السيارة
	</li>
	<li>
		اقفل السيارة
	</li>
</ol>
<p dir="rtl">
	ويمكن بالطبع تقسيم خطوة "أطفئ المحرك" إلى عدد من الخطوات مثل:
</p>

<ol dir="rtl">
<li>
		أطفئ دارة الإشعال
	</li>
	<li>
		أخرج مفتاح السيارة
	</li>
</ol>
<p dir="rtl">
	وهكذا إلى أن تُفصِّل كل خطوة من كامل عملية الذهاب إلى السوق.
</p>

<p dir="rtl">
	عملية تعريف الخطوط الأساسية ومن ثم كتابة التفاصيل لتلك الخطوات تسمى "نمط تصميم Top-Down". يسمح هذا النمط لنا بتقسيم المهام الكبيرة والضخمة إلى مهام أبسط وأصغر.
</p>

<p dir="rtl">
	سنستخدم نمط تصميم Top-Down ليساعدنا في التخطيط لبرنامجنا الذي سنكمل تطويره وإضافة الميزات إليه.
</p>

<p dir="rtl">
	يمكننا تلخيص "الوصف العام" للمهام التي يقوم بها السكربت الآن:
</p>

<ol dir="rtl">
<li>
		بداية الصفحة
	</li>
	<li>
		بداية ترويسة الصفحة
	</li>
	<li>
		كتابة العنوان
	</li>
	<li>
		إغلاق الترويسة
	</li>
	<li>
		بداية جسم الصفحة
	</li>
	<li>
		كتابة العنوان
	</li>
	<li>
		كتابة بصمة الوقت (timestamp)
	</li>
	<li>
		إغلاق الجسم
	</li>
	<li>
		إغلاق الصفحة
	</li>
</ol>
<p dir="rtl">
	تمت برمجة كل الخطوات السابقة، لكننا نريد إضافة المزيد. لندرج بعض المهام الإضافية بعد المهمة السابعة:
</p>

<ol dir="rtl" start="7">
<li>
		كتابة بصمة الوقت
	</li>
	<li>
		كتابة معلومات عن إصدار النظام
	</li>
	<li>
		كتابة الوقت الذي مضى منذ آخر تشغيل (uptime)
	</li>
	<li>
		كتابة مساحة القرص
	</li>
	<li>
		كتابة المساحة التخزينية لمجلدات المنزل (home)
	</li>
	<li>
		إغلاق الجسم
	</li>
	<li>
		إغلاق الصفحة
	</li>
</ol>
<p dir="rtl">
	سيكون من حسن حظنا وجود أوامر تستطيع تنفيذ المهام الإضافية، فسنستطيع استخدام "تعويض الأوامر" (command substitution) لوضعها في السكربت كالآتي:
</p>

<pre class="ipsCode" id="ips_uid_8709_7">
#!/bin/bash

# sysinfo_page - A script to produce a system information HTML file

##### Constants

TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Main

cat &lt;&lt;- _EOF_
  &lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;$TITLE&lt;/title&gt;
  &lt;/head&gt;

  &lt;body&gt;
      &lt;h1&gt;$TITLE&lt;/h1&gt;
      &lt;p&gt;$TIME_STAMP&lt;/p&gt;
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)
  &lt;/body&gt;
  &lt;/html&gt;
_EOF_</pre>

<p dir="rtl">
	أما للمهام التي لا توجد أوامر تستطيع فعل ما نريد تحديدًا، فيمكننا إنشاؤها باستخدام دوال الصدفة (shell functions).
</p>

<p dir="rtl">
	وكما تعلمنا في أحد الدروس السابقة، يمكن اعتبار دوال الصدفة على أنها "برامج صغيرة ضمن البرامج" وتسمح لنا باتباع مبادئ نمط التصميم top-down. علينا تعديل السكربت كالآتي لإضافة دوال الصدفة:
</p>

<pre class="ipsCode" id="ips_uid_8709_9">
#!/bin/bash

# sysinfo_page - A script to produce an system information HTML file

##### Constants

TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Functions

system_info()
{

}


show_uptime()
{

}


drive_space()
{

}


home_space()
{

}

##### Main

cat &lt;&lt;- _EOF_
  &lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;$TITLE&lt;/title&gt;
  &lt;/head&gt;

  &lt;body&gt;
      &lt;h1&gt;$TITLE&lt;/h1&gt;
      &lt;p&gt;$TIME_STAMP&lt;/p&gt;
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)
  &lt;/body&gt;
  &lt;/html&gt;
_EOF_
       </pre>

<p dir="rtl">
	هنالك نقطتان تجدر الإشارة إليهما: أولهما أنَّه يجب تعريف دوال الصدفة قبل محاولة استخدامها؛ وثانيهما هو أنَّ جسم الدالة (أي القسم الذي يقع بين قوس البداية "}" وقوس النهاية "{") يجب أن يحتوي على أمرٍ واحدٍ على الأقل. لن يعمل السكربت السابق وسيُظهِر رسالة خطأ وذلك لأنَّ جسم الدوال فارغ. أبسط طريقة لتصحيح هذه المشكلة هي وضع عبارة "<span style="font-family:courier new,courier,monospace;">return</span>" في جسم كل دالة، وبعدها سيُنفَّذ السكربت بنجاح.
</p>

<h2 dir="rtl">
	إبقاء السكربتات قابلة للتشغيل
</h2>

<p dir="rtl">
	من المفيد أثناء تطويرنا للتطبيق أن نُضيف جزءًا يسيرًا من الشيفرات ثم نُجرِّب السكربت ثم نضيف المزيد ثم نجرِّب السكربت وهكذا. وبهذه الطريقة سيسهل العثور على الأخطاء في الشيفرة ومن ثم تصحيحها.
</p>

<p dir="rtl">
	بعد إضافة الدوال إلى السكربت، أصبح بإمكانك الآن مراقبة التسلسل المنطقي لتنفيذ السكربت وذلك عبر آلية يُطلَق عليها اسم stubbing أي إضافة شيفرة وهمية. يمكنك تخيل هذه الآلية كما يلي: لنفترض أننا نريد إنشاء دالة اسمها "<span style="font-family:courier new,courier,monospace;">system_info</span>" لكننا لم نفكر في تفاصيل الشيفرة بشكل كامل. فبدلًا من إيقاف عملية تطوير السكربت إلى أن ننتهي من الدالة <span style="font-family:courier new,courier,monospace;">system_info </span>فيمكننا إضافة الأمر <span style="font-family:courier new,courier,monospace;">echo</span> إليها كالآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_11">
<span class="pln">system_info()
{
    # Temporary function stub
    echo "function system_info"
}
       </span></pre>

<p dir="rtl">
	سنتمكن باستخدام هذه الآلية من تنفيذ السكربت دون خطأ حتى لو لم نكمل برمجة الدالة <span style="font-family:courier new,courier,monospace;">system_info</span>؛ ونستطيع لاحقًا وضع الشيفرة الحقيقية بدلًا من أمر <span style="font-family:courier new,courier,monospace;">echo</span> السابق.
</p>

<p dir="rtl">
	سبب استخدامنا لأمر <span style="font-family:courier new,courier,monospace;">echo</span> هو أننا نحتاج إلى مؤشر لكي نعرف أنَّ السكربت قد نفَّذ الدالة المعنية.
</p>

<p dir="rtl">
	لنُطبِّق هذه الآلية على جميع الدوال في السكربت:
</p>

<pre class="ipsCode" id="ips_uid_8709_13">
#!/bin/bash

# sysinfo_page - A script to produce an system information HTML file

##### Constants

TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Functions

system_info()
{
    # Temporary function stub
    echo "function system_info"
}


show_uptime()
{
    # Temporary function stub
    echo "function show_uptime"
}


drive_space()
{
    # Temporary function stub
    echo "function drive_space"
}


home_space()
{
    # Temporary function stub
    echo "function home_space"
}


##### Main

cat &lt;&lt;- _EOF_
  &lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;$TITLE&lt;/title&gt;
  &lt;/head&gt;

  &lt;body&gt;
      &lt;h1&gt;$TITLE&lt;/h1&gt;
      &lt;p&gt;$TIME_STAMP&lt;/p&gt;
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)
  &lt;/body&gt;
  &lt;/html&gt;
_EOF_</pre>

<p dir="rtl">
	سنكمل الآن العمل على كل دالة على حدة لكي تُخرِج معلوماتٍ مفيدةً.
</p>

<h2 dir="rtl">
	show_uptime
</h2>

<p dir="rtl">
	ستُظهِر الدالة <span style="font-family:courier new,courier,monospace;">show_uptime</span> ناتج الأمر <span style="font-family:courier new,courier,monospace;">uptime</span>، الذي يعرض عدِّة معلومات مثيرة للاهتمام حول النظام، بما في ذلك المدة الزمنية منذ آخر إعادة تشغيل، وعدد المستخدمين، والحِمل (load) الحالي على النظام.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_15">
<span class="pln">$ uptime
9:15pm up 2 days, 2:32, 2 users, load average: 0.00, 0.00, 0.00</span></pre>

<p dir="rtl">
	لعرض ناتج الأمر <span style="font-family:courier new,courier,monospace;">uptime</span> في صفحة HTML، فسنحتاج إلى برمجة دالة الصدفة كالآتي (وذلك بعد حذف الشيفرة الوهمية التي كانت فيها):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_17">
<span class="pln">show_uptime()
{
    echo "</span><span class="tag">&lt;h2&gt;</span><span class="pln">System uptime</span><span class="tag">&lt;/h2&gt;</span><span class="pln">"
    echo "</span><span class="tag">&lt;pre&gt;</span><span class="pln">"
    uptime
    echo "</span><span class="tag">&lt;/pre&gt;</span><span class="pln">"
}
  </span></pre>

<p dir="rtl">
	كما ترى، تُخرِج الدالة السابقة نصًا يحتوي على خليطٍ من وسوم HTML مع مخرجات الأمر <span style="font-family:courier new,courier,monospace;">uptime</span>؛ وستصبح هذه المخرجات جزءًا من here script عندما تُجرى عملية "تعويض الأوامر" في الجزء الرئيسي من السكربت.
</p>

<h2 dir="rtl">
	drive_space
</h2>

<p dir="rtl">
	تستخدم الدالة <span style="font-family:courier new,courier,monospace;">drive_space</span> الأمر <span style="font-family:courier new,courier,monospace;">df</span> لتوفير ملخص للمساحة التخزينية المستهلكة من أنظمة الملفات الموصولة (mounted file systems).
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_19">
<span class="pln">$ df

Filesystem   1k-blocks      Used Available Use% Mounted on

/dev/hda2       509992    225772    279080  45% /
/dev/hda1        23324      1796     21288   8% /boot
/dev/hda3     15739176   1748176  13832360  12% /home
/dev/hda5      3123888   3039584     52820  99% /usr</span></pre>

<p dir="rtl">
	ستبدو بنية دالة <span style="font-family:courier new,courier,monospace;">dive_space</span> شبيهةً للغاية بدالة <span style="font-family:courier new,courier,monospace;">show_uptime</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_21">
<span class="pln">drive_space()
{
    echo "</span><span class="tag">&lt;h2&gt;</span><span class="pln">Filesystem space</span><span class="tag">&lt;/h2&gt;</span><span class="pln">"
    echo "</span><span class="tag">&lt;pre&gt;</span><span class="pln">"
    df
    echo "</span><span class="tag">&lt;/pre&gt;</span><span class="pln">"
}</span></pre>

<h2 dir="rtl">
	home_space
</h2>

<p dir="rtl">
	ستُظهِر دالة <span style="font-family:courier new,courier,monospace;">home_space</span> مقدار المساحة التخزينية التي يستهلكها كل مستخدم في مجلد المنزل الخاص به. سيُعرَض الناتج كقائمة مرتبة تنازليًا وفق مقدار المساحة التخزينية المستخدمة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_23">
<span class="pln">home_space()
{
    echo "</span><span class="tag">&lt;h2&gt;</span><span class="pln">Home directory space by user</span><span class="tag">&lt;/h2&gt;</span><span class="pln">"
    echo "</span><span class="tag">&lt;pre&gt;</span><span class="pln">"
    echo "Bytes Directory"
    du -s /home/* | sort -nr
    echo "</span><span class="tag">&lt;/pre&gt;</span><span class="pln">"
}</span></pre>

<p dir="rtl">
	لاحظ أنَّه يجب تنفيذ السكربت عبر مستخدم يملك امتيازات إدارية لكي تعمل الدالة السابقة بشكلٍ صحيح، لأنَّ الأمر <span style="font-family:courier new,courier,monospace;">du</span> يتطلب امتيازات الجذر (root) لكي يتفحص محتويات المجلد <span style="font-family:courier new,courier,monospace;">‎/home</span>.
</p>

<h2 dir="rtl">
	system_info
</h2>

<p dir="rtl">
	لسنا جاهزين بعد لإكمال دالة <span style="font-family:courier new,courier,monospace;">system_info</span>. لكننا سنُحسِّن من الشيفرة الوهمية التي فيها لكي تُنتِج وسوم HTML:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8709_25">
<span class="pln">system_info()
{
    echo "</span><span class="tag">&lt;h2&gt;</span><span class="pln">System release info</span><span class="tag">&lt;/h2&gt;</span><span class="pln">"
    echo "</span><span class="tag">&lt;p&gt;</span><span class="pln">Function not yet implemented</span><span class="tag">&lt;/p&gt;</span><span class="pln">"
}
  </span></pre>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقالَين <a href="http://linuxcommand.org/lc3_wss0060.php" rel="external nofollow">Shell Functions</a> و <a href="http://linuxcommand.org/lc3_wss0070.php" rel="external nofollow">Some Real Work</a> لصاحبهما William Shotts.
</p>
]]></description><guid isPermaLink="false">257</guid><pubDate>Tue, 17 May 2016 09:51:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x62B;&#x648;&#x627;&#x628;&#x62A; &#x648;&#x62A;&#x639;&#x648;&#x64A;&#x636; &#x627;&#x644;&#x623;&#x648;&#x627;&#x645;&#x631; &#x641;&#x64A; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; (Shell Scripts)</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AB%D9%88%D8%A7%D8%A8%D8%AA-%D9%88%D8%AA%D8%B9%D9%88%D9%8A%D8%B6-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r256/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-scripts-variables-constants.png.ff55749e11b5719ff30beb0618756940.png" /></p>

<div id="wmd-preview-section-25">
	<p id="المتغيرات-والثوابت-وتعويض-الأوامر-في-سكربتات-الصدفة">
		رأينا في الدرس السابق كيف <a href="https://academy.hsoub.com/devops/linux/%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D9%85%D8%AE%D8%B1%D8%AC%D8%A7%D8%AA-%D9%85%D8%B9-here-scripts-%D9%84%D8%AF%D9%89-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r255/" rel="">كتبنا سكربتًا يولِّد صفحة HTML</a>، لكن هذا ليس كافيًا لنا، فلنقم ببعض التعديلات.
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="16230" data-unique="ngq9o4y9v" src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-scripts-variables-constants.png.1afc2d9df12f6feed6ef268eb8f2b804.png" alt="shell-scripts-variables-constants.png"></p>
</div>

<div id="wmd-preview-section-26">
	<pre class="ipsCode" id="ips_uid_5489_9">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        My System Information
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
    &lt;h1&gt;My System Information&lt;/h1&gt;
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		هل لاحظت كيف أنَّ العبارة "My System Information" مكررة مرتين في السكربت السابق؟ لنُحسِّنها هكذا:
	</p>
</div>

<div id="wmd-preview-section-27">
	<pre class="ipsCode" id="ips_uid_5489_15">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

title="My System Information"

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        $title
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
    &lt;h1&gt;$title&lt;/h1&gt;
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		أضفنا سطرًا إلى بداية السكربت ووضعنا <span style="font-family:courier new,courier,monospace;">‎$title</span> بدلًا من العبارة "My System Information".
	</p>
</div>

<div id="wmd-preview-section-28">
	<h2 id="المتغيرات">
		المتغيرات
	</h2>

	<p>
		ما فعلناه في الأعلى سيمهد لنا الطريق لشرح فكرة أساسية جدًا موجودة في جميع لغات البرمجة تقريبًا: المتغيرات (variables). المتغيرات هي أماكن في الذاكرة يمكن أن تُستعمَل لتخزين المعلومات، ويُشار إليها باسمٍ مُميِّزٍ لها. 
	</p>

	<p>
		أنشأنا في السكربت السابق متغيرًا اسمه <span style="font-family:courier new,courier,monospace;">title</span> ووضعنا العبارة "My System Information" في الذاكرة، ثم استخدمنا ‎<span style="font-family:courier new,courier,monospace;">$title</span> لإخبار الصَدَفة أننا نريد إجراء "توسعة المعاملات" (parameter expansion) ونضع محتوى المتغير بدلًا من اسمه. 
	</p>

	<p>
		عندما ترى الصَدَفة كلمةً تبدأ برمز $ فستحاول معرفة إذا كانت تُشير تلك الكلمة إلى متغير، ثم ستضع القيمة المُخزَّنة فيه -أي المتغير- مكان ورود تلك الكلمة.
	</p>
</div>

<div id="wmd-preview-section-29">
	<h2 id="كيفية-إنشاء-متغير">
		كيفية إنشاء متغير
	</h2>

	<p>
		كل ما عليك فعله لإنشاء متغير هو وضع اسم المتغير في سطرٍ مستقل متبوعًا برمز المساواة (=) دون أيّة فراغات، ثم كتابة المعلومات التي تريد إسنادها بعد رمز المساواة.
	</p>
</div>

<div id="wmd-preview-section-30">
	<h2 id="أسماء-المتغيرات">
		أسماء المتغيرات
	</h2>

	<p>
		حسنًا، أنت من يُسمي المتغيرات، لكن هنالك بعض القواعد التي عليك مراعاتها: 
	</p>

	<ol>
<li>
			يجب أن تبدأ أسماء المتغيرات بحرف. 
		</li>
		<li>
			يجب ألّا يحتوي اسم المتغير على فراغات. استخدم الشرطات السفلية (_) بدلًا منها. 
		</li>
		<li>
			لا تستطيع استخدام علامات الترقيم.
		</li>
	</ol>
</div>

<div id="wmd-preview-section-31">
	<h2 id="كيف-أثر-المتغير-على-السكربت-الذي-نكتبه">
		كيف أثر المتغير على السكربت الذي نكتبه
	</h2>

	<p>
		سهَّلت إضافة المتغير <span style="font-family:courier new,courier,monospace;">title</span> الأمر علينا من ناحيتين: الأولى هي تقليل مقدار الكتابة الذي نحتاجه، والثانية (وهي المهمة) هي أننا جعلنا صيانة السكربت أسهل. 
	</p>

	<p>
		كلما ازدادت خبرتك في كتابة سكربتات الشِل (أو أي لغة برمجة أخرى)، فستتعلم أنَّك لا تنتهي من كتابة البرنامج في خطوة واحدة، فهنالك تعديلات وتحسينات من قبِل كاتب البرنامج أو من غيره؛ وهذا هو حجر الأساس لعملية تطوير البرمجيات مفتوحة المصدر. فلنقل مثلًا أنَّك تريد تغيير العبارة "My System Information" إلى "Linuxbox System Information"، فكنت تحتاج -في النسخة القديمة من السكربت- إلى تغيير تلك العبارة في مكانين منفصلين، أما في النسخة الجديدة التي فيها المتغير <span style="font-family:courier new,courier,monospace;">title</span> فلا حاجة إلى تغيير تلك العبارة إلا في مكانٍ وحيد. قد تظن أنَّ هذا التغيير تافه أو ليس له فائدة حقيقية، لكن ذلك لأنَّ السكربت الذي نكتبه ما يزال بسيطًا وقصيرًا؛ لكن التنظيم أساسيٌ جدًا في السكربتات الكبيرة والمعقدة.
	</p>
</div>

<div id="wmd-preview-section-32">
	<h2 id="متغيرات-البيئة-environment-variables">
		متغيرات البيئة Environment Variables
	</h2>

	<p>
		هنالك بعض المتغيرات المضبوطة في جلسة الصَدَفة من قِبل ملفات البدء التي رأيناها سابقًا. استعمل الأمر <span style="font-family:courier new,courier,monospace;">printenv</span> لرؤية جميع المتغيرات الموجودة في البيئة عندك؛ يحتوي أحد تلك المتغيرات "اسم المضيف" (hostname) لنظامك؛ ونستطيع أن نُضيف ذاك المتغير إلى السكربت كالآتي:
	</p>
</div>

<div id="wmd-preview-section-33">
	<pre class="ipsCode" id="ips_uid_5489_17">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

title="System Information for"

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        $title $HOSTNAME
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
    &lt;h1&gt;$title $HOSTNAME&lt;/h1&gt;
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		أصبح السكربت الآن يضع اسم الحاسوب الذي نعمل عليه في صفحة HTML الناتجة. لاحظ أنَّ أسماء متغيرات البيئة (وفق التقاليد البرمجية) تُكتَب بأحرفٍ كبيرة.
	</p>
</div>

<div id="wmd-preview-section-34">
	<h2 id="تعويض-الأوامر">
		تعويض الأوامر
	</h2>

	<p>
		سنحاول الآن تحسين السكربت بوضع ناتج من أحد الأوامر فيه. 
	</p>

	<p>
		كانت آخر نسخة من السكربت قادرةً على إنشاء صفحة HTML تحتوي على أسطر نصية بسيطة تتضمن اسم المضيف لجهازنا المأخوذ من متغير البيئة المسمى <span style="font-family:courier new,courier,monospace;">HOSTNAME</span>، سنُحدِّث السكربت الآن لإضافة بصمة وقت إلى الصفحة لكي تُشير إلى آخر تحديث لها، مع ذكر اسم المستخدم الذي قام بالتحديث.
	</p>
</div>

<div id="wmd-preview-section-35">
	<pre class="ipsCode" id="ips_uid_5489_20">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

title="System Information for"

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        $title $HOSTNAME
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
    &lt;h1&gt;$title $HOSTNAME&lt;/h1&gt;
    &lt;p&gt;Updated on $(date +"%x %r %Z") by $USER&lt;/p&gt;
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		كما لاحظت، استعملنا متغير بيئة جديد هو <span style="font-family:courier new,courier,monospace;">USER</span> لكي نحصل على اسم المستخدم؛ واستعملنا تعبيرًا غريب المظهر:
	</p>
</div>

<div id="wmd-preview-section-36">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5489_22">
<span class="pln">$(date +"%x %r %Z")</span></pre>

	<p>
		المحارف<span style="font-family:courier new,courier,monospace;"> ‎$()‎</span> تقول "يجب وضع ناتج الأمر المُحاط بالأقواس هنا". وأردنا في السكربت السابق وضع ناتج الأمر <span style="font-family:courier new,courier,monospace;">date +"%x %r %Z"‎</span> الذي يطبع التاريخ والوقت الحاليين. لدى الأمر <span style="font-family:courier new,courier,monospace;">date</span> ميزاتٌ وخياراتُ تنسيقٍ كثيرة، نستطيع إلقاء نظرة عليها كالآتي:
	</p>
</div>

<div id="wmd-preview-section-37">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5489_24">
<span class="pln">$ date --help | less</span></pre>

	<p>
		لاحظ أنَّ هنالك صيغة قديمة بديلة عن<span style="font-family:courier new,courier,monospace;"> (‎$(command </span>هي استخدام علامة الاقتباس الخلفية "`"، هذه الصيغة القديمة متوافقة مع صَدَفة Bourne Shell الأصلية (sh)؛ لكنني لا أنوي استخدام الشكل القديم لأنني أشرح استخدام bash الحديثة وليس sh. تدعم صَدَفة bash جميع السكربتات المكتوبة لـ sh، ولهذا تكون الصيغتان الآتيتان متكافئتين:
	</p>
</div>

<div id="wmd-preview-section-38">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5489_28">
<span class="pln">$(command)
`command`</span></pre>

	<h2>
		إسناد ناتج أحد الأوامر إلى متغير
	</h2>
</div>

<div id="wmd-preview-section-39">
	<p>
		يمكننا أيضًا إسناد ناتج أحد الأوامر إلى متغير:
	</p>
</div>

<div id="wmd-preview-section-40">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5489_30">
<span class="pln">right_now=$(date +"%x %r %Z")</span></pre>

	<p>
		نستطيع أيضًا وضع متغير داخل متغير آخر كما يلي:
	</p>
</div>

<div id="wmd-preview-section-41">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5489_32">
<span class="pln">right_now=$(date +"%x %r %Z")
time_stamp="Updated on $right_now by $USER"</span></pre>

	<h2>
		الثوابت
	</h2>
</div>

<div id="wmd-preview-section-42">
	<p>
		كما يوحي اسم "المتغيرات": قيمة المتغير قابلة للتبديل، وهذا يعني أنَّه من المحتمل أثناء تنفيذ السكربت أن تُعدَّل قيمة المتغير نتيجةً لعمليةٍ قمتَ بها. <br>
		في المُقابل، هنالك قيم يجب ألّا تتغير بعد ضبطها، وتسمى "الثوابت" (constants). سبب ذكري لهذا الموضوع هو أنَّ مفهوم الثوابت شائعٌ في البرمجة، وتدعمها أغلبية لغات البرمجة، لكن لكي أكون صريحًا معك، لم أشاهد استعمالًا عمليًا لها. فلو كان من المفترض أن تبقى قيم المتغير ثابتةً فسيسمى المتغير بأحرفٍ كبيرة لتذكير المبرمج أنَّ قيمة المتغير ثابتة. 
	</p>

	<p>
		تُعتبَر متغيرات البيئة ثوابتَ لأنها نادرًا ما تتغير؛ وتُعطى الثوابت أسماءً ذات أحرفٍ كبيرة عادةً. 
	</p>

	<p>
		سأستعمل العرف الآتي في هذا السكربت: الأحرف الكبيرة للثوابت والأحرف الصغيرة للمتغيرات. 
	</p>

	<p>
		يبدو السكربت الذي نعمل عليه كالآتي حاليًا:
	</p>
</div>

<div id="wmd-preview-section-43">
	<pre class="ipsCode" id="ips_uid_5489_11">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

title="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        $title
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
    &lt;h1&gt;$title&lt;/h1&gt;
    &lt;p&gt;$TIME_STAMP&lt;/p&gt;
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		ترجمة -وبتصرّف- للمقالَين <a href="http://linuxcommand.org/lc3_wss0040.php" rel="external nofollow">Variables</a> و <a href="http://linuxcommand.org/lc3_wss0050.php" rel="external nofollow">Command Substitution And Constants</a> لصاحبهما William Shotts.
	</p>
</div>
]]></description><guid isPermaLink="false">256</guid><pubDate>Wed, 04 May 2016 14:04:07 +0000</pubDate></item><item><title>&#x625;&#x639;&#x627;&#x62F;&#x629; &#x62A;&#x648;&#x62C;&#x64A;&#x647; &#x627;&#x644;&#x645;&#x62E;&#x631;&#x62C;&#x627;&#x62A; &#x645;&#x639; here scripts &#x644;&#x62F;&#x649; &#x643;&#x62A;&#x627;&#x628;&#x629; &#x633;&#x643;&#x631;&#x628;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; (Shell Scripts)</title><link>https://academy.hsoub.com/devops/linux/%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D9%85%D8%AE%D8%B1%D8%AC%D8%A7%D8%AA-%D9%85%D8%B9-here-scripts-%D9%84%D8%AF%D9%89-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r255/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-script-here-scripts.png.07074144d5d3d1c386903faf13dc1387.png" /></p>

<div id="wmd-preview-section-17">
	<p id="إعادة-توجيه-المخرجات-مع-here-scripts-لدى-كتابة-سكربات-الصدفة">
		سنشرع في بناء تطبيق مفيد بدءًا من هذا الدرس، سيُنتِج هذا التطبيق مستند HTML يحتوي على معلومات عن نظامك. قضيتُ وقتًا طويلًا في التفكير حول الطريقة التي عليّ اتباعها لشرح برمجة سكربتات الصدفة، ووجدت أنَّ الطريقة التي اعتمدتها مختلفة عن أغلبية الشروحات التي رأيتها، فالأغلبية تُفضِّل شرحًا هيكليًا لمختلف ميزات الصَدَفة bash، ويفترضون أنَّ لديك معرفة مسبقة مع إحدى لغات البرمجة؛ وعلى الرغم من أنني لا أعتبر أنَّ لديك خلفية برمجية، إلا أنني مدرك أنَّ نسبة كبيرة من الأشخاص العاملين في مجال التقنية يعرفون البنية الأساسية لصفحات HTML، لذلك سيُنتِج برنامجنا صفحة ويب. 
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="16170" data-unique="7oxk0oyg0" src="https://academy.hsoub.com/uploads/monthly_2016_05/shell-script-here-scripts.png.86e929da7406bcf1713c91bb0b24b8bf.png" alt="shell-script-here-scripts.png"></p>

	<p>
		سنكتشف ميزات الصَدَفة bash أثناء بنائنا للسكربت، وسنتعرف على الأدوات اللازمة لحل المشكلات التي ستواجهنا.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="كتابة-ملف-html-باستخدام-سكربت">
		كتابة ملف HTML باستخدام سكربت
	</h2>

	<p>
		كما تعلم، تكون بنية ملف HTML كالآتي:
	</p>
</div>

<div id="wmd-preview-section-19">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4693_8">
<span class="tag">&lt;html&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">
    The title of your page
    </span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">
    Your page content goes here.
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

	<p>
		بأخذ ذلك بعين الاعتبار، يمكننا أن نكتب سكربتًا يمكنه إخراج المحتوى السابق:
	</p>
</div>

<div id="wmd-preview-section-20">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4693_10">
<span class="pln">#!/bin/bash

# sysinfo_page - A script to produce an html file

echo "</span><span class="tag">&lt;html&gt;</span><span class="pln">"
echo "</span><span class="tag">&lt;head&gt;</span><span class="pln">"
echo "  </span><span class="tag">&lt;title&gt;</span><span class="pln">"
echo "  The title of your page"
echo "  </span><span class="tag">&lt;/title&gt;</span><span class="pln">"
echo "</span><span class="tag">&lt;/head&gt;</span><span class="pln">"
echo ""
echo "</span><span class="tag">&lt;body&gt;</span><span class="pln">"
echo "  Your page content goes here."
echo "</span><span class="tag">&lt;/body&gt;</span><span class="pln">"
echo "</span><span class="tag">&lt;/html&gt;</span><span class="pln">"</span></pre>

	<p>
		يمكن أن يُستخدم السكربت كالآتي (تذكَّر أنَّ الرمز &lt; هو رمز إعادة توجيه المخرجات، وهنا سنعيد توجيه المخرجات إلى ملف باسم <span style="font-family:courier new,courier,monospace;">sysinfo_page.html</span>):
	</p>
</div>

<div id="wmd-preview-section-21">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4693_12">
<span class="pln">$ sysinfo_page &gt; sysinfo_page.html</span></pre>

	<p>
		قيل أنَّ أعظم المبرمجين قدرًا هم أكسلهم! حيث يكتبون برامج ليريحوا أنفسهم من بعض الأعمال؛ وبالمثِل: عندما يكتب المبرمجون الأذكياء برنامجًا، فإنهم يحاولون تقليل مقدار الكتابة التي يكتبونها. 
	</p>

	<p>
		أول تحسين سنفعله للسكربت هو التخلص من الاستعمال المتكرر لأمر echo والاستعاضة عنه بأمرٍ واحد (سنحيط كامل مستند HTML بعلامات اقتباس):
	</p>
</div>

<div id="wmd-preview-section-22">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4693_14">
<span class="pln">#!/bin/bash

# sysinfo_page - A script to produce an HTML file

echo "</span><span class="tag">&lt;html&gt;</span><span class="pln">
 </span><span class="tag">&lt;head&gt;</span><span class="pln">
   </span><span class="tag">&lt;title&gt;</span><span class="pln">
   The title of your page
   </span><span class="tag">&lt;/title&gt;</span><span class="pln">
 </span><span class="tag">&lt;/head&gt;</span><span class="pln">

 </span><span class="tag">&lt;body&gt;</span><span class="pln">
   Your page content goes here.
 </span><span class="tag">&lt;/body&gt;</span><span class="pln">
 </span><span class="tag">&lt;/html&gt;</span><span class="pln">"</span></pre>

	<p>
		أصبح من الممكن احتواء الأسطر الجديدة في النص داخل علامتَي الاقتباس، وبهذا يمكن أن يمتد الوسيط (argument) المُمرَّر إلى الأمر <span style="font-family:courier new,courier,monospace;">echo</span> على أكثر من سطر. 
	</p>

	<p>
		بغض النظر أنَّ ما سبق تحسينٌ واضحٌ، إلا أنَّ فيه قصورًا لأنَّ شيفرات HTML تحتوي عادةً على علامات اقتباس، مما يجعلها تتعارض مع علامات الاقتباس المحيطة بالوسيط، لكن يمكننا "تهريب" (escape) علامة الاقتباس بوضع شرطة خلفية مائلة \ قبلها. 
	</p>

	<p>
		لكننا نريد تجنب كتابة المزيد من الأحرف! إذًا علينا البحث عن طريقة أفضل لطباعة النص. لحسن الحظ توفر لنا الصَدَفة bash طريقةً لفعل ذلك اسمها <span style="font-family:courier new,courier,monospace;">here script</span>.
	</p>
</div>

<div id="wmd-preview-section-23">
	<pre class="ipsCode" id="ips_uid_4693_16">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

cat &lt;&lt; _EOF_
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;
    The title of your page
    &lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    Your page content goes here.
&lt;/body&gt;
&lt;/html&gt;
_EOF_</pre>

	<p>
		<span style="font-family:courier new,courier,monospace;">here script</span> (يُسمى أحيانًا here document) هو شكل من أشكال إعادة توجيه المخرجات، الذي يوفِّر طريقةً لتضمين محتوى سيُمرِّر إلى مجرى الدخل القياسي (standard input stream) لأحد الأوامر. مُرِّرَت -في المثال السابق- كتلةٌ نصيةٌ إلى مجرى الدخل القياسي للأمر <span style="font-family:courier new,courier,monospace;">cat</span>. 
	</p>

	<p>
		الشكل العام لإنشاء <span style="font-family:courier new,courier,monospace;">here script</span>:
	</p>
</div>

<div id="wmd-preview-section-24">
	<pre class="ipsCode" id="ips_uid_4693_18">
command &lt;&lt; token
content to be used as command's standard input
token</pre>

	<p>
		يمكن اختيار أي سلسلة نصية لكي تكون العلامة الرمزية (token)، لكنني استخدمت<span style="font-family:courier new,courier,monospace;"> __EOF__</span> ‏(EOF هو اختصارٌ شهير للعبارة End Of File أي نهاية الملف) لشيوعها، لكنك تستطيع استخدام أي سلسلة تشاء، لطالما أنَّها لا تتعارض مع كلمةٍ محجوزةٍ في bash. العلامة الرمزية التي تُنهي here script يجب أن تُطابِق تمامًا تلك التي بدأته، وإلا فستعامل محتويات السكربت المتبقية على أنَّها دخل قياسي للأمر المُحدَّد. 
	</p>

	<p>
		هنالك خدعة إضافية يمكنك استخدامها مع here script تسمح لك بمحاذاة (indent) المحتوى المُمرَّر عبر here script لتحسين قابلية قراءة السكربت. يمكنك فعل ذلك بتعديل السكربت كالآتي:
	</p>
</div>

<div id="wmd-preview-section-25">
	<pre class="ipsCode" id="ips_uid_4693_20">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        The title of your page
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
        Your page content goes here.
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		تبديل علامة ‎<span style="font-family:courier new,courier,monospace;">&gt;&gt;</span> إلى ‎<span style="font-family:courier new,courier,monospace;">&lt;&lt;-</span>‎ سيؤدي إلى تجاهل مسافات الجدولة (tab) البادئة (لكن لن يتم تجاهل الفراغات) في here script؛ لن يحتوي ناتج الأمر <span style="font-family:courier new,courier,monospace;">cat</span> على أيّة مسافات جدولة بادئة. 
	</p>

	<p>
		حسنًا، لنُعدِّل محتويات ملف HTML لكي نبيّن ما الغرض من صفحة الويب:
	</p>
</div>

<div id="wmd-preview-section-26">
	<pre class="ipsCode" id="ips_uid_4693_22">
#!/bin/bash

# sysinfo_page - A script to produce an HTML file

cat &lt;&lt;- _EOF_
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;
        My System Information
        &lt;/title&gt;
    &lt;/head&gt;

    &lt;body&gt;
    &lt;h1&gt;My System Information&lt;/h1&gt;
    &lt;/body&gt;
    &lt;/html&gt;
_EOF_</pre>

	<p>
		سنجعل السكربت في الدرس القادم يُظهِر معلومات حقيقة من نظامنا. 
	</p>

	<p>
		ترجمة -وبتصرّف- للمقال <a href="http://linuxcommand.org/lc3_wss0030.php" rel="external nofollow">Here Scripts</a> لصاحبه William Shotts.
	</p>
</div>
]]></description><guid isPermaLink="false">255</guid><pubDate>Wed, 04 May 2016 11:54:38 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x62F;&#x64A;&#x644; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; (Shell Scripts) &#x627;&#x644;&#x645;&#x648;&#x62C;&#x648;&#x62F;&#x629; &#x639;&#x644;&#x649; &#x62D;&#x627;&#x633;&#x648;&#x628;&#x643;</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%88%D8%AF%D8%A9-%D8%B9%D9%84%D9%89-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%83-r254/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/edit-shell-scripts.png.f935b198002f42b8815606930a895e03.png" /></p>

<div id="wmd-preview-section-15">
	<p id="تعديل-سكربات-الصدفة-الموجودة-على-حاسوبك">
		قبل أن تبدأ في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r252/" rel="">كتابة سكربتات جديدة</a>، عليّ أن أشير إلى أنَّك تملك بعض السكربتات الموجودة مسبقًا، وضِعَت هذه السكربتات في مجلد المنزل الخاص بك عندما أُنشِئ حسابك، وتُستعمل لضبط سلوك جلسات سطر الأوامر في حاسوبك؛ تستطيع تعديل هذه السكربتات لتغيير بعض الأمور. 
	</p>

	<p style="text-align: center;">
		<img alt="edit-shell-scripts.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16169" data-unique="wwp2b1ui2" src="https://academy.hsoub.com/uploads/monthly_2016_05/edit-shell-scripts.png.a1cbe64913401594dbed9c017ece247f.png"></p>

	<p>
		سنلقِي نظرةً على سكربتَين من هذه السكربتات في هذا الدرس لكي نتعلم بعض المفاهيم الجديدة والمهمة عن الصَدَفة. 
	</p>

	<p>
		يُبقي النظام على مجموعة من المعلومات حول جلستك تدعى "البيئة" (environment)، تحتوي البيئة على أشياء مثل المجلدات التي سيتم البحث فيها عن البرمجيات (PATH)، واسم المستخدم، واسم الملف الذي سيُحفَظ فيه بريدك الإلكتروني، وغير ذلك. يمكنك رؤية قائمة كاملة لضبط البيئة بالأمر set. <br>
		هنالك نوعان من الأوامر التي تحتويها البيئة، وتُعرَف بالاختصارات (aliases) ودوال الصّدفة (shell functions).
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="ما-هو-منشأ-البيئة">
		ما هو منشأ البيئة؟
	</h2>

	<p>
		تبدأ صَدَفة bash عندما تُسجِّل دخولك إلى النظام، وتقرأ سلسلة من ملفات الضبط تُسمى "ملفات بدء التشغيل" أو "ملفات البدء" (startup files) التي تُعرِّف البيئة الافتراضية التي يتشارك فيها جميع المستخدمين؛ ثم ستقرأ ملفات بدء إضافية موجودة في مجلد المنزل الخاص بك التي تُعرِّف بيئتك الشخصية.
	</p>

	<p>
		يختلف الترتيب بحسب نوع جلسة سطر الأوامر التي بدأتها، إذ أنَّ هنالك نوعان: جلسة تحتاج إلى تسجيل دخول (login shell session) وجلسة لا تحتاج إلى تسجيل دخول (non-login shell session). الجلسة التي تحتاج إلى تسجيل دخول هي الجلسة التي تسألك عن اسم المستخدم وكلمة المرور، وذلك عندما تستعمل إحدى الطرفيات الوهمية (virtual console) على سبيل المثال. أما الجلسات التي لا تحتاج إلى تسجيل دخول فهي تحدث عادةً عندما تُشغِّل محاكي الطرفية داخل الواجهة الرسومية. 
	</p>

	<p>
		تقرأ الصَدَفة التي تحتاج إلى تسجيل دخول ملف بدء أو أكثر كما هو موضَّح هنا: 
	</p>

	<ul>
<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">/etc/profile</span></strong>: سكربت الضبط العام الذي يُطبَّق على جميع المستخدمين. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">~/.bash_profile</span></strong>: ملف بدء خاص بالمستخدم، يمكن أن يُستعمل لضبط خياراتٍ أخرى غير موجودة في سكربت الضبط العام، أو لتجاوز بعضها وإعادة تعريفها. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">~/.bash_login</span></strong>: إن لم يكن الملف ‎<span style="font-family:courier new,courier,monospace;">~/.bash_profile</span> موجودًا فستحاول الصَدَفة bash قراءة هذا السكربت. 
		</li>
		<li>
			<strong><span style="font-family:courier new,courier,monospace;">‎~/.profile</span></strong>: إن لم يكن الملف ‎<span style="font-family:courier new,courier,monospace;">~/.bash_profile</span> أو ‎<span style="font-family:courier new,courier,monospace;">~/.bash_login </span>موجودًا فستحاول الصَدَفة bash قراءة هذا الملف. هذا هو السلوك الافتراضي في التوزيعات المبنية على دبيان مثل أوبنتو. 
		</li>
	</ul>
<p>
		أما الصَدَفة التي لا تحتاج إلى تسجيل دخول، فتقرأ ملفات البدء الآتية: 
	</p>

	<ul>
<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">/etc/bash.bashrc</span></strong>: سكربت ضبط عام يُطبَّق على جميع المستخدمين. 
		</li>
		<li>
			‎<strong><span style="font-family:courier new,courier,monospace;">~/.bashrc</span></strong>: ملف بدء خاص بالمستخدم، يمكن أن يُستعمل لضبط خياراتٍ أخرى غير موجودة في سكربت الضبط العام، أو لتجاوز بعضها وإعادة تعريفها. 
		</li>
	</ul>
<p>
		إضافةً إلى قراءة ملفات الضبط السابقة، ترث الجلساتُ التي لا تحتاج إلى تسجيل دخول البيئةَ من العملية الأب (parent process) التي تكون عادةً جلسة تحتاج إلى تسجيل دخول. 
	</p>

	<p>
		ألقِ نظرةً على نظامك لترى ما هي ملفات البدء التي عندك، لكن لاحظ أنَّ أغلبية الملفات السابقة تبدأ بنقطة (مما يعني أنها مخفية)، لذا عليك استخدام الخيار <span style="font-family:courier new,courier,monospace;">‎-a</span>مع الأمر<span style="font-family:courier new,courier,monospace;"> ls</span>. 
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_12">
<span class="pln">ls -a</span></pre>

	<p>
		ملف <span style="font-family:courier new,courier,monospace;">‎~/.bashrc</span> هو أهم ملف بدء من وجه نظر المستخدم العادي لأنه يُقرَأ دائمًا. حيث تقرأه الجلسات التي لا تحتاج إلى تسجيل دخول افتراضيًا، وأغلبية ملفات البدء الخاصة بالجلسات التي تحتاج إلى تسجيل دخول تقرأ ملف<span style="font-family:courier new,courier,monospace;"> ‎~/.bashrc</span> أيضًا. 
	</p>

	<p>
		إذا ألقيت نظرةً داخل ملف <span style="font-family:courier new,courier,monospace;">‎.bash_profile‎ </span>(الملف الآتي مأخوذ من توزيعة CentOS)، فسيبدو شبيهًا بالآتي:
	</p>
</div>

<div id="wmd-preview-section-17">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_14">
<span class="pln"># .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH</span></pre>

	<p>
		تذكَّر أنَّ الأسطر التي تبدأ برمز # هي تعليقات ولا تُفسَّرها الصَدَفة؛ حيث أُضيفت هذه الأسطر لشرح الشيفرة لمن يقرأها من البشر. ستجد في السطر الرابع أول الأشياء المثيرة للاهتمام:
	</p>
</div>

<div id="wmd-preview-section-18">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_16">
<span class="pln">if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi</span></pre>

	<p>
		هذه هي عبارة <span style="font-family:courier new,courier,monospace;">if </span>الشرطية، التي سنشرحها بالتفصيل في درسٍ لاحق، لكنني سأفسرها لك كالآتي:
	</p>

	<p>
		إذا كان الملف<span style="font-family:courier new,courier,monospace;"> ‎~/.bashrc</span> موجودًا، فنفِّذ محتويات<span style="font-family:courier new,courier,monospace;"> ‎~/.bashrc</span>. 
	</p>

	<p>
		يمكننا أن نرى أنَّ الشيفرة القصيرة السابقة هي التي تجعل الجلسات التي تحتاج إلى تسجيل الدخول تقرأ محتويات الملف <span style="font-family:courier new,courier,monospace;">‎.bashrc</span>. 
	</p>

	<p>
		الخطوة التالية في ملف البدء هي ضبط المتغير <span style="font-family:courier new,courier,monospace;">PATH</span> وإضافة<span style="font-family:courier new,courier,monospace;"> ‎~/bin </span>إلى قائمة المجلدات التي سيتم البحث فيها عن الملفات التنفيذية للأوامر. <br>
		وفي نهاية الملف:
	</p>
</div>

<div id="wmd-preview-section-19">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_18">
<span class="pln">export PATH</span></pre>

	<p>
		وظيفة الأمر <span style="font-family:courier new,courier,monospace;">export</span> هي إخبار الصَدَفة أنَّ عليها جعل محتويات المتغير <span style="font-family:courier new,courier,monospace;">PATH</span> متاحةً للعمليات التي تنحدر منها (الأبناء).
	</p>
</div>

<div id="wmd-preview-section-20">
	<h2 id="الكنى-aliases">
		الاختصارات aliases
	</h2>

	<p>
		الاختصارات (aliases) هي طريقة سهلة لإنشاء أمر جديد يعمل اختصارًا لأمرٍ أطول. لها الشكل العام الآتي:
	</p>
</div>

<div id="wmd-preview-section-21">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_20">
<span class="pln">alias name=value</span></pre>

	<p>
		حيث <span style="font-family:courier new,courier,monospace;">name</span> هو اسم الأمر الجديد و <span style="font-family:courier new,courier,monospace;">value</span> هي السلسلة النصية التي ستُنفَّذ عند إدخال <span style="font-family:courier new,courier,monospace;">name</span> في سطر الأوامر. 
	</p>

	<p>
		لنُنشِئ اختصارا اسمه<span style="font-family:courier new,courier,monospace;"> l</span> (حرف L صغير) ولنجعله اختصارًا للأمر <span style="font-family:courier new,courier,monospace;">ls -l</span> (أي عرض محتويات المجلد بالصيغة التفصيلية). تأكَّد أنَّ مجلد العمل الحالي هو المنزل، ثم افتح ملف <span style="font-family:courier new,courier,monospace;">‎.bashrc</span> باستخدام محررك النصي المُفضَّل وأضف السطر الآتي إلى نهاية الملف:
	</p>
</div>

<div id="wmd-preview-section-22">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_22">
<span class="pln">alias l='ls -l'</span></pre>

	<p>
		عند إضافتك للأمر <span style="font-family:courier new,courier,monospace;">alias</span> إلى الملف، فستُنشِئ أمرًا جديدًا اسمه<span style="font-family:courier new,courier,monospace;"> l </span>الذي يكافئ<span style="font-family:courier new,courier,monospace;"> ls -l</span>. أغلِق جلسة الطرفية الحالية وابدأ واحدة جديدة لتجربة الاختصار التي أنشأناه، وذلك لإعادة قراءة محتويات الملف<span style="font-family:courier new,courier,monospace;"> ‎.bashrc</span>. يمكنك باستخدام هذه التقنية إنشاء أي عدد من الاختصارات المُخصصة لاستعمالك الشخصي، هذه إحداها:
	</p>
</div>

<div id="wmd-preview-section-23">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1655_24">
<span class="pln">alias today='date +"%A, %B %-d, %Y"'</span></pre>

	<p>
		سيُنشِئ السطر السابق اختصارا جديدا اسمه <span style="font-family:courier new,courier,monospace;">today</span> الذي سيُظهِر تاريخ اليوم بتنسيقٍ جميل. 
	</p>

	<p>
		بالمناسبة، الأمر <span style="font-family:courier new,courier,monospace;">alias</span> هو أمر مُضمَّن في الصَدَفة (shell builtin)، أي أنَّك تستطيع إنشاء الأوامر البديلة مباشرةً من سطر الأوامر؛ لكن يجب أن تعلم بأنَّ تلك الأوامر ستزول عند إغلاقك لجلسة الطرفية الحالية. مثال:
	</p>
</div>

<div id="wmd-preview-section-24">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4840_7">
<span class="pln">$ alias l='ls -l'</span></pre>

	<h2>
		دوال الصدفة
	</h2>
</div>

<div id="wmd-preview-section-25">
	<p>
		ستستفيد من أمر alias عند إنشاء اختصارات لأوامر بسيطة، لكن ماذا لو أردت إنشاء شيءٍ أكثر تعقيدًا؟ عليك حينها أن تجرِّب شيئًا يسمى "دوال الصدفة" (shell functions)، التي يمكنك اعتبارها أنهَّا "سكربتات داخل سكربتات"، أو سكربتات فرعية صغيرة. لنجرب واحدةً منها! افتح ملف <span style="font-family:courier new,courier,monospace;">‎.bashrc</span> بمحررك وضع ما يلي بدلًا عن الاختصار <span style="font-family:courier new,courier,monospace;">today</span>:
	</p>
</div>

<div id="wmd-preview-section-26">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4840_9">
<span class="pln">today() {
    echo -n "Today's date is: "
    date +"%A, %B %-d, %Y"
}</span></pre>

	<p>
		صدِّق أو لا تصدِّق، () هو أمر مضمَّن بالصدفة أيضًا مثَلُهَ كَمَثَلِ الأمر <span style="font-family:courier new,courier,monospace;">alias</span>، حيث يمكنك أيضًا إدخال دوال الصدفة مباشرةً من سطر الأوامر.
	</p>
</div>

<div id="wmd-preview-section-27">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4840_11">
<span class="pln">$ today() {
&gt; echo -n "Today's date is: "
&gt; date +"%A, %B %-d, %Y"
&gt; }
$</span></pre>

	<p>
		لكن تلك الدوال -مثلما هو عليه الحال مع الأمر <span style="font-family:courier new,courier,monospace;">alias</span>- ستزول عند إغلاق جلسة الطرفية الحالية. 
	</p>

	<p>
		ترجمة -وبتصرّف- للمقال <a href="http://linuxcommand.org/lc3_wss0020.php" rel="external nofollow">Editing The Scripts You Already Have</a> لصاحبه William Shotts.
	</p>
</div>
]]></description><guid isPermaLink="false">254</guid><pubDate>Wed, 04 May 2016 11:41:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x639;&#x645;&#x627;&#x644; &#x645;&#x64A;&#x632;&#x629; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x627;&#x644;&#x648;&#x638;&#x64A;&#x641;&#x629; (Bash's Job Control)&#xA0;&#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62E;&#x644;&#x641;&#x64A;&#x629; &#x648;&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x642;&#x62F;&#x645;&#x629; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D9%85%D9%8A%D8%B2%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%88%D8%B8%D9%8A%D9%81%D8%A9-bashs-job-control%C2%A0%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A9-%D9%88%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r253/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/linux-bash-job-control.png.c18f5589793285924cd3efa14fab614c.png" /></p>

<p dir="rtl">
	سنتحدثُ في هذا الدّرس عن الطرق التي يُوفّرها لك كلّ من Bash، نظام لينكس والطرفيّة Terminal للتّحكم بالوظائف والعمليّات. ذكرنا في درس <a href="http://academy.hsoub.com/devops/linux/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-process-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-r70/" rel="">إدارة العمليات في لينكس باستخدام الطرفية</a> كيفية استعمال الأوامر <span style="font-family:courier new,courier,monospace;">ps</span> ،<span style="font-family:courier new,courier,monospace;">kill</span> و <span style="font-family:courier new,courier,monospace;">nice</span> للتحكم بالمهام على نظامك.
</p>

<p dir="rtl">
	سنُركّز في هذا المقال على إدارة عمليّات المُقدّمة وعمليّات الخلفيّة وسنشرح كيف ترفع من مُستواك في التّحكم بالوظائف والمهام لتحصل على مُرونة أكثر عند تنفيذك للأوامر.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="linux-bash-job-control.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15719" data-unique="esq7cnrsv" src="https://academy.hsoub.com/uploads/monthly_2016_04/linux-bash-job-control.png.0fe22773ef3fc9b8b2db1f63cfd96d99.png"></p>

<h2 dir="rtl">
	إدارة عمليات المقدمة
</h2>

<p dir="rtl">
	مُعظمُ العمليّات التي تُشغّلها على لينكس ستُنفّذ في المُقدّمة. سيبدأ الأمر بالتّنفيذ ما يمنعك من تنفيذ أي أمر آخر طوال مدة تنفيذ العمليّة. يُمكن أن تسمح العمليّة بتَفاعلِ المُستخدم، أو يُمكن أن تُنفّذ إجراءًا معيّنا ثم تنتهي. وسيُعرض أي مُستخرج على شاشة الطرفية افتراضيّا، سنتطرّق إلى الطريقة المُبسّطة لإدارة عمليّات المُقدّمة أسفله.
</p>

<h3 dir="rtl">
	تشغيل عملية
</h3>

<p dir="rtl">
	تُشَغّلُ العمليّات في المُقدّمة افتراضيا إلى أن تنتهي أو عند تغيّر الحالة، وأثناء تشغيل العمليّات لن تتمكن من التفاعل مع الصّدفة Shell.
</p>

<p dir="rtl">
	بعض أوامر المُقدّمة تنتهي بسرعة مُرجعة المُستخدم إلى واجهة الصدفة آنيّاً، وهذا الأمر هو مثال على ذلك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_9">
<span class="pln">echo "Hello World"</span></pre>

<p dir="rtl">
	هذا الأمر سيطبع "مرحبا بالعالم" على شاشة الطرفيّة ثم يرجعك إلى شاشة الأوامر.
</p>

<p dir="rtl">
	بعض أوامر المُقدمة الأخرى تأخذ وقتا أطول للتنفيذ، مانعة الولوج إلى الصّدفة أثناء التشغيل.
</p>

<p dir="rtl">
	يُمكن أن يعود السبب إلى أن الأمر يُشغل عمليّة أعقد أو أنّ العمليّة مُبرمجة للتنفيذ إلى أن تتوقف بشكل واضح أو إلى أن تتلقى مُدخلات من المُستخدم.
</p>

<p dir="rtl">
	تُعتبر أداة <span style="font-family:courier new,courier,monospace;">top</span> من الأوامر التي تنفذ لوقت غير محدود، فبعد تشغيلها ستستمر في التنفيذ وتحديث عناصر الشاشة إلى أن يقوم المُستخدم بإنهاء العملية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_11">
<span class="pln">top</span></pre>

<p dir="rtl">
	يُمكنك الخروج بالضّغط على "<span style="font-family:courier new,courier,monospace;">q</span>". بعض العمليّات لا تملك طريقة للخروج ولتوقفها سيجب عليك استخدام طريقة أخرى.
</p>

<h3 dir="rtl">
	إنهاء عملية
</h3>

<p dir="rtl">
	لنفترض أننا قمنا بتشغيل حلقة تكرار بسيطة في سطر الأوامر، يُمكننا تشغيل حلقة تكرار تقوم بطباعة "Hello World" كل عشر ثوان. هذه الحلقة ستستمر في الطّباعة إلى أن تُوقَف إجباريّاً:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_13">
<span class="pln">while true; do echo "Hello World"; sleep 10; done</span></pre>

<p dir="rtl">
	حلقات التكرار كهذه لا تملك أي زر للإلغاء، سيتوجّب علينا أن نوقف العمليّة بارسال ما يسمّى بـ الإشارة signal. تستطيع النواة في لينكس إرسال إشارات إلى العمليّات لطلب إيقاف نهائيّ للعملية أو تغيير الحالة فقط، طرفيّات لينكس عادة ما تكون مضبوطة لإرسال إشارة "<strong>SIGNT</strong>" (الإشارة رقم 2) لعمليّة المُقدّمة الحاليّة عند ضغط تركيبة المفتاحين <span style="font-family:courier new,courier,monospace;">CTRL+C</span>.
</p>

<p dir="rtl">
	تُخبر إشارة "<strong>SIGNT</strong>" البرنامج بأن المستخدم قد طلب إنهاء العمليّة مُستخدما لوحة المفاتيح.
</p>

<p dir="rtl">
	لإيقاف حلقة التكرار التي بدأناها اضغط على مفتاحي <span style="font-family:courier new,courier,monospace;">CTRL</span> و"<span style="font-family:courier new,courier,monospace;">c</span>":
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_15">
<span class="pln">CTRL+C</span></pre>

<p dir="rtl">
	سيتم إغلاق حلقة التكرار و ستتمكن من التحكم بالصّدفة Shell مجددا.
</p>

<p dir="rtl">
	إشارة "SIGNT" المُرسلة عن طريق تركيبة <span style="font-family:courier new,courier,monospace;">CTRL+C</span> واحدة من الإشارات المتعدّدة التي يمكن إرسالها إلى البرامج، مُعظم الإشارات لا تملك تركيبة مفاتيح مُرتبطة بها، وعليك إرسال هذه الإشارات باستخدام الأمر <span style="font-family:courier new,courier,monospace;">kill</span> عوضا عن ذلك (سوف نغطي ذلك لاحقاً).
</p>

<h3 dir="rtl">
	تعليق العمليات
</h3>

<p dir="rtl">
	ذكرنا أعلاه أن عمليّات المُقدّمة تمنعك من تنفيذ أي أمر آخر طوال مدة تنفيذ العمليّة. ماذا لو أدركنا أنّنا نحتاج إلى شاشة الطرفية بعد أن نُشغّل عملية في المُقدمة؟
</p>

<p dir="rtl">
	إشارة "<strong>SIGTSTP</strong>" (الإشارة رقم 20) هي إشارة من الإشارات التي يمكن إرسالها إلى عمليّات المُقدّمة. عندما نضغط تركيبة مفاتيح <span style="font-family:courier new,courier,monospace;">CTRL+Z</span>، تُسجل الطرفيّة أمر "تعليق"، الذي يرسل إشارة "<strong>SIGTSTP</strong>" إلى عملية المُقدمة. هذا الأمر سيوقف مؤقّتا تنفيذ الأمر ويعيد التحكم بالطرفيّة.
</p>

<p dir="rtl">
	كمثال على ذلك، لنستخدم أمر <span style="font-family:courier new,courier,monospace;">ping</span> للاتّصال ب<span style="font-family:courier new,courier,monospace;"> google.com</span> كلّ 5 ثوان. سوف نُسبق الأمر بكلمة <span style="font-family:courier new,courier,monospace;">command</span>، ما يُخولُ لنا تجاوز أي كُنيات للصدفة (shell aliases) يُمكن لها وضع عدّ أقصى على الأمر :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_17">
<span class="pln">command ping -i 5 google.com</span></pre>

<p dir="rtl">
	عوضا عن إنهاء العملية باستعمال <span style="font-family:courier new,courier,monospace;">CTRL+C</span>، أدخل <span style="font-family:courier new,courier,monospace;">CTRL+Z</span> بدلا من ذلك.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_19">
<span class="pln">CTRL+Z</span></pre>

<p dir="rtl">
	سيكون المُخرج هكذا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_23">
<span class="pln">[1]+  Stopped                 ping -i 5 google.com</span></pre>

<p dir="rtl">
	لقد تم إيقاف الأمر <span style="font-family:courier new,courier,monospace;">ping</span> مؤقّتاً، وبذلك تستطيع الوصول إلى جلسة الصّدفة shell لكتابة الأوامر مُجدّداً. يُمكننا استعمال أداة إدارة العمليّات <span style="font-family:courier new,courier,monospace;">ps</span> لعرضها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_25">
<span class="pln">ps T</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_27">
<span class="pln">  <abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr></abbr></abbr></abbr></abbr> TTY      STAT   TIME COMMAND
26904 pts/3    Ss     0:00 /bin/bash
29633 pts/3    T      0:00 ping -i 5 google.com
29643 pts/3    R+     0:00 ps t</span></pre>

<p>
	يُمكننا ملاحظة أن عمليّة <span style="font-family:courier new,courier,monospace;">ping</span> لا تزال ضمن القائمة، لكن العمود STAT (الخاص بحالة العمليّة) يحمل القيمة "T". صفحة الدليل الخاصة بـ <span style="font-family:courier new,courier,monospace;">ps</span> تخبرنا أن هذا الحرف يعني أن العملية قد أوقفت عن طريق إشارة "التحكم بالعمليات".
</p>

<p dir="rtl">
	سوف نتحدّث بعمق أكثر عن كيفية تغيير حالة العمليّة،لكن في الوقت الحالي يُمكننا استئناف تنفيذ العمليّة في المُقدمة بكتابة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_29">
<span class="pln">fg</span></pre>

<p dir="rtl">
	عند استكمال التنفيذ، أنهِ العمليّة باستعمال <span style="font-family:courier new,courier,monospace;">CTRL+C</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_31">
<span class="pln">CTRL+C</span></pre>

<h2 dir="rtl">
	إدارة عمليات الخلفية
</h2>

<p dir="rtl">
	البديل الرئيسي لتنفيذ عمليّة في المُقدمة هو تشغيلها في الخلفيّة، عمليّة الخلفية مرتبطة بالطرفيّة التي شغّلتها منها، لكنّها لا تمنعك من الوصول إلى الصّدفة (سطر الأوامر)، عوضا عن ذلك، تُنفّذ العمليّة في الخلفيّة، تاركة لمُستخدم حريّة التفاعل مع النظام أثناء تشغيل العمليّة.
</p>

<p dir="rtl">
	بسبب الطريقة التي تتعامل بها عمليّات المقدمة مع الطرفيّة، يمكن أن تُشغّل عمليّة واحدة فقط لكل نافذة من نوافذ الطرفية. ولأن عمليّات الخلفية ترجع التحكم بالصّدفة Shell مباشرة بدون انتظار انتهاء العمليّة، يُمكن تشغيل العديد من العمليّات في الخلفيّة في الآن ذاته.
</p>

<h3 dir="rtl">
	تشغيل العمليات
</h3>

<p dir="rtl">
	يُمكنك تشغيل عمليّة في المُقدّمة بإلحاق محرف"<span style="font-family:courier new,courier,monospace;">&amp;</span>" عند نهاية الأمر. يُخبر هذا الصّدفة shell بألّا تنتظر إلى حين انتهاء العملية بل تشغيلها وإرجاع التحكم بالطرفيّة للمُستخدم فوراً. ستبقى المُخرجات تُعرض على شاشة الطرفية (إلا إذا قمت بـ<a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%A5%D8%AF%D8%AE%D8%A7%D9%84%D8%A7%D9%84%D8%A5%D8%AE%D8%B1%D8%A7%D8%AC-io-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r39/" rel="">إعادة توجيهها</a>) لكنّك ستتمكن من كتابة أوامر إضافية أثناء استمرار تنفيذ عمليّة الخلفيّة.
</p>

<p dir="rtl">
	على سبيل المثال، يُمكن أن نبدأ أمر <span style="font-family:courier new,courier,monospace;">ping</span> نفسه من القسم السّابق في الخلفيّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_34">
<span class="pln">command ping -i 5 google.com &amp;</span></pre>

<p dir="rtl">
	سترى مخرجا يبدو هكذا من نظام bash للتحكم بالعمليّات :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_36">
<span class="pln">[1] 4287</span></pre>

<p dir="rtl">
	وسترى أيضا المُخرج العادي من طرف الأمر <span style="font-family:courier new,courier,monospace;">ping</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_38">
<span class="pln">PING google.com (74.125.226.71) 56(84) bytes of data.
64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=1 ttl=55 time=12.3 ms
64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=2 ttl=55 time=11.1 ms
64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=3 ttl=55 time=9.98 ms</span></pre>

<p>
	رغم هذا ستتمكن من كتابة الأوامر في الوقت عينه. سوف يُمزج المُخرج من عمليّة الخلفيّة مع المدخلات والمخرجات الخاصة بعمليّة المُقدمة التي بدأتها، لكنّها لن تتداخل مع تنفيذ عمليّة المقدّمة.
</p>

<h3 dir="rtl">
	جدولة عمليات الخلفية
</h3>

<p dir="rtl">
	لرؤية جميع العمليّات المُتوقفة أو عمليّات الخلفية، يمكنك استعمال الأمر <span style="font-family:courier new,courier,monospace;">jobs</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_40">
<span class="pln">jobs</span></pre>

<p dir="rtl">
	إذا كان الأمر <span style="font-family:courier new,courier,monospace;">ping</span> مُشغّلا في الخلفية ستكون المخرجات على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_42">
<span class="pln">[1]+  Running                 command ping -i 5 google.com &amp;</span></pre>

<p dir="rtl">
	يُبيّن هذا أنّنا نملك عمليّة واحدة في الخلفيّة. <span style="font-family:courier new,courier,monospace;">[1] </span>تمثّل الـ "job spec" أو رقم الوظيفة. يُمكننا الإشارة إلى هذه العمليّة عند استعمال أوامر التحكم بالعمليّات مثل <span style="font-family:courier new,courier,monospace;">kill </span>،<span style="font-family:courier new,courier,monospace;">fg </span>،<span style="font-family:courier new,courier,monospace;">bg</span> بإضافة سابقة "%" إلى رقم الوظيفة. في هذه الحالة سنشير إلى هذه الوظيفة بالإشارة <span style="font-family:courier new,courier,monospace;">1%</span>.
</p>

<h3 dir="rtl">
	إيقاف عمليات الخلفية
</h3>

<p dir="rtl">
	يُمكننا إيقاف عمليّات الخلفيّة بعدّة طرق، أكثر طريقة نجاعة هي استخدام الأمر <span style="font-family:courier new,courier,monospace;">kill</span> مع رقم الوظيفة. كمثال، يمكن أن نوقف أمرنا المُشغَّل في الخلفيّة بكتابة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_44">
<span class="pln">kill %1</span></pre>

<p dir="rtl">
	حسب طريقة ضبط الطرفيّة التي تستخدمها، إما مُباشرة أو بعض ضغط <span style="font-family:courier new,courier,monospace;">ENTER</span> للمرة الثانية، ستشاهدُ حالة إيقاف الوظيفة على الطرفيّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_46">
<span class="pln">[1]+  Terminated              command ping -i 5 google.com</span></pre>

<p dir="rtl">
	إذا تحققنا بالأمر <span style="font-family:courier new,courier,monospace;">jobs</span>، سنلاحظ عدم وجود أي عمليّة.
</p>

<h2 dir="rtl">
	تغيير حالة العملية
</h2>

<p dir="rtl">
	بعد أن تعرفنا على كيفية تشغيل عمليّة أو إيقافها في الخلفيّة، يُمكننا التحدث عن كيفية تغيير حالة العمليّة.
</p>

<p dir="rtl">
	شرحنا تغيير حالة واحدة قبل قليل عند التطرق لكيفيّة إيقاف مُهمّة أو تعليق عملها باستخدام <span style="font-family:courier new,courier,monospace;">CTRL+Z</span>. يُمكننا نقل عمليّات المقدّمة إلى الخلفيّة أو العكس عندما تكون العمليّة في حالة توقّف.
</p>

<h3 dir="rtl">
	نقل عمليات المقدمة إلى الخلفية
</h3>

<p dir="rtl">
	إذا نسيت أن تنهي الأمر بحرف العطف "<span style="font-family:courier new,courier,monospace;">&amp;</span>"، لا تزال قادرا على نقل هذه العمليّة إلى الخلفيّة.
</p>

<p dir="rtl">
	الخطوة الأولى هي إيقاف العمليّة باستخدام <span style="font-family:courier new,courier,monospace;">CTRL+Z</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_48">
<span class="pln">CTRL+Z</span></pre>

<p dir="rtl">
	عندما تتوقف العمليّة، يُمكننا استعمال الأمر <span style="font-family:courier new,courier,monospace;">bg</span> لتشغيلها مجدّدا في الخلفيّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_50">
<span class="pln">bg</span></pre>

<p dir="rtl">
	ستشاهد حالة الوظيفة مع حرف العطف "<span style="font-family:courier new,courier,monospace;">&amp;</span>" ملحقا في الأخير:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_52">
<span class="pln">[1]+ ping -i 5 google.com &amp;</span></pre>

<p dir="rtl">
	يعمل الأمر <span style="font-family:courier new,courier,monospace;">bg</span> افتراضيّا مع آخر عمليّة تمت إيقافها، إذا أوقفت العديد من العمليّات بشكل متتالٍ بدون تشغيلها مجدّدا يُمكنك الإشارة إلى العمليّة برقم الوظيفة لإرسال العمليّة الصحيحة إلى الخلفيّة.
</p>

<p dir="rtl">
	لاحظ أنّه ليست كل العمليّات قابلة للإرسال إلى الخلفيّة. ستتوقف بعض العمليّات آليّاً إذا كشفت أنها نُفّذت مع إدخال ومخرج معياري متصلة مُباشرة مع طرفيّة نشطة.
</p>

<h3 dir="rtl">
	نقل عمليات الخلفية إلى المقدمة
</h3>

<p dir="rtl">
	يُمكننا أيضاً نقل عمليّات الخلفيّة إلى المُقدّمة باستخدام الأمر <span style="font-family:courier new,courier,monospace;">fg</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_54">
<span class="pln">fg</span></pre>

<p dir="rtl">
	هذا الأمر يعمل مع آخر عمليّة منقولة إلى الخلفيّة، يُشار إليها بعلامة "+" في مخرجات <span style="font-family:courier new,courier,monospace;">jobs</span>. الأمر يقوم فوراً بتعليق العمليّة ووضعها في المُقدّمة. لتحديد وظيفة أخرى استعمل رقم الوظيفة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_56">
<span class="pln">fg %2</span></pre>

<p dir="rtl">
	عندما تُنقل الوظيفة إلى المُقدّمة يُمكنك إمّا إنهاؤها مع<span style="font-family:courier new,courier,monospace;"> CTRL+C</span>، أو تركها لتكتمل أو تعليقها وإرسالها إلى الخلفيّة من جديد.
</p>

<h2 dir="rtl">
	التعامل مع إشارات SIGHUP
</h2>

<p dir="rtl">
	سواء كانت العمليّة في المقدّمة أو في الخلفيّة، فستبقى مرتبطة بالطرفيّة التي بدأت العمليّة منها، عندما تغلق الطرفيّة فإنها ترسل إشارة <strong>SIGHUP</strong> لجميع العمليّات (في المُقدمة، في الخلفيّة، أو المتوقّفة) المرتبطة بها. ما يُشير إلى العمليّات بالإنهاء لأن الطرفيّة المُتحكِّمة ستصبح غير مُتوفرة قريباً، ماذا لو أردت إغلاق طرفيّة مع إبقاء تنفيذ عمليّات الخلفيّة؟
</p>

<p dir="rtl">
	هناك العديد من الطرق للقيّام بذلك، أكثر الطرق مرونة هي باستعمال مُضاعف طرفيّة (terminal multiplexer) مثل <span style="font-family:courier new,courier,monospace;">tmux</span> أو <span style="font-family:courier new,courier,monospace;">screen</span>، أو استعمل أداة تمنح خاصية الفصل مثل <span style="font-family:courier new,courier,monospace;">dtach</span>.
</p>

<p dir="rtl">
	على الرغم من هذا فهذه الطرق ليست دائما خيّارا ممكنا، ففي بعض الأوقات قد لا تكون هذه البرمجيات متوفرة أو أنّك قد سبق وبدأت العمليّة التي تريدها أن تستمر في التنفيذ بعد إغلاق الطرفيّة.
</p>

<h3 dir="rtl">
	استعمال nohup
</h3>

<p dir="rtl">
	إذا كنت تعلم أنك عند تشغيل العمليّة سترغب في إغلاق الطرفيّة قبل انتهاء العمليّة، يُمكنك تنفيذها باستخدام أمر <span style="font-family:courier new,courier,monospace;">nohup</span>، هذا الأمر يؤمّن العمليّة من التعرض إلى الإنهاء من طرف إشارة <strong>SIGHUP</strong> وستستمر في التنفيذ عندما تُغلق الطرفيّة. وستسجل كابن للنظام الأساسي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_58">
<span class="pln">nohup ping -i 5 google.com &amp;</span></pre>

<p dir="rtl">
	سترى سطرا يبدو كالتالي، مبيّنا أن مُخرجات الأمر ستُكتب في ملف يسمى<span style="font-family:courier new,courier,monospace;"> nohup.out</span> (في المجلّد الحالي إذا ما كان قابلا للكتابة عليه، في حالة لم يكن قابلا للكتابة عليه فسيُنشئه في مُجلّد المنزل):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_60">
<span class="pln">nohup: ignoring input and appending output to 'nohup.out'</span></pre>

<p dir="rtl">
	والغرض منه التأكد من أن المخرجات ليست مفقودة بعد إغلاق الطرفيّة.
</p>

<p dir="rtl">
	إذا أغلقت نافذة الطرفية وفتحت أخرى، ستبقى العمليّة في طور التنفيذ، ولن تتمكن من رؤيتها في مخرجات الأمر <span style="font-family:courier new,courier,monospace;">jobs</span> لأن كل طرفيّة تحمل صفّ وظائف خاص بها، إغلاق الطرفيّة سبّب تدمير الوظيفة ping رغم أن العمليّة <span style="font-family:courier new,courier,monospace;">ping</span> لا تزال تُنفّذ.
</p>

<p dir="rtl">
	لإيقاف عمليّة <span style="font-family:courier new,courier,monospace;">ping</span>، يجب عليك البحث عن معرّف العمليّة (process ID) أو <abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr></abbr></abbr></abbr></abbr> الخاص بها، يُمكنك القيّام بذلك بالاستعانة بالأمر <span style="font-family:courier new,courier,monospace;">pggrep</span> (هناك أيضا الأمر <span style="font-family:courier new,courier,monospace;">pkill</span>، لكنّنا بهذه الطريقة المقسّمة إلى خطوتين نكون متأكدين من أننّا سنوقف العمليّة التي نريدها فقط). استعمل <span style="font-family:courier new,courier,monospace;">pgrep</span> مع <span style="font-family:courier new,courier,monospace;">a-</span> للبحث عن العمليّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_62">
<span class="pln">pgrep -a ping</span></pre>

<p dir="rtl">
	المُخرجات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_64">
<span class="pln">7360 ping -i 5 google.com</span></pre>

<p dir="rtl">
	يُمكنك بعدها إيقاف العمليّة بإلحاق معرف العمليّة (الرقم في العمود الأول) بالأمر <span style="font-family:courier new,courier,monospace;">kill</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_66">
<span class="pln">kill 7360</span></pre>

<p dir="rtl">
	قد ترغب في حذف ملف<span style="font-family:courier new,courier,monospace;"> nohup.out</span> إذا لم تكن تريده بعد الآن.
</p>

<h3 dir="rtl">
	استعمال disown
</h3>

<p dir="rtl">
	يكون الأمر <span style="font-family:courier new,courier,monospace;">nohup</span> مُفيدا فقط عندما تعلم أنّك ستحتاج إليه عند بدأ عمليّة ما. نظام إدارة الوظائف الخاص بـ bash يتيح لنا طرقا أخرى للحصول على نتائج مماثلة مع أمر <span style="font-family:courier new,courier,monospace;">diswon</span>.
</p>

<p dir="rtl">
	عند الضبط الافتراضي للأمر <span style="font-family:courier new,courier,monospace;">disown</span>، يقوم الأمر بحذف الوظيفة من طابور الوظائف الخاص بالطرفيّة. ما يعني أنك لن تستطيع إدارة العمليّة باستعمال التقنيّات التي تطرقنا إليها (مثل <span style="font-family:courier new,courier,monospace;">fg</span> ،<span style="font-family:courier new,courier,monospace;">bg</span> ،<span style="font-family:courier new,courier,monospace;">CTRL+Z</span> ،<span style="font-family:courier new,courier,monospace;">CTRL+C</span>). سيُحذف فوريّا من قائمة مخرجات الأمر <span style="font-family:courier new,courier,monospace;">jobs</span> ولن يكون مرتبطا بالطرفيّة بعد ذلك.
</p>

<p dir="rtl">
	يُستعمل الأمر عن طريق تحديد العمليّة بالاستعانة برقم وظيفتها، على سبيل المثال، لتتبرر (<span style="font-family:courier new,courier,monospace;">disown</span>) من الوظيفة رقم 2، يمكننا كتابة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1366_8">
<span class="pln">disown %2</span></pre>

<p dir="rtl">
	هذا الأمر سيترك الوظيفة في حالة مثل الأمر <span style="font-family:courier new,courier,monospace;">nohup</span>، الاستثناء الوحيد هو أن جميع المُخرجات ستُفقد بعد إغلاق الطرفيّة في حالة لم يتم إعادة توجيهها إلى ملف ما.
</p>

<p dir="rtl">
	لن ترغب عادة في حذف العمليّة من قائمة التحكم بالوظائف إذا لم تكن تريد إغلاق نافذة الطرفيّة فورا.يمكنك إضافة <span style="font-family:courier new,courier,monospace;">h-</span> للأمر لتقوم العمليّة بتجاهل إشارات <strong>SIGHUP</strong>، وتستمرَّ في العمل كوظيفة عاديّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_68">
<span class="pln">disown -h %1</span></pre>

<p dir="rtl">
	في هذه الحالة، يُمكنك استعمال تقنيّات التحكم بالوظائف للاستمرار في التحكم بالوظيفة إلى حين إغلاق الطرفيّة، عند إغلاق الطرفيّة، ستكون عالقا -مرة أخرى- مع عمليّة دون أي مُخرجات إذا لم تعِد توجيهها إلى ملف عندما بدأتها.
</p>

<p dir="rtl">
	للعمل على ذلك، يمكنك محاولة إعادة توجيه مخرجات العمليّة بعد أن شغلتها. هذا الأمر خارج مجال هذا الدرس. يمكنك الإطلاع على الدرس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%A5%D8%AF%D8%AE%D8%A7%D9%84%D8%A7%D9%84%D8%A5%D8%AE%D8%B1%D8%A7%D8%AC-io-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r39/" rel="">مقدمة إلى إعادة توجيه الإدخال/الإخراج (I/O) في لينكس</a> لمزيد من المعلومات.
</p>

<h3 dir="rtl">
	استعمال خيار الصدفة: huponexit
</h3>

<p dir="rtl">
	هناك أيضا طريقة أخرى في Bash لتجنّب مشكلة إشارات <strong>SIGHUP</strong> للعمليّة الابن، يتحكم خيّار <span style="font-family:courier new,courier,monospace;">huponexit</span> في ما إذا كان bash سيرسل إشارة <strong>SIGHUP</strong> للعمليّة الابن عند الخروج أو لا.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: خيّار <span style="font-family:courier new,courier,monospace;">huponexit</span> يؤثّر على طريقة تصرف إشارات <strong>SIGHUP</strong> فقط إذا كان إغلاق جلسة الصّدفة من داخل الصّدفة نفسه. يعتبر الأمر <span style="font-family:courier new,courier,monospace;">exit</span> أو <span style="font-family:courier new,courier,monospace;">CTRL+D </span>من الأمثلة على إغلاق الجلسة من داخل الصّدفة. عند إنهاء جلسة صدفة من برنامج الطرفيّة (بإغلاق النافذة، ...)، لن يكون للأمر <span style="font-family:courier new,courier,monospace;">huponexit</span> أي تأثير، عوضا عن ترك اتخاذ قرار إرسال إشارة <strong>SIGHUP</strong> لـ bash سترسل الطرفيّة بنفسها الإشارة إلى bash، والتي ستبثّ (بشكل صحيح) الإشارة إلى العمليّة الابن.
</p>

<p dir="rtl">
	رغم المحاذير أعلاه، يعتبر خيار <span style="font-family:courier new,courier,monospace;">huponexit</span> أسهل من الطرق.
</p>

<p dir="rtl">
	يُمكنك معرفة ما إذا كانت هذه الخاصية مُشغّلة أو لا بكتابة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_70">
<span class="pln">shopt huponexit</span></pre>

<p dir="rtl">
	لتشغيل الخاصيّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_72">
<span class="pln">shopt -s huponexit</span></pre>

<p dir="rtl">
	الآن، إذا قمت بالخروج من الجلسة بالأمر <span style="font-family:courier new,courier,monospace;">exit</span>، فإن العمليّات ستستمر في العمل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_340_74">
<span class="pln">exit</span></pre>

<p dir="rtl">
	لدى هذا الأمر نفس المحاذير حول المُخرجات مع الخيّار السابق، لذلك تأكد أنّك قمت بتوجيه مُخرجات العمليّة قبل إغلاق الطرفيّة إذا كانت مُهمّة.
</p>

<h2 dir="rtl">
	خاتمة
</h2>

<p dir="rtl">
	سيمنحك تعلّم التحكم بالوظائف وكيفيّة إدارة عمليّات المُقدمة وعمليّات الخلفيّة مرونة أكثر عند تشغيل البرامج من سطر الأوامر. عوضا عن فتح عدّة طرفيّات أو جلسات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr></abbr>، تستطيع أن تدبّر الأمر ببضع أوامر إيقاف وإرسال إلى الخلفيّة.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes" rel="external nofollow">How To Use Bash's Job Control to </a><a href="https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes" rel="external nofollow">Manage Foreground and Background Processes</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">253</guid><pubDate>Tue, 26 Apr 2016 11:05:36 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x643;&#x62A;&#x627;&#x628;&#x629; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; Shell Scripts</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r252/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/write-shell-scripts-linux.png.a9cc545cf3c4db84543657c76dd5913a.png" /></p>

<p dir="rtl">
	تتوفر آلاف الأوامر لمستخدمي سطر أوامر لينُكس، لكن كيف تستطيع تذكرها جميعًا؟ الجواب هو أنَّك لا تحتاج إلى ذلك؛ فالقوة الحقيقية للحاسوب تظهر عندما يقوم بالعمل عوضًا عنك، وذلك باستخدام سكربتات الصدفة (Shell Scripts) لأتمتة المهام.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="write-shell-scripts-linux.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15718" data-unique="bi2p8oju8" src="https://academy.hsoub.com/uploads/monthly_2016_04/write-shell-scripts-linux.png.ee830ea0d9e20637b12abc2e2f77aa19.png"></p>

<h2 dir="rtl">
	ما هي سكربتات الصدفة؟
</h2>

<p dir="rtl">
	بأبسط تعريفٍ لها: سكربت الصّدفة هو ملف يحتوي على سلسلة من الأوامر التي تقرأها الصَدَفة (shell) وتنفِّذ الأوامر التي فيها كما لو أنها أُدخِلَت مباشرةً من سطر الأوامر.
</p>

<p dir="rtl">
	الصَدَفة هي برمجية فريدة من نوعها، وذلك لأنها توفر واجهة سطرية (أي من سطر الأوامر) للتعامل مع النظام مع كونها مُفسِّر (interpreter) للسكربتات. وكما سنرى لاحقًا، أيّ شيء يمكنك القيام به في سطر الأوامر يمكن فعله في سكربتات الصدفة، وأغلبية الأشياء التي تستطيع كتابتها في سكربتات الصدفة يمكن تنفيذها مباشرةً في سطر الأوامر.
</p>

<p dir="rtl">
	سنُركِّز في هذه السلسلة على الميزات التي تُستخدم عادةً عند كتابة السكربتات.
</p>

<h2 dir="rtl">
	كتابة أول سكربت لك
</h2>

<p dir="rtl">
	يجب أن تفعل ثلاثة أشياء لكي تكتب سكربت شِل:
</p>

<ol dir="rtl">
<li>
		كتابة السكربت
	</li>
	<li>
		السماح للصَدَفة (shell) بتنفيذه (أي إعطاؤه إذن التنفيذ x)
	</li>
	<li>
		وضعه في مكانٍ تستطيع الصَدَفة العثور عليه فيه
	</li>
</ol>
<p dir="rtl">
	سكربت الصّدفة ما هو إلا ملف يحتوي على نص عادي؛ فلا يلزمك إلا محرر نصي لكتابة سكربتات الصدفة. "المحرر النصي" هو برنامج -يشبه برامج التحرير المكتبي- يستطيع قراءة وكتابة ملفات ASCII النصية. هنالك الكثير من المحررات النصية المتوفرة على نظام لينُكس سواءً كانت سطريةً (أي تعمل من سطر الأوامر) أم رسوميةً؛ هذه قائمة تحتوي على أشهرها:
</p>

<ul dir="rtl">
<li>
		<strong>vi</strong> أو <strong>vim</strong>: المحرر النصي السطري الشهير في نظام يونكس المعروف بصعوبة فهم بنية الأوامر فيه؛ لكنه -على الكفة الأخرى- محرر كفؤ وقوي جدًا وخفيف وسريع. سيؤتي تعلم vi أُكله لأنه متوفر على جميع الأنظمة الشبيهة بِيونكس (Unix-like). النسخة الموجودة من vi في أغلبية توزيعات لينُكس هي النسخة المُحسَّنة التي تدعى vim.
	</li>
	<li>
		<strong>Emacs</strong>: كبير المحررين في عالم النصوص الذي برمَجَه <a href="https://ar.wikipedia.org/wiki/%D8%B1%D9%8A%D8%AA%D8%B4%D8%A7%D8%B1%D8%AF_%D8%B3%D8%AA%D9%88%D9%84%D9%85%D9%86" rel="external nofollow">ريتشارد ستالمان</a>. يحتوي محرر Emac (أو يستطيع أن يحتوي) على كل ميزة يمكن أن تتواجد في أي محرر نصي على الإطلاق! يجدر بالذكر أنَّ مستخدمي vi و Emacs يشتبكون مع بعضهم (على الإنترنت بالطبع!) محاولين إثبات أنَّ محررهم هو الأفضل.
	</li>
	<li>
		<strong>nano</strong>: هو برنامج سطري شبيه بالمحرر النصي المضمَّن مع عميل البريد الإلكتروني pine، وهو سهل الاستخدام لكن ميزاته قليلة. أنصح عادةً باستخدام nano لمَن يتعامل مع سطر الأوامر لأول مرة.
	</li>
	<li>
		<strong>gedit</strong>: هو محرر رسومي يأتي مع سطح مكتب غنوم (Gnome).
	</li>
	<li>
		<strong>kate</strong>: هو محرر رسومي ذو ميزات متقدمة تُسهِّل كتابة السكربتات ويأتي مع حزمة برمجيات كدي (KDE).
	</li>
</ul>
<p dir="rtl">
	افتح الآن محررك النصي المفضَّل واكتب فيه أول سكربت لك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_13">
<span class="pln">!/bin/bash
My first script

echo "Hello World!"</span></pre>

<p dir="rtl">
	إذا كنتَ سريع البديهة، فمن المرجح أنَّك عرفت كيف تلصق النصوص في المحرر النصي الذي اخترته.
</p>

<p dir="rtl">
	إذا فتحت أيّ كتابٍ عن البرمجة من قبل، فستتعرف مباشرةً على برنامج "Hello World" التقليدي الذي يُجسِّده المثال السابق. احفظ الملف باسمٍ ذي معنى (ربما<span style="font-family:courier new,courier,monospace;"> hello_world</span>).
</p>

<p dir="rtl">
	أول سطر في الملف مهمٌ وله تأثيرٌ خاص، إذ يُسمى "shebang" وسيخبر الصَدَفة أيّ مُفسِّر عليها استدعاؤه لتفسير هذا السكربت، الذي هو في حالتنا <span style="font-family:courier new,courier,monospace;">‎/bin/bash</span>. تستعمل لغات السكربتات الأخرى مثل perl و awk و tcl و php و python هذه الآلية.
</p>

<p dir="rtl">
	السطر الثاني في الملف هو تعليق. أيّ شيء يأتي بعد علامة يُعتبر تعليقًا وستتجاهله الصَدَفة تمامًا. لكن عندما يزداد تعقيد برامجك فستصبح التعليقات مهمة جدًا، إذ يستعملها المبرمجون لشرح ما حولها لتسهيل فهم الآخرين له. آخر سطر في السكربت السابق هو الأمر <span style="font-family:courier new,courier,monospace;">echo</span> الذي يطبع ما يليه على الشاشة.
</p>

<h2 dir="rtl">
	ضبط الأذونات
</h2>

<p dir="rtl">
	علينا الآن إعطاء إذن التنفيذ لسكربت الصّدفة الذي كتبناه، وذلك بالأمر <span style="font-family:courier new,courier,monospace;">chmod</span> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_15">
<span class="pln">$ chmod 755 hello_world</span></pre>

<p dir="rtl">
	الإذن "755" سيسمح لك بالقراءة والكتابة والتنفيذ، بينما سيتمكن بقية المستخدمين من قراءة وتنفيذ السكربت فقط. أما إذا أردت أن يكون السكربت خاصًا بك (أي أنَّك الوحيد الذي تستطيع قراءته وتنفيذه) فضع "700" بدلًا من "755".
</p>

<p dir="rtl">
	راجع درس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-permissions-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r242/" rel="">مبادئ أذونات الملفات على لينكس</a> للمزيد من المعلومات.
</p>

<h2 dir="rtl">
	وضع الملف في المكان الصحيح
</h2>

<p dir="rtl">
	تستطيع عند هذه المرحلة تشغيل السكربت كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_17">
<span class="pln">$ ./hello_world</span></pre>

<p dir="rtl">
	يجب أن تشاهد العبارة "Hello World!‎" على الشاشة، وإن لم ترها فانظر أين حفظت السكربت، وانتقل إلى ذاك المجلد (بالأمر <span style="font-family:courier new,courier,monospace;">cd</span>) ثم جرب مرِّة أخرى.
</p>

<p dir="rtl">
	علينا الآن أن نتوقف قليلًا ونتحدث عن المسارات. عندما تكتب اسم أحد الأوامر فلن يبحث النظام (أو بالأحرى "الصَدَفة") عن ذاك البرنامج في جميع مجلدات حاسوبك لأن ذلك سيستغرق وقتًا طويلًا؛ ولكنك لاحظت أيضًا كيف أنَّك لا تحتاج إلى تحديد المسار الكامل للبرامج التي تريد تشغيلها وستظن أنَّ الصَدَفة تعرف أين تجدها.
</p>

<p dir="rtl">
	حسنًا، أنت محق: الصَدَفة تعرف أين تجد البرمجيات، لأنها -أي الصَدَفة- تحتوي على قائمة بالمجلدات التي تتواجد فيها الملفات التنفيذية (أي البرامج)، وستبحث داخل المجلدات في تلك القائمة عن البرامج، فإن لم تجد ما تبحث عنه في أحد تلك المجلدات فستظهر رسالة الخطأ الشهيرة <strong>command not found</strong>.
</p>

<p dir="rtl">
	يمكنك أن ترى تلك القائمة بكتابة الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_20">
<span class="pln">$ echo $PATH</span></pre>

<p dir="rtl">
	الذي سيطبع قائمة مفصولة بنقطتين رأسيتين للمجلدات التي سيتم البحث فيها عن البرامج إذا لم يُحدَّد مسارها الكامل. لاحظ كيف أننا حدَّدنا المسار (‎./‎) عند محاولتنا تشغيل السكربت سابقًا.
</p>

<p dir="rtl">
	يمكنك إضافة مجلدات إلى تلك القائمة باستخدام الأمر الآتي، حيث directory هو مسار المجلد الذي تريد إضافته:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_22">
<span class="pln">$ export PATH=$PATH:directory</span></pre>

<p dir="rtl">
	لكن من المستحسن أن تُعدِّل ملف<span style="font-family:courier new,courier,monospace;"> ‎.bashrc‎</span> أو <span style="font-family:courier new,courier,monospace;">‎.profile </span>(اعتمادًا على توزيعتك) لتضمين الأمر السابق فيه، وبهذا سيُنفَّذ في كل مرّة تُسجِّل دخولك فيها.
</p>

<p dir="rtl">
	تسمح بعض توزيعات لينُكس بإنشاء مجلد خاص بكل مستخدم ليضع فيه برامجه الشخصية، ويدعى ذاك المجلد <span style="font-family:courier new,courier,monospace;">bin</span> وهو مجلد فرعي موجود في مجلد المنزل (home) الخاص بك. إن لم يكن موجودًا، فتستطيع إنشاءه بالأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_24">
<span class="pln">$ mkdir bin</span></pre>

<p dir="rtl">
	انقل السكربت إلى مجلد <span style="font-family:courier new,courier,monospace;">bin</span> (ربما تستخدم الأمر <span style="font-family:courier new,courier,monospace;">mv</span>) ثم اكتب:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7411_26">
<span class="pln">$ hello_world</span></pre>

<p dir="rtl">
	وسيعمل السكربت. لاحظ أنَّك قد تحتاج في بعض التوزيعات (مثل أوبنتو) إلى بدء جلسة (session) جديدة حتى تتعرَّف الصَدَفة على المجلد <span style="font-family:courier new,courier,monospace;">bin</span>.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال <a href="http://linuxcommand.org/lc3_wss0010.php" rel="external nofollow">Writing Your First Script And Getting It To Work</a> لصاحبه William Shotts.
</p>
]]></description><guid isPermaLink="false">252</guid><pubDate>Fri, 29 Apr 2016 09:23:00 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; Red Hat Enterprise Linux &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; VirtualBox</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-red-hat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-virtualbox-r249/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/install-rhel-on-virtualbox.png.c9df04ed2b82c4432293343aad4235a2.png" /></p>

<p>
	توفّر Red Hat امتيازات خاصّة للمطوّرين يمكنك الاستفادة منها والتسجيل للحصول على رابط تنزيل ملف ISO. يمكن استخدام نفس الحساب للاشتراك والحصول على التحديثات من الشركة في إطار الاستخدام الشّخصي. ستحتاج قبل البدء في تثبيت توزيعة Red Hat Enterprise Linux إلى تنزيل الملفّ من موقع Red Hat.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="15716" data-unique="tg4t46k25" src="https://academy.hsoub.com/uploads/monthly_2016_04/install-rhel-on-virtualbox.png.3bae585cfd930c76427085001d2b50be.png" alt="install-rhel-on-virtualbox.png"></p>

<p>
	سنشرح في هذا المقال طريقة التثبيت باستخدام برنامج Oracle VirtualBox للأنظمة الوهمية الذي نفترض تثبيته لديك. يُنصَح بتوفّر الميزات التالية -على الأقل- من أجل تشغيل RHEL على النحو الأمثل:
</p>

<ul>
<li>
		جهاز بمعماريّة 64 بت بعتاد يدعم الأنظمة الوهميّة (Intel VT-X أو AMD-V).
	</li>
	<li>
		نظام تشغيل يدعمه Virtualbox مثل Windows 7 ،OS X 10.8 ،Ubuntu 12.04 أو أحدث.
	</li>
	<li>
		ذاكرة عشوائية قدرها 8 غيغا بايت.
	</li>
	<li>
		مساحة قرص صلب متاحة قدرها 24 غيغابايت.
	</li>
</ul>
<h2 id="إعداد-virtualbox-لتثبيت-rhel">
	إعداد VirtualBox لتثبيت RHEL
</h2>

<p>
	نتوقّف قبل البدء في خطوات التثبيت لشرح مصطلحين يردان كثيرا عند الحديث عن الأنظمة الوهمية: المُضيف Host والضّيف Guest. في هذا الإطار نطلق عبارة المُضيف على نظام التشغيل الذي نُثبّت عليه برنامج VirtualBox بينما نعني بالضّيف نظامَ التشغيل الذي سنثبته داخل VirtualBox. هذا الأخير ليس له وجود بدون VirtualBox الذي يلعب دور الوسيط بينه وبين نظام التشغيل المثبت فعلا.
</p>

<p>
	في حالتي النظام المُضيف هو أوبنتو 14.04 بينما سنثبت RHEL كنظام ضيف.
</p>

<p>
	نبدأ بتشغيل VirtualBox ثم نضغط على زر <strong>New</strong> (جديد) لإنشاء نظام وهمي جديد؛ تظهر نافذة جديدة. نختار اسم <strong>RHEL</strong> للجهاز الوهميّ الجديد وسيتعرّف Virtualbox تلقائيا على نوع (Type) نظام التشغيل وإصداره (Version).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15111" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_01.png.b11fd09e81f89f40458d7a4690879149.png" rel="external"><img alt="virtualbox_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15111" data-unique="nlkqarv0y" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_01.thumb.png.a93f25f598432d15ed94b156ac4a85ed.png"></a>
</p>

<p>
	ننتقل للخطوة الموالية (<strong>Next</strong>) لاختيار مقدار الذاكرة العشوائيّة للنّظام الوهميّ؛ الحد الأدنى هو 2096 ميغابايت (2 غيغابايت).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15112" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_02.png.3a8a15a554a49568d7edacc0019ede21.png" rel="external"><img alt="virtualbox_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15112" data-unique="e9y13xha7" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_02.thumb.png.c82520506feb92829824e64da1529752.png"></a>
</p>

<p>
	لديّ ذاكرة عشوائية قدرها 8 غيغابايت خصصتُ منها 4 للجهاز الوهمي الذي ستعمل عليه RHEL.
</p>

<p>
	ثم يأتي دور القرص الصلب الوهمي.
</p>

<p>
	حدّد خيار <strong>Create a virtual hard disk now </strong>(أنشئ قرصا صلبا وهميًّا الآن) ثم انقر على الزر <strong>Create</strong> (أنشئ).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15113" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_03.png.978ab1a13284152d238dbeca37cb355e.png" rel="external"><img alt="virtualbox_03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15113" data-unique="s63qjl2pn" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_03.thumb.png.36d9e0148b3bf4767a526978f0dbd13d.png"></a>
</p>

<p>
	حدّد خيار <strong>(VDI (VirtualBox Disk Image</strong> وهي صيغة الأقراص الصّلبة الوهمية المستخدمة مبدئيا في Virtualbox. انقر على التالي للخطوة الموالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15114" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_04.png.b0b49f4268d280c61d1014ac34257716.png" rel="external"><img alt="virtualbox_04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15114" data-unique="ygqs0n0sn" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_04.thumb.png.7a8aafb6cfe968230fd333b0b9854763.png"></a>
</p>

<p>
	يوجد خياران؛ إما حجز مساحة ثابتة مقدّما Fixed size أو جعلها ديناميكية Dynamically allocated. في الحالة الأولى تُحجز مساحة (20 غيغابايت مثلا) على القرص الصّلب للنظام المضيف وتُخصَّص للنظام الضّيف؛ أما في الحالة الثانية فإن استغلال القرص الصلب للنظام المضيف يكون حسب الحاجة في حدود المساحة المخصَّصة. الطريقة الأولى أبطأ أثناء الحجز وقد يستغرق إعداداها بضعة دقائق، ولكنها أسرع في الاستعمال؛ والثانية أسرع أثناء الإعداد وأبطأ أثناء الاستخدام.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15115" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_05.png.625ca7a81d1407ff16ae9c55482cddf9.png" rel="external"><img alt="virtualbox_05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15115" data-unique="ro7pf1o2b" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_05.thumb.png.aff8774bf96126c262db4240ff56f465.png"></a>
</p>

<p>
	تقترح النافذة التالية مسارا على النظام المضيف لحفظ القرص الوهميّ؛ يمكنك تغييره إن شئت. يوجد أيضا خيار لمساحة القرص الصّلب الوهمي. يجب أن تخصّص على الأقل 20 غيغابايت للنظام الوهميّ ويمكن أن تزيدها إن كنت تخطّط للعمل بكثافة على النظام (تثبيت الكثير من البرامج مثلا). بالنسبة لي اخترتُ 30 غيغابايت.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15116" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_06.png.f11634ac1c13b7f63e022ef4a62985ce.png" rel="external"><img alt="virtualbox_06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15116" data-unique="u47yfrbr6" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_06.thumb.png.46814b08a514cb4d172b9093e3060ec7.png"></a>
</p>

<p>
	نحصُل بالوصول إلى هذه النقطة على جهاز وهميّ قاعدي. نحتاج لبضعة إعدادات أخرى.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15117" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_07.png.bcc020ca80495c84108928918c43815f.png" rel="external"><img alt="virtualbox_07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15117" data-unique="lg3h4jijn" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_07.thumb.png.03897079473a00b24d7eae7cfe684601.png"></a>
</p>

<p>
	<strong>ملحوظة:</strong> ربما تلاحظ وجود أكثر من جهاز وهمي في الصّورة أعلاه. يتيح VirtualBox إنشاء أكثر من نظام ضيف على نفس المُضيف.
</p>

<p>
	اختر الجهاز الوهمي الذي أنشأناه للتّو (RHEL) من القائمة الموجودة في يسار الشاشة ثم انقر على خانة الإعدادات العامة <strong>General</strong> في يمين الشاشة. تظهر نافذة الإعدادات؛ اختر منها تبويب <strong>Advanced</strong>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15118" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_08.png.34616716279584d028efdeabaebc5fa7.png" rel="external"><img alt="virtualbox_08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15118" data-unique="l9g8ge24l" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_08.thumb.png.74169d88f632a222da1b86b2743b6967.png"></a>
</p>

<p>
	يسمح هذا الإعداد بتشارك الحافظة Clipboard بين النظامين الضّيف والمضيف. سنحتاج لتفعيل إضافات VirtualBox حتى يمكننا النسخ واللّصق بين الاثنين (خطوة موالية).
</p>

<p>
	يعمل الجهاز الوهمي مبدئيّا على معالج واحد؛ إلا أن بإمكانك جعله يعمل على أكثر من معالج إن كانت لديك معالجات أو أنوية متعدّدة. اختر <strong>System</strong> (النظام) من القائمة اليسرى في نافذة الإعدادات العامّة ثم تبويب المعالج <strong>Processor</strong> في الجانب الأيمن.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15119" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_09.png.894088a2d7458467ccbe13686956034f.png" rel="external"><img alt="virtualbox_09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15119" data-unique="2ne37qrf3" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_09.thumb.png.919efb0f11c4885cef44b49c3d8ad5d3.png"></a>
</p>

<p>
	اختر العدد المناسب بالنسبة لك (اخترتُ أن يعمل النظام الوهمي على معالجين؛ من أصل 4 متوفّرة).
</p>

<p>
	نأتي الآن لإعداد الجهاز الوهمي للإقلاع على ملف ISO الذي نزّلناه من موقع Red Hat.
</p>

<p>
	اختر <strong>Storage</strong> (التخزين) من القائمة اليسرى في نافذة الإعدادات العامّة ثم في الجانب الأيمن من النافذة، في مجموعة <strong>Storage tree</strong> (تفرعات التخزين) اختر أيقونة القرص الضوئي CD الموجودة تحت <strong>Controller: IDE</strong> (حيثُ توجد عبارة فارغ Empty دلالة على أننا لم نخصّص الإعداد بعد). انقُر على أيقونة القرص الضوئي ضمن مجموعة Attributes (الخصائص) يمينَ الشّاشة وانقر على خيار <strong>Choose Virtual Optical Disk File</strong> (اختر ملفّ قرص ضوئي وهمي). ستظهر نافذة انتقل عبرها إلى مكان ملف توزيعة RHEL الذي نزلته سابقا. يظهر اسم الملف <code>rhel-server-7.2-x86_64-dvd.iso</code> الآن في تفرّعات التخزين أسفل عبارة<strong> Controller: IDE</strong> بدلا من عبارة فارغ (Empty).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15120" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_10.png.0656d888e7dd008a31a368c0a6d6a706.png" rel="external"><img alt="virtualbox_10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15120" data-unique="q87236l7c" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_10.thumb.png.bc3d8f43937bed3c6aa4a20f60568c04.png"></a>
</p>

<p>
	بقيت لنا خطوة أخيرة قبل البدء في تثبيت التوزيعة؛ هذه الخطوة اختيارية ولكنها مفيدة. سننشئ مجلّدا مشتركا بين النظامين، الضيف والمضيف وهو ما يسهّل تشارك الملفات بين الاثنين.
</p>

<p>
	اختر <strong>Shared folders</strong> (المجلدات المشتركة) ضمن القائمة اليسرى في نافذة الإعدادات العامّة للجهاز الوهمي RHEL.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15121" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_11.png.cc87be94b796d97a40db85cb02ac2296.png" rel="external"><img alt="virtualbox_11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15121" data-unique="p6d1fqg3a" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_11.thumb.png.397f44eaf45a4e10ec9160a72419a0be.png"></a>
</p>

<p>
	انقر على زر الإضافة الموجود في يمين النافذة لتظهر نافذة صغيرة. حدّد في الحقل الأول Folder path مسار المجلّد على النظام المضيف ثم حدد له اسما بدون مساحات في الحقل الثاني.
</p>

<p>
	حدّد خيار Auto-mount (تركيب تلقائي) لكي يُركَّب الملف مع تشغيل النّظام.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15122" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_12.png.d271844dd842b539666f2ff39674d253.png" rel="external"><img alt="virtualbox_12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15122" data-unique="ae1wsqlif" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_12.thumb.png.2af3eff4f37acd9df8602f958ab49b92.png"></a>
</p>

<p>
	نحن الآن جاهزون لتثبيت RHEL.
</p>

<h2 id="تثبيت-rhel-على-virtualbox">
	تثبيت RHEL على VirtualBox
</h2>

<p>
	نختار النظام الوهميّ الذي أعددناه في الخطوات السابقة ثم ننقر على زر <strong>Start</strong> (ابدأ).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15123" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_13.png.997b7b63080a3c78695deb16d5c1b86a.png" rel="external"><img alt="virtualbox_13.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15123" data-unique="gj82nsga8" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_13.thumb.png.0fcc630b33d0db5beed9a9401e081e2b.png"></a>
</p>

<p>
	يحمّل الجهاز الوهميّ ملف التوزيعة من القرص الضّوئي الوهميّ وتبدأ بالتالي عمليّة التثبيت كما لو كنا أمام جهاز حاسوب حقيقي.
</p>

<p style="text-align: center;">
	<img alt="virtualbox_14.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15124" data-unique="z2vzo9guj" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_14.png.9356655ac38aad8e03864dea8d0b2036.png"></p>

<p>
	يظهر خياران في الشاشة؛ الأول لبدء تثبيت التوزيعة مباشرة والثاني لاختبار ملف ISO ثم بدء التثبيت. نختار الثاني للتحقّق من أنّه لا توجد عيوب في الملفّ.
</p>

<p>
	<strong>ملحوظة: </strong>اضغط على زرّ <span style="font-family:courier new,courier,monospace;">Ctrl</span> الأيمن في لوحة المفاتيح لجعل المؤشّر يعمل داخل الإطار المخصّص للنظام الضّيف؛ ثم اضغط عليه مرةً أخرى إذا أردت إعادة المؤشّر للنظام المضيف.
</p>

<p>
	ينفّذ النظام بضعة عمليات للتحقّق من سلامة ملف ISO الخاصّ بالتوزيعة ثم تبدأ عمليّة التثبيت.
</p>

<p>
	الخطوة الأولى هي اختيار اللغة وتموضع لوحة المفاتيح.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15125" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_15.png.1e47da3b3bee940f1e0c4e2f9a2b18a4.png" rel="external"><img alt="virtualbox_15.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15125" data-unique="e7f6d48r4" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_15.thumb.png.3388ba60313f07f540476fab69293d5e.png"></a>
</p>

<p>
	يأتي بعد اختيّار اللغة ملخَّص للتثبيت؛ يمكنك فيه اختيّار منطقة التوقيت، اللّغة، لوحة المفاتيح وإعدادات أخرى. بالنقر على إحدى الفقرات تُفتَح نافذة لإعدادها ثم بعد الانتهاء من الإعداد يوجد زر <strong>Done</strong> (تمّ) للعودة للملخَّص.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15126" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_16.png.dc78435f51ff8f8fb413548c379d15de.png" rel="external"><img alt="virtualbox_16.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15126" data-unique="yy94nbljz" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_16.thumb.png.946e54bfdff0483fcddaa675841e422d.png"></a>
</p>

<p>
	سنذهب لزرّ <strong>Software selection</strong><em> </em>(اختيّار البرامج) وننقر عليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15127" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_17.png.457e3977c3e8ff03c45ae7423d1175ae.png" rel="external"><img alt="virtualbox_17.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15127" data-unique="uuqlumleo" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_17.thumb.png.2659069a9195fd2c7c17eede6e2b3a99.png"></a>
</p>

<p>
	نحدّد خيار Server with Gui (خادوم بواجهة رسوميّة) من لائحة Base Environment (البيئة القاعديّة) الموجودة يسار الشاشة. توجد يمين الشاشة لائحة بإضافات برمجية (حزم برامج) يمكن الاختيار بينها للتثبيت مع البيئة القاعديّة المحدّدة. اختر من بينها Development tools (أدوات تطوير) التي سنحتاجها لاحقا ثم انقر زرّ <strong>Done</strong> للعودة إلى الملخّص.
</p>

<p>
	انقر على زرّ <strong>Network amd Hostname</strong> (الشبكة واسم المضيّف) في نافذة الملخّص لإعداد الاتّصال بالشبكة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15128" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_18.png.29f27701bf14e7ee8acc893f7972ade9.png" rel="external"><img alt="virtualbox_18.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15128" data-unique="8mpjvms9a" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_18.thumb.png.d326b2ae124af68610b7308d986c5c67.png"></a>
</p>

<p>
	اختر واجهة الشبكة من اللّائحة على اليسار ثم فعّل الاتّصال بالنقر على زر On.
</p>

<p>
	عطّل بالعودة إلى نافذة الملخّص استخدامَ KDump بنزع تحديد<strong> Enable kdump</strong> في نافذة الإعداد الخاصّة به من أجل ربح قليل من الذاكرة العشوائية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15129" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_19.png.c233df01d0223d12be0f7c2880c987e7.png" rel="external"><img alt="virtualbox_19.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15129" data-unique="ms2d99y4z" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_19.thumb.png.43a48a037d8f4ef3a0189eab75ce717c.png"></a>
</p>

<p>
	بقي لنا إعداد القرص الصّلب الذي سنثبّت عليه النظام لذا نختار زرّ <strong>Installation destination</strong> (وجهة التثبيت) في نافذة الملخّص.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15130" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_20.png.27a657a563970e02ff0aad43bfca9c72.png" rel="external"><img alt="virtualbox_20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15130" data-unique="u4mf7ir7q" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_20.thumb.png.4fb153b74ef813d2702b8ec84edab83b.png"></a>
</p>

<p>
	بما أن لدينا قرصا وهميّا فسنختاره كاملا للتجزئة.
</p>

<p>
	<strong>ملحوظة:</strong> ينبغي الحذر في هذه الخطوة إن كنت تثبّت التوزيعة على جهاز فعلي وليس وهميا به نظم تشغيل أخرى. ربما يؤدي اختيار تجزئة غير مناسبة إلى محو بياناتك الموجودة على القرص.
</p>

<p>
	يمكننا الآن بعد أن أكلنا إعداد الوجهة النقر على زرّ <strong>Begin installation</strong> لبدء التثبيت.
</p>

<p>
	تبدأ عملية تثبيت RHEL وتظهر نافذة جديدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15131" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_21.png.0bcac08a9d57a71b8c0999f8d769c234.png" rel="external"><img alt="virtualbox_21.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15131" data-unique="sdhlg4cq5" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_21.thumb.png.c626da9ffe3ddc308198ef37ec81fbcc.png"></a>
</p>

<p>
	يُطلَب منّا أثناء نسخ الملفّات وتثبيت الأدوات التي اخترناها إعدادُ حساب المستخدِم الجذر Root ومستخدم آخر للمهامّ غير الإدارية.
</p>

<p>
	انقر على زرّ <strong>Root password </strong>(كلمة سر الجذر) لضبط كلمة السّر الخاصّة بالمستخدم الجذر؛ ثم بعد إتمام ضبطها انقر على زرّ<strong> User creation</strong> (إنشاء مستخدِم) لإعداد مستخدم آخر غير المستخدم الجذر. تبدو الصّورة على النحو التالي بعد إكمال الإعداديْن.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15132" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_22.png.ee3d08d191fd22ced935b283b12fa92e.png" rel="external"><img alt="virtualbox_22.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15132" data-unique="shc60wpct" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_22.thumb.png.392ba9dd423dc52de777a249038bdd91.png"></a>
</p>

<p>
	انتظر حتى إكمال نقل الملفات وتطبيق الإعدادات (قد يستغرق ذلك دقائق طويلة حسب جهازك) ثم انقر على زرّ <strong>Reboot</strong> (أعد التشغيل).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15133" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_23.png.80218d07a737ded1e591b2078bcd5208.png" rel="external"><img alt="virtualbox_23.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15133" data-unique="gfvvmyknt" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_23.thumb.png.273bb626ad414d0bfb6408aa34b737b4.png"></a>
</p>

<p>
	تظهر - بعد إعادة تشغيل النظام في الخطوة السّابقة - النافذة التالية والتي تطلُب قراءة شروط استخدام RHEL والموافقة عليها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15134" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_24.png.e50f5620de917a6e8157fe79d04adfda.png" rel="external"><img alt="virtualbox_24.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15134" data-unique="bwg0is9lf" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_24.thumb.png.3d773ad63364758d6cd9e9e0c981e48f.png"></a>
</p>

<ul>
<li>
		اكتب الرقم 1 ثم اضغط على زر Enter لعرض معلومات الرّخصة.
	</li>
	<li>
		اكتب الرقم 2 ثم اضغط Enter لقبول الرخصة.
	</li>
	<li>
		اضغط على الزّر <code>c</code> في لوحة المفاتيح للخروج من شروط الاستخدام.
	</li>
	<li>
		اضغط على الزّر <code>c</code> لاستكمال التثبيت.
	</li>
</ul>
<p>
	<strong>ملحوظة:</strong> قد لا تظهر النافذة أعلاه؛ وتظهر بدلا منها نافذة رسومية يمكن من خلالها قراءة الترخيص وقبوله. يوجد أيضا في نفس النافذة زر للوصول المباشر إلى مدير الاشتراكات (لتسجيل الاشتراك كما في الخطوة الموالية أدناه).
</p>

<p>
	تظهر بعد اكتمال عمليّة الإقلاع نافذة دخول باسم الحساب العاديّ الذي أنشأته أثناء التثبيت.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15135" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_25.png.926bb92d1d5fc1b24c3a8b67d9b9cba3.png" rel="external"><img alt="virtualbox_25.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15135" data-unique="jj0iicx3x" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_25.thumb.png.192f80b779385116b73df9541969c089.png"></a>
</p>

<p>
	بقيت لنا خطوة أخيرة وهي تسجيل نسختنا من أجل الحصول على التحديثات من Red Hat.
</p>

<p>
	تأكّد من الاتّصال بالشبكة بالذهاب إلى قائمة <strong>Applications</strong> (التطبيقات) ثم القائمة الفرعيّة <strong>System tools </strong>(أدوات النّظام) ثم خيار <strong>Settings</strong> (الإعدادات) ثم زر <strong>Network</strong> (الشّبكة). نتوجّه بعد التأكّد من الاتّصال إلى قائمة التطبيقات مرة أخرى، أدوات النّظام ونختار منها <strong>Red Hat Subscription Manager</strong> (مدير الاشتراك في Red Hat). أدخل كلمة السرّ الخاصّة بالحساب الجذر (ليست كلمة سر حسابك العادي) إن طُلب منك ذلك. تظهر النافذة التالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15136" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_26.png.a9d21a0f1569663ae6f9ae54489a6dd6.png" rel="external"><img alt="virtualbox_26.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15136" data-unique="g5s7tz2hd" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_26.thumb.png.b5206ca0beed2836cc6c95b30b6c6ba0.png"></a>
</p>

<p>
	ننقر على زر <strong>Register</strong> (سجِّل) وندخل معلومات الاستيثاق الخاصّة بحساب مطوّري Red Hat (اسم المستخدِم وكلمة السّر) ثم ننتظر قليلا لتظهر النافذة التاليّة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15137" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_27.png.84b9103406fec75816da4ac420399d56.png" rel="external"><img alt="virtualbox_27.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15137" data-unique="df00jdhfe" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_27.thumb.png.5730b91341dabf9eace83d9649bd3f6d.png"></a>
</p>

<p>
	تلخّص النافذة معلومات الاشتراك ونوعه. نضغط على زرّ <strong>Attache</strong> (أرفق) لاستخدام الاشتراك وتلقي التحديثات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15138" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_28.png.b33dd31894103e78c3baa546905211d8.png" rel="external"><img alt="virtualbox_28.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15138" data-unique="2ftcu7iwt" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_28.thumb.png.d99efd9d7ec8338f7b0a5c01f0aa2387.png"></a>
</p>

<p>
	لدينا الآن اشتراك مدّته سنة.
</p>

<h2>
	إعدادات تكميلية
</h2>

<p>
	أنهينا الآن تثبيت RHEL على VirtualBox؛ نكمل بتطبيق إعدادات تكميلية تساعدنا أثناء العمل على RHEL من داخل VirtualBox.
</p>

<h3>
	تعطيل شاشة القفل وخيارات حفظ الطاقة
</h3>

<p>
	تشغّل الإعدادات المبدئيّة في RHEL قفل الشّاشة عندما لا تكون مستخدمة؛ هذا مناسب أثناء العمل على جهاز فعليّ إلا أنه من الأفضل تعطيله على نظام وهميّ حيث يتولّى النّظام المضيف هذه المهمة. لتعطيل هذه الإعدادات ننقر على  قائمة التطبيقات ثم نختار أدوات النظام ونحدّد الإعدادات <strong>Settings</strong>.
</p>

<p>
	نختار ضمن نافذة الإعدادات خيار <strong>الخصوصية</strong> <strong>Privacy</strong>، ثم <strong>قفل الشاشة</strong> <strong>Screen lock</strong> ثم نعطّل<strong> القفل التلقائي للشاشة</strong> <strong>Automatic Screen Lock</strong>.
</p>

<p>
	نعود لنافذة الإعدادات ونختار زرّ <strong>الطاقة</strong> <strong>Power</strong> لتظهر نافذة إعدادات الطاقة. ننقر على القائمة المنسدلة بجانب خيّار <strong>Black screen</strong> (الشاشة السوداء) ثم نختار <strong>Never</strong> من القائمة.
</p>

<h3>
	إضافات Virtualbox 
</h3>

<p>
	تمكّن VirtualBox Guest Additions (إضافات الضّيف في VirtualBox) من تحسين التّكامل بين النظام الضّيف والنّظام المضيف. مثلا:
</p>

<ul>
<li>
		استخدام المؤشّر دون الحاجة للضغط على زر <span style="font-family:courier new,courier,monospace;">Ctrl</span> في لوحة المفاتيح.
	</li>
	<li>
		النسخ واللّصق بين النظامين.
	</li>
	<li>
		تشارك الملفات.
	</li>
	<li>
		القدرة على تغيير حجم الواجهة الرسوميّة داخل النظام الوهمي بتغيير حجم نافذة النّظام داخل VirtualBox.
	</li>
</ul>
<p>
	تحتاج قبل تثبيت إضافات VirtualBox إلى تثبيت أدوات التّطوير (نفّذنا هذه الخطوة أثناء تثبيت النظام) وإلى الدّخول إلى واجهة سطح المكتب. تكون خطوات التثبيت على النحو التالي.
</p>

<p>
	شغّل النظام الوهميّ RHEL ثم اختر قائمة <strong>Devices</strong> (أجهزة طرفيّة) في نافذة VirtualBox؛ ثم اختر <strong>Insert Guest Additions CD image</strong>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15164" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_29.png.8c532aee5603187bdc35a0c24d30452f.png" rel="external"><img alt="virtualbox_29.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15164" data-unique="wolwgoxcf" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_29.thumb.png.c9a58c142d90cd766558c4365d5137b3.png"></a>
</p>

<p>
	ستظهر بعد لحظات نافذة حوار تسألك ما إذا كنت متأكدا من أنك تريد تنزيل الملف.
</p>

<p style="text-align: center;">
	<img alt="virtualbox_30.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15165" data-unique="mqnphb1nq" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_30.png.17ec2245022389f6c113e9e17bf897f7.png"></p>

<p>
	يبدأ تنزيل الملفّ بالضغط على <strong>Download</strong> (نزِّل) ثم تظهر بعد اكتمال التنزيل نافذة تطلُب تسجيل الملف وإدخاله في القرص الضّوئي الوهمي للنظام.
</p>

<p style="text-align: center;">
	<img alt="virtualbox_31.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15166" data-unique="olqq0gzdv" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_31.png.643878c02b094c5d3da021420c09e551.png"></p>

<p>
	انقر على زر <strong>Insert</strong>. تظهر بعد إدخال الملفّ النافذة التاليّة التي تطلُب تشغيله.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15167" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_32.png.01705701dc1d64e762ee2b69bba6984a.png" rel="external"><img alt="virtualbox_32.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15167" data-unique="wlyxogpju" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_32.thumb.png.9e834ebd4b3d254f856e94ff3fd93f55.png"></a>
</p>

<p>
	يبدأ - بالنقر على زر <strong>Run</strong> في النافذة - تثبيتُ الإضافات. سيُطلَب منك إدخال كلمة السّر الخاصّة بحساب الجذر Root.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15168" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_33.png.f82879471c00993cf8418c2b2ae1c530.png" rel="external"><img alt="virtualbox_33.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15168" data-unique="oxc1qkl23" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_33.thumb.png.03cdd14e3c309441ecab75b292a8613b.png"></a>
</p>

<p>
	تطلُب نافذة التثبيت الضغط على زر Enter بعد اكتمال العملية. أعد تشغيل النظام؛ ستظهر رسالة على الشاشة تخبرك أن النظام الوهمي يتعرّف الآن تلقائيا على المؤش عند مروره في النافذة الخصّة به في VirtualBox دون الحاجة للضّغط على زر <span style="font-family:courier new,courier,monospace;">Ctrl</span>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15169" href="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_34.png.9298cdf8cfd2ad459d7e93994356cabc.png" rel="external"><img alt="virtualbox_34.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15169" data-unique="17kd4kr30" src="https://academy.hsoub.com/uploads/monthly_2016_04/virtualbox_34.thumb.png.43d2ab3f0a2bcb5e2e0a58419ec13fd2.png"></a>
</p>

<p>
	يمكن استخدام المؤشّر على النّظام المضيف بمجرّد خروجه من حيّز الشاشة المخصَّص للنظام الضّيف. انقر على الأيقونة اليمنى في الرسالة لكي لا تظهر مجدّدا.
</p>

<h3 id="تحديث-النظام">
	تحديث النظام
</h3>

<p>
	الخطوة الأخيرة هي تحديث النّظام. افتح طرفيّة Terminal (قائمة التطبيقات ثم المفضّلة Favorites) ثم نفّذ الأمر التالي للدخول في الحساب الجذر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7572_7">
<span class="pln">su </span><span class="pun">-</span></pre>

<p>
	ستُطلب منك كلمة سر المستخدم الجذر. ثم نفّذ الأمر التالي لتحديث الحزم والبرامج المثبّتة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2592_8">
<span class="pln">yum -y update</span></pre>
]]></description><guid isPermaLink="false">249</guid><pubDate>Tue, 26 Apr 2016 08:18:36 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x62D;&#x632;&#x645; &#x641;&#x64A; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x648;&#x62F;&#x628;&#x64A;&#x627;&#x646;&#xA0;-&#xA0;&#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86%C2%A0-%C2%A0%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r250/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/package-managment-ubunt-debian.png.51b7fca6e4e1bbdd09c223849267d8db.png" /></p>

<p>
	نواصل معكم في هذا المقال استعراض <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r248/" rel="">أساسيات إدارة الحزم في أوبنتو ودبيان</a>. إذا لم تقرأ الجزء الأول فأنصحك بقراءته أوّلا قبل مواصلة قراءة هذا المقال.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="15638" data-unique="x05cd7fee" src="https://academy.hsoub.com/uploads/monthly_2016_04/package-managment-ubunt-debian.png.56fb5974eea85fb1a48d0388c3e86325.png" alt="package-managment-ubunt-debian.png"></p>

<h2>
	إزالة الحزم وحذف الملفات
</h2>

<p>
	العمليات المعاكسة لعملية التنصيب والتحميل الحِزم متاحة أيضًا من مدير الحِزم. هذا القسم سيناقش كيفية إزالة تنصيب الحِزم وتنظيف الملفات التي قد تبقى كنتيجة لعمل الحزمة.
</p>

<h3>
	إزالة حزمة
</h3>

<p>
	لإزالة حزمة منصبة، يجب إضافة الأمر الفرعي <span style="font-family:courier new,courier,monospace;">remove</span> إلى الأمر <span style="font-family:courier new,courier,monospace;">apt-get</span>. سيقوم هذا الأمر بإزالة الملفات التي قامت الحزمة بتنصيبها على نظامك مع استثناء جدير بالاهتمام.
</p>

<p>
	الأمر يُبقي ملفات الإعدادات محفوظة في مكانِ ما في حال تم إعادة تنصيب الحزمة مرة أخرى فيما بعد. تعتبر هذه الطريقة مفيدة في حالة الحذف المفاجئ للحزمة؛ حيث لا تضيع جهودك هدرًا في إعادة ضبط الإعدادات وتخصيصها.
</p>

<p>
	لإكمال العملية يلزمك تزويد الأمر باسم الحزمة المراد إزالتها أو إلغاء تصيبها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_8">
<span class="pln">sudo apt-get remove package</span></pre>

<p>
	ستتم إزالة الحزمة، باستثناء ملف الإعدادات.
</p>

<h3>
	إزالة حزمة وكل ملفات الإعدادات ذات العلاقة
</h3>

<p>
	إذا كنت ترغب في إزالة حزمة وكل الملفات المتعلقة بها من نظامك، متضمنة ملفات الإعدادات، يمكنك استخدام الأمر الفرعي <span style="font-family:courier new,courier,monospace;">purge</span> من الأمر <span style="font-family:courier new,courier,monospace;">apt-get</span>.<br>
	بخلاف الأمر <span style="font-family:courier new,courier,monospace;">remove</span> -الذي تم ذكره بالأعلى- فإن الأمر <span style="font-family:courier new,courier,monospace;">purge</span> يزيل كل شيء. تعتبر هذه الطريقة مفيدة في حال عدم رغبتك الاحتفاظ بملفات الإعدادات، أو في حال ما كانت لديك بعض المشاكل وترغب في البدء من الصفر.
</p>

<p>
	تجدر الإشارة هنا إلى أن ملفات الإعدادات لا يمكن استرجاعها في حال تم حذفها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_10">
<span class="pln">sudo apt-get purge package</span></pre>

<p>
	في هذه الحالة، عندما تقوم بإعادة تنصيب الحزمة مرة أخرى فسيتم استخدام الإعدادات الافتراضية.
</p>

<h3>
	إزالة الاعتماديات التلقائية التي لم تعد لها حاجة
</h3>

<p>
	تتم إزالة الحِزم من النظام باستخدام الأوامر <span style="font-family:courier new,courier,monospace;">apt-get remove</span> أو<span style="font-family:courier new,courier,monospace;"> apt-get purge</span>، لكن بعض هذه الحزم كان قد تطلّب وقت التنصيب بعض الاعتماديات لاستكمال التنصيب، وبعد إزالة الحزمة تبقى هذه الاعتماديات.
</p>

<p>
	لإزالة أي حِزم تم تنصيبها كاعتماديات ولم تعد مطلوبة لأي حزمة أخرى، يمكنك تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">autoremove</span> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_12">
<span class="pln">sudo apt-get autoremove</span></pre>

<p>
	إذا كنت ترغب في إزالة كل ملفات الإعدادات المتعلقة من الاعتماديات التي تمت إزالتها، يجب إضافة <span style="font-family:courier new,courier,monospace;">purge--</span> إلى الأمر <span style="font-family:courier new,courier,monospace;">autoremove</span>. سيقوم هذا الأمر بإزالة ملفات الإعدادات مثل وظيفة الأمر <span style="font-family:courier new,courier,monospace;">purge</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_14">
<span class="pln">sudo apt-get --purge autoremove</span></pre>

<h3>
	تنظيف ملفات الحزم المهجورة Obsolete
</h3>

<p>
	بعض الحِزم تُصبح قديمة ومهجورة مع مرور الوقت.
</p>

<p>
	بإمكان الأداة<span style="font-family:courier new,courier,monospace;"> apt-get</span> إزالة أيٍ من ملفات هذه الحِزم عن النظام المحلي، تلك الملفات المرتبطة بالحِزم والتي لم تعد متاحة من قِبل المستودعات باستخدام الأمر <span style="font-family:courier new,courier,monospace;">autoclean</span>.
</p>

<p>
	يقوم هذا الأمر بتحرير المزيد من المساحة على الخادوم، ويسمح بتحديث الذاكرة المؤقتة على النظام المحلي وتجنّب الاحتفاظ ببيانات غير مستخدمة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_16">
<span class="pln">sudo apt-get autoclean</span></pre>

<h2>
	الحصول على معلومات حول الحزم
</h2>

<p>
	كل حزمة تحتوي على كمية كبيرة من البيانات التي يمكن الوصول إليها من خلال أدوات إدارة الحِزم. في هذا القسم سنقوم بتسليط الضوء على بعض الطرق الشائعة للحصول على المعلومات حول الحزم المتاحة والمنصبة.
</p>

<h3>
	عرض المعلومات حول حزمة
</h3>

<p>
	لعرض المعلومات التفصيلية حول حزمة في التوزيعة التي تستخدمها، يمكنك استخدام الأمر الفرعي <span style="font-family:courier new,courier,monospace;">show</span> من الأمر <span style="font-family:courier new,courier,monospace;">apt-cache</span>.
</p>

<p>
	هذا الأمر يعتمد على اسم الحزمة في المستودع:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_18">
<span class="pln">apt-cache show package</span></pre>

<p>
	سيقوم الأمر بعرض معلومات حول الحِزم التي تظهر في نتاج البحث عن تلك الحزمة التي يتم الاستفسار عنها.
</p>

<p>
	كل حزمة مرشحة تتضمن معلومات حول اعتمادياتها، الإصدار، التركيبة أو المعمارية، التعارضات، الاسم الفعلي للحزمة، حجم الحزمة وحجم تنصيبها، الوصف التفصيلي، بالإضافة إلى معلومات أخرى.
</p>

<p>
	لعرض المزيد من المعلومات حول كل حزمة مرشحة، شاملة لقائمة كاملة للاعتماديات العكسية ( قائمة الحِزم التي تعتمد على الحزمة التي نستفسر عنها) استخدم الأمر <span style="font-family:courier new,courier,monospace;">showpkg</span> بدلا من الأمر المذكور أعلاه، والذي سيتضمن الكثير من المعلومات حول علاقة هذه الحزمة بالحِزم الأخرى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_20">
<span class="pln">apt-cache showpkg package</span></pre>

<h3>
	عرض المعلومات حول حزمة deb.
</h3>

<p>
	لعرض تفاصيل حول ملف <span style="font-family:courier new,courier,monospace;">deb. </span>يمكنك استخدام المؤشر <span style="font-family:courier new,courier,monospace;">info-- </span>مع الأمر <span style="font-family:courier new,courier,monospace;">dpkg</span>، الهدف لهذا الأمر يجب أن يكون مسار ملف <span style="font-family:courier new,courier,monospace;">deb.</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_22">
<span class="pln">dpkg --info debfile.deb</span></pre>

<p>
	سيعرض لك هذا الأمر بعض البيانات الوصفية حول الحزمة التي تستفسر عنها، المعلومات تتضمن اسم الحزمة وإصدارها، المعمارية التي بُنيت لها، الحجم والاعتماديات المطلوبة، الوصف والتعارضات.
</p>

<h3>
	عرض الاعتماديات والاعتماديات العكسية
</h3>

<p>
	لعرض الاعتماديات (اعتماد حزمة على أخرى) بشكل دقيق، وكذلك الاعتماديات العكسية (الحِزم التي تعتمد على هذه الحزمة) يمكنك استخدام الأداة<span style="font-family:courier new,courier,monospace;"> apt-cache</span>.
</p>

<p>
	لعرض معلومات الاعتماديات بشكل جيد، يمكنك استخدام الأمر الفرعي <span style="font-family:courier new,courier,monospace;">depends</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_24">
<span class="pln">apt-cache depends package</span></pre>

<p>
	سيقوم الأمر بعرض معلومات حول كل حِزمة تم التعرف عليها كاعتمادية، بالإضافة إلى الاقتراحات، التوصيات أو التعارضات.
</p>

<p>
	إذا كنت ترغب في معرفة أي حِزم تعتمد على حزمة معينة، يمكنك إضافة اسم الحزمة إلى الأمر الفرعي <span style="font-family:courier new,courier,monospace;">rdepends</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_26">
<span class="pln">apt-cache rdepends package</span></pre>

<h3>
	عرض إصدارات الحزمة المنصبة والمتاحة
</h3>

<p>
	في الكثير من الأحيان تتوفر عدّة إصدارات من حزمة ما في المستودع، مع حزمة واحدة افتراضية. لعرض الإصدارات المتاحة لحزمة ما، يمكنك استخدام الأمر الفرعي <span style="font-family:courier new,courier,monospace;">policy</span> من الأمر <span style="font-family:courier new,courier,monospace;">apt-cache</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_28">
<span class="pln">apt-cache policy package</span></pre>

<p>
	سيقوم الأمر بعرض أي إصدار تم تنصيبه (إذا كان الحزمة منصبة)، الحزمة المرشحة والتي سيتم تنصيبها بشكل افتراضي إذا لم تقم بتحديد إصدار في أمر التنصيب، بالإضافة إلى جدول إصدارات الحزم، منتهيًا بمؤشر يشير إلى أولوية كل إصدار.
</p>

<p>
	يمكنك استخدام تلك الطريقة لتحديد أي إصدار سيتم تنصيبه والبدائل المتاحة. ولأن هذه الطريقة ترصد المستودعات التي يتواجد فيها كل إصدار، فإنه يمكن استخدامها لتحديد إذا ما توافرت مستودعات أخرى أو الأرشيف الشخصي للحِزم (PPAs) تقوم بنسخ الحِزم من المستودع الافتراضي.
</p>

<h3>
	عرض الحزم المنصبة باستخدام الأمر dpkg -l
</h3>

<p>
	لعرض الحِزم التي تم تنصيبها على نظامك، لديك القليل من الخيارات، اعتمادًا على هيئة المخرجات، وكذلك حجم المعلومات المطلوبة.
</p>

<p>
	الطريقة الأولى تتضمن استخدام <span style="font-family:courier new,courier,monospace;">dpkg</span> أو <span style="font-family:courier new,courier,monospace;">dpkg-query</span> مع <span style="font-family:courier new,courier,monospace;">l-</span>. المخرجات من الأمرين كليهما ستكون متطابقة، بلا شك ستعطي قائمة لكل حزمة منصبة (جزئيا أو كليّا) على النظام، وشكلها كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_30">
<span class="pln">dpkg -l</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_32">
<span class="pln">Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                        Version                                 Architecture Description
+++-===========================================-=======================================-============-=====================================================================================================================
ii  account-plugin-generic-oauth                0.10bzr13.03.26-0ubuntu1.1              amd64        GNOME Control Center account plugin for single signon - generic OAuth
ii  accountsservice                             0.6.34-0ubuntu6                         amd64        query and manipulate user account information
ii  acl                                         2.2.52-1                                amd64        Access control list utilities
ii  acpi-support                                0.142                                   amd64        scripts for handling many ACPI events
ii  acpid                                       1:2.0.18-1ubuntu2                       amd64        Advanced Configuration and Power Interface event daemon
. . .</span></pre>

<p>
	ستستمر المخرجات لكل حزمة في النظام على المخرجات يمكنك رؤية مدلولات الحروف الثلاثة الأولى في كل سطر. الحرف الأولى يشير إلى الحالة المرغوب فيها للحزمة، وتكون أحد ما يلي:
</p>

<ul>
<li>
		<strong><span style="font-family:courier new,courier,monospace;">u</span></strong>: غير معروف
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">i</span></strong>: تم التنصيب
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">r</span></strong>: تمت إزالتها.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">p</span></strong>: تمت إزالتها كليّا ( تنظيف بعد الإزالة)
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">h</span></strong>: إصدار معلّق.
	</li>
</ul>
<p>
	الحرف الثاني يشير إلى الحالة الحقيقة للحزمة كما هو معروف لنظام التحزيم Packaging system، يمكن أن تكون إحدى الحالات التالية:
</p>

<ul>
<li>
		<strong><span style="font-family:courier new,courier,monospace;">n</span></strong>: لم يتم تنصيبها.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">i</span></strong>: تم تنصيبها.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">c</span></strong>: ملف الإعدادات موجود، لكن الحزمة تمت إزالتها.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">u</span></strong>: تم فك ضغط الحزمة لكن لم يُشرع في إعدادها بعد.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">f</span></strong>: الحزمة منصبة (جزئيًا) مما يعني حدوث فشل أثناء عملية التنصيب مما لم يسمح باكتمال عملية التنصيب.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">w</span></strong>: الحزمة تنتظر حدثًا من حزمة منفصلة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">p</span></strong>: الحزمة تم تفعيلها من قِبل حزمة أخرى.
	</li>
</ul>
<p>
	الحرف الثالث، والذي يكون عبارة عن مسافة فارغة لأغلب الحِزم، له خيار واحد كما يلي:
</p>

<ul>
<li>
		<p>
			<strong><span style="font-family:courier new,courier,monospace;">r</span></strong>: إشارة إلى ضرورة إعادة التنصيب، مما يفيد أن الحزمة غير مكتملة ولا يمكن الاستفادة من وظائفها.
		</p>
	</li>
</ul>
<p>
	باقي الأعمدة تحتوي اسم الحزمة، الإصدار، المعمارية وكذلك الوصف.
</p>

<h3>
	عرض حالة التنصيب للحِزم التي تم ترشيحها
</h3>

<p>
	إذا قمت بإضافة معيار بحث بعد <span style="font-family:courier new,courier,monospace;">l-</span> ، فإن <span style="font-family:courier new,courier,monospace;">dpkg</span> سيعرض كل الحِزم التي تحوي معيار البحث، سواءً كانت منصّبة أم لا، على سبيل المثال، نستطيع البحث عن عمليات المكتبات YAML كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_34">
<span class="pln">dpkg -l libyaml*</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_36">
<span class="pln">Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name            Version      Architecture Description
+++-===============-============-============-===================================
ii  libyaml-0-2:amd 0.1.4-2ubunt amd64        Fast YAML 1.1 parser and emitter li
ii  libyaml-dev:amd 0.1.4-2ubunt amd64        Fast YAML 1.1 parser and emitter li
un  libyaml-perl    </span><span class="tag">&lt;none&gt;</span><span class="pln">                    (no description available)
un  libyaml-syck-pe </span><span class="tag">&lt;none&gt;</span><span class="pln">                    (no description available)
ii  libyaml-tiny-pe 1.51-2       all          Perl module for reading and writing</span></pre>

<p>
	كما ترى في العمود الأول، النتيجة الثالثة والرابعة غير منصبة. هذا الأمر يعرض كل حزمة يتوفر فيها معيار البحث، بالإضافة إلى الحالة الحالية والمرغوب فيها.
</p>

<h3>
	عرض الحِزم المنصبة بالأمر dpkg --get-selections
</h3>

<p>
	يمكنك استعراض الحِزم المنصبة على نظامك بطريقة أخرى، باستخدام مؤشر <span style="font-family:courier new,courier,monospace;">get-selections--</span> مع الأداة <span style="font-family:courier new,courier,monospace;">dpkg</span>، حيث يزودنا هذا الأمر بقائمة لكل الحِزم التي تم تنصيبها، والتي تمت إزالتها دون التنظيف بعد الإزالة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_38">
<span class="pln">dpkg --get-selections</span></pre>

<p>
	للتفريق بين تلك الحالتين، يمكنك استخدام <span style="font-family:courier new,courier,monospace;">awk</span> للتصفية حسب الحالة. لاستعراض الحِزم المنصّبة فقط، اطبع:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_40">
<span class="pln">dpkg --get-selections | awk '$2 ~ /^install/`</span></pre>

<p>
	لعرض قائمة الحِزم التي تمت إزالتها لكن لم يتم إزالة ملفات الإعدادات، يمكنك استخدام الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_42">
<span class="pln">dpkg --get-selections | awk '$2 !~ /^install/'</span></pre>

<h3>
	البحث ضمن الحزم المنصبة
</h3>

<p>
	للبحث في الحِزم المنصبة عن حزمة معينة، يمكنك إضافة نص التصفية/الترشيح بعد خيار <span style="font-family:courier new,courier,monospace;">get-selections--</span>. هذا الأمر يستخدم البدائل لمحاولة العثور على تطابق ما. مرة أخرى، يقوم هذا الأمر بعرض أي حزمة منصبة، أو ملفات الإعدادات الخاصة بها ما زالت على النظام:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_44">
<span class="pln">dpkg --get-selections libz*</span></pre>

<p>
	مرة أخرى، يمكنك التصفية باستخدام تعبيرات <span style="font-family:courier new,courier,monospace;">awk</span> من القسم أعلاه.
</p>

<h3>
	استعراض الملفات المنصبة من خلال حزمة
</h3>

<p>
	لاستعراض الملفات الخاصة بحزمة ما، يمكنك استخدام مؤشر <span style="font-family:courier new,courier,monospace;">L-</span> مع الأمر <span style="font-family:courier new,courier,monospace;">dpkg</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_46">
<span class="pln">dpkg -L package</span></pre>

<p>
	سيقوم هذا الأمر بطباعة المسار الكامل لكل ملف خاص بتلك الحزمة. بالطبع لن تتضمن القائمة ملفات الإعدادات التي يتم إنشاؤها من خلال عمليات الحزمة
</p>

<h3>
	البحث عن ما تنصبه الحزمة لموقع ما
</h3>

<p>
	لاستكشاف أي حزمة مسؤولة عن ملف معين في نظام الملفات، يمكنك إضافة الملف الكامل إلى الأمر <span style="font-family:courier new,courier,monospace;">dpkg</span> مع مؤشر <span style="font-family:courier new,courier,monospace;">S-</span>.
</p>

<p>
	سيقوم الأمر بطباعة اسم الحزمة التي قامت بتنصيب الملف:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_48">
<span class="pln">dpkg -S /path/to/file</span></pre>

<p>
	تجدر الإشارة إلى أن أي ملفات تم نقلها إلى مكان ما من خلال عملية ما بعد التنصيب، لا يمكن ربطها بحزمتها من خلال هذا الأمر.
</p>

<h3>
	معرفة أي حزمة تقوم بتوفير ملف ما دون تنصيبها
</h3>

<p>
	قد تحتاج في بعض الأحيان لمعرفة أي حزمة تزودك بملف ما أو أمر ما، حتى بدون أن تقوم بتنصيب الحزمة على نظامك. من السهل معرفة إذا ما كانت حزمة معينة تحتوي ملفًا ما باستخدام <span style="font-family:courier new,courier,monospace;">dpkg</span> بإضافة الخيار <span style="font-family:courier new,courier,monospace;">S-</span>.
</p>

<p>
	لعمل ذلك يلزم تنصيب الأداة <span style="font-family:courier new,courier,monospace;">apt-file</span>. تمتلك هذه الأداة قاعدة بيانات لمعلوماتٍ حول الحزم، من ضمن هذه المعلومات مسار التنصيب لكل ملف خاص بالحزمة من قاعدة البيانات تلك.
</p>

<p>
	قم بتنصيب الأداة بتنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_50">
<span class="pln">sudo apt-get update
sudo apt-get install apt-file</span></pre>

<p>
	الآن، قم بتحديث قاعدة البيانات الخاصة بالأداة وقم بالبحث عن ملف بتنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_52">
<span class="pln">sudo apt-file update
sudo apt-file search /path/to/file</span></pre>

<p>
	سيعمل هذا الأمر فقط للمواقع التي تم تنصيبها مباشرة بواسطة حزمة ما. لن يتم إيجاد الملفات التي تم إنشاؤها بواسطة برامج ما بعد التثبيت.
</p>

<h2>
	تحويل قوائم الحزم بين الأنظمة
</h2>

<p>
	في كثير من الأحيان قد تحتاج لعمل نسخة احتياطية لقائمة الحِزم التي تم تنصيبها على نظامك، واستخدامها لتنصيب نفس القائمة من الحِزم على نظام آخر. بالطبع تعتبر هذه الطريقة مفيدة لأغراض النسخ الاحتياطي. هذا القسم يوضح آلية تصدير واستيراد قوائم الحِزم.
</p>

<h3>
	تصدير قائمة الحزم
</h3>

<p>
	إذا كنت ترغب في تكرار مجموعة الحزم التي تم تنصيبها على نظامك إلى نظام آخر، يتوجب عليك في البداية تصدير قائمة الحزم.
</p>

<p>
	يمكنك تصدير قائمة الحزم المنصّبة إلى ملف بتلك الصيغة المطلوبة لاحقًا لعمية الاستيراد عن طريق مخرجات الأمر<span style="font-family:courier new,courier,monospace;"> dpkg --get-selections</span> :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_54">
<span class="pln">dpkg --get-selections &gt; ~/packagelist.txt</span></pre>

<p>
	يمكنك نسخ هذه القائمة إلى نظام أو حاسوب آخر واستيرادها.
</p>

<p>
	قد تحتاج أيضًا لأخذ نسخة احتياطية لقوائم المصادر وقائمة المفاتيح الموثوقة. يمكنك أخذ نسخة احتياطية من المصادر بإنشاء مجلد بالملفات الضرورية ونسخها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_56">
<span class="pln">mkdir ~/sources
cp -R /etc/apt/sources.list* ~/sources</span></pre>

<p>
	المفاتيح الموثوقة يمكن نسخها احتياطيًا بتنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_58">
<span class="pln">apt-key exportall &gt; ~/trusted_keys.txt</span></pre>

<p>
	الآن يمكنك تحويل الملف<span style="font-family:courier new,courier,monospace;"> packagelist.txt</span> ومجلد <span style="font-family:courier new,courier,monospace;">sources</span> والملف<span style="font-family:courier new,courier,monospace;"> trusted_keys.txt</span> إلى حاسوب آخر بغرض استيرادها.
</p>

<h3>
	استيراد قائمة الحزم
</h3>

<p>
	إذا قمت بإنشاء قائمة الحزم باستخدام <span style="font-family:courier new,courier,monospace;">dpkg --get-selections </span>كما تم شرحه أعلاه، بإمكانك استيراد الحِزم على حاسوب آخر باستخدام الأمر <span style="font-family:courier new,courier,monospace;">dpkg</span> .
</p>

<p>
	في البداية يجب أن تقوم بإضافة مفاتيح الثقة، وتحضير قوائم المصادر التي تم نسخها من الحاسوب الأول. على افتراض أنك قمت بنسخ جميع الملفات المنقولة إلى مجلد home في الحاسوب الثاني، يمكنك تنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_60">
<span class="pln">sudo apt-key add ~/trusted_keys.txt
sudo cp -R ~sources/* /etc/apt/</span></pre>

<p>
	ثم قم بإزالة الحالة عن الحزِم غير الضرورية من الحاسوب الجديد. مما يعني أنك تقوم بتطبيق التغييرات من جديد. يجب تطبيق هذا من خلال حساب root أو صلاحيات sudo:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_63">
<span class="pln">sudo dpkg --clear-selections</span></pre>

<p>
	سيقوم الأمر باختيار كل الحِزم التي لا ترغب بتنصيبها. يجب أيضا تحديث قائمة الحِزم المحلية لضمان أن عمليات التنصيب سيكون لديها سجل أو معلومات لكل البرامج التي نحتاج تنصيبها. عملية التنصيب والتحدث الفعلية سيتم معالجتها من خلال أداة <span style="font-family:courier new,courier,monospace;">dselect</span>.
</p>

<p>
	يجب التأكد أن الأداة <span style="font-family:courier new,courier,monospace;">dselect</span> قد تم تنصيبها. تمتلك هذه الأداة قاعدة بيانات خاصة بها، لذا يجب تحديثها قبل الاستكمال:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_65">
<span class="pln">sudo apt-get update
sudo apt-get install dselect
sudo dselect update</span></pre>

<p>
	الآن نستطيع تطبيق قائمة الحزم فوق القائمة الحالية؛ لمعرفة أي حزم يجب الاحتفاظ بها أو تحميلها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_67">
<span class="pln">sudo dpkg --set-selections &lt; packagelist.txt</span></pre>

<p>
	يقوم هذا الأمر بضبط حالات الحزم التي نريدها. لتطبيق التغييرات يجب تطبيق الأمر الفرعي <span style="font-family:courier new,courier,monospace;">dselect-upgrade</span> من الأمر<span style="font-family:courier new,courier,monospace;"> apt-get</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_69">
<span class="pln">sudo apt-get dselect-upgrade</span></pre>

<p>
	سيقوم هذا الأمر بتحميل وتنصيب الحزم الضرورية. وسيقوم بإزالة الحزم التي لم يتم اختيارها. وفي النهاية فإن قائمة الحزم يجب أن تتطابق مع تلك التي تم استيرادها من الحاسوب الأول، بغض النظر عن أن ملفات الإعدادات ما زالت تحتاج لأن يتم نسخها أو تعديلها.
</p>

<h2>
	إضافة المستودعات والأرشيف الشخصي للحزم PPA
</h2>

<p>
	تحتوي المجموعة الافتراضية من المستودعات التي يتم توفيرها في أغلب التّوزيعات على حِزم كافية لأغلب المستخدمين. بالرغم من ذلك فإنك تحتاج في الكثير من الأحيان إلى مصادر إضافية. سنقوم في هذا القسم بمناقشة آلية أعداد أدوات الحزم لتتعامل مع مصادر إضافية.
</p>

<h3>
	إضافة أرشيف شخصي للحزم
</h3>

<p>
	يعتبر الأرشيف الشخصي للحزم (PPAs) بديلا عن المستودعات التقليدية. الأرشيف الشخصي للحزم متاح فقط لأنظمة أوبنتو، حتى كتابة هذا المقال. عادة ما يتميز الأرشيف الشخصي للحزم بمجال أصغر من المستودعات، ويحتوي مجموعة مركزة من التطبيقات التي يتم الاحتفاظ بها مِن خلال مَن يمتلك الأرشيف الشخصي للحِزم.
</p>

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

<p>
	لإضافة أرشيف الشخصي للحزم، يمكنك استخدام الأمر <span style="font-family:courier new,courier,monospace;">add-apt-repository</span>. يجب أن تضيف الاسم <span style="font-family:courier new,courier,monospace;">ppa</span>:، متبوعًا باسم مالك الأرشيف الشخصي للحزم على <a href="https://launchpad.net/ubuntu/+ppas" rel="external nofollow">Launchpad</a>، شرطة مائلة ثم اسم الأرشيف الشخصي للحزم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_71">
<span class="pln">sudo add-apt-repository ppa:owner_name/ppa_name</span></pre>

<p>
	قد يتطلب الأمر الموافقة على قبول مفتاح صاحب الحِزم. بعد ذلك سيتم إضافة الأرشيف الشخصي للحزم لنظامك، مما يسمح لك بتنصيب الحزم بأوامر <span style="font-family:courier new,courier,monospace;">apt</span> الاعتيادية. قبل البحث عن الحزم أو تنصيبها، قمت بالتأكد من تحديث ذاكرة التخزين المؤقت المحلية بالمعلومات حول الأرشيف الشخصي الجديد للحِزم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_73">
<span class="pln">sudo apt-get update</span></pre>

<h3>
	إضافة مستودعات
</h3>

<p>
	لإضافة المزيد من المستودعات لأنظمة أوبنتو أو دبيان، يمكنك اتباع أحدِ مسارين.
</p>

<p>
	المسار الأول يتم بتعديل قوائم المصادر لديك مباشرة. بإمكانك تعديل ملف <span style="font-family:courier new,courier,monospace;">etc/apt/sources.list/</span> أو استبدال ملف قائمة جديد في مجلد <span style="font-family:courier new,courier,monospace;">/etc/apt/sources.list.d/</span>. إذا قمت باستخدام الطريقة الثانية فيجب الانتباه إلى أن اسم الملف الذي قمت بإنشائه يجب أن ينتهي بـ<span style="font-family:courier new,courier,monospace;"> list.</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_75">
<span class="pln">sudo nano /etc/apt/sources.list.d/new_repo.list</span></pre>

<p>
	يمكنك إضافة موقع المستودع الجديد في الملف الجديد باستخدام الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_77">
<span class="pln">deb_or_deb-src url_of_repo release_code_name_or_suite component_names</span></pre>

<p>
	الأجزاء المختلفة لمواصفات المستودع موضحة كما يلي:
</p>

<ul>
<li>
		<strong>deb</strong> أو <strong>deb-src</strong>: لتحديد نوع المستودع. تستخدم deb لتحديد المستودع العادي، بينما مستودعات المصادر تبدأ بـ <span style="font-family:courier new,courier,monospace;">deb-src</span>.
	</li>
	<li>
		<strong>url</strong>: العنوان الرئيسي للمستودع. يجب أن يكون الموقع الذي يتواجد فيه المستودع.
	</li>
	<li>
		<strong>release code name or suite</strong>: عادة ما يكون الاسم الرسمي لإصدار التوزيعة، لكن قد يكون أي اسم مستخدم لتعريف مجموعة محددة من الحِزم التي تم إنشاؤها للإصدار الذي تستخدمه من التوزيعة.
	</li>
	<li>
		<strong>component names</strong>: علامات لاختيار الحِزم التي ترغب بتوفرها. وتعتبر ميزة يتم توفيرها من القائمين على التوزيعة؛ لتقديم توضيح حول المصداقية أو قيود الترخيص للبرامج التي تحتويها.
	</li>
</ul>
<p>
	باستطاعتك إضافة هذه الأسطر بداخل الملف. معظم المستودعات تحتوي معلومات حول الهيئة التي يجب استخدامها.
</p>

<p>
	الطّريقة الأخرى لإضافة المزيد من المستودعات يتم باستخدام الأمر<span style="font-family:courier new,courier,monospace;"> add-apt-repository</span>. توزيعات أوبنتو تحتوي هذا الأمر بشكل افتراضي، بينما يمكن تنصيبها إلى توزيعات دبيان من خلال حزمة <span style="font-family:courier new,courier,monospace;">software-properties-common</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_79">
<span class="pln">sudo apt-get update
sudo apt-get install software-properties-common</span></pre>

<p>
	بعد ذلك يمكن إضافة الأسطر التي تريد إضافتها إلى الأمر <span style="font-family:courier new,courier,monospace;">add-apt-repository</span>. بالطبع يجب أن تكون الإضافات بنفس الهيئة أو الشكل الذي تستخدمه في حالة الإضافات اليدوية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_81">
<span class="pln">sudo add-apt-repository 'deb url release component'</span></pre>

<p>
	يجب التأكد من تحديث الذاكرة المؤقتة المحلية للحِزم بعد تطبيق أي تحديث للمستودع؛ كي يكون النظام على وعي بالحِزم المتاحة حديثًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4275_83">
<span class="pln">sudo apt-get update</span></pre>

<h2>
	خاتمة
</h2>

<p>
	هناك العديد من عمليات إدارة الحِزم التي يمكنك إجراؤها، لكننا حاولنا تغطية أغلب الخطوات الشائعة هنا. إذا كان لديك أي تفضيلات أو اهتمامات أخرى، يرجى استخدام قسم التعليقات أدناه لنعرفها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/ubuntu-and-debian-package-management-essentials" rel="external nofollow">Ubuntu and Debian Package Management Essentials</a> لصاحبه <a href="https://www.digitalocean.com/community/users/jellingwood" rel="external nofollow">Justin Ellingwood</a>.
</p>
]]></description><guid isPermaLink="false">250</guid><pubDate>Sun, 24 Apr 2016 10:59:45 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x623;&#x645;&#x631; tar &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A3%D9%85%D8%B1-tar-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r243/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/linux-tar-command.png.d89acd81e15b70f38f7f0154e323e343.png" /></p>

<p>
	يعدّ أمر <code>tar</code> من بين الأدوات التي يشيع استخدامها في سطر أوامر لينكس، إلا أن جوانب مفيدة كثيرة في الأمر تبقى مجهولة. نعرض في هذا المقال بعض أشهر استخدامات الأمر <code>tar</code> إضافة إلى استخدامات رائعة أخرى يقل الانتباه إليها.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="15061" data-unique="m7xxpxs1o" src="https://academy.hsoub.com/uploads/monthly_2016_04/linux-tar-command.png.3d7ed8536e8532a724c0b65091bf56ee.png" alt="linux-tar-command.png"></p>

<p>
	أول ما تجب معرفته هو الغرض الأساسي من <code>tar</code>؛ إذ يعمل الأمر على جمع الكثير من الملفات في واحد. إذا نفذت أمر <code>tar</code> على مجلّد من 37 ملفّا فستحصُل على ملفّ واحد يضمّها جميعا وبالتي يسهُل مشاركتها مع الآخرين. كما أن الأمر يحافظ على بنية المجلّد ويمكن أن يحافظ على الأذونات ومعلومات الوقت والزمن كذلك.
</p>

<h2 id="الخيارات">
	الخيارات
</h2>

<p>
	في ما يلي قائمة بأهم الخيارات التي يمكن استخدامها مع <code>tar</code>.
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;"><code>c</code></span>: إنشاء ملف أرشيف.
	</li>
	<li>
		<code>f</code>: استخدام مُخرج الأمر لإنشاء ملف. تظهر مخرجات الأمر في الطرفية فقط إن لم يٍُستخدَم هذا الخيار.
	</li>
	<li>
		<code>x</code>: استخراج محتويات ملف أرشيف.
	</li>
	<li>
		<code>j</code>: استخدام خوارزمية bzip2 لضغط الملفات.
	</li>
	<li>
		<code>z</code>: استخدام خوارزمية gzip لضغط الملفات.
	</li>
	<li>
		<code>p</code>: الحفاظ على الأذونات عند استخراج الملفات.
	</li>
	<li>
		<code>t</code>: الحصول على قائمة بمحتويات ملف الأرشيف.
	</li>
	<li>
		<code>v</code>: عرض تقدّم عمل الأمر أثناء تنفيذه.
	</li>
	<li>
		<code>d</code>: عرض الفروق بين ملف الأرشيف ونظام الملفات.
	</li>
</ul>
<h2 id="أمثلة">
	إنشاء ملف أرشيف
</h2>

<ul>
<li>
		إنشاء ملف أرشيف لمجلّد:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_7">
<span class="pln">tar cf directory</span><span class="pun">.</span><span class="pln">tar directory</span></pre>

<ul>
<li>
		إنشاء ملفّ أرشيف انطلاقا من مجموعة ملفات:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_9">
<span class="pln">tar cf directory</span><span class="pun">.</span><span class="pln">tar file1 file2 file3</span></pre>

<ul>
<li>
		إنشاء ملف أرشيف مضغوط بخوارزمية bzip لملفات mp3 الموجودة في المجلّد الحالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_11">
<span class="pln">tar </span><span class="pun">-</span><span class="pln">cvf mp3collection</span><span class="pun">.</span><span class="pln">tar </span><span class="pun">.</span><span class="com">/*.mp3</span></pre>

<ul>
<li>
		إنشاء ملف أرشيف من المجلد <code>/home/academy/</code> مع الحفاظ على الأذونات:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_13">
<span class="pln">tar cvpf academy</span><span class="pun">.</span><span class="pln">tar </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">academy</span><span class="pun">/</span></pre>

<ul>
<li>
		إنشاء أرشيف من المجلد <code>etc/</code> مع استبعاد المجلد الفرعيّ <code>apache2:</code>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_15">
<span class="pln">tar cvf etc_without_apache</span><span class="pun">.</span><span class="pln">tar </span><span class="pun">–</span><span class="pln">exclude</span><span class="pun">=</span><span class="str">'/etc/apache2/'</span></pre>

<h2>
	ضغط الملفات
</h2>

<ul>
<li>
		إنشاء ملف مضغوط بـ<code>bzip2</code> مع عرض تقدّم عمل الأمر في الطرفية:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_17">
<span class="pln">tar cjvf directory</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 directory</span><span class="pun">/</span></pre>

<ul>
<li>
		إنشاء ملف مضغوط بـ<code>gzip</code> مع عرض تقدّم عمل الأمر في الطرفية:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_19">
<span class="pln">tar czvf directory</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz directory</span><span class="pun">/</span></pre>

<h2>
	عرض محتوى أرشيف
</h2>

<ul>
<li>
		عرض محتوى ملف الأرشيف <code>directory:</code>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_21">
<span class="pln">tar tvf directory</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2

</span><span class="pun">...</span><span class="pln">
bluewaters_1440x900</span><span class="pun">.</span><span class="pln">jpg
cloudyday_1440x900</span><span class="pun">.</span><span class="pln">jpg
fragile_1600x1200</span><span class="pun">.</span><span class="pln">jpg
coolemoticon_1440x900</span><span class="pun">.</span><span class="pln">jpg
cloudyday_1440x900</span><span class="pun">.</span><span class="pln">jpg
</span><span class="pun">...</span></pre>

<h2>
	الاستخراج من ملفات الأرشيف
</h2>

<ul>
<li>
		استخراج محتوى ملف أرشيف:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_23">
<span class="pln">tar xvf directory</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2</span></pre>

<ul>
<li>
		استخراج ملف <code>passwd</code> فقط من أرشيف <code>etc:</code>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_25">
<span class="pln">tar xvf etc</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 passwd</span></pre>

<ul>
<li>
		استخراج مجلد <code>postfix</code> فقط من أرشيف <code>etc:</code>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_27">
<span class="pln">tar xvf etc</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">postfix</span><span class="pun">/</span></pre>

<ul>
<li>
		استخراج ملفات <code>php</code> فقط من أرشيف <code>htdocs:</code>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_29">
<span class="pln">tar xvf htdocs</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 </span><span class="pun">–</span><span class="pln">wildcards </span><span class="str">'*.php'</span></pre>

<h2>
	الفروق
</h2>

<ul>
<li>
		الفرق بين ملف أرشيف ومجلّد (في حال عدم ذكر المجلد فالمقارنة تكون مع مجلد بنفس اسم الأرشيف في المجلد الحالي):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_31">
<span class="pln">tar df directory</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2</span></pre>

<ul>
<li>
		البحث عن ملف في الأرشيف:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_33">
<span class="pln">tar df directory</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2  directory</span><span class="pun">/</span><span class="pln">file1</span></pre>

<p>
	<strong>ملحوظة:</strong> يجب في إصداراتٍ من <code>tar</code> تمرير خيار خوارزمية الضغط أثناء استخراج الملفات أو أثناء النظر في فروق ملفات أرشيف مضغوطة)؛ إلا أن الأمر اختياري في أغلب الإصدارات الأخيرة.
</p>

<p>
	مثلا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_35">
<span class="pln">tar xjvf etc</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">postfix</span><span class="pun">/</span></pre>

<p>
	بدلا من:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4755_37">
<span class="pln">tar xvf etc</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">postfix</span><span class="pun">/</span></pre>

<p>
	ترجمة -وبتصرّف- لمقال <a href="https://danielmiessler.com/study/tar/" rel="external nofollow">A tar Primer</a> لصاحبه Daniel Miessler.
</p>
]]></description><guid isPermaLink="false">243</guid><pubDate>Fri, 15 Apr 2016 08:31:41 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x62D;&#x632;&#x645; &#x641;&#x64A; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x648;&#x62F;&#x628;&#x64A;&#x627;&#x646; - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r248/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/package-managment-ubunt-debian.png.4a5dbb9dcd035883db7e25d075b18f8d.png" /></p>

<p dir="rtl">
	<a name="__DdeLink__1462_967907112" rel="external"></a>إدارة الحزم هي أحد الميزات الرئيسة التي تتحفنا بها توزيعات أنظمة لينكس. طريقة التحزيم وأدوات إدارة الحِزم تختلف من توزيعة إلى أخرى، رغم ذلك ظهرت مجموعتان وتم تصنيفهما الأكثر انتشارًا.
</p>

<p dir="rtl">
	بخصوص التوزيعات المبنية على ريدهات لينكس، فإنها تستخدم أدوات RPM مثل rpm و yum. أما المجموعة الأخرى والتي يتم استخدامها من قِبل دبيان ، أوبنتو ، والتوزيعات ذات العلاقة، فإنها تستخدم هيئة التحزيم بطريقة deb وأدوات مثل apt و dpkg. سيُعني المقال بمناقشة هذه المجموعة الأخيرة.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="package-managment-ubunt-debian.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14961" data-unique="gj7yao3bf" src="https://academy.hsoub.com/uploads/monthly_2016_04/package-managment-ubunt-debian.png.19df7d61a7be81e95ba401c453e3bb9a.png"></p>

<h2 dir="rtl">
	ما الذي سيغطيه هذا المقال
</h2>

<p dir="rtl">
	سيغطي هذا المقال أدوات إدارة الحِزم على مستوى المستخدم، والتي تستخدم غالبًا في أنظمة دبيان وأوبنتو، لن يتم تغطية الأدوات الضرورية لإنشاء الحِزم بسبب الآراء المتباينة حول السياسات بين مختلف التوزيعات والتعقيدات المتضمنة بأمثلة لها اعتبارها.
</p>

<p dir="rtl">
	سوف نناقش كل أداة متاحة بشكل منفرد في ملخص أدوات إدارة نظام الحِزم في دبيان، لكن أغلبية هذا المقال سيكون مرتبًا حسب الوظيفة وليس حسب الأداة؛ حيث أن هذا المقال يعتبر مرجعًا وظيفيًا.
</p>

<p dir="rtl">
	لتحقيق الاستفادة القصوى من هذا المقال يرجى وضع النقاط التالية في الاعتبار:
</p>

<ul dir="rtl">
<li>
		إذا كنت مبتدئًا في أدوات إدارة الحِزم في دبيان يرجى قراءة ملخص أدوات إدارة الحِزم في دبيان أدناه، هذا القسم سيوفر لك ملخصًا شاملا عن ميّزات كل أداة، وكيف ترتبط ببعضها.
	</li>
	<li>
		استخدم كل قسم من هذا المقال كضرورة للوصول لما تريده. هذا المقال ليس إجرائيًا؛ لذا لك الحرية في الوصول إلى ما تراه مناسبًا لك.
	</li>
	<li>
		قم بنسخ ولصق أمثلة الأوامر المعطاة، مع استبدال القيم المذكورة بالقيم الخاصة بك.
	</li>
</ul>
<h2 dir="rtl">
	نظرة عامة حول أدوات إدارة الحزم الخاصة بدبيان
</h2>

<p dir="rtl">
	نظام البيئة المتاح في دبيان / أوبنتو يستخدم أدوات إدارة حِزم مختلفة إلى حدِ ما لإدارة البرامج في النظام.
</p>

<p dir="rtl">
	أغلب هذه الأدوات غير مترابطة، وتعمل على نفس قاعدة البيانات للحزمة، بعض هذه الأدوات يحاول تقديم واجهات ذات مستوى عالٍ لأنظمة الحِزم، بينما تركّز أدوات أخرى على تزويد وظيفة في مستوى متدنّي.
</p>

<h3 dir="rtl">
	Apt-get
</h3>

<p dir="rtl">
	يعتبر الأمر<span style="font-family:courier new,courier,monospace;"> Apt-get</span> الأكثر استخدامًا من مجموعة apt، هدفه الرئيسي هو عمل واجهة مع المستودعات البعيدة التي يتم الاحتفاظ بها من قِبل فريق الحِزم الخاص بالتوزيعة، بالإضافة إلى تنفيذ العمليات على الحِزم المتاحة.
</p>

<p dir="rtl">
	تعمل مجموعة apt بشكل عام عن طريق سحب المعلومات من المستودعات إلى الذاكرة المؤقتة التي يتم إدارتها من خلال النظام المحلي.
</p>

<p dir="rtl">
	الأمر<span style="font-family:courier new,courier,monospace;"> apt-get</span> يستخدم لتحديث الذاكرة المؤقتة المحلية، ويستخدم أيضًا للتعديل على حالة الحِزمة؛ نقصد تنصيب أو إزالة الحزمة من النظام.
</p>

<h3 dir="rtl">
	Apt-cache
</h3>

<p dir="rtl">
	أحد الأوامر الأخرى المهمة في مجموعة apt هو الأمر <span style="font-family:courier new,courier,monospace;">apt-cache</span>، والذي يستخدم الذاكرة المؤقتة المحلية ليستعلم عن المعلومات المتعلقة بالحِزم المتاحة في مستودعاته.
</p>

<p dir="rtl">
	على سبيل المثال، في أي وقت ترغب في البحث عن حزمة معينة أو أداة لتنفيذ وظيفة معينة، فإن الأمر <span style="font-family:courier new,courier,monospace;">apt-cache</span> يُعتبر نقطة جيدة للبداية. يمكن أن تكون مفيدة أيضًا لمعرفة أيّ إصدار حزمة سيتم استخدامه من لأي إجراء.
</p>

<p dir="rtl">
	كما وتعتبر<span style="font-family:courier new,courier,monospace;"> apt-cache</span> مفيدة في حالة معلومات الاعتمادية، والاعتمادية العكسية.
</p>

<h3 dir="rtl">
	Aptitude
</h3>

<p dir="rtl">
	يقوم الأمر <span style="font-family:courier new,courier,monospace;">aptitude</span> بدمج الكثير من وظائف الأمرين المذكورين أعلاه، تتوفر فيه ميزة العمل كأداة سطر الأوامر حيث تدمج وظائف الأداتين المذكورتين أعلاه، وتستطيع أيضًا العمل باستخدام <span style="font-family:courier new,courier,monospace;">ncurses</span> والتي تعتبر واجهة قائمة نصية.
</p>

<p dir="rtl">
	عند العمل من سطر الأوامر، العديد من الأوامر تقوم بتمثيل الإمكانيات الخاصة بـ<span style="font-family:courier new,courier,monospace;"> apt-get</span> و <span style="font-family:courier new,courier,monospace;">apt-cache </span>بالضبط. لن نناقش <span style="font-family:courier new,courier,monospace;">aptitude</span> باستفاضة في هذا المقال بسبب التداخل الواضح في وظائف الأوامر.
</p>

<p dir="rtl">
	إذا كنت تفضل هذه الأداة فإنك تستطيع دومًا استخدام <span style="font-family:courier new,courier,monospace;">aptitude</span> بالمبادلة مع<span style="font-family:courier new,courier,monospace;"> apt-get</span> أو <span style="font-family:courier new,courier,monospace;">apt-cache</span>.
</p>

<h3 dir="rtl">
	Dpkg
</h3>

<p dir="rtl">
	بينما تركّز الأدوات السابقة على إدارة الحِزم المحفوظة في المستودعات، إلا أن الأمر <span style="font-family:courier new,courier,monospace;">dpkg</span> يمكن استخدامه ليعمل على حزم deb. بشكل منفرد. هذا الأمر مسؤول بالضبط عن الأعمال التي تجري في كواليس الأوامر المذكورة أعلاه.
</p>

<h3 dir="rtl">
	Tasksel
</h3>

<p dir="rtl">
	يعتبر برنامج tasksel نوعًا مختلفًا من أدوات إدارة البرامج. فبدلاً من إدارة الحزم أو حتى التطبيقات بشكل منفرد، فإن tasksel تركّز على تجميع البرامج المطلوبة لتنفيذ مهام محددة.
</p>

<p dir="rtl">
	يمكن اختيار المهام المنظمة باستخدام واجهة نصيَة، أو يمكن استهدافها مثلما تستهدف بعض الحِزم في أدواة الحزم المعتادة. تعتبر الأداة مفيدة جدًا للبداية والمضي قدمًا في العمل، بالرغم من أنها ليست الطريقة الأمثل.
</p>

<h3 dir="rtl">
	أدوات أخرى
</h3>

<p dir="rtl">
	هناك العديد من الأدوات المتاحة لإدارة الحزم والتي تزودنا بالعديد من المهام والوظائف، أو تستحضر معلومات بطرق مختلفة. بعض هذه الأدوات مفيدة في مواقف معينة لكننا سنذكر بعض هذه الأدوات عند الضرورة.
</p>

<h2 dir="rtl">
	تحديث الذاكرة المؤقتة للحزم والنظام
</h2>

<p dir="rtl">
	تزودنا أدوات إدارة الحزم بطرق ممتازة لدوام تحديث قائمة النظام الخاصة بالحزم المتاحة، كما وتزودنا بطرق بسيطة لتحدث الحزم المنصبة حاليا على خادومك.
</p>

<h3 dir="rtl">
	تحديث الذاكرة المؤقتة للحزم المحلية
</h3>

<p dir="rtl">
	تعتبر المستودعات التي تعتمد عليها أدوات الحزم الخاصة بك في الحصول على معلومات الحزمة محدثة على الدوام، لكن معظم أدوات إدارة الحِزم تعمل بالذاكرة المؤقتة لهذه المعلومات.
</p>

<p dir="rtl">
	يحبذ دائمًا عمل تحديث للذاكرة المؤقتة الخاصة بالحِزم لكل جلسة قبل إجراء أي أوامر خاصة بالحزم، هذا سوف يضمن أنك تعمل على المعلومات المحدثة حول البرنامج المتاح. إضافة إلى أن بعض أوامر التنصيب سوف لن تتم إذا كنت تعمل على معلومات قديمة لبعض الحِزم.
</p>

<p dir="rtl">
	لتحديث الذاكرة المؤقتة، استخدم الأمر <span style="font-family:courier new,courier,monospace;">apt-get </span>مع اللاحقة <span style="font-family:courier new,courier,monospace;">update</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_8">
<span class="pln">sudo apt-get update</span></pre>

<p dir="rtl">
	هذا سوف يجلب قائمة المعلومات المحدثة من المستودعات عن الحزم التي تتابعها.
</p>

<h3 dir="rtl">
	تحديث الحزم بدون إزالة
</h3>

<p dir="rtl">
	مجموعة الحزم apt تسهل عملية تحديث كل البرامج المنصبة على الخادوم.
</p>

<p dir="rtl">
	الأمر <span style="font-family:courier new,courier,monospace;">apt</span> يميّز بين عمليتي تحديثٍ مختلفتين، العملية الأولى (والتي سيتم تفصيلها في هذا القسم) يمكن استخدامها لتحديث أي جزء لا يتطلب إزالة أجزاء أخرى.
</p>

<p dir="rtl">
	تعتبر هذه الطريقة مهمة جدا عندما لا ترغب في إزالة أي حزمة مـُنصبّة تحت أي ظرف. لكن – في الحقيقة – بعض التحديثات تتضمن استبدال أجزاء النظام أو إزالة ملفات التعارض. سوف تتجاهل هذه الطريقة أي تحديثات تتطلب إزالة حِزم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_10">
<span class="pln">sudo apt-get upgrade</span></pre>

<p dir="rtl">
	بعد تنفيذ هذا الإجراء، سيتم تطبيق أي تحديث لا يتضمن إزالة أجزاء.
</p>

<h3 dir="rtl">
	تحديث الحِزم والإزالة حسب الضرورة
</h3>

<p dir="rtl">
	تقوم مجموعة apt بتسهيل عملية التحديث لكافة البرامج المنصبة على الخادوم.
</p>

<p dir="rtl">
	يقوم الأمر بالتمييز بين عمليتي تحديث مختلفتين، الأولى تقوم بتجاهل أي عملية تحديث تتطلب إزالة أي حزمة، وهذه العملية تم شرحها في القسم أعلاه.
</p>

<p dir="rtl">
	العملية الثانية، تقوم بتحديث كل الحِزم، حتى تلك التي تتطلب إزالة حزم معينة. هذا الأمر ضروري غالبًا كاعتمادية لتغيير الحِزم.
</p>

<p dir="rtl">
	عادة، يتم استبدال الحِزم التي تمت إزالتها ببديل وظيفي خلال عملية التحديث، مما يجعل عملية التحديث آمنة. على أي حال يجب الانتباه إلى الحزم التي يتوجب إزالتها. لإجراء هذه الوظيفة، نفّذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_12">
<span class="pln">sudo apt-get dist-upgrade</span></pre>

<p dir="rtl">
	سيقوم بتحديث كل الحزم على النظام، تعتبر هذه العملية تحديث كامل أكبر التحديث السّابق.
</p>

<h2 dir="rtl">
	تحميل وتنصيب الحزم
</h2>

<p dir="rtl">
	تُعد مهمة تسهيل تحميل وتنصيب الحِزم على النظام كإحدى المهام الرئيسة في أدوات إدارة الحِزم.
</p>

<h3 dir="rtl">
	البحث عن الحزم
</h3>

<p dir="rtl">
	بعد عملية تحميل وتنصيب الحِزم، أول خطوة هي البحث في مستودعات التوزيعة عن الحِزم التي تلزمك.
</p>

<p dir="rtl">
	أغلب أوامر <span style="font-family:courier new,courier,monospace;">apt</span> تعمل بشكل رئيسي على الذاكرة المؤقتة لمعلومات الحِزم المحفوظة على الحاسوب المحلي. بالطبع فإن هذا الأمر يسمح بالمزيد من السرعة في التنفيذ، والتقليل من حركة البيانات عبر الشبكة.
</p>

<p dir="rtl">
	البحث عن الحِزم هي عملية تستهدف المعلومات في الذاكرة المؤقتة للحِزم. الأمر الفرعي<span style="font-family:courier new,courier,monospace;"> apt-cache search</span> هو الأداة المستخدمة في البحث عن الحِزم المتاحة. يرجى الانتباه إلى ضرورة التأكد من تحديث الذاكرة المؤقتة المحلية قبل عملية البحث من خلال الأمر <span style="font-family:courier new,courier,monospace;">sudo apt-get update</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_14">
<span class="pln">apt-cache search package</span></pre>

<p dir="rtl">
	حيث أن هذه العملية تستعلم عن المعلومات فقط، فإنها لا تتطلب صلاحيات <span style="font-family:courier new,courier,monospace;">sudo</span>. أي بحث يتم إجراؤه سيبحث عن أسماء الحِزم بالإضافة إلى الوصف الكامل لها.
</p>

<p dir="rtl">
	على سبيل المثال، إذا كنت تبحث عن <span style="font-family:courier new,courier,monospace;">htop</span>، ستكون النتائج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_38">
<span class="pln">apt-cache search htop</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_36">
<span class="pln">aha - ANSI color to HTML converter
htop - interactive processes viewer
libauthen-oath-perl - Perl module for OATH One Time Passwords</span></pre>

<p dir="rtl">
	كما ترى، لدينا حزمة اسمها <span style="font-family:courier new,courier,monospace;">htop</span>، لكننا نرى أيضا برنامجين آخرين، كلاهما أشار إلى <span style="font-family:courier new,courier,monospace;">htop</span> في حقل الوصف الكامل للحزمة (الوصف الذي يلي المخرجات هو وصف مختصر).
</p>

<h3 dir="rtl">
	تنصيب الحزم من المستودعات
</h3>

<p dir="rtl">
	لتنصيب حزمة من المستودعات، بالإضافة إلى كل الحزمة المعتمدة عليها، نستخدم الأمر <span style="font-family:courier new,courier,monospace;">apt-get</span> مع الأمر الفرعي <span style="font-family:courier new,courier,monospace;">install</span>.
</p>

<p dir="rtl">
	المدخلات مع هذا الأمر يجب أن تكون اسم أو أسماء الحزم كما هو ظاهر/مُستخدم في المستودع:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_18">
<span class="pln">sudo apt-get install package</span></pre>

<p dir="rtl">
	بإمكانك تنصيب عدة حِزم دفعة واحدة، مع الفصل بينها بمسافة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_20">
<span class="pln">sudo apt-get install package1 package2</span></pre>

<p dir="rtl">
	إذا طلبت حِزمة تتطلب اعتمادات أخرى، سيتم عرضها ويُطلب منك تأكيد العملية، ستكون شبيهة بما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_40">
<span class="pln">Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  apache2-data
Suggested packages:
  apache2-doc apache2-suexec-pristine apache2-suexec-custom
  apache2-utils
The following NEW packages will be installed:
  apache2 apache2-data
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 236 kB of archives.
After this operation, 1,163 kB of additional disk space will be used.
Do you want to continue [Y/n]?</span></pre>

<p dir="rtl">
	كما ترى، بالرغم من أننا طلبنا تنصيب <span style="font-family:courier new,courier,monospace;">apache2</span> فأن الحزمة <span style="font-family:courier new,courier,monospace;">apache2-data</span> مطلوبة كاعتمادية. في هذه الحالة يمكنك الاستكمال بالضغط على زر الإدخال ENTER أو "y" أو تجاهل العملية بالضغط على حرف "n".
</p>

<h3 dir="rtl">
	تنصيب إصدار حِزمة معين من المستودعات
</h3>

<p dir="rtl">
	إذا كنت تريد تنصيب إصدار محدد لحزمة ما، يمكنك إضافة الإصدار الذي ترغب به مع إشارة التساوي، كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_24">
<span class="pln">sudo apt-get install package=version</span></pre>

<p dir="rtl">
	الإصدار في هذه الحالة يجب أن يتوافق مع الأرقام المتاحة في المستودع. هذا يعني استخدام نموذج الإصدارات الموجود في التوزيعة التي تستخدمها. تستطيع إيجاد الإصدارات المتاحة عبر تنفيذ الأمر
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_26">
<span class="pln">apt-cache policy package</span></pre>

<h3 dir="rtl">
	إعادة ضبط الإعدادات
</h3>

<p dir="rtl">
	العديد من الحِزم تتضمن إعدادات ما قبل التنصيب، والتي يتم تنفيذها بعد اكتمال عملية التنصيب. غالبا يكون لمدير النظام الحرية في اختيار الإعدادات.
</p>

<p dir="rtl">
	إذا كنت تريد تأجيل خطوات هذه الإعدادات الإضافية، يمكنك استخدام الأمر <span style="font-family:courier new,courier,monospace;">dpkg-reconfigure</span>، الذي بدوره يبحث في الحزمة التي يتم تمريرها له، ويعيد تنفيذ أي أوامر للإعدادات اللاحقة المتضمنة في مواصفات الحزمة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_28">
<span class="pln">sudo dpkg-reconfigure package</span></pre>

<p dir="rtl">
	هذا سيسمح لك بالوصول إلى الإعدادات الإضافية (وربما غيرها) التي تجاوزتها خلال التنصيب.
</p>

<h3 dir="rtl">
	إجراء محاكاة لعمليات الحزمة
</h3>

<p dir="rtl">
	في بعض الأحيان، تحتاج لترى التأثيرات الجانبية لعملية ما بدون الاعتماد الفعلي لتنفيذ الأمر. لحسن الحظ فإن <span style="font-family:courier new,courier,monospace;">apt</span> تسمح لك بإضافة <span style="font-family:courier new,courier,monospace;">s-</span> لمحاكاة العملية.
</p>

<p dir="rtl">
	على سبيل المثال، تريد أن ترى ما يمكن أن يحصل عندما تختار تنصيب حزمة، يمكنك تنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_30">
<span class="pln">apt-get install -s package</span></pre>

<p dir="rtl">
	هذا سيسمح لك برؤية كل الاعتمادات والتغييرات على نظامك، والتي سوف تحدث لو قمت بإزالة لاحقة <span style="font-family:courier new,courier,monospace;">s-</span>. إحدى فوائد هذه الطريقة هو تمكينك من رؤية نتائج عملية ما، والتي تتطلب صلاحية root، بدون استخدام <span style="font-family:courier new,courier,monospace;">sudo</span>.
</p>

<p dir="rtl">
	على سبيل المثال، لتقييم ما يمكن تنصيبه مع apache2، يمكنك تنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_42">
<span class="pln">NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  apache2-data
Suggested packages:
  apache2-doc apache2-suexec-pristine apache2-suexec-custom
  apache2-utils
The following NEW packages will be installed:
  apache2 apache2-data
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Inst apache2-data (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [all])
Inst apache2 (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [amd64])
Conf apache2-data (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [all])
Conf apache2 (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [amd64])</span></pre>

<p dir="rtl">
	سنحصل على كل المعلومات عن الحِزم والإصدارات دون الحاجة إلى إكمال العملية فعليًا.
</p>

<p dir="rtl">
	هذه الطريقة تعمل أيضا مع عمليات أخرى مثل تحديثات النظام:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_34">
<span class="pln">apt-get -s dist-upgrade</span></pre>

<h3 dir="rtl">
	عدم التنبيه لطلب التأكيد مع إجراءات الحزمة
</h3>

<p dir="rtl">
	تقوم <span style="font-family:courier new,courier,monospace;">apt</span> بتنبيه المستخدم بشكل افتراضي لتأكيد العديد من العمليات، هذا يتضمن عمليات التنصيب التي تتطلب اعتماديات إضافية وتحديث للحزم.
</p>

<p dir="rtl">
	لتجاوز هذه التحديثات، يمكنك إضافة <span style="font-family:courier new,courier,monospace;">y-</span> عند تنفيذ هذه الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_44">
<span class="pln">sudo apt-get install -y package</span></pre>

<p dir="rtl">
	سيقوم هذا الأمر بتنصيب الحزمة وأي اعتماديات دون طلب التأكيد من المستخدم، يستخدم أيضا في عملية التحديث أيضًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_46">
<span class="pln">sudo apt-get dist-upgrade –y</span></pre>

<h3 dir="rtl">
	إصلاح الاعتماديات غير المكتملة والحِزم
</h3>

<p dir="rtl">
	في بعض الأحيان لا تكتمل بعض عمليات التنصيب بسبب الاعتماديات أو أي مشاكل أخرى. إحدى هذه الحالات الشائعة لحدوث مثل هذه المشاكل عند تنصيب حزمة من نوع deb. من خلال <span style="font-family:courier new,courier,monospace;">dpkg</span>، والتي لا تقوم بتحليل الاعتماديات.
</p>

<p dir="rtl">
	يقوم الأمر <span style="font-family:courier new,courier,monospace;">apt-get</span> بمحاولة تنظيم الوضع بتمرير الأمر <span style="font-family:courier new,courier,monospace;">f-</span>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_48">
<span class="pln">sudo apt-get install -f</span></pre>

<p dir="rtl">
	سيقوم بالبحث عن أي اعتماديات غير متوفرة ومحاولة تنصيبها لإصلاح شجرة الاعتماديات. إذا كان التنصيب غير مكتمل بسبب مشكلة في الاعتماديات، فيجب أن تكون هذه الخطوة الأولى لمحاولة الحل.
</p>

<h3 dir="rtl">
	تحميل حزمة من المستودعات
</h3>

<p dir="rtl">
	في الكثير من الأحيان يكون من المفيد تحميل الحِزم من المستودعات دون تنصيبها فعليًا. يمكنك تنفيذ ذلك من خلال الأمر الفرعي <span style="font-family:courier new,courier,monospace;">download</span> التابع للأمر <span style="font-family:courier new,courier,monospace;">apt-get</span>.
</p>

<p dir="rtl">
	بما أن الحالة هي تحميل ملف فقط، فلا يتأثر النظام، وبالتالي لا حاجة لصلاحيات <span style="font-family:courier new,courier,monospace;">sudo</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_50">
<span class="pln">apt-get download package</span></pre>

<p dir="rtl">
	يقوم هذا الأمر بتحميل حزمة / حِزم معينة إلى المجلد الحالي.
</p>

<h3 dir="rtl">
	تحميل مصدر الحزمة من المستودعات
</h3>

<p dir="rtl">
	يمكنك تحميل الملفات المصدرية للحِزم على الرغم من أن الأمر <span style="font-family:courier new,courier,monospace;">apt</span> يتعامل بشكل رئيسي مع حِزم deb.، طالما أن قوائم المصدر الخاصة بـ <span style="font-family:courier new,courier,monospace;">apt</span> تكون مجهّزة بتلك المعلومات.
</p>

<p dir="rtl">
	لتحميل مصدر الحزمة، يجب أن يكون هناك سطر <span style="font-family:courier new,courier,monospace;">deb-src</span> مُوافق لذلك في ملف<span style="font-family:courier new,courier,monospace;"> source.list</span> لتلك الـ <span style="font-family:courier new,courier,monospace;">apt</span>.
</p>

<p dir="rtl">
	بإمكانك الاطلاع على كيفية عمل ذلك في قسم إضافة مستودعات <span style="font-family:courier new,courier,monospace;">apt</span>.
</p>

<p dir="rtl">
	بعد أن يتم إعداد المستودعات، يمكنك تحميل مصدر حزمة ما من خلال تنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_52">
<span class="pln">sudo apt-get source package</span></pre>

<p dir="rtl">
	هذا الأمر سيقوم بتحميل ملفات الحزمة إلى المجلد الحالي. بالطبع فإن التحميل يشمل مجلد الحزمة، ملف الوصف dsc، وملف الحزمة مضغوطًا ومؤرشفًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_54">
<span class="pln">ls -F</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2307_8">
<span class="pln">sublime-text-2.0.2/                 sublime-text_2.0.2-1~webupd8~3.tar.gz
sublime-text_2.0.2-1~webupd8~3.dsc</span></pre>

<p dir="rtl">
	إذا كنت تود استخدام حِزم التوزيعة كأساس لتعديلات مستقبلية، يمكنك استخدام الطريقة المذكورة.
</p>

<h3 dir="rtl">
	تنصيب حزمة deb.
</h3>

<p dir="rtl">
	بعض المزودين يقدمون الملفات الخام deb. لبرامجهم، والتي يمكنك تنصيبها على نظامك، ولكن أغلب التوزيعات توصِي بتنصيب البرامج من مستودعاتهم التي تنال قدرًا كافيًا من اهتمامهم.
</p>

<p dir="rtl">
	لتنصيب ملفات deb.، نستخدم أداة <span style="font-family:courier new,courier,monospace;">dpkg</span> والتي تستخدم بشكل رئيسي للعمل مع الحِزم المستقلة. لا تقوم الأداة بإجراءات التنصيب، بدلا من ذلك تبحث عن حِزم deb. في المجلد الحالي، أو المسار الذي يتم تزويده:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_58">
<span class="pln">sudo dpkg --install debfile.deb</span></pre>

<p dir="rtl">
	من المهم ملاحظة أن أداة <span style="font-family:courier new,courier,monospace;">dpkg</span> لا تقوم بالتعامل مع الاعتماديات، مما يعني أن التنصيب سيبوء بالفشل في حال عدم وجود الحزم التي تعتمد عليها الحزمة الحالية. لحُسن الحظ تقوم الأداة بتحديد الاعتماديات المطلوبة، حيث أنه إذا كانت الاعتماديات متوفرة في المستودعات يمكنك توفيرها بسهولة فيما بعد من خلال تنفيذ الأمر
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_60">
<span class="pln">sudo apt-get install -f</span></pre>

<p dir="rtl">
	سيقوم هذا الأمر بتنصيب الاعتماديات المطلوبة، من بينها تلك التي قامت الأداة <span style="font-family:courier new,courier,monospace;">dpkg</span> بتحديدها.
</p>

<h3 dir="rtl">
	تنصيب "مهام" البرامج من خلال Tasksel
</h3>

<p dir="rtl">
	من الممكن تنصيب مجموعة كبيرة من البرامج ذات العلاقة من خلال استخدام المهام "tasks". المهام – ببساطة – هي مجموعات من الحِزم التي تقوم بتجهيز بيئة معينة عندما يتم تنصيبها مع بعضها البعض. من الأمثلة على هذه المهام ما يلي: خادوم LAMP (خاص ببيئة تطوير مواقع الويب)، بيئة سطح المكتب، خادوم التطبيقات.
</p>

<p dir="rtl">
	قد تحتوي بعض الأنظمة على حزمة tasksel موجودة بشكل افتراضي. للحصول عليها يمكنك تنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_62">
<span class="pln">sudo apt-get update
sudo apt-get install tasksel</span></pre>

<p dir="rtl">
	كما ويمكنك اختيار حِزم مهام مختلفة بتنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_64">
<span class="pln">sudo tasksel</span></pre>

<p dir="rtl">
	سيقوم هذه الأمر بعرض واجهة تسمح لك باختيار مجموعات حِزم مختلفة وتطبيق التغييرات.
</p>

<p dir="rtl">
	يمكنك استعراض قائمة المهام المتاحة وحالتها (من حيث التنصيب) بتنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_66">
<span class="pln">tasksel --list-task</span></pre>

<p dir="rtl">
	أخيرًا، يمكنك تنصيب مهام من سطر الأوامر بتنفيذ:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5617_68">
<span class="pln">sudo tasksel install task_name</span></pre>

<p dir="rtl">
	سنواصل في الجزء القادم <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86%C2%A0-%C2%A0%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r250/" rel="">المزيد من أساسيات إدارة الحزم في أوبنتو ودبيان</a>.
</p>

<p dir="rtl">
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/ubuntu-and-debian-package-management-essentials" rel="external nofollow">Ubuntu and Debian Package Management Essentials</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">248</guid><pubDate>Fri, 15 Apr 2016 07:59:00 +0000</pubDate></item><item><title>&#x634;&#x631;&#x62D; &#x623;&#x630;&#x648;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; (File permissions) &#x639;&#x644;&#x649; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x648;&#x64A;&#x648;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%B4%D8%B1%D8%AD-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-permissions-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%8A%D9%88%D9%86%D9%83%D8%B3-r240/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/linux-file-permissions.png.1b0e108556a0972385d0b4e90af3769b.png" /></p>

<p>
	يجد كثير من مستخدمي لينكس والأنظمة الشبيهة بيونكس عموما مشاكل في فهم أذونات Permissions الملفات والمجلّدات. يتعلق الأمر أحيانا بترتيب أوضاع بتات القراءة، الكتابة أو التنفيذ؛ بينما تكمن الصعوبة أحيانا أخرى بفهم رموز العدّ الثمانيّ Octal أو ربما كيفية حل لغز بت <code>setuid</code> والبت اللاّصق Sticky bit.
</p>

<p style="text-align: center;">
	<img alt="linux-file-permissions.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14876" data-unique="lm44htoge" src="https://academy.hsoub.com/uploads/monthly_2016_04/linux-file-permissions.png.86eeb5220e9948fc7cf66d7d69e87fb5.png"></p>

<p>
	يتوجّه هذا المقال إلى من لم يفهم قطّ هذه الأذونات بالدرجة الأولى وإلى من يجد خلطا من حين لآخر في تفاصيلها.
</p>

<p>
	راجع أيضا مقال  <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-permissions-r25/" rel="">مقدّمة إلى أذونات لينكس Linux Permissions</a>.
</p>

<h2 id="الأساسيات">
	الأساسيات
</h2>

<p>
	نبدأ أولا بالنظر إلى مخرجات أمر <code>ls</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_7">
<span class="pln">ls </span><span class="pun">-</span><span class="pln">lah 

</span><span class="pun">-</span><span class="pln">rwxr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">--</span><span class="pln">  </span><span class="lit">1</span><span class="pln"> daniel consultants  </span><span class="lit">5K</span><span class="pln">  </span><span class="typ">Mar</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="lit">06</span><span class="pun">:</span><span class="lit">55</span><span class="pln"> scanner</span><span class="pun">.</span><span class="pln">rb
</span><span class="pun">-</span><span class="pln">rwxr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">-</span><span class="pln">x  </span><span class="lit">1</span><span class="pln"> sarah teachers      </span><span class="lit">18M</span><span class="pln"> </span><span class="typ">Jul</span><span class="pln"> </span><span class="lit">30</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="lit">07</span><span class="pln"> papers</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2</span></pre>

<ul>
<li>
		<strong>ثلاث مجموعات من ثلاثة أحرف</strong>: بما أن الأمر يتعلّق هنا بملفات فستظهر عارضة <code>-</code> في أول كل مُخرَج (سطر) . تلي العارضة مجموعة محارف (9 بالضبط، تدخُل العوارض <code>-</code> في الحساب) سنصطلح على تقسيمها إلى ثلاث مجموعات فرعية متساوية (3x3).
	</li>
	<li>
		<strong>المستخدِم-المجموعة-الآخرون</strong>: نسمي المجموعات الثلاث على الترتيب المستخدِم User, U، مجموعة المستخدم Group, G والآخرين Other, O. يعني هذا أن أول مجموعة محارف (<code>rwx</code> في السطريْن) تتعلق بالمستخدِم مالك الملفّ، الثانية (<code>r-x</code> في السطريْن) تتعلّق بمجموعة المستخدمين مالكة الملفّ والثالثة (<code>--r</code> في السطر الأول و<code>r-x</code> في السطر الثاني) تعني الآخرين أي بقية المستخدمين.
	</li>
	<li>
		<strong>صاحب (مالك) الملف</strong>: يظهر في نتيجة الأمر المستخدم مالك الملف ومجموعة المستخدمين مالكة الملف كذلك، لكنك لن ترى الآخرين. يعود السبب في ذلك إلى أن أذونات الآخرين (مجموعة المحارف الأخيرة ضمن المجموعات الثلاث أعلاه) تنطبق على كل من ليس مالكَ الملف وليس ضمن مجموعة المستخدمين صاحبة الملف.
	</li>
</ul>
<h3 id="الأعداد-الثلاثة">
	الأعداد الثلاثة
</h3>

<p>
	يرتبك بعضهم عندما يرى الأذونات مذكورة بصيغة مجموعة من ثلاثة أعداد، لكنّ الأمر ليس بهذا التعقيد. تذكّر فقط أن هذه الأعداد هي أماكن تحوي الرقم الموافق للإذن حسب الترتيب (من اليسار إلى اليمين): <code>r</code> (القراءة)، <code>w</code> (الكتابة) و<code>x</code> (التنفيذ).
</p>

<p>
	لاحظ الصورة. بالنسبة لكلّ رمز، نضربه في <code>1</code> إذا كان مذكورا في الأذونات وفي 0 إن لم يكن (تظهر عارضة مكانه)، ثم نجمع نتيجة كل ثلاثي.
</p>

<p style="text-align: center;">
	<img alt="01_permissions.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13685" data-unique="h17z5x9wu" src="https://academy.hsoub.com/uploads/monthly_2016_03/01_permissions.png.71d8daaf7792e92de83c598a5eea240d.png"></p>

<h3 id="الأذون-على-المجلدات">
	الأذونات على المجلدات
</h3>

<p>
	يجب الانتباه إلى أن الأذونات على المجلدات تختلف عنها على الملفات. توحي أسماء الأذونات على الملفات بعملها: قراءة الملف (<code>r</code>)، الكتابة فيه أو حذفه (<code>w</code>) وتنفيذه (<code>x</code>)؛ بينما الدلالة مختلفة قليلا في المجلدات:
</p>

<ul>
<li>
		يعني إذن القراءة على مجلد أن بإمكانك عرض المجلّد.
	</li>
	<li>
		يدلّّ إذن الكتابة أن لديك القدرة على إنشاء محتوى في المجلد أو حذفه منه.
	</li>
	<li>
		يشير إذن التنفيذ إلى أنه بالإمكان الدخول إلى المجلّد، تنفيذ أمر <code>cd</code> عليه مثلا.
	</li>
</ul>
<h2 id="البت-اللاصق-معرف-المستخدم-ومعرف-المجموعة">
	البت اللاصق، معرف المستخدم ومعرف المجموعة
</h2>

<p>
	تمثّل هذه الخيارات الثلاثة الجزئية الأكثر تعقيدا لدى الكثيرين في أذونات لينكس.
</p>

<h3 id="معرف-المستخدم">
	معرف المستخدم
</h3>

<p>
	صُمِّم خيار معرّف المستخدم <code>setuid</code> (اختصار لـ Set user ID upon execution "اضبط معرّف المستخدم أثناء التنفيذ") لحلّ مشكل أساسي: غياب الإذن الكافي لتنفيذ بعض البرامج. كان حلّ هذا المشكل بإضافة خيار إلى الملف يقول “نفّذ هذا البرنامج وفق أذونات المستخدم الذي يملكه بغضّ النظر عن المستخدم الذي ينفّذ الملف”. ينبغي الحذر من استخدام هذا الخيار - الذي أصبح متجاوزا - إذ قد يؤدي لأخطار أمنية. إن حدث ومررت بإذن على النحو التالي فأنت أمام خيار <code>setuid</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_9">
<span class="pun">-</span><span class="pln">rwsr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">--</span><span class="pln">  </span><span class="lit">1</span><span class="pln"> daniel consultants  </span><span class="lit">5K</span><span class="pln">  </span><span class="typ">Mar</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="lit">06</span><span class="pun">:</span><span class="lit">55</span><span class="pln"> scanner</span><span class="pun">.</span><span class="pln">rb</span></pre>

<p>
	لاحظ حرف <code>s</code> في أذونات المستخدم مالك الملف مكان إذن التنفيذ <code>x</code>. يشير حرف <code>s</code> إلى أن إذن <code>setuid</code> مضبوط. يظهر حرف <code>s</code> في المثال أعلاه صغيرا Lowercase وهو ما يعني أن خيار التنفيذ متاح أيضا لمالك الملف. إن كان خيار <code>setuid</code> فقط مضبوطا (بمعنى أنه لا يُتاح لمالك الملف إذن تنفيذه) فسيظهر الحرف كبيرا Uppercase هكذا <code>S</code>.
</p>

<p>
	<strong>ملحوظة:</strong> ينطبق التنبيه أعلاه بخصوص هيئة الحرف (صغير أو كبير) على جميع خيارات الأذونات الخاصة. المبدأ العام هو: إذا كان الحرف الذي يشير للإذن الخاص صغيرا فهذا يعني أن الإذن لدى المالك أيضا، أما إذا كان كبيرا فهذا يعني أنه ليس لدى المالك هذا الإذن.
</p>

<h3 id="معرف-المجموعة-setguid">
	معرف المجموعة setguid
</h3>

<p>
	يشبه الخيّار السابق في عمله مع فرق أنه يُطبَّق على مجموعة المستخدمين المالكة للملف بدلا من المستخدم المالك: 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_11">
<span class="pun">-</span><span class="pln">rwxr</span><span class="pun">-</span><span class="typ">Sr</span><span class="pun">-</span><span class="pln">x  </span><span class="lit">1</span><span class="pln"> bjones principals  </span><span class="lit">101K</span><span class="pln">  </span><span class="typ">Aug</span><span class="pln"> </span><span class="lit">16</span><span class="pln"> </span><span class="lit">04</span><span class="pun">:</span><span class="lit">01</span><span class="pln"> grades</span><span class="pun">.</span><span class="pln">xml</span></pre>

<p>
	الفرق هنا بالمقارنة مع المثال في الفقرة السابقة هو أن حرف <code>S</code> يوجد ضمن أذونات المجموعة بدلا من المستخدِم. لاحِظ أيضا أن الحرف <code>S</code> في هذا المثال كبير وهو ما يعني أنّه ليس لدى المجموعة المالكة (<code>principals</code> في هذه الحالة) إذن التنفيذ ولكن عند تنفيذ المستخدِم <code>bjones</code> (المالك) أو مستخدم آخر ليس ضمن مجموعة <code>principals</code> للملف فإنّ التنفيذ سيكون بصلاحيات المجموعة المالكة.
</p>

<h3 id="البت-اللاصق">
	البت اللاصق
</h3>

<p>
	يُستخدم هذا البت من أجل منع مستخدمين من التعديل على أو حذف ملفات مستخدِم أو مجموعة مستخدمين. يمكن تطبيق البت اللّاصق على ملفات عادية ولكنّه يُطبَّق أكثر على المجلّدات. نفرض مثلا أنك وضعت مجلدا تحت تصرّف مجموعة من التلاميذ ثم منحت لكل طالب مجلدا خاصا به. يمكن باستخدام البتّ اللاصق التأكد من أنه لن يكون بإمكان طالب حذفُ محتوى مجلد خاصّ بطالب آخر.
</p>

<p>
	يبدو البت اللاّصق كما يلي (لاحظ حرف <code>t</code>):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_13">
<span class="pln">drwxr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">-</span><span class="pln">t  </span><span class="lit">1</span><span class="pln"> alice alice  </span><span class="lit">4.4K</span><span class="pln">  </span><span class="lit">2007</span><span class="pun">-</span><span class="lit">01</span><span class="pun">-</span><span class="lit">01</span><span class="pln"> </span><span class="lit">09</span><span class="pun">:</span><span class="lit">21</span><span class="pln"> </span><span class="typ">Alice</span></pre>

<h2 id="التعديل-على-الأذون">
	التعديل على الأذونات
</h2>

<p>
	استخدم أمر <code>chmod</code> لتعديل أذونات ملفّ بذكر الأذونات الجديدة التي تريد تطبيقها. يغيّر الأمر التالي أذونات مجلد الويب لتصبح <code>755</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_15">
<span class="pln">chmod </span><span class="lit">755</span><span class="pln"> web_directory</span></pre>

<p>
	يغيّر الأمر أدناه أذونات ملف لتصبح <code>644</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_17">
<span class="pln">chmod </span><span class="lit">644</span><span class="pln"> grocery_list</span><span class="pun">.</span><span class="pln">txt</span></pre>

<h3 id="تعيين-معرف-المستخدم-معرف-المجموعة-والبت-اللاصق">
	تعيين معرف المستخدم، معرف المجموعة والبت اللاصق
</h3>

<p>
	يمكن استخدام أمر <code>chmod</code> أيضا لتعيين الأذونات الخاصّة.
</p>

<ul>
<li>
		لتعيين معرّف المستخدم (نضيف <code>4</code> أمام الأذونات الاعتيادية):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_19">
<span class="pln">chmod </span><span class="lit">4644</span><span class="pln"> script</span><span class="pun">.</span><span class="pln">rb</span></pre>

<ul>
<li>
		يمكن أيضا استخدام طريقة إضافة الأذونات الأخرى:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_21">
<span class="pln">chmod u</span><span class="pun">+</span><span class="pln">s script</span><span class="pun">.</span><span class="pln">rb</span></pre>

<ul>
<li>
		لتعيين معرّف المجموعة (نضيف <code>2</code> أمام الأذونات الاعتيادية):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_23">
<span class="pln">chmod </span><span class="lit">2644</span><span class="pln"> script</span><span class="pun">.</span><span class="pln">rb</span></pre>

<p>
	أو:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_25">
<span class="pln">chmod g</span><span class="pun">+</span><span class="pln">s script</span><span class="pun">.</span><span class="pln">rb</span></pre>

<ul>
<li>
		لتعريف البت اللّاصق (نضيف <code>1</code> أمام الأذونات الاعتيادية):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_27">
<span class="pln">chmod </span><span class="lit">1644</span><span class="pln"> myfiles</span></pre>

<p>
	أو:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5215_29">
<span class="pln">chmod o</span><span class="pun">+</span><span class="pln">t myfiles</span></pre>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://danielmiessler.com/study/unixlinux_permissions/" rel="external nofollow">A Unix and Linux Permissions Primer</a> لصاحبه Daniel Miessler.
</p>
]]></description><guid isPermaLink="false">240</guid><pubDate>Sat, 09 Apr 2016 22:53:00 +0000</pubDate></item><item><title>&#x62A;&#x642;&#x646;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x639;&#x64A;&#x645;&#x629; (Cryptography) &#x648;&#x627;&#x644;&#x62A;&#x634;&#x641;&#x64A;&#x631; (Encryption) &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x627;&#x62A;&#x647;&#x627; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%8A%D9%85%D8%A9-cryptography-%D9%88%D8%A7%D9%84%D8%AA%D8%B4%D9%81%D9%8A%D8%B1-encryption-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D8%A7%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r236/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/encryption-linux.png.78b7d78e391e44d2065b257aeb89eb13.png" /></p>

<p>
	تتوفّر على توزيعات لينكس برامج تحظُر إنشاء كلمات سر يسهُل تخمينها؛ فالوصول إلى الكثير من بيانات المستخدم وبرامجه يتطلّب تجاوز مرحلة إدخال كلمة السرّ ، الأمر الذي يجعل من كلمات السر نقطة حرجة في سبيل تأمين النظام والمستخدم على حدّ السواء ويجب بالتالي الحرص دائما على أن تكون محدَّثة.
</p>

<p style="text-align: center;">
	<img alt="encryption-linux.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14796" data-unique="xh11yqlfh" src="https://academy.hsoub.com/uploads/monthly_2016_04/encryption-linux.png.a2630a13f365915239c9b7580279b14e.png"></p>

<p>
	توجد الكثير من طرق تعمية البيانات ولكلّ منها خصوصيّاته. تستخدم أغلب توزيعات لينكس خوارزميّة تعمية تُسمّى معيار تعميّة البيانات Data Encryption Standard, DES لتعميّة كلمات السّر. تُخزّن كلمات السرّ المعمّاة في ملف <code>etc/passwd/</code> أو <code>etc/shadow/</code>. عندما يحاول المستخدم الولوج إلى النظام فإن كلمة السّر التي يُدخِلها تُعمَّى ثم تقارن بحقل كلمة السّر المعمّاة في الملف، فإن حصل تطابق فهذا يعني أنها نفس كلمة السّر وبالتالي يُسمح له بالولوج. تستخدم أغلب توزيعات لينكس نسخة من DES لا تعمل إلا في اتجاه واحد؛ بمعنى أنه يمكن استخدامها لتعميّة كلمة سر ولكن لا يمكن استخدامها لفك تعميّة كلمات السر في ملفّي <code>etc/passwd/</code> و<code>etc/shadow/</code>.
</p>

<p>
	يمكن لبرامج هجمات <a href="https://ar.wikipedia.org/wiki/%D9%87%D8%AC%D9%88%D9%85_%D8%A7%D9%84%D9%82%D9%88%D8%A9_%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D8%A7%D8%A1" rel="external nofollow">القوة العمياء</a> Brute force attacks مثل John the Ripper وCrack تخمين كلمات السر التي لا تحترم حدًّا أدنى من العشوائية؛ وبإمكان مديري النّظم استخدامها لصالحهم في طريقة استباقية بتنفيذها على كلمات سرّ مستخدميهم للعثور على كلمات السّر غير الآمنة ثم الطلب من هؤلاء تغييرها إلى أخرى آمَن.
</p>

<h2 id="التعمية-بالمفاتيح-العمومية">
	التعمية بالمفاتيح العمومية
</h2>

<p>
	تستخدم التعمية بالمفاتيح العمومية Public-Key Cryptography مفتاحا (سلسلة محارف) للتعمية وآخر لفكّها، على عكس طرق تعمية أخرى تستخدم نفس المفتاح للمهمتيْن. يهدف استخدام مفتاح خاصّ للتعميّة (المفتاح العموميّ) وآخر لفكّها (المفتاح الخصوصيّ) إلى تجاوز ضرورة تأمين نقل المفتاح الوحيد أثناء تبادل الرسائل المعمّاة. يتوفّر المفتاح العمومي لكلّ شخص للجميع دون استثناء بينما يقى المفتاح الخصوصي سرًّا خاصًّا به. مثلا، عندما يريد <em>محمّد</em> إرسال بريد معمّى إلى <em>عمر</em> فإنه يستخدم <strong>المفتاح العموميّ لعمر</strong> لتعمية البريد، عند وصول البريد إلى عمر فإنه يستخدم <strong>مفتاحه الخصوصي</strong> الذي لا يعرفه غيره لفك تعميّة الرسالة والاطّلاع عليها. بهذه الطريقة لن يعرف فحوى الرسالة غيرهما، محمّد لأنه كتب الأصل غير المعمَّى، وعمر لأنه الوحيد الذي يمكنه فك تعميتها.
</p>

<h3 id="برنامج-pgp">
	برنامج PGP
</h3>

<p>
	يتبنّى برنامج PGP (اختصار لـ Pretty Good Privacy) مبدأ التعمية بالمفاتيح العمومية ويمكن استخدامه لتوقيع البيانات وتعميّتها: التوقيع للتأكد من المصدر والحؤول دون انتحال الشخصيّة، والتعمية للحفاظ على خصوصية البيانات. يجب الانتباه قبل استخدام البرنامج إلى التقييدات القانونية في استخدامه. يُحظَر في بعض الدوّل توجيه رسائل بتعميّة قويّة إلى خارج البلد.
</p>

<h3 id="بروتوكول-tls">
	بروتوكول <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل"><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل"><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr></abbr></abbr>
</h3>

<p>
	يُستخدَم بروتوكول <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل"><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل"><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr></abbr></abbr> (والإصدار السابق منه <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></abbr></abbr>) كثيرا لتأمين الاتصالات في شبكة حواسيب. يهدف البروتوكول إلى الحفاظ على خصوصية البيانات المنقولة عبر الاتصال بتعميتها، الاستيثاق من هويّات المتخاطبين باستخدام تعمية بالمفاتيح العمومية والتأكد من سلامة البيانات عن طريق جمع تحقق Checksum لكلّ حزمة بيانات. التنفيذ الأكثر شهرة على أنظمة لينكس لهذا المعيار هو مكتبة OpenSSL التي تدعم خوارزميات تعمية من بينها DES، Blowfish وIDEA.
</p>

<h3 id="بروتوكول-https">
	بروتوكول HTTPS
</h3>

<p>
	وهو تطوير لبروتوكول HTTP بتضمينه داخل اتّصال يؤمّنه بروتوكول <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل"><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل"><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr></abbr></abbr> (أو <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></abbr></abbr>). الأغراض الأساسية من استخدام HTTPS على مواقع الويب هي الاستيثاق، حماية الخصوصية والتحقق من سلامة البيانات المتبادلة.
</p>

<h3 id="بروتوكول-smime">
	بروتوكول S/MIME
</h3>

<p>
	يأتي الاسم اختصارا لـ Secure Multipurpose Internet Mail Extension (امتداد البريد الإلكتروني الآمن متعدّد الأغراض)، وهو معيار مفتوح يعتمد على التعميّة بالمفاتيح العمومية لتأمين البريد الإلكتروني وغيره من أنواع المراسلات على الشبكة.
</p>

<h3 id="الشبكات-الخاصة-الافتراضية-virtual-private-network">
	الشبكات الخاصة الافتراضية Virtual Private Network
</h3>

<p>
	توجد تنفيذات عدّة لمعيار بروتوكول الإنترنت الآمن على لينكس. معيار IPSEC (اختصار لـ Internet Protocol Security؛ أمان بروتوكول الإنترنت) هو مجهود تقف خلفه قوة مهمات هندسة الإنتنرت IETF ويهدف إلى إنشاء اتصالات معمّاة على مستوى الشبكة (<a href="https://academy.hsoub.com/certificates/cisco/ccna/%D9%81%D9%87%D9%85-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D9%8A%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-r4/" rel="">الطبقة الثالثة</a>) وتوفير سبُل للتحقق من سلامة البيانات، التحكم في الوصول، الاستيثاق والسريّة.
</p>

<p>
	من الأمثلة على تطبيقات هذا البروتوكول في لينكس LibreSwan الذي يسمح للمستخدم ببناء نفق اتصالات آمن عبر شبكات غير موثوقة. يُعمَّى كل ما يمر إلى الشبكة غير الموثوقة قبل إرساله ليعمل الطرف الآخر عند استلامه على فك التعمية، تنتُج عن هذه العملية شبكة خاصّة افتراضية Virtual Private Network, <abbr title="Virtual Private Network | الشبكة الخاصة الافتراضية"><abbr title="Virtual Private Network | الشبكة الخاصة الافتراضية"><abbr title="Virtual Private Network | الشبكة الخاصة الافتراضية">VPN</abbr></abbr></abbr> والتي هي شبكة اتصالات خاصّة على الرغم من أن الأجهزة فيها تتصل عن طريق شبكة غير موثوقة.
</p>

<p>
	لا تقتصر طُرُق إنشاء شبكات خاصة افتراضية في لينكس على IPSEC، بل توجد برامج خاصّة لهذا الغرض مثل <a href="https://academy.hsoub.com/tags/openvpn/" rel="">OpenVPN</a> التي تستخدم كثيرا مكتبات OpenSSL.
</p>

<h3 id="بروتوكول-ssh">
	بروتوكول <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr>
</h3>

<p>
	توجد عدّة حزم برمجية على لينكس لاستخدام <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr> أبرزها OpenSSH. صُمِّم بروتوكول <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr> ليحلّ مكان بروتوكولات الاتصال عن بعد غير الآمنة مثل <code>rlogin</code>، <code>rsh</code> و<code>rexec</code>التي كانت ترسل البيانات دون احتياطات أمنية تُذكر. تعتمد حزمة برامج OpenSSH على التعمية بالمفاتيح العمومية لتعميّة الاتصالات بين مضيفين Hosts، وللاستيثاق من المستخدمين. كما يمكن استخدامها للولوج إلى خادوم بعيد أو لنسخ البيانات بين مضيفين مع الحماية من هجمات <a href="https://ar.wikipedia.org/wiki/%D9%87%D8%AC%D9%88%D9%85_%D8%B1%D8%AC%D9%84-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D8%B3%D8%B7" rel="external nofollow">رجل في الوسط</a> Man in the middle وهجمات أخرى.
</p>

<h3 id="وحدات-الاستيثاق-سريعة-التفعيل-pluggable-authentication-modules">
	وحدات الاستيثاق سريعة التفعيل Pluggable Authentication Modules
</h3>

<p>
	تأتي الإصدارات الحديثة من توزيعات لينكس محمّلة بآلية استيثاق موحدة تُسمّى Pluggable Authentication Modules, PAM تسمح للتطبيقات التي تعمل في فضاء المستخدم بتغيير متطلبات الاستيثاق الخاصّة بها وطريقته حسب الحاجة. يمكن باستخدام هذه الآلية من بين أمور أخرى:
</p>

<ul>
<li>
		تحديد أمكنة وأوقات معيّنة لمستخدمين لا يمكنهم الولوج خارجها إلى النظام.
	</li>
	<li>
		تعيين سقف لاستخدام الموارد لكل مستخدِم.
	</li>
	<li>
		استعمال خوارزميات تعميّة أخرى غير DES لجعل فك التعمية بهجمات القوة العمياء أصعب.
	</li>
	<li>
		تفعيل كلمات السّر في ملف <code>shadow</code> حسب الحاجة.
	</li>
</ul>
<h2 id="ملف-shadow-لتأمين-كلمات-سر-المستخدمين">
	ملف Shadow لتأمين كلمات سر المستخدمين
</h2>

<p>
	تستخدم الإصدارات الحديثة من توزيعات لينكس ملف <code>etc/shadow/</code> لجعل كلمات سر المستخدم المعمّاة في مأمن من بقية المستخدمين على نفس النظام. كانت كلمات السر المعمّاة تخزّن في الإصدارات القديمة داخل ملف <code>etc/passwd/</code> مبدئيا، ويمكن لجميع المستخدمين رؤيتها وبالتالي تنفيذ هجمات القوة العمياء عليها لمحاولة فك تعميتها. يعني اللجوء إلى ملف <code>etc/shadow/</code> أن المستخدمين الإداريين فقط هم من يمكنهم رؤية كلمات السّر المعمّاة.
</p>

<h3 id="التأكد-من-أمان-كلمات-مرور-المستخدمين">
	التأكد من أمان كلمات مرور المستخدمين
</h3>

<p>
	يحتاج مدير النظام أحيانا إلى التأكد من أن كلمات مرور المستخدمين جيّدة كفاية، لكي لا تكون بابا قد يؤدي فتحه إلى مشاكل أمنية أخرى، تُستخدم برامج مثل Jone the Ripper وCrack لهذا الغرض. تقوم فكرة هذه البرامج على توليد كلمات مرور معمّاة إما حسب نمط معرَّف مسبقا أو بالاعتماد على قاموس ألفاظ ثم مقارنتها بكلمات المرور المعمّاة الخاصّة بالمستخدمين، فإن وُجد تطابق عُرِفت كلمة السر.
</p>

<p>
	الجدير بالذكر أن مثل هذه البرامج تأخذ الكثير من الوقت وموارد الجهاز للعمل؛ وكلما كانت كلمات السّر معقدة كل ما كانت المهمة أصعب. في سيناريو هجمة حقيقية سيحتاج المخترق أولا إلى الحصول على ملف كلمات سر المستخدمين وهو أمر يحتاج لثغرات أمنية قد لا تكون موجودة؛ إلا أن الحيطة واجبة على الدوام.
</p>

<p>
	ترجمة - وبتصرّف - لمقال <a href="https://www.unixmen.com/encryption-methods-linux/" rel="external nofollow">Encryption Methods in Linux</a> لصاحبه M.el Khamlichi.
</p>

<p>
	حقوق الصورة البارزة: <a href="http://www.freepik.com/free-vector/data-encryption-banners_768935.htm" rel="external nofollow">Designed by Freepik</a>.
</p>
]]></description><guid isPermaLink="false">236</guid><pubDate>Fri, 08 Apr 2016 19:38:00 +0000</pubDate></item><item><title>10 &#x623;&#x62F;&#x648;&#x627;&#x62A; &#x645;&#x641;&#x64A;&#x62F;&#x629; &#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x631;&#x628;&#x645;&#x627; &#x644;&#x645; &#x62A;&#x633;&#x645;&#x639; &#x639;&#x646;&#x647;&#x627; &#x645;&#x646; &#x642;&#x628;&#x644;</title><link>https://academy.hsoub.com/devops/linux/10-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D9%8A%D8%AF%D8%A9-%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%B1%D8%A8%D9%85%D8%A7-%D9%84%D9%85-%D8%AA%D8%B3%D9%85%D8%B9-%D8%B9%D9%86%D9%87%D8%A7-%D9%85%D9%86-%D9%82%D8%A8%D9%84-r237/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/linux-tools.png.aea7f9812aa1623d7b0fe5ba20c79b50.png" /></p>

<p>
	جمعنا في هذا المقال 10 أدوات تساعد مستخدمي لينكس في مهامّ متنوعة مثل مراقبة الشبكة، فحص النظام وأوامر أخرى للرفع من الإنتاجية.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="14757" data-unique="3msr9diu0" src="https://academy.hsoub.com/uploads/monthly_2016_03/linux-tools.png.13efaa9110c6902ae42670a81f206940.png" alt="linux-tools.png"></p>

<h2 id="w">
	الأداة w
</h2>

<p>
	يُظهر أمر <code>w</code> المستخدمين مسجلي الدخول إلى النظام والعمليات التي ينفذونها:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2349_7">
<span class="pln">w</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13653" href="https://academy.hsoub.com/uploads/monthly_2016_03/01_w.png.c64814320434a9c6b0ec6c3d72a4f667.png" rel="external"><img alt="01_w.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13653" data-unique="zamdadvip" src="https://academy.hsoub.com/uploads/monthly_2016_03/01_w.thumb.png.b37d7d3019e2b94e21a65ab7b2ab08a7.png"></a>
</p>

<p>
	أضف الخيار<span style="font-family:courier new,courier,monospace;"> <code>h-</code></span> للحصول على المساعدة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2349_9">
<span class="pln">w -h</span></pre>

<h2 id="nmon">
	nmon
</h2>

<p>
	وهي أداة تعرض معلومات عن أداء النظام، يمكن تثبيتها على أوبنتو بالأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_7">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install nmon</span></pre>

<p>
	ثم بعد التثبيت ننفذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_9">
<span class="pln">nmon</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13652" href="https://academy.hsoub.com/uploads/monthly_2016_03/01_nmon.png.9e37483d025fc5feefc25fdbd644d019.png" rel="external"><img alt="01_nmon.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13652" data-unique="9ykixwa5b" src="https://academy.hsoub.com/uploads/monthly_2016_03/01_nmon.thumb.png.24899a4cfcd326d43a4f12bf1b36d634.png"></a>
</p>

<p>
	يمكن للأداة تحصيل معلومات عن استخدام الشبكة، المعالج والذاكرة.
</p>

<p>
	اضغط على حرف <span style="font-family:courier new,courier,monospace;"><code>c</code></span> لمعلومات عن استخدام المعالج:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13654" href="https://academy.hsoub.com/uploads/monthly_2016_03/02_nmon.png.5fae8071399441aced753dc9b8a2b84a.png" rel="external"><img alt="02_nmon.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13654" data-unique="9tfyrca2j" src="https://academy.hsoub.com/uploads/monthly_2016_03/02_nmon.thumb.png.f7ba005933a87f35b7d7f11b903e8fbb.png"></a>
</p>

<p>
	وحرف <span style="font-family:courier new,courier,monospace;"><code>n</code></span> لمعلومات عن الشبكة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13655" href="https://academy.hsoub.com/uploads/monthly_2016_03/03_nmon.png.6b58f629dbcd7e663df1ae7e5db93a12.png" rel="external"><img alt="03_nmon.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13655" data-unique="6goflyi13" src="https://academy.hsoub.com/uploads/monthly_2016_03/03_nmon.thumb.png.c818d2bf4146315cf93231def95b7084.png"></a>
</p>

<p>
	تعطي الأداة بالضغط على حرف <span style="font-family:courier new,courier,monospace;"><code>d</code></span> معلومات عن استخدام القرص الصلب:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13673" href="https://academy.hsoub.com/uploads/monthly_2016_03/04_nmon.png.fa17f447efa9e4bb52532d1161e290ec.png" rel="external"><img alt="04_nmon.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13673" data-unique="mlzn6pj61" src="https://academy.hsoub.com/uploads/monthly_2016_03/04_nmon.thumb.png.72f556a807dfa2bd8568fc00ae8e04cc.png"></a>
</p>

<h2>
	ncdu
</h2>

<p>
	وهي أداة تُستعمَل لتحليل استخدام مساحة القرص الصلب. للتثبيت على أوبنتو نفذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_12">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install ncdu</span></pre>

<p>
	وللاستخدام:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_14">
<span class="pln">ncdu </span><span class="pun">/</span></pre>

<p>
	تأخذ الأداة معطى يمثّل المجلد الذي نريد معرفة مساحته على القرص الصلب. في المثال أعلاه حدّدنا المجلّد الجذر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13657" href="https://academy.hsoub.com/uploads/monthly_2016_03/05_ncdu.png.e721103eab89994ab6cafc0528948a17.png" rel="external"><img alt="05_ncdu.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13657" data-unique="psrle7x93" src="https://academy.hsoub.com/uploads/monthly_2016_03/05_ncdu.thumb.png.9587178a7377486b41b62364f46f7d37.png"></a>
</p>

<p>
	قد يأخذ تحليل القرص بعض الوقت حسب حجمه، ثم تظهر النتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13658" href="https://academy.hsoub.com/uploads/monthly_2016_03/06_ncdu.png.e337c557287856f053ff5c5868a20b18.png" rel="external"><img alt="06_ncdu.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13658" data-unique="ewugxq8ia" src="https://academy.hsoub.com/uploads/monthly_2016_03/06_ncdu.thumb.png.404f2b525ec4dba4c6cc082824821c1e.png"></a>
</p>

<p>
	استخدم الأسهم للانتقال بين قائمة المجلدات، وزر <code>Enter</code> لاختيار مجلد، <span style="font-family:courier new,courier,monospace;"><code>n</code></span> لترتيبها حسب الاسم و <span style="font-family:courier new,courier,monospace;"><code>s</code></span> لترتيبها حسب الحجم (تُرتّب المجلدات مبدئيا حسب الحجم).
</p>

<h2 id="slurm">
	slurm
</h2>

<p>
	تُستخدَم هذه الأداة لمراقبة تدفق البيانات عبر الشبكة حيث تظهرها في شكل منحنيات بيانية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_16">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install slurm</span></pre>

<p>
	استخدم الخيار <span style="font-family:courier new,courier,monospace;"><code>i-</code></span> لمراقبة واجهة شبكة محددة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_18">
<span class="pln">slurm </span><span class="pun">-</span><span class="pln">i eth1</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13659" href="https://academy.hsoub.com/uploads/monthly_2016_03/07_slurm.png.3654fbfa3ac787d65c40025e369e7ec9.png" rel="external"><img alt="07_slurm.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13659" data-unique="rnyjlud5g" src="https://academy.hsoub.com/uploads/monthly_2016_03/07_slurm.thumb.png.f13546ccb3c3879c20c9bdf756f98ca7.png"></a>
</p>

<p>
	اضغط زر <code>l</code> و <code>c</code> للانتقال بين طريقتي العرض، <code>r</code> لتحديث الشاشة و <code>q</code> للخروج.
</p>

<h2 id="findmnt">
	findmnt
</h2>

<p>
	يُُستخدَم أمر <span style="font-family:courier new,courier,monospace;"><code>findmnt</code></span> للعثور على نظم الملفات المركّبة Mounted. كما يُستخدَم لتركيب أو نزع تركيب أجهزة طرفية عند الحاجة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_20">
<span class="pln">findmnt</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13660" href="https://academy.hsoub.com/uploads/monthly_2016_03/08_findmnt.png.1b6f2c890b10bef57e07d64a113dc6f1.png" rel="external"><img alt="08_findmnt.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13660" data-unique="kqbosbs5y" src="https://academy.hsoub.com/uploads/monthly_2016_03/08_findmnt.thumb.png.57a2a4ee640f3dfc94a41a97e1c90c4b.png"></a>
</p>

<p>
	نستخدم خيار <code>l-</code> للعرض على هيئة لائحة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_22">
<span class="pln">findmnt </span><span class="pun">-</span><span class="pln">l</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13661" href="https://academy.hsoub.com/uploads/monthly_2016_03/09_findmnt.png.7b4cbd8f4d3436f1f372479df0cd3657.png" rel="external"><img alt="09_findmnt.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13661" data-unique="50vzaunpq" src="https://academy.hsoub.com/uploads/monthly_2016_03/09_findmnt.thumb.png.af55c63b8c2f8a44f2ad59918da541a9.png"></a>
</p>

<p>
	عرض نظم الملفات المركّبة في ملف <code>fstab</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_26">
<span class="pln">findmnt </span><span class="pun">-</span><span class="pln">s</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13662" href="https://academy.hsoub.com/uploads/monthly_2016_03/10_findmnt.png.b2268dab75fb2a60fb70401d46c8a119.png" rel="external"><img alt="10_findmnt.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13662" data-unique="mukyydufw" src="https://academy.hsoub.com/uploads/monthly_2016_03/10_findmnt.thumb.png.e5bd57b4fe47a138a41c7f1b5700f588.png"></a>
</p>

<p>
	يمكن أيضا البحث عن نظم الملفات حسب النوع:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_28">
<span class="pln">findmnt </span><span class="pun">-</span><span class="pln">t ext4</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13663" href="https://academy.hsoub.com/uploads/monthly_2016_03/11_findmnt.png.ec660f66d0309c4b0143623a12d60361.png" rel="external"><img alt="11_findmnt.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13663" data-unique="nfh43fvsl" src="https://academy.hsoub.com/uploads/monthly_2016_03/11_findmnt.thumb.png.4b87e5bee3e19010e66137dba94b4fa7.png"></a>
</p>

<h2 id="dstat">
	dstat
</h2>

<p>
	هي أداة مجمَّعة لمراقبة استخدام الذاكرة، عمليات النظام وأداء القرص الصلب. تُعدّ <code>dstat</code> بديلا جيدا لكل من <code>ifstat </code>،<code>iostat</code> و <code>dmstat</code>.
</p>

<p>
	للتثبيت:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_30">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install dstat</span></pre>

<p>
	نفذ أمر <code>dstat</code> للحصول على معلومات مفصّلة عن استخدام المعالج، القرص الصلب والشبكة. يتيح الخيار <code>c-</code> تركيز المعلومات المعروضة على المعالج:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_32">
<span class="pln">dstat </span><span class="pun">-</span><span class="pln">c</span></pre>

<p>
	كما يمكن استخدام الخيار <code>l-</code> مع <code>c-</code> لمعرفة متوسّط استخدام المعالج لدقيقة، 3 دقائق أو 15 دقيقة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13664" href="https://academy.hsoub.com/uploads/monthly_2016_03/12_dstat.png.99239e63ce6d36e2940029e47891cf52.png" rel="external"><img alt="12_dstat.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13664" data-unique="gwr6aax4a" src="https://academy.hsoub.com/uploads/monthly_2016_03/12_dstat.thumb.png.ffd568d21fbce52c529c6014af3abb8e.png"></a>
</p>

<p>
	يوجد خيار <code>D-</code>الذي يمكن من متابعة أداء تجزئة قرص صلب بدلا من كامل القرص (<code>d-</code> لعرض أداء القرص فقط دون بقية الإحصاءات):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_34">
<span class="pln">dstat </span><span class="pun">-</span><span class="pln">dD sda7</span></pre>

<p style="text-align: center;">
	<img alt="14_dstat.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13666" data-unique="yn1xqkdqo" src="https://academy.hsoub.com/uploads/monthly_2016_03/14_dstat.png.9b1bdad62a2ebb56c435cbcfba8afc5a.png"></p>

<h2 id="saidar">
	saidar
</h2>

<p>
	أداة أخرى تعمل في سطر الأوامر لمراقبة إحصاءات النظام مثل استخدام القرص الصلب، الشبكة، الذاكرة، مساحة الإبدال Swap وغيرها.
</p>

<p>
	للتثبيت:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_36">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install saidar</span></pre>

<p>
	ثم ننفذ أمر <code>saidar</code> للحصول على إحصاءات عن مختلف موارد النظام. يمكن استخدام الخيار <code>c-</code> لتلوين المخرجات.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_38">
<span class="pln">saider </span><span class="pun">-</span><span class="pln">c</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13667" href="https://academy.hsoub.com/uploads/monthly_2016_03/15_saidar.png.3946c6cf9ea2881ade4de8256ac33c7f.png" rel="external"><img alt="15_saidar.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13667" data-unique="6a66gxzxc" src="https://academy.hsoub.com/uploads/monthly_2016_03/15_saidar.thumb.png.b42670b8c230dc34ed31f289e9d0d813.png"></a>
</p>

<h2 id="ss">
	ss
</h2>

<p>
	تأتي <code>ss</code> (اختصار لـSocket statistics) بديلا لأداة <code>netstat</code> لتجميع معلومات من فضاء النواة Kernel، تتميّز بالسرعة مقارنة مع <code>netstat</code>.
</p>

<p>
	لعرض جميع الاتصالات (نستخدم <code>less</code> لتسهيل تصفح المخرجات، اضغط على زر المسافة للانتقال للشاشة الموالية):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_40">
<span class="pln">ss </span><span class="pun">|</span><span class="pln">less</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13668" href="https://academy.hsoub.com/uploads/monthly_2016_03/16_ss.png.b7731849838bddcaf2ea4d8f4a2407e3.png" rel="external"><img alt="16_ss.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13668" data-unique="ng9kzh8jz" src="https://academy.hsoub.com/uploads/monthly_2016_03/16_ss.thumb.png.c8562c5e403e755724c15c74b4f0a64b.png"></a>
</p>

<p>
	يمكن استخدام الخيار <code>A-</code> لحصر النتائج حسب النوع:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_42">
<span class="pln">ss </span><span class="pun">-</span><span class="pln">A tcp</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13669" href="https://academy.hsoub.com/uploads/monthly_2016_03/17_ss.png.7092a74bece6a87bfd972172154934c5.png" rel="external"><img alt="17_ss.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13669" data-unique="mzy0no8xg" src="https://academy.hsoub.com/uploads/monthly_2016_03/17_ss.thumb.png.d714aed33f00e3a636e792d638164b71.png"></a>
</p>

<p>
	كما توجد إمكانية عرض أسماء ومعرّفات العمليات <code><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr></abbr></abbr></code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_44">
<span class="pln">ss </span><span class="pun">-</span><span class="pln">ltp</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13670" href="https://academy.hsoub.com/uploads/monthly_2016_03/18_ss.png.69718491a69dd8f170a71bc298cae556.png" rel="external"><img alt="18_ss.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13670" data-unique="ov7qgx3a8" src="https://academy.hsoub.com/uploads/monthly_2016_03/18_ss.thumb.png.3a80a090f43b38b6c881c90baa69f16d.png"></a>
</p>

<h2 id="ccze">
	ccze
</h2>

<p>
	تتيح هذه الأداة عرض السجلات Logs بهيئة أكثر جاذبية، للتثبيت نفذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_46">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install ccze</span></pre>

<p>
	مثال على الاستخدام:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_48">
<span class="pln">tailf </span><span class="pun">/</span><span class="pln">var</span><span class="pun">/</span><span class="pln">log</span><span class="pun">/</span><span class="pln">syslog </span><span class="pun">|</span><span class="pln"> ccze</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13671" href="https://academy.hsoub.com/uploads/monthly_2016_03/19_ccze.png.80babaf5efa29d1a1727079f187590b2.png" rel="external"><img alt="19_ccze.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13671" data-unique="0mekr0usn" src="https://academy.hsoub.com/uploads/monthly_2016_03/19_ccze.thumb.png.23e064ebdef0f278f5a7c4e7ea11554e.png"></a>
</p>

<p>
	تمكّن الأداة أيضا من حفظ السجلات بنفس طريقة العرض في ملف HTML:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_50">
<span class="pln">tailf </span><span class="pun">/</span><span class="pln">var</span><span class="pun">/</span><span class="pln">log</span><span class="pun">/</span><span class="pln">syslog </span><span class="pun">|</span><span class="pln"> ccze </span><span class="pun">-</span><span class="pln">h </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">/</span><span class="pln">path_to_file</span><span class="pun">.</span><span class="pln">html</span></pre>

<p>
	يعرض الأمر عند استخدام الخيار <code>l-</code> وحدات الأداة (أنواع السجلات التي تتعامل معها).
</p>

<h2 id="ranwhenpy">
	ranwhen.py
</h2>

<p>
	وهو سكربت python يعمل في الطرفية لعرض نشاطات النظام بيانيا، ينشئ السكربت منحنيات بيانية ملوّنة لعرض تفاصيل الأنشطة.
</p>

<p>
	للتثبيت على أوبنتو أضف المستودع التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_52">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">add</span><span class="pun">-</span><span class="pln">repository ppa</span><span class="pun">:</span><span class="pln">fkrull</span><span class="pun">/</span><span class="pln">deadsnakes</span></pre>

<p>
	ثم حدّث النظام:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_54">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get update</span></pre>

<p>
	وثبّت الإصدار 3.2 من python:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_56">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install python3</span><span class="pun">.</span><span class="lit">2</span></pre>

<p>
	نزّل السكربت:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_58">
<span class="pln">wget </span><span class="pun">-</span><span class="pln">c https</span><span class="pun">:</span><span class="com">//github.com/p-e-w/ranwhen/archive/master.zip</span></pre>

<p>
	ثم فك ضغطه:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_60">
<span class="pln">unzip master</span><span class="pun">.</span><span class="pln">zip </span><span class="pun">&amp;&amp;</span><span class="pln"> cd ranwhen</span><span class="pun">-</span><span class="pln">master</span></pre>

<p>
	بإمكاننا الآن تنفيذ الأداة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7204_62">
<span class="pln">python3</span><span class="pun">.</span><span class="lit">2</span><span class="pln"> ranwhen</span><span class="pun">.</span><span class="pln">py</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="13672" href="https://academy.hsoub.com/uploads/monthly_2016_03/20_ranwhen.png.e40af8a09e2ef59b3f7a45bf97de3ae9.png" rel="external"><img alt="20_ranwhen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13672" data-unique="kgc03qkgp" src="https://academy.hsoub.com/uploads/monthly_2016_03/20_ranwhen.thumb.png.a5a92191f8d9dd01c93305cb5dc962aa.png"></a>
</p>

<p>
	ترجمة - وبتصرّف - لمقال <a href="https://www.unixmen.com/10-useful-utilities-linux-users/" rel="external nofollow">Ten 10 Useful Utilities For Linux Users</a> لصاحبه Rajneesh Upadhyay.
</p>
]]></description><guid isPermaLink="false">237</guid><pubDate>Thu, 31 Mar 2016 22:10:44 +0000</pubDate></item><item><title>&#x645;&#x628;&#x627;&#x62F;&#x626; &#x623;&#x630;&#x648;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; (File permissions) &#x639;&#x644;&#x649; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-permissions-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r242/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/56f5be6e00d6a_linux-file-permissions(1).png.78b6ab3d7a37cffac88801cb44a5db8a.png" /></p>

<p>
	يحتاج لينكس، مثل غيره من أنظمة التشغيل متعدّدة المستخدمين Multi-user system إلى طريقة للتحكّم في وصول المستخدمين إلى مختلف الملفات. ليس من المحبّذ مثلا أن يعدّل مستخدم آخر على ملفات الإعداد التي أخذ ضبطها كثيرا من وقتك. يُطبَّق مبدأُ الفصلِ هذا على نظام تشغيل لينكس بآلية الأذونات Permissions.
</p>

<p style="text-align: center;">
	<img alt="linux-file-permissions (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="14391" data-unique="ejb9ncm26" src="https://academy.hsoub.com/uploads/monthly_2016_03/56f5be6d484b7_linux-file-permissions(1).png.83ff47a9b66cf7fc09bd650e0ef89c67.png"></p>

<h2 id="كيف-تعمل-الأذونات">
	كيف تعمل الأذونات
</h2>

<p>
	يُخزَّن كلّ ملف على النظام بأذوناته الخاصّة. كيف تُمثَّل؟ من الراجح أنك صادفتها أثناء عملك على نظام لينكس:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5106_7">
<span class="pln">drwxr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">-</span><span class="pln">x 
</span><span class="pun">-</span><span class="pln">r</span><span class="pun">-</span><span class="pln">w</span><span class="pun">-</span><span class="pln">rwrw</span><span class="pun">-</span><span class="pln"> 
</span><span class="pun">-</span><span class="pln">rwxr</span><span class="pun">--</span><span class="pln">r</span><span class="pun">--</span></pre>

<p>
	تظهر الأذونات عند تنفيذ أوامر مثل <code>ls -l</code>. تخبر سلسلة المحارف Charcters بمعلومات الملف؛ يمكن تقسيم سلسلة المحارف الخاصّة بمعلومات الملف إلى أربعة أقسام:
</p>

<ul>
<li>
		<strong>القسم الأول</strong>: هو المِحرف الأول الذي يدلّ على نوع الملفّ.
	</li>
	<li>
		<strong>القسم الثاني</strong>: يحوي المحارف من 2 إلى 4؛ وهي أذونات المستخدِم مالك الملف؛ أي ما يحقّ لهذا المستخدم فعله على الملف.
	</li>
	<li>
		<strong>القسم الثالث</strong>: المحارف من 5 إلى 7؛ وهي أذونات المجموعة مالكة الملف.
	</li>
	<li>
		<strong>القسم الرابع</strong>: المحارف من 8 إلى 10؛ وهي أذونات بقية المستخدمين (ليسوا مالك الملف ولا ينتمون للمجموعة مالكة الملف).
	</li>
</ul>
<p>
	يمكن للمحرف الأول أن يكون أحد المحارف التالية:
</p>

<ul>
<li>
		<strong><code>-</code></strong> للملفات العادية.
	</li>
	<li>
		<strong><code>d</code></strong>: للمجلّدات.
	</li>
	<li>
		<strong><code>l</code></strong>: للوصلات الرمزية Symbolic link.
	</li>
	<li>
		<strong><code>s</code></strong>: لمقابس Socket يونكس.
	</li>
	<li>
		<strong><code>p</code></strong>: لأنابيب الاتّصال.
	</li>
	<li>
		<strong><code>c</code></strong>: للأجهزة الطرفيّة المحرفيّة Character device file.
	</li>
	<li>
		<strong><code>b</code></strong>: للأجهزة الطرفيّة الكتليّة Block device file.
	</li>
</ul>
<p>
	توضّح المحارف التسعة التالية لنوع الملف الأذونات في ثلاثة أقسام من ثلاثة محارف (القسم الثاني، الثالث والرابع المذكورة أعلاه): تعرض المحارف الثلاثة الأولى أذونات القراءة، الكتابة والتنفيذ بالنسبة لمالك الملف. تعرض المحارف الثلاثة الموالية نفس الأذونات ولكن بالنسبة للمجموعة مالكة الملف؛ والمحارف الثلاثة الأخيرة الأذونات بالنسبة لبقية المستخدمين. يعني المحرف الأول من كل قسم من إذن القراءة (<code>r</code>)، المحرف الثاني إذن الكتابة (<code>w</code>) والمحرف الثالث إذن التنفيذ (<code>x</code>). يدلّ ذكر المحرف (<code>w</code>، <code>r</code> و<code>x</code>) على وجود الإذن أما غياب الإذن فيُشار إليه بعارضة <code>-</code>. يعني وجود عارضة مكان إذن القراءة (أو الكتابة أو التنفيذ) أن المعني (المالك، المجموعة أو الآخرين) ليس لديه هذا الإذن.
</p>

<p>
	بالعودة إلى المثال: 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5106_9">
<span class="pln">drwxr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">-</span><span class="pln">x </span></pre>

<p>
	يعني هذا السطر أننا أمام مجلّد (المحرف الأول <code>d</code>)، لدى مالك الملف (المحارف من 2 إلى 4) جميع الأذونات (<code>rwx</code>)، لدى المجموعة المالكة (المحارف من 5 إلى 7) إذنا القراءة والتنفيذ ولكن ليس لديها إذن الكتابة (<code>r-x</code>)، ونفس الشيء بالنسبة لبقية المستخدمين.
</p>

<h2 id="تعديل-الأذونات">
	تعديل الأذونات
</h2>

<p>
	يُستخدَم أمر <code>chmod</code> لتعديل الأذونات. توجد طريقتان لذلك: الأولى باستخدام الأحرف المذكورة أعلاه (<code>w</code>، <code>r</code> و<code>x</code>)، والثانية باستخدام أرقام. سنشرح الطريقة الأخيرة هنا لأنها أسرع كثيرا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5106_11">
<span class="pln">chmod </span><span class="lit">775</span><span class="pln"> </span><span class="pun">~/</span><span class="pln">my</span><span class="pun">/</span><span class="pln">file</span></pre>

<p>
	نلقي نظرة على القائمة التالية لفهم معنى الأرقام:
</p>

<ul>
<li>
		<code>4</code> = <code>r</code>
	</li>
	<li>
		<code>2</code> = <code>w</code>
	</li>
	<li>
		<code>1</code> = <code>w</code>
	</li>
	<li>
		= إذن غير موجود
	</li>
</ul>
<p>
	نجمع الأرقام للحصول على الأذونات. بالنسبة لإذن <code>rwx</code> فيجب أن يكون <code>4+2+1</code>=<code>7</code>؛ إذن <code>r-x</code> يجب أن يكون <code>4+0+1=5</code> وهكذا. بما أن لدينا ثلاثة أقسام من الأذونات (المستخدِم المالك، المجموعة المالكة وبقية المستخدمين) فسنحتاج إلى ثلاثة أرقام، رقم لكلّ قسم. أي أننا نجمع الأرقام المقابلة لأذونات كل قسم ونضعها جنبا إلى جنب في عدد من ثلاثة أرقام: الرّقم على اليسار لأذونات المستخدم المالك، الرقم في الوسط للمجموعة المالكة والرقم على اليمين لبقية المستخدمين.
</p>

<p>
	نعرف، بتنفيذ المبدأ أعلاه ، أن الأمر السابق يعدّل أذونات الملف <code>/my/file/~</code> لتصبح كالتالي (طبقنا الأمر على ملف عادي، وبالتالي تظهر <code>-</code> في معلومات الملف تليها الأذونات):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5106_13">
<span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span></pre>

<h2 id="تعديل-ملكية-ملف">
	تعديل ملكية ملف
</h2>

<p>
	يوجد أمران لتعديل ملكية الملف، الأول وهو <code>chown</code> يغيّر المستخدم المالك والثاني <code>chgrp</code> ويغيّر المجموعة المالكة.
</p>

<p>
	تغيير المستخدم المالك (المالك الجديد للملف <code>/my/file/~</code> هو <code>user</code>):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5106_15">
<span class="pln">chown user </span><span class="pun">~/</span><span class="pln">my</span><span class="pun">/</span><span class="pln">file</span></pre>

<p>
	تغيير المجموعة المالكة (المجموعة الجديدة هي <code>group</code>):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5106_18">
<span class="pln">chgrp group </span><span class="pun">~/</span><span class="pln">my</span><span class="pun">/</span><span class="pln">file</span></pre>

<p>
	إن لم تكن مالكَ الملف أو تنفذ الأمرين أعلاه بصلاحيات المستخدم الأعلى <code>root</code> فلن ينجح تنفيذ الأمر.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://radek.io/2011/07/19/linux-file-permissions-explained/" rel="external nofollow">Linux File Permissions Explained</a> لصاحبه Radek Pazdera.
</p>
]]></description><guid isPermaLink="false">242</guid><pubDate>Fri, 25 Mar 2016 22:56:00 +0000</pubDate></item><item><title>&#x641;&#x64A; &#x645;&#x627;&#x630;&#x627; &#x64A;&#x62E;&#x62A;&#x644;&#x641; Ubuntu &#x639;&#x646; Debian&#x61F;</title><link>https://academy.hsoub.com/devops/linux/%D9%81%D9%8A-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AE%D8%AA%D9%84%D9%81-ubuntu-%D8%B9%D9%86-debian%D8%9F-r235/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/ubuntu-vs-debian.png.f3f244135ffd5298b4f35bb00bd0b94c.png" /></p>

<p>
	تعدّ توزيعتا دبيان وأوبنتو من أكثر توزيعات لينكس تأثيرا، فمن بين حوالي 285 توزيعة نشطة، تُشتقّ 132 من دبيان بما فيها أوبنتو نفسها، إضافة إلى 67 أخرى مشتقة مباشرة من أوبنتو. على الرغم من ذلك تختلف تجربة استخدام الاثنتين في جميع الجوانب تقريبا؛ الأمر الذي يجعل الاختيار، الذي يجب أن يُبنى على التفضيلات في نواح أساسية مثل الدّعم، مستوى تحكّم المستخدِم، سهولة الاستخدام؛ أمرا غير يسير بتاتا.
</p>

<p style="text-align: center;">
	<img alt="ubuntu-vs-debian.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14328" data-unique="e09zjdxnz" src="https://academy.hsoub.com/uploads/monthly_2016_03/ubuntu-vs-debian.png.ac16b840f65013cbb0ceaca820330606.png"></p>

<p>
	يميل الكثيرون عند وصف الاختلاف بين التوزيعتين إلى أن أوبنتو "توزيعة للمبتدئين"، بينما دبيان هي "خيار الخبراء". رغم أن هذا التوصيف صحيح جزئيا إلا أنه يميل في نفس الوقت إلى المبالغة.
</p>

<p>
	لم تتغيّر النظرة إلى دبيان كثيرا في السنوات العشر الأخيرة رغم أنها أصبحت تتيح تسهيلات أكثر للمستخدم الذي يرغب في ذلك. على نحو مشابه؛ يظهر أن استخدام أوبنتو سهل جدا إذا نظرنا للأمر من ناحية مبادئ التصميم إلا أن العادات قد تجعل المستخدِم يختلف في هذا التوصيف.
</p>

<p>
	تظهر الفروقات بين التوزيعتين جليةً رغم التشابه؛ بدءًا من التثبيت وسطح المكتب، إلى إدارة الحزم Packages والمجتمع Community، وهي أمور تجعل اختيار المناسب لخطّة عمل مؤسستك غير بديهي.
</p>

<h2 id="الاختلافات-في-التثبيت">
	الاختلافات في التثبيت
</h2>

<p>
	يعتمد اختيار التوزيعة بدرجة مهمّة على نوعية العتاد Hardware لديك. تعمل دبيان حاليا على 13 معمارية عتاد تشمل معماريات 32bit و 64bit المعيارية من Intel، معمارية ARM و PowerPC. بينما تدعم أوبنتو رسميا معماريتي 32bit و 64bit، وتعمل على تطوير دعم معماريات ARM.
</p>

<p>
	يجب أيضا أخذ مثبّت Installer كل توزيعة في الحسبان. صُمِّم مثبِّت أوبنتو لكي لا يحتاج إلا إلى الحد الأدنى من المُدخلات من المستخدِم من أجل تسهيل التثبيت وجعله أسرع ما يمكن. يمكنك إن واجهت صعوبة تجربة وضع الخبير في المثبِّت والذي هو في الأساس إعادة تصميم لمثبّت دبيان.
</p>

<p>
	مثبِّت دبيان لديه، على الجانب الآخر، أولوياته الخاصة. مثلا، لا يختلف المثبّت الرسومي عن المثبّت على سطر الأوامر سوى في الواجهة. يمكن، على عكس الشائع عن دبيان، تثبيت التوزيعة بسهولة بقبول الخيارات المبدئية في كل مرحلة من مراحل التثبيت. أما إذا كنت تفضّل التخصيص فيمكنك الاختيار من بين الاختيارات المتاحة في كلّ خطوة، مما يزيد بدرجة ملحوظة مدّة التثبيت. يختار مثبِّت دبيان مخاطبة جميع مستويات المستخدمين بدلا من التوجّه إلى المبتدئين. لن تجد، على الأرجح، مثبّتا على نفس المستوى من المرونة.
</p>

<h2 id="الفروق-في-إدارة-النظام-والحزم">
	الفروق في إدارة النظام والحزم
</h2>

<p>
	تنقسم المستودعات في دبيان إلى ثلاثة أساسية: المستودع المستقر Stable، المستودع الاختباري Testing والمستودع غير المستقر Unstable. يمثّل المستودع المستقرّ الإصدار المنصوح به من حزم البرمجيات لبيئات الإنتاج نظرًا لمرورها بالكثير من الاختبارات لتأكيد صلاحيتها، أما المستودع الاختباري فهو نسخة تخضع للاختبار وتتهيأ للمرور إلى المستوى الأعلى (المستودع المستقر)، في حين لا تزال النسخة في المستودع غير المستقر في مرحلة التطوير. أضيفت في السنوات الأخيرة مستودعات أخرى (رسمية وغير رسمية) مثل الحمل العكسي Backports، التجريبي Experimental، الأمان Security وغيرها. إلا أن تلك التي يجب على المستخدمين الانتباه إليها هي الثلاثة الأساسية.
</p>

<p>
	يختار مستخدمو دبيان بين الاستقرار منقطع النظير على حساب حداثة الحزم من جهة، والجدّة على حساب استقرار الحزم وتغييرات قد تكون كارثية وتشلّ النظام من جهة أخرى. يختلف تأثير خيار المستودعات أكثر على نوعية الحزم، هل هي حزم أساسية للنظام مثل النواة أو أخرى أقل أهمية مثل أدوات مساعِدة. يمكن مثلا اختيار مستودعات مستقرة للحزم الأساسية ومستودعات اختبارية لأدوات غير أساسية.
</p>

<p>
	تأخذ أوبنتو حزمها من مستودعات دبيان الاختبارية أو غير المستقرة وبدلا من تنظيمها حسب مستوى الاستقرار ترتّبها في أربع مستودعات أساسية: <code>Main</code> وتوجد به البرامج المدعومة من Canonical، مستودع <code>Universe</code> وتوجد به برامج حرّة يشرف عليها المجتمع، <code>Restricted</code> ويحوي برامج غير حرّة مُصنَّفة على أنها مهمّة و <code>Multiverse</code> الذي توجد به برامج غير حرة لا تدخل ضمن برامج المستودع السابق. تُضاف بضعة مستودعات أخرى، إلا أن هذه الأربعة هي الأساسية.
</p>

<p>
	يوجد فرق مهمّ آخر بين دبيان وأوبنتو وهو في طريقة التعامل مع البرامج غير الحرة؛ فدبيان لا تثبّت مبدئيا سوى الحزم الحرّة ونفس المبدأ يطبّقه المثبِّت الخاصّ بها والذي لا يثبّت الوِحدات غير الحرة في النواة. إنْ احتجت إلى برامج غير حرة فسيلزمك إضافة مقاطع <code>Nonfree</code> و <code>Contrib</code> لكلّ مستودع. لا تظهر التفرقة بين البرامج الحرّة وغير الحرّة بنفس الوضوح في أوبنتو. فرغم أن دبيان تتيح استخدام برامج غير حرّة إلا أنها لا تشجّع على ذلك وتجعلك تدرك أنّ استخدام هذه البرامج مخالف للمبادئ التي تشجّعها دبيان؛ في حين تشجّع أوبنتو على استخدام برامج غير حرّة من أجل توفير تجربة استخدام مشابهة لأنظمة التشغيل التجارية.
</p>

<p>
	من فروق إدارة النظام التي يجدر ذكرها هو أن أوبنتو تعطّل مبدئيا إمكانية الدخول المباشر إلى حساب المستخدِم الجذر، مشجّعةً استخدام <code>sudo</code> ما أمكن لتنفيذ المهامّ الإدارية.
</p>

<h2 id="الفروق-في-بيئة-سطح-المكتب">
	الفروق في بيئة سطح المكتب
</h2>

<p>
	تختلف التوزيعتان في بيئة سطح المكتب المبدئيّة لكلّ منهما. تستخدم أوبنتو بيئة يونيتي Unity من تطوير شركة Canonical التي تقف خلف التوزيعة. إن نجحت Canonical في تسويق جوالاتها وأجهزتها اللوحية فسيمكنك في المستقبل الحصول على بيئة سطح المكتب نفسها على جميع أجهزتك (حاسوب، هاتف، حاسوب لوحيّ).
</p>

<p>
	تدعم كلّ من دبيان وأوبنتو أكثر من بيئة سطح مكتب. تقدّم أوبنتو أسطح مكتب في ما يشبه توزيعات مستقلة: على سبيل المثال Xubuntu لبيئة سطح المكتب Xfce و Kubuntu لبيئة سطح المكتب KDE.
</p>

<p>
	تشبه أسطُح المكتب المتوفّرة في دبيان تلك الموجودة في أوبنتو؛ إلا أن فِرَق التطوير التي تعدّها أقرب إلى توزيعة دبيان المعيارية. تختلف تواريخ إصدارات سطح المكتب لدبيان، فقد تتأخر بعضها قليلا بعد وقت الإصدار الرسمي لدبيان حتى تكون جاهزة (نفس الشيء يحدُث مع أوبنتو).
</p>

<p>
	تتوفّر أغلب حزم أوبنتو باستثناء Unity لدبيان؛ كما أن حزم دبيان تتوفّر غالبا لأوبنتو إذ أن الأخيرة تعتمد على حزم من مستودعات دبيان. تكون حزم أوبنتو عادةً أحدث من نظيراتها في دبيان التي تمر بدورة اختبار وتنقيح أطول مما يجعل حزم دبيان أكثر استقرارا.<br><strong>تحذير:</strong> لا تفترض أن الأصل المشترك بين الحزم يجعلها متوافقة بين التوزيعتين. يُقدَّر أن حوالي 20 بالمائة من حزم أوبنتو غير متوافقة مع دبيان للاختلافات في التسمية وأماكن الملفات.
</p>

<h2 id="الفروق-في-مجتمع-التوزيعة">
	الفروق في مجتمع التوزيعة
</h2>

<p>
	يمكن لمجتمعَيْ التوزيعتين أن يكونا معيارا ضمن معايير الاختيار. يشتهر مجتمع دبيان بمناقشته لكلّ قرار بالتفصيل. خصوصا في المسائل ذات الأهمية. تتحوّل النقاشات أحيانا عن مسارها وتصبح أقرب للشحناء. يصوّت جميع مطوّري الحزم الرسميين لاختيار قائد لمشروع دبيان، ومسؤولين آخرين. تسير الأمور على العموم حسب اقتراحات أعضاء المجتمع وإن كان للمسؤولسن المنتخبين سلطة لحدٍّ ما.
</p>

<p>
	يختلف مجتمع أوبنتو عن مجتمع دبيان في أن لديه مدونة سلوك Code of Conduct تحكُم التفاعلات في المجتمع. يقود Jono Bacon مجتمع أوبنتو لحدّ الساعة ويبذل مجهودا في حلّ النزاعات بين الأعضاء. يُضاف إلى ذلك مجلس إداري فني للمجتمع يُنتخب سنويا. رغم ذلك يبقى Mark Shuttleworth مؤسّس أوبنتو صاحب القرار الأخير. يملك المؤسس وممثلو Canonical السلطة في تقرير مستقبل التوزيعة وتنتُج عن قراراتهم أحيانا انتفاضات في أوساط المساهمين فيها.
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	توجد الكثير من المعايير لأخذها في الحسبان عند الاختيار بين دبيان وأوبنتو: مستخدم مبتدئ أم خبير؟ برنامج حرّ أم خاص؟ سهولة الاستخدام أم التحكم؟ برامج محدَّثة في مقابل برامج مستقرّة، مجتمع مفتوح أو مغلق؟ كلها أمور يجب أن تُراعى وتُدرَس قبل أن تأخذ قرارا قد يؤثّر على مستقبل مؤسستك. ربّما تجد من بين تلك المعايير ما لا يمثّل قيمة كبيرة لك، على عكس أخرى توليها أهمية شديدة. الأساسي أن تحدّد أولوياتك.
</p>

<p>
	ترجمة -وبتصرّف- لمقال <a href="https://www.unixmen.com/ubuntu-different-debian" rel="external nofollow">How Ubuntu is different from Debian</a> لصاحبه M.el Khamlichi.
</p>
]]></description><guid isPermaLink="false">235</guid><pubDate>Thu, 24 Mar 2016 22:20:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x639;&#x631;&#x636; &#x648;&#x62A;&#x62F;&#x64A;&#x631; &#x633;&#x62C;&#x644;&#x627;&#x62A; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x648;CentOS</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%B9%D8%B1%D8%B6-%D9%88%D8%AA%D8%AF%D9%8A%D8%B1-%D8%B3%D8%AC%D9%84%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88centos-r233/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/linux-logs.png.1e6520740a9ef0dc75d6af418c5e41dc.png" /></p>

<div id="wmd-preview-section-9">
	<p>
		في كثير من الأحيان يحتاج مدراء أنظمة لينكس للإطلاع على ملفات السجلات (log files) للكشف عن الأخطاء والمشاكل، وهذا الأمر في الحقيقة يجب على أي مدير نظام القيام به.
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="13421" data-unique="3jdh03szd" src="https://academy.hsoub.com/uploads/monthly_2016_02/linux-logs.png.b4c2a6b335e0dbeb938cd5aff9282d02.png" alt="linux-logs.png.b4c2a6b335e0dbeb938cd5aff"></p>
</div>

<div id="wmd-preview-section-10">
	<p>
		يستطيع نظام لينكس ومُختلف التطبيقات توليد مختلف أنواع الرسائل والتي يتم تسجيلها في ملفات السجلات المختلفة، ويستخدم نظام لينكس مجموعة من ملفات الإعدادات والمجلدات والبرامج والأوامر والعفاريت (daemons) لإنشاء وتخزين وحذف رسائل السجل. ولذلك فإن معرفة المكان الذي يحتفظ فيه النظام على ملفات السجلات وكيفية استخدام الأوامر المتعلقة به يمكن أن يساعدك على توفير وقتك الثمين أثناء استكشاف الأخطاء وإصلاحها.
	</p>

	<p>
		في هذا الدرس، سنلقي نظرة على مُختلف جوانب السّجلات وإدارتها على أنظمة لينكس
	</p>

	<p>
		<strong>ملاحظة:</strong> تم اختبار هذه الأوامر على أنظمة CentOS 6.4 و Ubuntu 12 و Debian 7.
	</p>
</div>

<div id="wmd-preview-section-11">
	<h2 id="الموقع-الافتراضي-لملفات-السجلات">
		الموقع الافتراضي لملفات السجلات
	</h2>

	<p>
		إن الموقع الافتراضي لملفات السجلات هو <span style="font-family:courier new,courier,monospace;">var/log/</span>.
	</p>

	<p>
		يمكنك رؤية قائمة الملفات الموجودة في هذا المجلد عن طريق الأمر:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4900_7">
<span class="pln"> ls -l /var/log</span></pre>

	<p>
		هذه قائمة ملفات السجلات الموجودة في نظام CentOS الخاص بي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4900_9">
<span class="pln">total 1472  
-rw-------. 1 root root   4524 Nov 15 16:04 anaconda.ifcfg.log  
-rw-------. 1 root root  59041 Nov 15 16:04 anaconda.log  
-rw-------. 1 root root  42763 Nov 15 16:04 anaconda.program.log  
-rw-------. 1 root root 299910 Nov 15 16:04 anaconda.storage.log  
-rw-------. 1 root root  40669 Nov 15 16:04 anaconda.syslog  
-rw-------. 1 root root  57061 Nov 15 16:04 anaconda.xlog 
-rw-------. 1 root root   1829 Nov 15 16:04 anaconda.yum.log  
drwxr-x---. 2 root root   4096 Nov 15 16:11 audit 
-rw-r--r--  1 root root   2252 Dec  9 10:27 boot.log  
-rw-------  1 root utmp    384 Dec  9 10:31 btmp  
-rw-------. 1 root utmp   1920 Nov 28 09:28 btmp-20131202  
drwxr-xr-x  2 root root   4096 Nov 29 15:47 ConsoleKit
-rw-------  1 root root   2288 Dec  9 11:01 cron
-rw-------. 1 root root   8809 Dec  2 17:09 cron-20131202  
-rw-r--r--  1 root root  21510 Dec  9 10:27 dmesg
-rw-r--r--  1 root root  21351 Dec  6 16:37 dmesg.old  
-rw-r--r--. 1 root root 165665 Nov 15 16:04 dracut.log  
-rw-r--r--. 1 root root 146876 Dec  9 10:44 lastlog 
-rw-------  1 root root    950 Dec  9 10:27 maillog  
-rw-------. 1 root root   4609 Dec  2 17:00 maillog-20131202  
-rw-------  1 root root 123174 Dec  9 10:27 messages
-rw-------. 1 root root 458481 Dec  2 17:00 messages-20131202  
-rw-------  1 root root   2644 Dec  9 10:44 secure 
-rw-------. 1 root root  15984 Dec  2 17:00 secure-20131202  
-rw-------  1 root root      0 Dec  2 17:09 spooler  
-rw-------. 1 root root      0 Nov 15 16:02 spooler-20131202  
-rw-------. 1 root root      0 Nov 15 16:02 tallylog
-rw-rw-r--. 1 root utmp  89856 Dec  9 10:44 wtmp
-rw-------  1 root root   3778 Dec  6 16:48 yum.log  </span></pre>

	<h2>
		عرض محتويات ملف السجل
	</h2>
</div>

<div id="wmd-preview-section-12">
	<p>
		هذه قائمة من ملفات السجلات الشائعة التي يمكن أن تجدها في مجلد <span style="font-family:courier new,courier,monospace;">/var/log/</span>:
	</p>

	<ul><li>
			<span style="font-family:courier new,courier,monospace;">wtmp</span>
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">utmp</span>
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">dmesg</span>
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">messages</span>
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">maillog أو mail.log</span>
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">spooler</span>
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">auth.log أو secure</span>
		</li>
	</ul><p>
		إن ملفات <span style="font-family:courier new,courier,monospace;">wtmp</span> و <span style="font-family:courier new,courier,monospace;">utmp</span> تتبع تسجيل دخول وخروج المستخدمين ولا يمكنك عرض محتويات هذه الملفات باستخدام الأمر <span style="font-family:courier new,courier,monospace;">cat</span> أو ما شابه، فهنالك أوامر خاصة لفعل ذلك.
	</p>

	<p>
		سوف نتعلم في هذا الدرس بعضا من هذه الأوامر.
	</p>

	<ul><li>
			لتعرف من الذي سجّل دخوله حاليا في خادوم لينكس يمكنك بسهولة استخدام الأمر <span style="font-family:courier new,courier,monospace;">who</span>، وهذا الأمر يحصل على بياناته من ملف <span style="font-family:courier new,courier,monospace;">var/run/utmp/</span> (لأنظمة CentOS وDebian) أو من ملف <span style="font-family:courier new,courier,monospace;">run/utmp/ </span>(لأنظمة أوبنتو).
		</li>
	</ul><p>
		هذا مثال من نظام CentOS:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4900_11">
<span class="pln">who

root     tty1         2013-12-09 10:44  
root      pts/0        2013-12-09 10:29 (10.0.2.2)  
sysadmin pts/1        2013-12-09 10:31 (10.0.2.2)  
joeblog  pts/2        2013-12-09 10:39 (10.0.2.2)  </span></pre>

	<p>
		في هذه الحالة بالذات، أنا المستخدم الوحيد للنظام ولقد شغّلت الخادوم من Oracle VirtualBox ومن ثم استطعت الوصول إليه كمستخدم جذر من الطرفية من جلسة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>، أما بالنسبة للمستخدميْن الآخريْن (sysadmin وjoebolg) فهم أيضا فتحا جلسات لهما على النظام.
	</p>

	<ul><li>
			الأمر <span style="font-family:courier new,courier,monospace;">last</span> يخبرنا بتاريخ تسجيل الدخول للمستخدمين:
		</li>
	</ul><pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4900_14">
<span class="pln">last | grep sysadmin 

sysadmin pts/1        10.0.2.2         Mon Dec  9 10:31   still logged in
sysadmin pts/0        10.0.2.2         Fri Nov 29 15:42 - crash  (00:01)  
sysadmin pts/0        10.0.2.2         Thu Nov 28 17:06 - 17:13  (00:06)  
sysadmin pts/0        10.0.2.2         Thu Nov 28 16:17 - 17:05  (00:48)  
sysadmin pts/0        10.0.2.2         Thu Nov 28 09:29 - crash  (06:04)  
sysadmin pts/0        10.0.2.2         Wed Nov 27 16:37 - down   (00:29)  
sysadmin tty1                          Wed Nov 27 14:05 - down   (00:36)  
sysadmin tty1                          Wed Nov 27 13:49 - 14:04  (00:15)  </span></pre>

	<p>
		في هذا المثال، أحاول إيجاد تاريخ تسجيل الدخول لمستخدم <span style="font-family:courier new,courier,monospace;">sysadmin</span>، وكما ترى، فهنالك أمثلة لبضعة حالات توقّف فيها النظام.
	</p>

	<ul><li>
			لتعرف متى كانت آخر مرة تم إعادة تشغيل (reboot) النظام، يمكننا كتابة الأمر التالي:
		</li>
	</ul><pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4900_17">
<span class="pln">last reboot  </span></pre>

	<p>
		وستكون النتيجة مشابهة لهذه:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4900_21">
<span class="pln">reboot   system boot  2.6.32-358.el6.x Mon Dec  9 10:27 - 10:47  (00:19)
reboot   system boot  2.6.32-358.el6.x Fri Dec  6 16:37 - 10:47 (2+18:10)
reboot   system boot  2.6.32-358.el6.x Fri Dec  6 16:28 - 16:36  (00:08)    
reboot   system boot  2.6.32-358.el6.x Fri Dec  6 11:06 - 16:36  (05:29)
reboot   system boot  2.6.32-358.el6.x Mon Dec  2 17:00 - 16:36 (3+23:36)
reboot   system boot  2.6.32-358.el6.x Fri Nov 29 16:01 - 16:36 (7+00:34)
reboot   system boot  2.6.32-358.el6.x Fri Nov 29 15:43 - 16:36 (7+00:53)
...  
... 
wtmp begins Fri Nov 15 16:11:54 2013  </span></pre>

	<ul><li>
			وإذا أردت معرفة متى سجّل شخص معين دخوله آخر مرة إلى النظام، استخدم الأمر <span style="font-family:courier new,courier,monospace;">lastlog</span>:
		</li>
	</ul><pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7552_7">
<span class="pln">lastlog </span></pre>

	<p>
		في نظامي، ستكون النتيجة مشابهة لهذه:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7552_9">
<span class="pln">Username        Port        From            Latest  
root            tty1                        Mon Dec  9 10:44:30 +1100 2013
bin                                        **Never logged in**
daemon                                     **Never logged in**  
adm                                        **Never logged in**  
lp                                         **Never logged in**  
sync                                       **Never logged in**  
shutdown                                   **Never logged in**  
halt                                       **Never logged in**  
mail                                       **Never logged in**  
uucp                                       **Never logged in**  
operator                                   **Never logged in**  
games                                      **Never logged in**  
gopher                                     **Never logged in**  
ftp                                        **Never logged in**  
nobody                                     **Never logged in**  
vcsa                                       **Never logged in**  
saslauth                                   **Never logged in**  
postfix                                    **Never logged in**  
sshd                                       **Never logged in**  
sysadmin         pts/1    10.0.2.2         Mon Dec  9 10:31:50 +1100 2013  
dbus                                       **Never logged in**  
joeblog          pts/2    10.0.2.2         Mon Dec  9 10:39:24 +1100 2013  </span></pre>

	<p>
		بالنسبة لبقية ملفات السجل النصية، يمكنك استخدام أوامر <span style="font-family:courier new,courier,monospace;">cat</span> أو <span style="font-family:courier new,courier,monospace;">head</span> أو <span style="font-family:courier new,courier,monospace;">tail</span> لقراءة محتوياتها.
	</p>

	<p>
		في المثال بالأسفل، أحاول النظر إلى آخر 10 أسطر من ملف <span style="font-family:courier new,courier,monospace;">var/log/messages/</span> في نظام Debian:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7552_11">
<span class="pln">sudo tail /var/log/messages</span></pre>

	<p>
		ستكون المخرجات كالآتي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7552_13">
<span class="pln">Dec 16 01:21:08 debian kernel: [    9.584074] Bluetooth: BNEP (Ethernet Emulation) ver 1.3  
Dec 16 01:21:08 debian kernel: [    9.584074] Bluetooth: BNEP filters: protocol multicast  
Dec 16 01:21:08 debian kernel: [    9.648220] Bridge firewalling registered
Dec 16 01:21:08 debian kernel: [    9.696728] Bluetooth: SCO (Voice Link) ver 0.6 
Dec 16 01:21:08 debian kernel: [    9.696728] Bluetooth: SCO socket layer initialized  
Dec 16 01:21:08 debian kernel: [    9.832215] lp: driver loaded but no devices found  
Dec 16 01:21:08 debian kernel: [    9.868897] ppdev: user-space parallel port driver  
Dec 16 01:21:11 debian kernel: [   12.748833] [drm] Initialized drm 1.1.0 20060810
Dec 16 01:21:11 debian kernel: [   12.754412] pci 0000:00:02.0: PCI INT A -&gt; Link[LNKB] -&gt; GSI 11 (level, low) -&gt; IRQ 11  
Dec 16 01:21:11 debian kernel: [   12.754412] [drm] Initialized vboxvideo 1.0.0 20090303 for 0000:00:02.0 on minor 0</span></pre>

	<h2>
		عفريت rsyslog
	</h2>
</div>

<div id="wmd-preview-section-13">
	<p>
		في قلب آلية التّسجيل نجد عفريت <span style="font-family:courier new,courier,monospace;">rsyslog</span>، وهذه الخدمة مسؤولة عن الاستماع إلى رسائل السجلات من مختلف أجزاء نظام لينكس ومن ثم توجيه الرسالة إلى ملف السجل الصحيح في مجلد <span style="font-family:courier new,courier,monospace;">var/log/</span> وكما يمكنها إعادة إرسال رسائل السجلات إلى خواديم لينكس آخرى.
	</p>
</div>

<div id="wmd-preview-section-14">
	<h3 id="ملف-إعدادات-rsyslog">
		ملف إعدادات rsyslog
	</h3>

	<p>
		يحصل عفريت <span style="font-family:courier new,courier,monospace;">rsyslog</span> على إعداداته من ملف<span style="font-family:courier new,courier,monospace;"> rsyslog.conf</span> الموجود في مجلد <span style="font-family:courier new,courier,monospace;">etc/</span>، ويعمل هذا الملف أساسا على اخبار عفريت <span style="font-family:courier new,courier,monospace;">rsyslog</span> أين يحفظ رسائل السجلات، وهذه التعليمات تأتي من سلسلة أسطر متكونة من جزئين داخل الملف.
	</p>

	<p>
		يمكن إيجاد هذا الملف في<span style="font-family:courier new,courier,monospace;"> rsyslog.d/50-default.conf</span> في نظام أوبنتو.
	</p>

	<p>
		تتكون مجموعتا التعليمات من محدد (selector) وإجراء (action)، ويتم الفصل بين الجزئين بفراغ.
	</p>

	<p>
		يُحدد جزء "المحدد" مصدر وأهمية رسالة السجل وأما جزء "الإجراء" فيحتوي على ما يجب فعله مع تلك الرسالة.
	</p>

	<p>
		ينقسم جزء "المحدد" إلى جزئين مفصولين بنقطة .، ويسمى الجزء الأول بـ facility (جزء أصل الرسالة) وأما الثاني وهو الذي يأتي بعد النقطة فيسمى بـ priority (جزء درجة أهمية الرسالة) ومعا، أي جزئي facility/priority والإجراء يخبران rsyslog ماذا يفعل عندما يتم إنشاء رسالة تتطابق مع المعايير.
	</p>

	<p>
		هذا مقتطف من ملف<span style="font-family:courier new,courier,monospace;"> rsyslog.conf </span>على توزيعة CentOS:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7552_15">
<span class="pln"># rsyslog v5 configuration file
...  
...    
# Include all config files in /etc/rsyslog.d/  
IncludeConfig /etc/rsyslog.d/*.conf  

#### RULES ####  
# Log all kernel messages to the console.  
# Logging much else clutters up the screen.  
#kern.*  /dev/console  

# Log anything (except mail) of level info or higher.  
# Don't log private authentication messages!  
*.info;mail.none;authpriv.none;cron.none                /var/log/messages  

# The authpriv file has restricted access.  
authpriv.*                                              /var/log/secure  

# Log all the mail messages in one place.  
mail.*                                                  -/var/log/maillog  


# Log cron stuff  
cron.*                                                  /var/log/cron  

# Everybody gets emergency messages  
*.emerg                                                 *  

# Save news errors of level crit and higher in a special file.  
uucp,news.crit                                          /var/log/spooler  

# Save boot messages also to boot.log  
local7.*                                                /var/log/boot.log  
...  
...  </span></pre>

	<p>
		لنفهم السطور السابقة، دعونا ننظر في أنواع المختلفة من المنشئات (facilities) التي يعترف بها نظام لينكس:
	</p>

	<ul><li>
			<strong>auth</strong><span style="font-family:courier new,courier,monospace;"><strong> </strong></span>أو<span style="font-family:courier new,courier,monospace;"><strong> </strong></span><strong>authpriv</strong>: الرسائل التي تأتي من الأحداث المرتبطة بالأمن والتراخيص (authorization).
		</li>
		<li>
			<strong>kern</strong>: للرسائل القادمة من نواة لينكس.
		</li>
		<li>
			<strong>mail</strong>: للرسائل التي تم إنشاؤها من نظام الفرعي للبريد.
		</li>
		<li>
			<strong>cron</strong>: للرسائل المتعلقة بعفريت Cron.
		</li>
		<li>
			<strong>daemon</strong>: للرسائل القادمة من العفاريت.
		</li>
		<li>
			<strong>news</strong>: للرسائل القادم من النظام الفرعي لأخبار الشبكة.
		</li>
		<li>
			<strong>lpr</strong>: لرسائل السجل المتعلقة بالطباعة.
		</li>
		<li>
			user: لرسائل السجل القادمة من برامج المستخدم.
		</li>
		<li>
			من <strong>local0</strong> إلى <strong>local7</strong>: محجوزة للاستخدام المحلي.
		</li>
	</ul><p>
		وهذه قائمة من الأولويات بترتيب تصاعدي:
	</p>

	<ul><li>
			<strong>debug</strong>: بيانات تنقيح البرامج.
		</li>
		<li>
			<strong>info</strong>: رسالة معلومات بسيطة - لا يلزم التدخل.
		</li>
		<li>
			<strong>notice</strong>: حالة قد تتطلب الاهتمام.
		</li>
		<li>
			<strong>warn</strong>: تحذير.
		</li>
		<li>
			<strong>err</strong>: خطأ.
		</li>
		<li>
			<strong>crit</strong>: حالة حرجة.
		</li>
		<li>
			<strong>alert</strong>: حالة تتطلب تدخلًا فوريًا.
		</li>
		<li>
			<strong>emerg</strong>: حالة طارئة مستعجلة.
		</li>
	</ul><p>
		والآن دعونا ننظر إلى هذا السطر من الملف:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_7">
<span class="pln">cron.*              /var/log/cron    </span></pre>

	<p>
		هذا السطر سيخبر عفريت rsyslog بحفظ جميع الرسائل من عفريت cron في ملف يدعى <span style="font-family:courier new,courier,monospace;">var/log/cron/</span>، وأما رمز * بعد النقطة فيعني أن الرسائل من جميع الأولويات سيتم تسجيلها، وبالمثل فإذا تم وضع رمز * في المنشأ (facility) فذلك يعني لجميع المصادر.
	</p>

	<p>
		يمكن أن تكون المنشئات والأولويات مرتبطة بعدة طرق، ففي الشكل الافتراضي، عندما يكون هنالك أولوية واحد محددة بعد النقطة، فذلك يعني تحديد جميع الأحداث التي أولويتها أكبر أو تساوي تلك الأولوية، لذلك في الموجه التالي فإنه سيتم تسجيل جميع الرسائل القادمة من نظام الفرعي للبريد والتي تكون أولويتها من نوع تحذير فما فوق في ملف خاص داخل مجلد <span style="font-family:courier new,courier,monospace;">var/log/</span>:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_9">
<span class="pln">mail.warn           /var/log/mail.warn  </span></pre>

	<p>
		سيتم تسجيل جميع الرسائل التي تساوي أولويتها لـ "تحذير" فما فوق وتتُرك بقية الرسائل التي تكون أولويتها أقل من ذلك، أي أن الرسائل ذات أولوية err أو crit أو alert أو emerg لن يتم تسجيلها في الملف.
	</p>

	<p>
		إذا تم استخدام رمز المساواة = بعد النقطة فسيتم تسجيل فقط الأولوية المطابقة، أي أنه إذا أردت الحصول على رسائل info فقط القادمة من نظام الفرعي للرسائل، فإنك ستكتب شيء مشابه لهذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_11">
<span class="pln">mail.=info          /var/log/mail.info</span></pre>

	<p>
		مرة أخرى، إذا أردت الحصول على جميع الرسائل من نظام الفرعي للبريد ماعدا رسائل info، فإنك ستكتب شيئًا مشابهًا لهذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_13">
<span class="pln">mail.!info          /var/log/mail.info  </span></pre>

	<p>
		أو هذا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_15">
<span class="pln">mail.!=info         /var/log/mail.info  </span></pre>

	<p>
		في الحالة الأولى، سيحتوي ملف<span style="font-family:courier new,courier,monospace;"> mail.info </span>على جميع الرسائل التي تملك أولوية أقل من info، وفي الحالة الثانية، سيحتوي هذا الملف على جميع الرسائل التي تملك أولوية أكبر من info.
	</p>

	<p>
		في حالة وجود أكثر من مَنشأ على نفس السطر فيجب الفصل بينها بواسطة فواصل، وفي حالة وجود مصادر متعددة (facility.priority) في نفس السطر فيجب الفصل بينها بواسطة الفاصلة المنقوطة.
	</p>

	<p>
		عندما يتم وضع علامة * لأحد الإجراءات فهذا يعني أن الإجراء لجميع المستخدمين.
	</p>

	<p>
		هذا السطر في ملف<span style="font-family:courier new,courier,monospace;"> rsyslog.conf </span>في نظام CentOS يخبرنا بهذا الشيء:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_19">
<span class="pln"># Everybody gets emergency messages    
*.emerg                                                 *    </span></pre>

	<p>
		حاول أن تعرف ماذا يقول ملف<span style="font-family:courier new,courier,monospace;"> rsyslog.conf </span>في نظام لينكس، فهذا مقتطف من خادوم نظام ديبيان الذي أعمل عليه:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_21">
<span class="pln">#  /etc/rsyslog.conf    Configuration file for rsyslog.  
#  
#           For more information see  
#           /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html  
...  
...  
auth,authpriv.*         /var/log/auth.log  
*.*;auth,authpriv.none      -/var/log/syslog  
#cron.*             /var/log/cron.log  
daemon.*            -/var/log/daemon.log  
kern.*              -/var/log/kern.log  
lpr.*               -/var/log/lpr.log  
mail.*              -/var/log/mail.log  
user.*              -/var/log/user.log  

#
# Logging for the mail system.  Split it up so that  
# it is easy to write scripts to parse these files.  
#  
mail.info           -/var/log/mail.info  
mail.warn           -/var/log/mail.warn  
mail.err            /var/log/mail.err  
#  
# Logging for INN news system.  
#  
news.crit           /var/log/news/news.crit  
news.err            /var/log/news/news.err  
news.notice         -/var/log/news/news.notice  </span></pre>

	<p>
		كما ترى، يحفظ ديبيان جميع الرسائل ذات مستوى أمني/تراخيص في <span style="font-family:courier new,courier,monospace;">var/log/auth.log/</span> في حين أن CentOS يحفظها في <span style="font-family:courier new,courier,monospace;">var/log/secure/</span>.
	</p>

	<p>
		إن إعدادات rsyslog يمكن أن تأتي من ملفات خاصة أخرى، هذه الملفات الخاصة موجودة في العادة في مجلدات مختلفة داخل مجلد <span style="font-family:courier new,courier,monospace;">etc/rsyslog.d/</span> ويحتوي ملف<span style="font-family:courier new,courier,monospace;"> rsyslog.conf</span> على جميع هذه المجلدات باستخدام موجه <span style="font-family:courier new,courier,monospace;">IncludeConfig$</span>.
	</p>

	<p>
		هكذا يبدو شكلها في نظام أوبنتو:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_23">
<span class="pln">#  Default logging rules can be found in /etc/rsyslog.d/50-default.conf  
....  
....    
$IncludeConfig /etc/rsyslog.d/*.conf  </span></pre>

	<p>
		تبدو المحتويات الموجودة في مجلد <span style="font-family:courier new,courier,monospace;">etc/rsyslog.d/</span> كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_25">
<span class="pln">-rw-r--r-- 1 root root  311 Mar 17  2012 20-ufw.conf  
-rw-r--r-- 1 root root  252 Apr 11  2012 21-cloudinit.conf  
-rw-r--r-- 1 root root 1655 Mar 30  2012 50-default.conf  </span></pre>

	<p>
		لا يجب أن تكون وجهة رسائل السجل بالضرورة هي ملف السجل، فيمكن أن تُرسل الرسالة إلى طرفية المستخدم، وفي هذه الحالة، سيحتوي حقل الإجراء على اسم المستخدم، وإذا كنت تحتاج إلى إرسال الرسالة إلى أكثر من مستخدم واحد، فيجب فصل أسماء المستخدمين بفواصل وإذا أردت إرسالها لجميع المستخدمين فيمكنك وضع الرمز * في حقل الإجراء.
	</p>

	<p>
		بما أن عفريت rsyslog جزء من نظام تشغيل الشبكة، فلا يُمكنه حفظ السّجلات محليا فحسب، وإنما يمكنه أن يُرسلها إلى خواديم لينكس أخرى في الشبكة أو أن يُصبح مستودعًا لبقية الأنظمة. فالعفريت يستمع لرسائل السجل من منفذ UDP 514.
	</p>

	<p>
		المثال التالي سيُغير وجهة الرسائل الحرجة للنواة إلى خادوم يدعى texas.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_27">
<span class="pln">kern.crit           @texas  </span></pre>

	<h2>
		إنشاء واختبار رسائل سجل الخاصة بك
	</h2>
</div>

<div id="wmd-preview-section-15">
	<p>
		حان الآن وقت إنشاء ملفات سجل خاصة بنا، ولتجربة هذا سنحتاج إلى التالي:
	</p>

	<ul><li>
			إضافة مواصفات ملف السجل في ملف <span style="font-family:courier new,courier,monospace;">etc/rsyslog.conf/</span>
		</li>
		<li>
			إعادة تشغيل عفريت <span style="font-family:courier new,courier,monospace;">rsyslog</span>
		</li>
		<li>
			تجربة الإعدادات باستخدام أداة <span style="font-family:courier new,courier,monospace;">logger</span>
		</li>
	</ul><p>
		في المثال التالي، أضفت سطرين جديدين إلى ملف <span style="font-family:courier new,courier,monospace;">rsyslog.conf</span> التابع لنظام لينكس CentOS الخاص بي، وكما ترى، كل واحد منها قادم من منشأ يدعى local4 ولديهم أولويات مختلفة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_31">
<span class="pln">vi /etc/rsyslog.conf  </span></pre>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_33">
<span class="pln">....  
....  

# New lines added for testing log message generation  

local4.crit                                             /var/log/local4crit.log  
local4.=info                                            /var/log/local4info.log  </span></pre>

	<p>
		بعد ذلك، سيتم إعادة تحميل ملف الإعدادات عند إعادة تشغيل الخدمة:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_36">
<span class="pln">/etc/init.d/rsyslog restart  

Shutting down system logger:                               [  OK  ]  
Starting system logger:                                    [  OK  ]  </span></pre>

	<p>
		الآن، تم استدعاء تطبيق التسجيل لإنشاء رسالة سجل:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_40">
<span class="pln">logger -p local4.info " This is a info message from local 4"  </span></pre>

	<p>
		الآن، عند النظر إلى مجلد <span style="font-family:courier new,courier,monospace;">var/log/</span> سوف تجد ملفين جديدين:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_43">
<span class="pln">...  
...  
-rw-------  1 root root      0 Dec  9 11:21 local4crit.log  
-rw-------  1 root root     72 Dec  9 11:22 local4info.log  </span></pre>

	<p>
		إن حجم ملف <span style="font-family:courier new,courier,monospace;">local4info.log </span>لا يساوي صفر، لذلك عندما يتم فتحه، سأرى الرسالة التي تم تسجيلها:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_47">
<span class="pln">cat /var/log/local4info.log  

Dec  9 11:22:32 TestLinux root:  This is a info message from local 4  </span></pre>

	<h2>
		تدوير ملفات السجل
	</h2>
</div>

<div id="wmd-preview-section-16">
	<p>
		كلما زادت المعلومات المكتوبة في ملفات السجل ازداد حجمها، ومن الواضح أن هذا الأمر سيقلل من الأداء وستكون إدارة هذه الملفات عملية متعبة.
	</p>

	<p>
		لينكس يستخدم مفهوم "التدوير" لملفات السجل بدلا من تنظيفها أو حذفها، عندما يتم تدوير سجل معين، سيتم إنشاء ملف جديد وتغيير اسم الملف القديم وضغطه بشكل إختياري.
	</p>

	<p>
		يمكن لملف السجل أن يملك عدة نسخ قديمة لا تزال موجودة، وهذه الملفات قد تعود لفترات قديمة من الزمن وستكون كسجل متراكم، وعند إنشاء عدد معين من هذه المتراكمات سيتسبب السجل المُدوّر بحذف ملف السجل الأقدم .
	</p>

	<p>
		يتم تشغيل التدوير عن طريق أداة <span style="font-family:courier new,courier,monospace;">logrotate</span>.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h3 id="ملف-إعدادات-logrotate">
		ملف إعدادات logrotate
	</h3>

	<p>
		يعتمد <span style="font-family:courier new,courier,monospace;">logrotate</span> مثل <span style="font-family:courier new,courier,monospace;">rsyslog</span> على ملف الإعدادات واسم هذا الملف هو <span style="font-family:courier new,courier,monospace;">logrotate.conf</span> وهو موجود في <span style="font-family:courier new,courier,monospace;">etc/</span>.
	</p>

	<p>
		هذا ما أراه في ملف<span style="font-family:courier new,courier,monospace;"> logrotate.conf </span>على خادوم ديبيان الخاص بي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_59">
<span class="pln">cat /etc/logrotate.conf  

# see "man logrotate" for details  
# rotate log files weekly  
weekly  

# keep 4 weeks worth of backlogs  
rotate 4  

# create new (empty) log files after rotating old ones  
create  

# uncomment this if you want your log files compressed  
#compress  

# packages drop log rotation information into this directory  
include /etc/logrotate.d  

# no packages own wtmp, or btmp -- we'll rotate them here  
/var/log/wtmp {  
    missingok  
    monthly  
    create 0664 root utmp  
    rotate 1  
}  

/var/log/btmp {  
    missingok  
    monthly  
    create 0660 root utmp  
    rotate 1  
}  

# system-specific logs may be configured here  </span></pre>

	<p>
		الأسطر مفهومة وتشرح نفسها بنفسها، بشكل افتراضي، ملفات السجل يتم تدويرها بشكل أسبوعي مع الإبقاء على أربع سجلات في وقت واحد، عندما يشتغل البرنامج سيتم إنشاء ملف سجل جديد وسيتم ضغط الملف القديم اختياريا.
	</p>

	<p>
		الاستثناء الوحيد هو في ملفات <span style="font-family:courier new,courier,monospace;">wtmp</span> و <span style="font-family:courier new,courier,monospace;">btmp</span>، فملفات <span style="font-family:courier new,courier,monospace;">wtmp</span> تتبع تسجيلات الدخول للنظام وأما <span style="font-family:courier new,courier,monospace;">btmp</span> فهي تتبع تسجيلات الدخول النظام الخاطئة، كلا هذين الملفين يتم تدوريهما كل شهر ولن يتم إرجاع أي خطأ إذا كان أحد الملفات السابقة لـ <span style="font-family:courier new,courier,monospace;">wtmp</span> أو <span style="font-family:courier new,courier,monospace;">btmp</span> غير موجود.
	</p>

	<p>
		يتم الاحتفاظ بملفات إعدادات التّدوير المخصصة في مجلد <span style="font-family:courier new,courier,monospace;">etc/logrotate.d/</span>، وهذه أيضا يتم تضمينها في ملف <span style="font-family:courier new,courier,monospace;">logrotate.conf </span>مع التوجيه.
	</p>

	<p>
		يعرض لي نظام ديبيان محتويات هذا المجلد:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_57">
<span class="pln">ls -l /etc/logrotate.d  

total 44  
-rw-r--r-- 1 root root 173 Apr 15  2011 apt  
-rw-r--r-- 1 root root  79 Aug 12  2011 aptitude  
-rw-r--r-- 1 root root 135 Feb 24  2010 consolekit  
-rw-r--r-- 1 root root 248 Nov 28  2011 cups  
-rw-r--r-- 1 root root 232 Sep 19  2012 dpkg  
-rw-r--r-- 1 root root 146 May 12  2011 exim4-base  
-rw-r--r-- 1 root root 126 May 12  2011 exim4-paniclog  
-rw-r--r-- 1 root root 157 Nov 16  2010 pm-utils  
-rw-r--r-- 1 root root  94 Aug  8  2010 ppp  
-rw-r--r-- 1 root root 515 Nov 30  2010 rsyslog  
-rw-r--r-- 1 root root 114 Nov 26  2008 unattended-upgrades  </span></pre>

	<p>
		محتويات ملف <span style="font-family:courier new,courier,monospace;">rsyslog</span> تظهر لك كيف يتم تدوير بعض ملفات السجل:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_55">
<span class="pln">cat /etc/logrotate.d/rsyslog

/var/log/syslog  
{  
    rotate 7  
    daily  
    missingok  
    notifempty  
    delaycompress  
    compress  
    postrotate  
        invoke-rc.d rsyslog reload &gt; /dev/null  
    endscript  
}  

/var/log/mail.info  
/var/log/mail.warn  
/var/log/mail.err  
/var/log/mail.log  
/var/log/daemon.log  
/var/log/kern.log  
/var/log/auth.log  
/var/log/user.log  
/var/log/lpr.log  
/var/log/cron.log  
/var/log/debug  
/var/log/messages  
{  
    rotate 4  
    weekly  
    missingok  
    notifempty  
    compress  
    delaycompress  
    sharedscripts  
    postrotate  
        invoke-rc.d rsyslog reload &gt; /dev/null  
    endscript  
}  </span></pre>

	<p>
		كما ترى، إن ملف <span style="font-family:courier new,courier,monospace;">syslog</span> ستتم إعادة تهيئته يوميا مع إبقاء ملفات السجل لمدة 7 أيام، أما بقية ملفات السجل فيتم تدويرها أسبوعيا.
	</p>

	<p>
		كما لا ننسى موجه <span style="font-family:courier new,courier,monospace;">postrotate</span> فهو جدير بالذكر أيضا، فهذا الإجراء يحدد ماذا يحدث بعد الانتهاء من كامل عملية إعادة تدوير ملف السجل.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h3 id="تجربة-التدوير">
		تجربة التدوير
	</h3>

	<p>
		يمكن أن يشتغل <span style="font-family:courier new,courier,monospace;">Logrotate</span> يدويا لإعادة تدوير ملف أو أكثر، ولفعل ذلك، يمكننا ببساطة تحديد ملف الإعدادات الخاص بالأمر كمعامل لهذا الأمر.
	</p>

	<p>
		لنرى كيف يعمل، هذه قائمة جزئية من ملفات السجل موجود في مجلد <span style="font-family:courier new,courier,monospace;">var/log/</span> على الخادوم التجريبي CentOS الخاص بي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_53">
<span class="pln">ls -l /var/log  

total 800    
...  
-rw-------  1 root root    359 Dec 17 18:25 maillog  
-rw-------. 1 root root   1830 Dec 16 16:35 maillog-20131216  
-rw-------  1 root root  30554 Dec 17 18:25 messages  
-rw-------. 1 root root 180429 Dec 16 16:35 messages-20131216  
-rw-------  1 root root    591 Dec 17 18:28 secure  
-rw-------. 1 root root   4187 Dec 16 16:41 secure-20131216  
...  
...  </span></pre>

	<p>
		سوف تبدو المحتويات الجزئية لملف<span style="font-family:courier new,courier,monospace;"> logrotate.conf </span>كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_51">
<span class="pln">cat /etc/logrotate.conf

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs 
rotate 4  

# create new (empty) log files after rotating old ones
create  
...  
...  </span></pre>

	<p>
		بعد ذلك قمنا بتشغيل أمر <span style="font-family:courier new,courier,monospace;">logrotate</span>:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_49">
<span class="pln">logrotate -fv /etc/logrotate.conf    </span></pre>

	<p>
		سيتم نقل الرسائل عند إنشاء الملفات الجديدة والتعامل مع الأخطاء. وعندما يتنهي كل هذا، سنحاول التأكد من ملفات mail وsecure و messages الجديدة:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9617_61">
<span class="pln">ls -l /var/log/mail* 

-rw-------  1 root root    0 Dec 17 18:34 /var/log/maillog 
-rw-------. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216  
-rw-------  1 root root  359 Dec 17 18:25 /var/log/maillog-20131217  


ls -l /var/log/messages*  
-rw-------  1 root root    148 Dec 17 18:34 /var/log/messages
-rw-------. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216 
-rw-------  1 root root  30554 Dec 17 18:25 /var/log/messages-20131217 


ls -l /var/log/secure*  
-rw-------  1 root root    0 Dec 17 18:34 /var/log/secure
-rw-------. 1 root root 4187 Dec 16 16:41 /var/log/secure-20131216 
-rw-------  1 root root  591 Dec 17 18:28 /var/log/secure-20131217 </span></pre>

	<p>
		كما ترى، تم إنشاء ملفات السجل الجديدة الثلاث، ملفات <span style="font-family:courier new,courier,monospace;">maillog</span> و <span style="font-family:courier new,courier,monospace;">secure</span> لاتزال فارغة، في حين أن ملف <span style="font-family:courier new,courier,monospace;">messages</span> يملك بعض المعلومات.
	</p>
</div>

<div id="wmd-preview-section-19">
	<h2 id="خاتمة">
		خاتمة
	</h2>

	<p>
		نأمل أن يكون هذا الدرس قد أعطاك بعض الأفكار حول سجلات نظام لينكس، يمكنك أن تحاول وتجرب على خادومك التجريبي حتى تكون لديك فكرة أفضل، حالما تتعود على أماكن ملفات السجل وإعداداتها، استخدم معرفتك لدعم نظم الإنتاج الخاصة بك، وحينها، يمكنك إنشاء بعض الكُنيات aliases لتوفير بعض الوقت .
	</p>

	<p>
		ترجمة -وبتصرف- للمقال: <a href="https://www.digitalocean.com/community/tutorials/how-to-view-and-configure-linux-logs-on-ubuntu-and-centos" rel="external nofollow">How To View and Configure Linux Logs on Ubuntu and Centos</a> لصاحبه Sadequl Hussain.
	</p>
</div>
]]></description><guid isPermaLink="false">233</guid><pubDate>Mon, 22 Feb 2016 20:11:49 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x62D;&#x632;&#x645;: apt &#x60C;yum &#x60C;dnf &#x60C;pkg</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/linux-package-managment.png.dcf3135b5946f218607d4831051a35d4.png" /></p>

<div id="wmd-preview-section-14">
	<p id="أساسيات-إدارة-الحزم-apt-yum-dnf-pkg">
		توفر معظم الأنظمة الشبيهة بيونكس آلية مركزية لإيجاد وتثبيت البرمجيات. تُوزَع البرمجيات عادة في شكل حزم، مُخزنة في مستودعات. التعامل مع الحزم يُعرَف بإدارة الحزم. توفر الحزم المكونات الأساسية لنظام التشغيل، مع المكتبات المشتركة، التطبيقات، الخدمات والوثائق.
	</p>

	<p style="text-align: center;">
		<img alt="linux-package-managment.png" class="ipsImage ipsImage_thumbnailed" data-fileid="13324" data-unique="vqvdlbun3" src="https://academy.hsoub.com/uploads/monthly_2016_02/linux-package-managment.png.f3f1ebd92169c71f3055a122333b7035.png"></p>
</div>

<div id="wmd-preview-section-15">
	<p>
		يقوم نظام إدارة الحزم بأكثر من تثبيت البرمجيات لمرة واحدة. فهو يوفر أيضًا أدوات لترقية الحزم المثبتة حاليًا. تُساعد مستودعات الحزم على التأكد من أن الشيفرة فُحِصَت للاستخدام على نظامك، وأن المطورين والمشرفين وافقوا على نُسخ البرمجيات المُثبتة.
	</p>

	<p>
		عند ضبط الخواديم أو بيئات التطوير، غالبًا ما يكون النظر لما وراء المستودعات الرسمية ضروريًا. فقد تكون الحزم في الإصدار المُستقر من التوزيعة قديمة، خصوصًا عندما تكون البرمجيات المعنية سريعة التغيُر. وبالرغم من هذا، فإن إدارة الحزم هي مهارة حيوية لمدراء الأنظمة والمطورين، ووفرة البرمجيات المُحزّمة للتوزيعات الرئيسية هي مورد هائل.
	</p>

	<p>
		اُعد هذا الدّليل ليكون مرجعًا سريعًا لأساسيات إيجاد، تثبيت وترقية الحزم على مجموعة متنوعة من التوزيعات، وينبغي أن يساعدك على ترجمة هذه المعرفة بين الأنظمة.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="أنظمة-إدارة-الحزم-لمحة-موجزة">
		أنظمة إدارة الحزم: لمحة موجزة
	</h2>

	<p>
		معظم أنظمة الحزم تُبنَى من مجموعات من ملفات الحزم. ملف الحزمة هو أرشيف يحتوي على ملفات ثُنائية مُترجمة ومصادر أخرى تُشكل البرنامج، مع سكربتات التثبيت. تحتوي الحزم أيضًا على بيانات وصفية قيّمة، تتضمن اعتمادياتها وقائمة من الحزم الأخرى المطلوبة لتثبيتها وتشغيلها.
	</p>

	<p>
		على الرغم من تشابه وظائف وفوائد تنسيقات وأدوات التحزيم إلى حد بعيد، إلا أنها تختلف باختلاف المنصات:
	</p>
	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						نظام التشغيل
					</th>
					<th>
						التنسيق
					</th>
					<th>
						الأدوات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian
					</td>
					<td>
						.deb
					</td>
					<td>
						apt, apt-cache, apt-get, dpkg
					</td>
				</tr>
<tr>
<td>
						Ubuntu
					</td>
					<td>
						.deb
					</td>
					<td>
						apt, apt-cache, apt-get, dpkg
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						.rpm
					</td>
					<td>
						yum
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						.rpm
					</td>
					<td>
						dnf
					</td>
				</tr>
<tr>
<td>
						FreeBSD
					</td>
					<td>
						Ports, .txz
					</td>
					<td>
						make, pkg
					</td>
				</tr>
</tbody>
</table>
</center>

	<p>
		تنسيق الحزم في دبيان والأنظمة المبنية عليها مثل أوبنتو، لينكس منت وراسبيان يكون كملف .deb. تُوفر أداة الحزم المُتقدمة APT أوامر لمعظم العمليات الشائعة: البحث بالمستودعات، تثبيت مجموعات من الحزم واعتمادياتها وإدارة الترقيات. تعمل أوامر APT كواجهة أمامية للأداة منخفضة المستوى dpkg، والتي تقوم بتثبيت ملفات .deb الفردية على النظام محليًا، وأحيانًا تُستدعى مباشرةً.
	</p>

	<p>
		تَستخدم CentOS، فيدورا والتوّزيعات الأخرى في عائلة Red Hat ملفات بتنسيق RPM. يُستخدم yum في CentOS للتفاعل مع ملفات الحزم الفردية والمستودعات.
	</p>

	<p>
		في النُسخ الحديثة من فيدورا حل dnf محل yum، وهو مُشتق حديث يحتفظ بمعظم خصائص واجهة yum النصية.
	</p>

	<p>
		يُدار نظام الحزم الثنائية في FreeBSD بالأمر pkg. ويوفر FreeBSD كذلك ما يُطلق عليه اسم Ports Collection، وهو هيكل مُجلدات محلية وأدوات تسمح للمُستَخدِم بجلب، تجميع وتثبيت الحزم مباشرة من المصدر باستخدام ملفاتMakefile. استخدام pkg مُريح غالبًا، ولكن أحيانًا لا تتوافر حزم مُترجمة مسبقًا، أو قد تُريد تغيير الخيارات بوقت الترجمة.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="تحديث-قوائم-الحزم">
		تحديث قوائم الحزم
	</h2>

	<p>
		تحتفظ معظم الأنظمة بقاعدة بيانات محلية للحزم المتوافرة بالمستودعات البعيدة. من الأفضل تحديث قاعدة البيانات قبل ترقية الحزم. وكاستثناء جزئي لهذا النمط، سيتحقق yum و dnf من وجود تحديثات قبل القيام ببعض العمليات، لكن يمكنك سؤالها عن توافر التحديثات بأي وقت.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						sudo apt-get update
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						yum check-update
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						dnf check-update
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						sudo pkg update
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						sudo portsnap fetch update
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-18">
	<h2 id="ترقية-الحزم-المثبتة">
		ترقية الحزم المثبتة
	</h2>

	<p>
		التأكد من حداثة البرمجيات المُثبتة على النظام ستكون مهمة ضخمة بدون نظام حزم. ستضطر أن تتتبع تغييرات المنبع والتنبيهات الأمنية لمئات من الحزم المختلفة. على الرغم من أن مدير الحزم لن يحل كل مشكلة ستقابلها عند ترقية البرمجيات، إلا أنه يُمَكِنُك من صيانة معظم مكونات النظام بأوامر قليلة.
	</p>

	<p>
		ترقية الـ port المُثبتة على FreeBSD يمكن أن تُؤدي إلى إدخال أعطال أو تتطلب خطوات ضبط يدوية. من الأفضل أن تقرأ <span style="font-family:courier new,courier,monospace;">usr/ports/UPDATING/ </span>قبل الترقية باستخدام <span style="font-family:courier new,courier,monospace;">portmaster</span>.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						sudo apt-get upgrade
					</td>
					<td>
						يُرقي الحزم الجديدة فقط، إن كان بالإمكان.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo apt-get dist-upgrade
					</td>
					<td>
						قد يُضيف أو يحذف حزم لتلبية الاعتماديات الجديدة.
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						sudo yum update
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						sudo dnf upgrade
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						sudo pkg upgrade
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						less /usr/ports/UPDATING
					</td>
					<td>
						<p>
							يُستخدم الأمر less لعرض ملاحظات التحديث للمنافذ.
						</p>

						<p>
							استخدم مفاتيح الأسهم للانتقال، اضغط q للخروج.
						</p>
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						<p>
							cd /usr/ports/ports-mgmt/portmaster
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							sudo make install &amp;&amp; sudo portmaster -a
						</p>
					</td>
					<td>
						يُثبت portmaster ويستخدمه لتحديث المنافذ المُثبتة.
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-19">
	<h2 id="إيجاد-حزمة">
		إيجاد حزمة
	</h2>

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

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأوامر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						apt-cache search search_string
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						yum search search_string
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						yum search all search_string
					</td>
					<td>
						يبحث بجميع الحقول، من ضمنها الوصف.
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						dnf search search_string
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						dnf search all search_string
					</td>
					<td>
						يبحث بجميع الحقول، من ضمنها الوصف.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						pkg search search_string
					</td>
					<td>
						يبحث بالاسم.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						pkg search -f search_string
					</td>
					<td>
						يبحث بالاسم، ويُعيد وصف كامل.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						pkg search -D search_string
					</td>
					<td>
						يبحث بالوصف.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						<p>
							cd /usr/ports
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							make search name=package
						</p>
					</td>
					<td>
						يبحث بالاسم.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						<p>
							cd /usr/ports
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							make search key=search_string
						</p>
					</td>
					<td>
						يبحث في الأسماء، الأوصاف والاعتماديات.
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-20">
	<h2 id="عرض-معلومات-عن-حزمة-محددة">
		عرض معلومات عن حزمة محددة
	</h2>

	<p>
		من المفيد قراءة أوصاف تفصيلية عن الحزم التي قررت تثبيتها. إلى جانب نص قابل للقراءة، يتضمن غالبًا بيانات وصفية مثل أرقام النُسخ وقائمة من اعتماديات الحزم.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						apt-cache show package
					</td>
					<td>
						يعرض المعلومات المُخزنة محليًا عن الحزمة package.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						dpkg -s package
					</td>
					<td>
						يعرض حالة التثبيت الحالية للحزمة package.
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						yum info package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						yum deplist package
					</td>
					<td>
						يسرد اعتماديات الحزمة package.
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						dnf info package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						dnf repoquery –requires package
					</td>
					<td>
						يسرد اعتماديات الحزمة package.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						pkg info package
					</td>
					<td>
						يعرض معلومات عن الحزمة المُثبتة package.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						<p>
							cd /usr/ports/category/port
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							cat pkg-descr
						</p>
					</td>
					<td>
						 
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-21">
	<h2 id="تثبيت-حزمة-من-المستودعات">
		تثبيت حزمة من المستودعات
	</h2>

	<p>
		بمجرد معرفة اسم الحزمة، يمكن تثبيت الحزمة واعتمادياتها بأمر واحد. عمومًا، يمكنك طلب تثبيت حزم عديدة ببساطة عن طريق ذكرها جميعًا.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						sudo apt-get install package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo apt-get install package1 package2 …
					</td>
					<td>
						يُثبت كل الحزم المذكورة package1 package2 …
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo apt-get install -y package
					</td>
					<td>
						يُجيب بنعم عندما يطلب apt الاستمرار.
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						sudo yum install package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo yum install package1 package2 …
					</td>
					<td>
						يُثبت كل الحزم المذكورة package1 package2 …
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo yum install -y package
					</td>
					<td>
						يُجيب بنعم عندما يطلب yum الاستمرار.
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						sudo dnf install package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo dnf install package1 package2 …
					</td>
					<td>
						يُثبت كل الحزم المذكورة package1 package2 …
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo dnf install -y package
					</td>
					<td>
						يُجيب بنعم عندما يطلب dnf الاستمرار.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						sudo pkg install package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo pkg install package1 package2 …
					</td>
					<td>
						يُثبت كل الحزم المذكورة package1 package2 …
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						<p>
							cd /usr/ports/category/port
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							sudo make install
						</p>
					</td>
					<td>
						يبني ويُثبت منفذ من المصدر.
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-22">
	<h2 id="تثبيت-حزمة-من-نظام-الملفات-المحلي">
		تثبيت حزمة من نظام الملفات المحلي
	</h2>

	<p>
		أحيانًا، بالرغم من عدم تحزيم البرمجيات رسميًا لنظام معين، سيوفر المطور أو البائع ملفات الحزم للتحميل. يمكنك الحصول عليهم عبر المتصفح، أو من خلال <span style="font-family:courier new,courier,monospace;">curl</span> على سطر الأوامر. بمجرد وجود الحزمة على النظام، يمكن عادة تثبيتها بأمر واحد.
	</p>

	<p>
		يتعامل <span style="font-family:courier new,courier,monospace;">dpkg</span> مع ملفات الحزم الفردية على الأنظمة الدبيانية. إذا كان هناك اعتماديات ناقصة لحزمة، فيمكن استخدام <span style="font-family:courier new,courier,monospace;">gdebi</span> لجلب هذه الاعتماديات من المستودعات الرسمية.
	</p>

	<p>
		يُستخدم yum و dnf على أنظمة فيدورا و CentOS لتثبيت ملفات الحزم الفردية، ومُعالجة الاعتماديات المطلوبة أيضًا.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						sudo dpkg -i package.deb
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						<p>
							sudo apt-get install -y gdebi
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							sudo gdebi package.deb
						</p>
					</td>
					<td>
						<p>
							يُثبت ويستخدم gdebi لتثبيت الحزمة package.deb
						</p>

						<p>
							ويَحصُل على أي اعتماديات ناقصة.
						</p>
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						sudo yum install package.rpm
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						sudo dnf install package.rpm
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						sudo pkg add package.txz
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo pkg add -f package.txz
					</td>
					<td>
						يُثبت الحزمة package حتى وإن كانت مُثبتة.
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-23">
	<h2 id="إزالة-حزمة-واحدة-أو-أكثر">
		إزالة حزمة واحدة أو أكثر
	</h2>

	<p>
		بما أن مدير الحزم يعرف الملفات التي تأتي مع حزمة مُعينة، فيمكن إزالة هذه الملفات بشكل نظيف من النظام إذا لم يعد هناك حاجة لهذه الحزمة.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						sudo apt-get remove package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo apt-get autoremove
					</td>
					<td>
						يُزيل الحزم غير الضرورية.
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						sudo yum remove package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						sudo dnf erase package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						sudo pkg delete package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						sudo pkg autoremove
					</td>
					<td>
						يُزيل الحزم غير الضرورية.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						sudo pkg delete package
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						<p>
							cd /usr/ports/path_to_port
						</p>

						<p>
							&amp;&amp;
						</p>

						<p>
							make deinstall
						</p>
					</td>
					<td>
						يلغي تثبيت منفذ مُثبت.
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-24">
	<h2 id="الحصول-على-المساعدة">
		الحصول على المساعدة
	</h2>

	<p>
		بالإضافة إلى التوثيقات المتوافرة على الشبكة، ضع في اعتبارك أن صفحات دليل يونكس (يُشار إليها بصفحات الدليل) متوافرة لمعظم الأوامر من الصدفة. استخدم <span style="font-family:courier new,courier,monospace;">man</span> لقراءة صفحة page على النّحو التّالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7881_7">
<span class="pln">$ man page</span></pre>

	<p>
		يمكنك الانتقال بمفاتيح الأسهم في<span style="font-family:courier new,courier,monospace;"> man. </span>اضغط <span style="font-family:courier new,courier,monospace;">/</span> للبحث عن نص في الصفحة، و <span style="font-family:courier new,courier,monospace;">q </span>للخروج.
	</p>

	<center>
		<table style="border: 1px solid black; border-collapse: collapse;">
<thead><tr>
<th>
						النظام
					</th>
					<th>
						الأمر
					</th>
					<th>
						ملاحظات
					</th>
				</tr></thead>
<tbody>
<tr>
<td>
						Debian / Ubuntu
					</td>
					<td>
						man apt-get
					</td>
					<td>
						تحديث قاعدة البيانات المحلية والتعامل مع الحزم.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						man apt-cache
					</td>
					<td>
						الاستعلام في قاعدة بيانات الحزم المحلية.
					</td>
				</tr>
<tr>
<td>
						 
					</td>
					<td>
						man dpkg
					</td>
					<td>
						التعامل مع ملفات الحزم الفردية والاستعلام عن الحزم المُثبتة.
					</td>
				</tr>
<tr>
<td>
						CentOS
					</td>
					<td>
						man yum
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						Fedora
					</td>
					<td>
						man dnf
					</td>
					<td>
						 
					</td>
				</tr>
<tr>
<td>
						FreeBSD Packages
					</td>
					<td>
						man pkg
					</td>
					<td>
						التعامل مع الحزم الثنائية المُترجمة مُسبقًا.
					</td>
				</tr>
<tr>
<td>
						FreeBSD Ports
					</td>
					<td>
						man ports
					</td>
					<td>
						التعامل مع مجموعات المنافذ.
					</td>
				</tr>
</tbody>
</table>
</center>
</div>

<div id="wmd-preview-section-25">
	<h2 id="خاتمة-ولمزيد-من-القراءة">
		خاتمة ولمزيد من القراءة
	</h2>

	<p>
		عرضنا العمليات الأساسية التي يمكن استخدامها كمرجع بين الأنظمة، لكننا لم نتطرّق سوى إلى أساسيات الأمر. للحصول على مزيد من التفاصيل لنظام معين، راجع المصادر التالية:
	</p>

	<ul>
<li>
			يُغطي <a href="https://www.digitalocean.com/community/tutorials/ubuntu-and-debian-package-management-essentials" rel="external nofollow">هذا الدليل</a> إدارة حزم دبيان وأوبنتو بالتفصيل.
		</li>
		<li>
			هناك <a href="https://www.centos.org/docs/5/html/yum/" rel="external nofollow">دليل CentOS الرسمي لإدارة البرمجيات باستخدام yum</a>.
		</li>
		<li>
			هناك <a href="https://fedoraproject.org/wiki/Dnf" rel="external nofollow">صفحة wiki فيدورا عن dnf</a>، و<a href="https://dnf.readthedocs.org/en/latest/index.html" rel="external nofollow">دليل dnf الرسمي</a>.
		</li>
		<li>
			يُغطي <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%AF%D9%8A%D8%B1-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-freebsd-101-%D8%A8%D9%88%D8%A7%D8%B3%D8%B7%D8%A9-pkg-r101/" rel="">هذا الدليل</a> إدارة حزم FreeBSD باستخدام pkg.
		</li>
		<li>
			يحتوي <a href="https://www.freebsd.org/doc/handbook/" rel="external nofollow">دفتر FreeBSD</a> على <a href="https://www.freebsd.org/doc/handbook/ports-using.html" rel="external nofollow">قسم لاستخدام مجموعات المنافذ</a>.
		</li>
	</ul>
<p>
		ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/package-management-basics-apt-yum-dnf-pkg" rel="external nofollow">Package Management Basics: apt, yum, dnf, pkg</a> لصاحبه Brennen Bearnes.
	</p>
</div>
]]></description><guid isPermaLink="false">231</guid><pubDate>Fri, 26 Feb 2016 23:50:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x644;&#x63A;&#x629; AWK &#x644;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x646;&#x635;&#x648;&#x635; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-awk-%D9%84%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r133/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/awk-linux.png.3564fde0fe1b2162c41199ee451d1ad1.png" /></p>

<p dir="rtl">تتّبع الأدوات المساعدة في لينِكس فلسفة Unix من ناحية تصميمها عادةً، حيث يُوصى بأن تكون الأدوات صغيرة، أن تستخدم ملفّات نص مُجرَّد plain text للدخل input والخَرْج output، وأن تعمل بالأسلوب التركيبي modular manner، ونمتلك بسبب هذا الإرث legacy وظيفة رائعة لمعالجة النّصوص مع أدوات مثل sed وawk.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/awk-linux.png.37477a87bebbe3bb0d35d16b1f9da359.png"><img data-fileid="6812" class="ipsImage ipsImage_thumbnailed" alt="awk-linux.thumb.png.4e2533c16d36d3a0a36d" src="https://academy.hsoub.com/uploads/monthly_2015_11/awk-linux.thumb.png.4e2533c16d36d3a0a36dc367b2f0c126.png"></a></p><p dir="rtl">سنناقش في هذا الدّرس <strong>awk</strong>، والتي هي لغة برمجة ومُعالِج نصوص على حدٍّ سواء يُمكن استخدامها للتعامل مع بيانات النّصوص بطرق مفيدة جدًّا، سنناقش هذا على Ubuntu 12.04 VPS ولكن ينبغي أن يعمل بنفس الطريقة على أي نظام لينِكس حديث.</p><h2 dir="rtl">الصياغة الأساسية Basic Syntax</h2><p dir="rtl">يتم تضمين الأمر <strong>awk</strong> افتراضيًّا في جميع أنظمة لينِكس الحديثة، لذا لن نحتاج إلى تثبيته لكي نبدأ باستخدامه.</p><p dir="rtl">يكون awk مفيدًا أكثر عند التعامل مع ملفات نصيّة مُنسَّقة بطريقة متوقعة، فعلى سبيل المثال يكون ممتازًا في تحليل parsing والتعامل مع البيانات المجدولة، فهو يعمل على الأسطر سطرًا تلو الآخر وبالتكرار عبر كامل الملف.</p><p dir="rtl">يستخدم awk افتراضيًّا الفواصل whitespaces (المسافات spaces، tabs، إلخ) للفصل بين الحقول، ولحسن الحظ تستخدم معظم ملفّات الإعدادات على نظام لينِكس هذه الصّيغة.</p><p dir="rtl">الصيغة الأساسيّة لأمر awk هي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '/search_pattern/ { action_to_take_on_matches; another_action; }' file_to_parse</pre><p dir="rtl">نستطيع إمّا إزالة قسم البحث search أو قسم الإجراء action من أي أمر awk، إنّ الإجراء الافتراضي الذي يتم اتخاذه إن لم نقم بكتابة القسم “action” هو الطباعة “print”، والذي يقوم ببساطة بطباعة كافّة الأسطر الموافقة.</p><p dir="rtl">إن لم نقم بكتابة القسم “search” يُنفِّذ awk الإجراء المُدرَج في كل سطر.</p><p dir="rtl">أمّا إن قمنا بكتابتهما معًا فيستخدم awk قسم البحث search ليقرّر إذا ما كان السّطر الحالي يعكس النمط pattern المطلوب، ومن ثمّ يُنفِّذ الإجراءات على الأمور المُوافِقة له.</p><h2 dir="rtl">استخدامات بسيطة</h2><p dir="rtl">نستطيع استخدام awk في أبسط أشكاله مثل <strong>cat</strong> ليطبع ببساطة جميع أسطر ملف نصّي على الشّاشة.</p><p dir="rtl">فلنطبع ملف <span style="font-family:courier new,courier,monospace;">fstab</span> لخادومنا، والذي يعرض أنظمة الملفّات filesystems التي يعرفها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '{print}' /etc/fstab</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
proc /proc proc nodev,noexec,nosuid 0 0
# / was on /dev/vda1 during installation
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1</pre><p dir="rtl">لا يفيدنا هذا كثيرًا، فلنجرّب قدرات awk في ترشيح filtering البحث:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '/UUID/' /etc/fstab</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># device; this may be used with UUID= as a more robust way to name devices
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1</pre><p dir="rtl">وكما نرى يطبع awk الآن الأسطر التي تحتوي "UUID" فقط، بإمكاننا التخلّص من سطر التعليق comment غير المهم عن طريق تحديد أنّ "UUID" يجب أن تتواجد في بداية السّطر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '/^UUID/' /etc/fstab</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1</pre><p dir="rtl">نستطيع بشكل مشابه استخدام قسم الإجراء action لتحديد أي قطع من المعلومات نريد طباعتها، على سبيل المثال لطباعة العمود الأول فقط نستطيع كتابة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '/^UUID/ {print $1;}' /etc/fstab</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd</pre><p dir="rtl">يمكننا الرجوع لكل عمود (لأنّها مفصولة بفراغ بينها) عن طريق متغيرات variables مرتبطة برقم عمودها، على سبيل المثال نستطيع الرجوع للعمود الأول بواسطة المتغير <span style="font-family:courier new,courier,monospace;">1$</span>، والرجوع لكامل السّطر بواسطة المتغير<span style="font-family:courier new,courier,monospace;"> 0$</span>.</p><h2 dir="rtl">متغيرات awk الداخلية والتنسيق الموسع Expanded Format</h2><p dir="rtl">يستخدم awk بعض المتغيّرات الدّاخليّة internal variables لتعيين قطع معيّنة من المعلومات بينما يقوم بمعالجة الملف.</p><p dir="rtl">إنّ المتغيّرات الدّاخليّة التي يستخدمها awk هي:</p><ul dir="rtl"><li><strong>FILENAME</strong>: يُرجِع ملف الدّخل input الحالي.</li><li><strong>FNR</strong>: يُرجِع عدد التسجيلات record الحاليّة نسبة لملف الدّخل الحالي، على سبيل المثال إن كُنّا نملك ملفّين للدخل فسيخبرنا هذا المتغيّر بعدد التسجيلات لكل ملف بدلًا من أن يخبرنا بالمجموع الكلّي.</li><li><strong>FS</strong>: فاصل الحقل الحالي المُستخدَم للدلالة على كل حقل في التسجيل، يتم تعيينه افتراضيًّا إلى مسافة whitespace.</li><li><strong>NF</strong>: عدد الحقول في التسجيلات الحاليّة.</li><li><strong>NR</strong>: عدد التسجيلات الحاليّة.</li><li><strong>OFS</strong>: فاصل الحقل للبيانات المُخرَجة، يتم تعيينه افتراضيًّا إلى مسافة whitespace.</li><li><strong>ORS</strong>: فاصل التّسجيلات للبيانات المُخرَجة، وهو بشكل افتراضي سطر جديد.</li><li><strong>RS</strong>: فاصل التّسجيلات المُستخدَم لتمييز التّسجيلات المنفصلة في ملف الدّخل، وهو بشكل افتراضي سطر جديد.</li></ul><p dir="rtl">نستطيع تغيير قيم هذه المتغيّرات بحسب رغبتنا لتوافِق احتياجات ملفّاتنا، نقوم بذلك عادةً خلال طور التهيئة لمعالجة awk.</p><p dir="rtl">يقودنا هذا إلى مفهوم هام آخر، إنّ صياغة awk مُعقَّدة أكثر بقليل ممّا شاهدناه في البداية، حيث توجد أيضًا كُتَل blocks اختياريّة <span style="font-family:courier new,courier,monospace;">BEGIN</span> <span style="font-family:courier new,courier,monospace;">وEND</span> والتي يُمكن أن تحتوي على أوامر ليتم تنفيذها قبل وبعد معالجة الملف على التوالي.</p><p dir="rtl">يجعل هذا من صيغتنا المُوسَّعة تبدو مشابهة لما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk 'BEGIN { action; }
/search/ { action; }
END { action; }' input_file</pre><p dir="rtl">إنّ الكلمات المفتاحيّة BEGIN وEND هي في الواقع مجرّد مجموعات مُحدّدة من الشّروط conditions تمامًا مثل مُعامِلات parameters البحث، فهي تتوافق مع الشّروط: قبل معالجة المستند وبعد معالجته.</p><p dir="rtl">ويعني هذا أنّه بإمكاننا تغيير بعض المتغيّرات الداخليّة في القسم BEGIN، فعلى سبيل المثال الملف <span style="font-family:courier new,courier,monospace;">etc/passwd/</span> مفصول بواسطة نقطتين (:) بدلًا من مسافة، وإن أردنا طباعة العمود الأول من هذا الملف نستطيع كتابة ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo awk 'BEGIN { FS=":"; }
{ print $1; }' /etc/passwd</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root
daemon
bin
sys
sync
games
man
. . .</pre><p dir="rtl">نستطيع استخدام الكُتَل BEGIN وEND لطباعة معلومات بسيطة حول الحقول التي نطبعها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; }
{print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;}
END { print "---------\nFile Complete" }' /etc/passwd</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">User       UID  GID    Home       Shell
--------------
root         0   0     /root      /bin/bash
daemon       1   1     /usr/sbin  /bin/sh
bin          2   2     /bin       /bin/sh
sys          3   3     /dev       /bin/sh
sync         4   65534 /bin       /bin/sync
. . .
---------
File Complete</pre><p dir="rtl">بإمكاننا كما نرى تنسيق الأشياء بشكل أنيق من خلال الاستفادة من بعض ميّزات awk.</p><p dir="rtl">جميع الأقسام المُوسّعة اختياريّة، وفي الواقع القسم action الرئيسي بذاته اختياري إن تمّ تعريف قسم آخر، نستطيع أن نفعل أشياء من هذا القبيل كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk 'BEGIN { print "We can use awk like the echo command"; }'</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">We can use awk like the echo command</pre><h2 dir="rtl">البحث في الحقول والتعابير المركبة في awk</h2><p dir="rtl">قُمنا في أحد الأمثلة السّابقة بطباعة السّطر الذي يبدأ بـ "UUID" من الملف <span style="font-family:courier new,courier,monospace;">etc/fstab/</span>، وكان هذا سهلًا لأنّنا كُنّا نبحث عن بداية السّطر بأكمله.</p><p dir="rtl">ولكن ماذا لو أردنا معرفة إذا ما كان نمط البحث قد وافق بداية الحقل field بدلًا من ذلك؟</p><p dir="rtl">نستطيع إنشاء الملف <span style="font-family:courier new,courier,monospace;">favorite_food.txt</span> الذي يضم قائمة تحوي رقم العناصر والأطعمة المفضّلة لمجموعة من الأصدقاء:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">echo "1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan
5 spaghetti jessica" &gt; favorite_food.txt</pre><p dir="rtl">إن كُنّا نريد إيجاد جميع الأطعمة التي تبدأ بـ “sa” من هذا الملف فبإمكاننا البدء بتجربة شيء مشابه لما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '/sa/' favorite_food.txt</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan</pre><p dir="rtl">قمنا هنا بالمطابقة مع أي مثال عن “sa” في الكلمة، وهذا لا يستثني كلمات مثل " wasabi" والتي تحوي هذا النمط في منتصفها، أو "sandy" غير الموجودة في العمود الذي نريده، فنحن مهتمون فقط بالكلمات التي تبدأ بـ “sa” والموجودة في العمود الثاني.</p><p dir="rtl">بإمكاننا إخبار awk أن يُطابِق بداية العمود الثاني باستخدام هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '$2 ~ /^sa/' favorite_food.txt</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">3 sandwich brian
4 salad ryan</pre><p dir="rtl">يسمح لنا هذا كما نرى بالبحث فقط في بداية العمود الثاني عن مُطابِق.</p><p dir="rtl">يُخبِر الحرف "^" بأن يُحدِّد awk بحثه في بداية الحقل، ويُحدِّد الجزء "<span style="font-family:courier new,courier,monospace;"><span style="line-height: 24.8889px;">~</span>field_num</span>" بأنّه يجب فقط النّظر إلى العمود الثاني.</p><p dir="rtl">يُمكننا بسهولة البحث عن الأشياء غير المُطابِقة بتضمين الحرف "!" قبل المَدّة tilde (~).</p><p dir="rtl">سيعيد هذا الأمر جميع الأسطر التي لا تملك طعامًا يبدأ بـ “sa”:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '$2 !~ /^sa/' favorite_food.txt</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">1 carrot sandy
2 wasabi luke
5 spaghetti jessica</pre><p dir="rtl">إن قرّرنا لاحقًا أنّنا فقط مهتمّون بالأسطر التي يكون فيها ما سبق صحيحًا ورقم العنصر أقل من 5، فنستطيع استخدام تعبير مُركَّب مثل هذا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">awk '$2 !~ /^sa/ &amp;&amp; $1 &lt; 5' favorite_food.txt</pre><p dir="rtl">يُقدِّم لنا هذا بعض الأشياء الجديدة، أوّلها هو القدرة على إضافة مُتطلّبات إضافيّة للسطر الذي نريد مُطابقته باستخدام العامل operator <strong>&amp;&amp;</strong>، نستطيع باستخدام هذا جمع عدد كيفي من الشّروط للسطر الذي نريد مُطابقته.</p><p dir="rtl">نستخدم هذا العامل لإضافة التحقّق من أنّ قيمة العمود الأوّل أقل من 5.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">يجب أن يكون لدينا الآن فكرة أساسيّة حول كيفيّة قيام <strong>awk</strong> بالتعامل مع تنسيق، وطباعة الملفّات النّصيّة بانتقائيّة، رغم ذلك فإنّ awk موضوع أكبر من هذا بكثير، وهو في الواقع لغة برمجة كاملة تحتوي على إسناد للمتغيّرات، بُنى التّحكّم control structures، دوال مُضمَّنة built-in functions، والمزيد من ذلك، ويُمكن استخدامه في scripts لتنسيق النصوص بطريقة مقروءة بسهولة.</p><p dir="rtl">ولتعلّم المزيد حول كيفيّة العمل مع awk تحقّق من الموارد الكبيرة له على الإنترنت، واقرأ عن gawk وهو إصدار GNU من awk الموجود على توزيعات لينِكس الحديثة.</p><p dir="rtl">ترجمة -وبتصرّف- لـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-the-awk-language-to-manipulate-text-in-linux">How To Use the AWK language to Manipulate Text in Linux</a> لصاحبه Justin Ellingwood.</p>
]]></description><guid isPermaLink="false">133</guid><pubDate>Thu, 05 Nov 2015 21:42:17 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; Systemd: &#x627;&#x644;&#x639;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x62E;&#x62F;&#x645;&#x627;&#x62A;&#x60C; &#x627;&#x644;&#x648;&#x62D;&#x62F;&#x627;&#x62A; Units&#x60C; &#x648;&#x627;&#x644;&#x64A;&#x648;&#x645;&#x64A;&#x627;&#x62A; Journal</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-systemd-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-units%D8%8C-%D9%88%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A7%D8%AA-journal-r130/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/systemd.png.a39ea36e100d4033007b9bdf8a2e8ce4.png" /></p>

<p dir="rtl">
	شهدت السنوات الأخيرة انتقال توزيعات لينِكس على نحو متزايد من أنظمة init الأخرى إلى <strong>systemd</strong>، تُوفِّر مجموعة أدوات systemd نموذج init مرن وسريع لإدارة الجهاز بشكل كامل من الإقلاع boot فصاعدًا.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/systemd.png.ec7677984e0c07c1902714613a8b860d.png" data-fileid="6773" rel="external"><img alt="systemd.png" class="ipsImage ipsImage_thumbnailed" data-fileid="6773" src="https://academy.hsoub.com/uploads/monthly_2015_11/systemd.thumb.png.b2df3d0f4b495fd6b506130e544c1ee1.png"></a>
</p>

<p dir="rtl">
	سنقوم في هذا الدرس بالمرور بشكل سريع على أهم الأوامر التي نحتاج معرفتها لإدارة خادوم يحتوي على systemd، ينبغي أن يعمل هذا على أي خادوم يُطبِّق systemd (أي إصدار نظام تشغيل يساوي أو أعلى من Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15). فلنبدأ الآن.
</p>

<h2 dir="rtl" id="إدارة-الوحدة-بشكل-أساسي-Basic-Unit-Management">
	إدارة الوحدة بشكل أساسي Basic Unit Management
</h2>

<p dir="rtl">
	الشيء الأساسي الذي يديره systemd ويعمل عليه هو الوحدة “unit”، يُمكن أن تكون الوحدات من عدّة أنواع، ولكن النّوع الأشيع هو الخدمة service (يتبيّن ذلك من ملف الوحدة الذي ينتهي بـ .service)، ولإدارة الخدمات على خادوم يحتوي systemd فإنّ أداتنا الرئيسيّة هي الأمر systemctl.
</p>

<p dir="rtl">
	تمتلك جميع أوامر نظام init الاعتياديّة إجراءات مُكافِئة مع الأمر <strong>systemctl</strong>، سنستخدم الوحدة <span style="font-family:courier new,courier,monospace;">nginx.service</span> للتوضيح (يجب علينا تثبيت Nginx باستخدام مُدير الحِزَم للحصول على ملف الخدمة هذا).
</p>

<p dir="rtl">
	نستطيع على سبيل المثال تشغيل الخدمة بكتابة ما يلي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl start nginx.service</pre>

<p dir="rtl">
	نستطيع إيقافها مرّة أخرى بكتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl stop nginx.service</pre>

<p dir="rtl">
	ولإعادة تشغيل الخدمة نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl restart nginx.service</pre>

<p dir="rtl">
	ولمحاولة إعادة تحميل reload الخدمة بدون مقاطعة الوظيفة الطبيعيّة نكتب ما يلي:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl reload nginx.service</pre>

<h2 dir="rtl">
	تمكين أو تعطيل الوحدات
</h2>

<p dir="rtl">
	لا يتم بشكل افتراضي تشغيل معظم ملفّات وحدات systemd تلقائيًّا عند الإقلاع، ولإعداد هذه الوظيفة نحتاج لتمكين “enable” الوحدة، والذي يقوم بتعليقها بخطافة hook إلى هدف “target” إقلاع مُعيَّن ممّا يُسبِّب تحفيز تشغيلها عند بدء تشغيل الهدف.
</p>

<p dir="rtl">
	لتمكين خدمة من البدء تلقائيًّا عند الإقلاع نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl enable nginx.service</pre>

<p dir="rtl">
	إن كُنّا نرغب بتعطيل الخدمة مرّة أخرى نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl disable nginx.service</pre>

<h2 dir="rtl">
	الحصول على لمحة عامة عن حالة النظام
</h2>

<p dir="rtl">
	هناك قدر كبير من المعلومات التي يمكننا استخلاصها من خادوم systemd للحصول على لمحة عامّة عن حالة النّظام.
</p>

<p dir="rtl">
	على سبيل المثال للحصول على كافّة ملفّات الوحدات التي يعرضها systemd على أنّها نشطة “active” نكتب ما يلي (نستطيع فعليًّا ألّا نكتب list-units لأنّه سلوك systemctl الافتراضي):
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-units</pre>

<p dir="rtl">
	ولعرض جميع الوحدات التي قام systemd بتحميلها أو حاول تحميلها إلى الذّاكرة بما في ذلك الخدمات غير النشطة حاليًّا نُضيف المحوِّل switch الذي يُدعى <span style="font-family:courier new,courier,monospace;">all--</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-units --all</pre>

<p dir="rtl">
	لعرض جميع الوحدات المُثبَّتة على النّظام بما في ذلك الوحدات التي لم يحاول systemd أن يُحمّلها إلى الذاكرة نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-unit-files</pre>

<h2 dir="rtl">
	عرض معلومات السجل Log الأساسية
</h2>

<p dir="rtl">
	يجمع ويدير المُكوِّن في systemd الذي يُدعى journald المُدخلات اليوميّة journal entries من كافّة أجزاء النّظام.
</p>

<p dir="rtl">
	وهي بالأساس معلومات السّجلات من التطبيقات والنواة kernel.
</p>

<p dir="rtl">
	ولمشاهدة جميع مُدخلات السّجلات بدءًا من المُدخَل الأقدم نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
journalctl</pre>

<p>
	سيظهر لنا هذا افتراضيًّا المُدخلات من الإقلاعات السّابقة والحاليّة إن تمّ إعداد journald ليحفظ سجلّات records الإقلاع السّابق، تُمكِّن بعض التوزيعات هذا الأمر افتراضيًّا بينما لا تقوم توزيعات أخرى بتمكينه (ولتمكينه إمّا نُحرِّر الملف <span style="font-family:courier new,courier,monospace;">etc/systemd/journald.conf/</span> ونُعيِّن الخيار <span style="font-family:courier new,courier,monospace;">Storage=</span> إلى مستمر "persistent" أو نُنشِئ الدّليل persistent بكتابة <span style="font-family:courier new,courier,monospace;"><strong>sudo mkdir -p /var/log/journal</strong></span>).
</p>

<p dir="rtl">
	إن كُنّا نرغب برؤية المُدخلات اليوميّة فقط من الإقلاع الحالي نُضيف العَلَم <span style="font-family:courier new,courier,monospace;">b-</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
journalctl -b</pre>

<p dir="rtl">
	ولمشاهدة رسائل النواة فقط، مثل تلك التي تكون ممثلة عادةً بواسطة dmesg، نستطيع استخدام العَلَم <span style="font-family:courier new,courier,monospace;">k-</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
journalctl -k</pre>

<p dir="rtl">
	مرةً أخرى، نستطيع تحديد الأمر السّابق ليكون فقط للإقلاع الحالي بإضافة العَلَم <span style="font-family:courier new,courier,monospace;">b-</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
journalctl -k -b</pre>

<h2 dir="rtl">
	الاستعلام عن سجلات وحالات الوحدة
</h2>

<p dir="rtl">
	بينما تُمكّننا الأوامر السّابقة من الوصول إلى الحالة العامّة للنظام، فنستطيع أيضًا الحصول على معلومات حول حالة الوحدات بشكلٍ فردي.
</p>

<p dir="rtl">
	يُستخدم الخيار <span style="font-family:courier new,courier,monospace;">status</span> مع الأمر systemctl للحصول على لمحة عامّة عن الحالة الحاليّة للوحدة، يُظهر لنا هذا الأمر إذا ما كانت الوحدة نشطة، معلومات حول العمليّة process، وآخر المُدخلات اليوميّة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl status nginx.service</pre>

<p dir="rtl">
	لمشاهدة كافّة المُدخلات اليوميّة للوحدة التي نسأل عنها نضيف الخيار –u مع اسم الوحدة إلى الأمر <span style="font-family:courier new,courier,monospace;">journalctl</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
journalctl -u nginx.service</pre>

<p dir="rtl">
	ونستطيع كالعادة تحديد المُدخلات للإقلاع الحالي فقط بإضافة العَلَم <span style="font-family:courier new,courier,monospace;">b-</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
journalctl -b -u nginx.service</pre>

<h2 dir="rtl">
	فحص الوحدات وملفات الوحدات
</h2>

<p dir="rtl">
	نعرف حتى الآن كيفيّة تعديل حالة وحدة ما بواسطة تشغيلها أو إيقافها، ونعلم كيف نشاهد معلومات اليوميّات journal والحالة لأخذ فكرة عمّا يحدث مع العمليّة، ومع ذلك لم نتعلّم كيفيّة فحص inspect جوانب أخرى للوحدات وملفّات الوحدات.
</p>

<p dir="rtl">
	يحتوي ملف الوحدة المُعامِلات parameters التي يستخدمها systemd لإدارة وتشغيل الوحدة، ولمشاهدة المحتويات الكاملة لملف الوحدة نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl cat nginx.service</pre>

<p dir="rtl">
	ولرؤية شجرة الاعتماديّات dependency tree لوحدة ما (والتي تحاول وحدات systemd تفعيلها عند بدء تشغيل الوحدة) نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-dependencies nginx.service</pre>

<p dir="rtl">
	يُظهر لنا هذا الأمر الوحدات المعتمدة مع توسيع expand الوحدات الهدف target بشكل تكراري recursively، ولتوسيع كافّة الوحدات المعتمدة بشكل تكراري نُمرِّر العَلَم <span style="font-family:courier new,courier,monospace;">all--</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-dependencies --all nginx.service</pre>

<p dir="rtl">
	وأخيرًا نستخدم الخيار <span style="font-family:courier new,courier,monospace;">show</span> لمشاهدة التفاصيل ذات المستوى المُنخفض low-level لإعدادات الوحدة على النّظام:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl show nginx.service</pre>

<p dir="rtl">
	يُعطينا هذا الأمر قيمة كل مُعامِل تتم إدارته بواسطة systemd.
</p>

<h2 dir="rtl">
	تعديل ملفات الوحدة
</h2>

<p dir="rtl">
	إن كُنّا نحتاج للقيام بتعديلات على ملف الوحدة فيسمح لنا systemd بالقيام بالتغييرات من خلال الأمر systemctl بنفسه بدون أن نضطر للذهاب إلى موقع الملف الفعلي على القرص.
</p>

<p dir="rtl">
	لإضافة مقطع snippet لملف الوحدة، والذي يُمكن استخدامه لإلحاق append أو تجاوز override إعدادات في ملف الوحدة الافتراضي، نستدعي ببساطة الخيار <span style="font-family:courier new,courier,monospace;">edit</span> على الوحدة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl edit nginx.service</pre>

<p dir="rtl">
	وإن كُنّا نرغب بتعديل كامل محتوى ملف الوحدة بدلًا من إنشاء مقطع، نُمرَّر العَلَم --full:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl edit --full nginx.service</pre>

<p dir="rtl">
	يجب بعد الانتهاء من تعديل ملف الوحدة إعادة تحميل العمليّة systemd نفسها لكي تلتقط تغييراتنا:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl daemon-reload
</pre>

<h2 dir="rtl">
	استخدام الأهداف targets (مستويات التشغيل Runlevels)
</h2>

<p dir="rtl">
	ومن الوظائف الأخرى لنظام init نقل الخادوم نفسه بين حالات مختلفة، تُشير أنظمة init التقليديّة لهذا الأمر باسم مستويات التشغيل "runlevels" ممّا يسمح للنظام بأن يكون في مستوى تشغيل runlevel واحد فقط بنفس الوقت.
</p>

<p dir="rtl">
	يتم في systemd استخدام الأهداف targets بدلًا من ذلك، والتي هي بشكل أساسي نقاط تزامن يستطيع الخادوم استخدامها لنقل نفسه إلى حالة مُحدّدة، يُمكن أن يتم ربط الخدمة وملفّات الوحدة الأخرى إلى هدف، ويُمكن للأهداف المتعددة أن تكون نشطة في الوقت نفسه.
</p>

<p dir="rtl">
	ولرؤية كل الأهداف المتاحة على نظامنا نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-unit-files --type=target</pre>

<p dir="rtl">
	لمشاهدة الهدف الافتراضي الذي يحاول <strong>systemd</strong> الوصول إليه عند الإقلاع (والذي بدوره يقوم بتشغيل كافّة ملفّات الوحدة التي تُشكّل شجرة الاعتماديّات لهذا الهدف) نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl get-default</pre>

<p dir="rtl">
	نستطيع تغيير الهدف الافتراضي الذي سيتم استخدامه عند الإقلاع باستخدام الخيار <span style="font-family:courier new,courier,monospace;">set-default</span>:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl set-default multi-user.target</pre>

<p dir="rtl">
	نكتب ما يلي لكي نرى ما هي الوحدات المرتبطة بالهدف:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
systemctl list-dependencies multi-user.target</pre>

<p dir="rtl">
	يمكننا تعديل حالة النظام للانتقال بين الأهداف عن طريق الخيار <span style="font-family:courier new,courier,monospace;">isolate</span>، سيقوم هذا بإيقاف تشغيل أيّة وحدات غير مرتبطة بالهدف المحدّد، ويجب أن نكون متأكدين من أنّ الهدف الذي نقوم بعزله isolate لا يوقف تشغيل أيّة خدمات أساسيّة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl isolate multi-user.target</pre>

<h2 dir="rtl">
	إيقاف تشغيل أو إعادة تشغيل الخادوم
</h2>

<p dir="rtl">
	هنالك بعض الاختصارات المتاحة لبعض الحالات الرئيسيّة التي يستطيع النّظام الانتقال إليها، على سبيل المثال لإيقاف تشغيل خادومنا نكتب:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl poweroff</pre>

<p dir="rtl">
	إن كُنّا بدلًا من ذلك نريد إعادة تشغيل النظام فبإمكاننا فعل ذلك بكتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl reboot</pre>

<p dir="rtl">
	نستطيع الإقلاع في وضع الإنقاذ rescue mode بكتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo systemctl rescue</pre>

<p dir="rtl">
	لاحظ أنّ معظم أنظمة التشغيل تقوم بتضمين كنيات aliases تقليديّة لهذه العمليّات بحيث أنّنا نستطيع ببساطة كتابة:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo poweroff </pre>

<p dir="rtl">
	أو
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
sudo reboot </pre>

<p dir="rtl">
	بدون systemctl، ومع ذلك ليس من المضمون أن يكون هذا مُعدًّا على كل الأنظمة.
</p>

<h2 dir="rtl">
	الخطوات التالية
</h2>

<p dir="rtl">
	ينبغي أن نكون الآن قد تعلّمنا أساسيّات إدارة خادوم يستخدم <strong>systemd</strong>، ومع ذلك هناك المزيد لتعلمّه مع توسّع احتياجاتنا، توجد أدناه روابط دروس تحتوي معلومات أكثر تفصيلًا حول بعض المُكوّنات التي ناقشناها في هذا الدّرس:
</p>

<ul dir="rtl">
<li>
		كيفيّة استخدام Systemctl لإدارة خدمات ووحدات Systemd.
	</li>
	<li>
		<a name="_GoBack" rel="external"></a> كيفيّة استخدام Journalctl لعرض سجلّات Systemd والتعامل معها.
	</li>
	<li>
		فهم وحدات وملفّات وحدات Systemd.
	</li>
</ul>
<p dir="rtl">
	نستطيع من خلال تعلّم كيفيّة الاستفادة من قوّة نظام init لدينا أن نتحكّم بحالة أجهزتنا وإدارة خدماتنا وعمليّاتنا بشكل أسهل.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- لـ <a href="https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal" rel="external nofollow">Systemd Essentials: Working with Services, Units, and the Journal</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">130</guid><pubDate>Wed, 04 Nov 2015 23:41:00 +0000</pubDate></item></channel></rss>
