<?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/9/?d=4</link><description>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</description><language>ar</language><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62D;&#x632;&#x64A;&#x645; &#x648;&#x62A;&#x648;&#x632;&#x64A;&#x639; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AD%D8%B2%D9%8A%D9%85-%D9%88%D8%AA%D9%88%D8%B2%D9%8A%D8%B9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r106/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/python-package.png.401c299a7fdb619694e740524437d414.png" /></p>

<p>إنّ كل مكتبات بايثون (مثل حزم التّطبيقات application packages) التي نقوم بتنزيلها باستخدام مدير الحزم package manager (مثل pip) يتمّ توزيعها باستخدام أداة مساعدة مُخصصة لهذا العمل، تقوم هذه الأدوات المساعدة بإنشاء توزيعات بايثون Python distributions والتي هي أساسا عبارة عن ملفات أرشيف مرقمة بإصدار ومضغوطة، تحتوي هذه الملفّات على جميع العناصر المتعلقة بما يتم توزيعه، مثل ملفات المصادر source files وملفات الموارد resource files.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/python-package.png.55d84f891138c7e0f3611d46f4e89b55.png"><img data-fileid="4899" class="ipsImage ipsImage_thumbnailed" alt="python-package.thumb.png.438cd403af1da58" src="https://academy.hsoub.com/uploads/monthly_2015_09/python-package.thumb.png.438cd403af1da58149519344c0491cf8.png"></a></p><p>سنقوم في هذا الدرس بالتحدث عن الأدوات الضرورية للتوزيع، وسنتطرق إلى الخطوات الأساسية التي تسمح لنا بحزم المكتبات المفيدة الخاصة بنا، الوحدات modules، أو حتى التطبيقات applications والتي ستكون مفيدة لنا عند توزيع المشروع الخاص بنا على خادوم أو مشاركته على الإنترنت.</p><h2>توزيعات وحزم بايثون</h2><p>حتى ولو كنا قد عملنا قليلًا فقط مع بايثون، فنحن متآلفون مع مفهوم استخدام مدير الحزم (مثل pip ،easy_install) لتنزيل الوحدات والمكتبات (مثل هياكل تطوير التطبيقات application development frameworks) والتي يتم بعدها استيرادها واستخدامها لإنشاء واحدة جديدة.</p><p>تقوم أدوات إدارة الحِزَم هذه -والتي تعمل محليا- بالاتصال إلى مصدر بعيد source (مثل دليل حزم بايثون Python Package Index – PyPI) وتنفيذ الإجراء المطلوب (كالبحث والتنصيب).</p><p>تتكوّن طريقة توزيع تطبيق ما من تغليف الدليل directory الخاص به ببعض الملفّات الضّروريّة (مع القليل من الملفّات المُوصى بها)، تحديد العناصر المرتبطة (كالموارد resources والاعتماديات dependencies، إلخ) وإصدارها أو استخدامها في مكان آخر ببساطة.</p><p><strong>ملاحظة</strong>: نشجعك بشدة على العمل على بيئات افتراضيّة لعزل تنزيلات بايثون، الوحدات والتطبيقات التي تعمل عليها.</p><h3>1. حزم بايثون</h3><p>الحزمة في بايثون هي تقنيا عبارة عن دليل قابل للاستيراد (باستخدام <code>init__.py</code><span style="font-family: monospace; line-height: 12.8px;">__</span> ) يحتوي على ملفات المصادر (كالوحدات)، ولا يجب الخلط بينها وبين حزم نظام التشغيل والتي هي تقنيًّا تطبيقات فعلية (مثل حزمة Debian)، ومع ذلك يجب أن نُلاحظ أنّ توزيعات بايثون في الواقع تدعى أيضًا بالحزم.</p><p>مثال على بنية الحِزمة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">package
 |
 |-- __init__.py</pre><h3>2. تطبيقات بايثون</h3><p>على الرّغم من أنّه يُمكننا اعتبار أي شيء في بايثون كتطبيق وذلك ابتداء من ملف واحد وحتى مئات الملفات المُبعثرة عبر الحزم المُختلفة، فإنّ التطبيق في أغلب الحالات الواقعيّة يتكوّن من العديد من الوحدات والبعض من الاستيرادات الخارجيّة (من المكتبات).</p><p>مثال على بنية التّطبيق:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">myapp
|
|-- __init__.py
|-- amodule.py
|-- anothermod.py
|__ tests
|     |
|     |-- __init__.py
|     |-- ..
|     |-- .
| ..</pre><h3>3. مكتبات وأدوات توزيع بايثون</h3><p>نظرا لطبيعة شعبية لغة بايثون ووجود كميّة وافرة من مكتبات وتطبيقات الطرف الثالث third-party المكتوبة لأجلها فقد كان من الضّروري دوما إيجاد طريقة مُوحّدة وأبسط لتوزيعها، تُوجد العديد من المكتبات والأدوات المختلفة المُستخدمة لإنشاء توزيعات بايثون.</p><p>تمّ إنشاء مجموعة الأدوات المساعدة لتوزيع بايثون والتي تدعى <code>distutils </code>من أجل التعامل مع مهام التوزيع.</p><h3>4. دليل حزم بايثون (Python Package Index (PyPI</h3><p>دليل حزم بايثون أو PyPI هو مستودع مركزي (على الإنترنت Online) للمشاريع (توزيعات بايثون)، حيث تستخدم أدوات إدارة الحِزم مثل pip هذا المستودع من أجل استضافة، إيجاد وتثبيت الحِزَم.</p><h2>البدء</h2><p>فلنقم في البداية بإنشاء تطبيق بايثون بسيط وعام باستخدام إطار العمل المصغّر <a rel="external nofollow" href="http://flask.pocoo.org/">flask</a> (إنشاء البنية) والذي يُمكننا لاحقًا تحزيمه.</p><p>التطبيق عبارة عن تطبيق ويب بسيط جدا، ﻷن الهدف من الدرس هو كيفية التحزيم وليس التطبيق في حد ذاته.</p><h2>إنشاء بنية التطبيق</h2><p>نهدف إلى إنشاء مثال يشابه معظم مشاريع العالم الحقيقي، ولهذا من الأفضل أن نتخيّل حالة تحتوي على وحدات.<br>بُنية المثال:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">/MyApplication
|-- run.py
|-- config.py
|__ /app
     |-- __init__.py
     |-- /module_one
         |-- __init__.py
         |-- controllers.py
         |-- models.py                
     |__ /templates
         |-- module_one
             |-- hello.html
     |__ /static
     |__ ..
     |__ .</pre><h3>1. إنشاء المجلدات:</h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">/MyApplication
|-- run.py
|-- config.py
|__ /app
     |-- __init__.py
     |-- /module_one
         |-- __init__.py
         |-- controllers.py
         |-- models.py                
     |__ /templates
         |-- module_one
             |-- hello.html
     |__ /static
     |__ ..
     |__ .</pre><h3>2. تعديل الملف <code>run.py</code> باستخدام برنامج nano:</h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano ~/MyApplication/run.py</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint"># Run a test server.
from app import app
app.run(debug=True)</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <code>CTRL+X</code> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><h3>3. تعديل الملف <code>config.py</code> باستخدام برنامج nano:</h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano ~/MyApplication/config.py</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">DEBUG = True
THREADS_PER_PAGE = 4
CSRF_ENABLED     = True
CSRF_SESSION_KEY = "secret"</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <code>CTRL+X</code> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><h3>4. تعديل الملف <code>app/init.py</code> باستخدام برنامج nano:</h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano ~/MyApplication/app/__init__.py</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">from flask import Flask, render_template

app = Flask(__name__)
app.config.from_object("config")

from app.module_one.controllers import module_one
app.register_blueprint(module_one)
</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <span style="font-family:courier new,courier,monospace;"><code>CTRL+X</code></span> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><h3>5. تعديل الملف <code>app/module_one/controllers.py</code> باستخدام برنامج nano:</h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano app/module_one/controllers.py</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">from flask import Blueprint, request, render_template

module_one = Blueprint("auth", __name__, url_prefix="/auth")

@module_one.route("/hello")
def hello():
    return render_template("module_one/hello.html")</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <code>CTRL+X</code> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><h3>6. تعديل الملف <code>app/templates/module_one/hello.html</code> باستخدام برنامج nano:</h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano app/templates/module_one/hello.html</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">&lt;DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;title&gt;{% block title %}My Site{% endblock %}&lt;/title&gt;
    {% block css %}
    {% endblock %}
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
 &lt;/head&gt;
&lt;body&gt;
    Hello, world!
&lt;/body&gt;
&lt;/html&gt;</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <code>CTRL+X</code> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><h2>البدء بتوزيع وحزم التطبيق</h2><p>بعد إنشاء بنية التطبيق المثالية لموقع ويب يستخدم flask، نستطيع المتابعة بالقيام بالخطوة الأولى في إعداد التوزيعة.</p><h3>1. تبديل بنية المجلد</h3><p>من أجل حَزْم تطبيقنا بشكل جيّد نحتاج للقيام ببعض الإضافات لبُنية مجلّدنا.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">/MyApplication
|-- run.py
|__ /app
     |-- __init__.py
     |-- /module_one
         |-- __init__.py
         |-- controllers.py
         |-- models.py                
     |__ /templates
         |-- module_one
             |-- hello.html
     |__ /static
     |__ ..
     |__ .
|-- setup.py    # Distribution setup file
|-- README.txt  # Read-me file
|-- MANIFEST.in # Distribution manifest file
|-- CHANGES.txt # Changes log</pre><p>فلنقم بتبديل بنية المجلد لإنشاء الملفات الضروريّة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">touch ~/MyApplication/setup.py
touch ~/MyApplication/README.py
touch ~/MyApplication/MANIFEST.py
touch ~/MyApplication/CHANGES.py
mv    ~/MyApplication/run.py ~/MyApplication/bin/run</pre><h3>2. إنشاء الملف <code>setup.py</code></h3><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano ~/MyApplication/setup.py</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">from distutils.core import setup

setup(
# Application name:
name="MyApplication",

# Version number (initial):
version="0.1.0",

# Application author details:
author="name surname",
author_email="name@addr.ess",

# Packages
packages=["app"],

# Include additional files into the package
include_package_data=True,

# Details
url="http://pypi.python.org/pypi/MyApplication_v010/",

#
# license="LICENSE.txt",
description="Useful towel-related stuff.",

# long_description=open("README.txt").read(),

# Dependent packages (distributions)
install_requires=[
    "flask",
],
)</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <code>CTRL+X</code> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><h3>3. إنشاء الملف <code>MANIFEST.in</code></h3><p>إن كنا نحتاج إلى شحن دلائل إضافية (ثابتة static أو قوالب templates) يجب علينا التصريح عنها في <code>manifest</code> لكي يتمّ حَزْمها، سنقوم بفعل هذا في <code>MANIFEST.in</code>.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano ~/MyApplication/MANIFEST.in</pre><p>نضع المحتويات التّالية بداخله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">recursive-include app/templates *
recursive-include app/static *</pre><p>نقوم الآن بحفظه والخروج منه باستخدام <code>CTRL+X</code> ومن ثم تأكيد ذلك باستخدام <code>Y</code>.</p><p>هذا هو كل ما نحتاجه ، الآن حِزمة توزيعة بايثون جاهزة ليتمّ تثبيتها وشحنها.</p><h3>4. ملفات إضافية</h3><p>يجب دومًا أن نتذكّر أنّه من أجل الحصول على توزيعة كاملة يجب أن يكون الملف/الدليل محتويًا على الملفّات التالية ومربوطًا بها:</p><ul><li><code>README.txt</code></li><li><code>MANIFEST.in</code></li><li><code>LICENSE.txt</code></li></ul><h2>التعامل مع التطبيق الجاهز للتوزيع</h2><p>بعد أن انتهينا من إنشاء تطبيقنا ومن ثم أجرينا التبديلات الضرورية لبنية الملف لتحضيره لبناء توزيعة لا تحتوي على أيّة أخطاء، نستطيع الآن البدء بالمرور على عمليّات الحَزْم.</p><h3>1. كيف نقوم بإنشاء ملف التوزيع</h3><p>من أجل توليد نسخة ملف التوزيع، نقوم بتنفيذ الأمر التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">cd     ~/MyApplication
python setup.py sdist</pre><p>سيذهب هذا الأمر إلى إعداداتنا، يطبع العمليات التي يتمّ تنفيذها ويُوَلِّد ملف أرشيف tar داخل الدليل الجديد <code>diet</code>، مشابهًا لما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint"># root@hostname:~/MyApplication# ls dist
# MyApplication-0.1.0.tar.gz</pre><p><strong>ملاحظة</strong>: بما أنّنا لم نقم بتأهيل جميع المجلدات الفرعية (مثل static) وتعاملنا مع ملفات إضافية (مثل <code>README.txt</code>)، فقد نحصل على بعض التحذيرات أثناء عمليّة الإنشاء.</p><h3>2. كيفية تثبيت التطبيق</h3><p>يستطيع الآخرون من الآن فصاعدًا تثبيت واستخدام التّطبيق باستخدام ملف <code>setup.py</code> الذي أنشأناه.</p><p>من أجل تثبيت التطبيق نقوم بتنفيذ الأوامر التالية:</p><pre style="line-height: 12.8px;" data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">python setup.py install</pre><p>إن كان هذا التثبيت من أجل التطوير وأردنا تثبيت المُتطلّبات سنقوم بتنفيذ ما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">python setup.py develop</pre><h3>3. كيفية مشاركة التطبيق</h3><p>إن أردنا مشاركة الشيفرة على دليل حِزَم بايثون، نستطيع فعل ذلك عن طريق بدء الإجراء <code>register</code> كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">python setup.py register</pre><p>نستطيع إكمال هذا الإجراء عبر اتّباع التّعليمات التي تظهر على الشّاشة.</p><p>وإن كنّا نملك تسجيل دخول مسجل registered login من أجل الرفع Upload فقط نستطيع استخدام الأمر التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">python setup.py sdist upload</pre><h3>4. كيفية إنشاء حزم من الإصدارات الجديدة للتطبيق</h3><ol><li>نقوم بتحرير الملف <code>setup.py</code> عن طريق مُحرّر نصوص (مثل <code>nano</code>) وتعيين رقم الإصدار الجديد "<code>version="0.1.1</code>.</li><li>نقوم بتحرير الملف <code>CHANGES.txt</code> لنعكس التغييرات.</li><li>نقوم بإجراء التّعديلات الضّروريّة على الملفين <code>LICENSE.txt</code> و <code>README.txt</code>.</li><li>رفع الشّيفرة بعد الخطوة السّابقة.</li></ol><p>ترجمة -وبتصرّف- لـلمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-package-and-distribute-python-applications">How To Package And Distribute Python Applications</a> لصاحبه O.S. Tezer.</p><p>حقوق الصورة البارزة: <a rel="external nofollow" href="http://www.freepik.com/free-vector/vectors_796124.htm">Designed by Freepik</a>.</p>
]]></description><guid isPermaLink="false">106</guid><pubDate>Fri, 18 Sep 2015 16:08:38 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x641;&#x639;&#x64A;&#x644; &#x62D;&#x635;&#x635; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x64A;&#x646; &#x648;&#x627;&#x644;&#x645;&#x62C;&#x645;&#x648;&#x639;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%81%D8%B9%D9%8A%D9%84-%D8%AD%D8%B5%D8%B5-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-r99/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/linux-qutoa.png.f348f23b2985b4f7852b0c260242ece4.png" /></p>

<p>يفترض هذا الدرس أنّك قد قمتَ بالفعل بإنشاء خادوم افتراضي خاصّ (VPS) وإضافة العديد من حسابات المستخدمين إليه. يتم تطبيق نظام الحصص (Quotas) في غالب الأحيان على مستخدمي FTP أو SFTP، ولكن من الممكن أيضًا تطبيقه على أيّ مستخدم على النظام. لاحظ أنّه من غير الممكن استخدام ميّزة المستخدم الوهمي (virtual user) عبر VSFTP، لأنّ المستخدمين لا يجب أن يكونوا موجودين على النظام أصلًا.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_08/linux-qutoa.png.bf6d22f3620cafeefaaf5caf015473a4.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3926" src="https://academy.hsoub.com/uploads/monthly_2015_08/linux-qutoa.thumb.png.4a9218213d77c73adeaa889a32367c4a.png" class="ipsImage ipsImage_thumbnailed" alt="linux-qutoa.thumb.png.4a9218213d77c73ade"></a></p><p>يتم استخدام الحصص لتقييد المساحة التي يمكن لمستخدم أو مجموعة أن يستخدمها على الخادوم. هناك عادةً طريقتان لإدارة الحصص: الأولى عبر إنشاء نظام ملفّاتٍ فارغ خاصّ بمستخدمٍ معيّن ومن ثمَّ ضمّه (mount) إلى النظام. ميّزة هذه الطريقة هي أنّك لا تحتاج تثبيت أيّ حزمة إضافية خارجية. والطريقة الثانية هي عبر استخدام أداة لإدارة الحصص وتنظيمها. ميّزة هذه الطريقة هي إمكانية تغيير الحصص بسهولة بدون الحاجة إلى القيام بأيّ تغييراتٍ معقّدة على نظام الملفّات.</p><h2>تثبيت Quota</h2><p>سنبدأ العملية عبر تثبيت برنامج <span style="font-family:courier new,courier,monospace;">quota</span>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">apt-get install quota</pre><p>يجب أن يتم تعديل خيارات الضمّ (mount) الخاصّة بنظام الملفّات قبل أن نتمكّن من استخدام الحصص. يجب أن نفتح ملفّ <span style="font-family:courier new,courier,monospace;">fstab</span> ونقوم بتعديله عبر الأمر التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo nano /etc/fstab</pre><p>يتم تفعيل الحصص عبر إضافة <span style="font-family:courier new,courier,monospace;">usrquota</span> و/أو <span style="font-family:courier new,courier,monospace;">grpquota</span> إلى خيارات الضمّ للقرص الصلب الرئيسي. عند استخدام <span style="font-family:courier new,courier,monospace;">usrquota</span>، فإنّه سيتم تفعيل الحصص على مستخدمين معيّنين فقط، بينما يسمح خيار <span style="font-family:courier new,courier,monospace;">grpquota</span> بتفعيل نظام الحصص لمجموعات معيّنة.</p><p>يمكن إضافة الخيارين بشكلٍ منفصل بناء على النتيجة التي تريد الوصول إليها. يجب أن يتم تعديل ملفّ <span style="font-family:courier new,courier,monospace;">fstab</span> كالتالي لتفعيل نظام الحصص على حسابات المستخدمين (إذا كنتَ تريد تفعيل نظام الحصص على المجموعات، فقم بإضافة <span style="font-family:courier new,courier,monospace;">grpquota</span>):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">LABEL=DOROOT  / ext4  errors=remount-ro,usrquota  0 1</pre><p>احفظ الملفّ وقم بتفعيل خيارات الضمّ الجديدة عبر إعادة ضمّ نظام الملفّات بالأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">mount -o remount /</pre><p>سيقوم الأمر التالي بإنشاء ملفّ حصص جديد في مسار الجذر الخاصّ بنظام الملفّات. سيكون هذا الملفّ عبارةً عن ملف فهرس يتم استخدامه بواسطة نظام الحصص لإدارة حجم حصّة كلّ مستخدم من مساحة القرص. يحتوي الملفّ أيضًا على تقييدات المستخدمين والإعدادات المضبوطة.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">quotacheck -cum /</pre><p>يتألّف الأمر من المُعامِلات الثلاثة التالية:</p><ul><li>يقوم المُعامِل c بالإشارة إلى ضرورة إنشاء ملفٍّ جديد، وسيقوم بالكتابة فوقه في حال كان موجودًا مسبقًا.</li><li>يشير المُعامِل u إلى أنّه يجب إنشاء ملفّ فهرس جديد للمستخدمين. لإنشاء ملفّ فهرس للمجموعات كذلك، قم بإضافة المُعامِل g في الأمر السابق.</li><li>وأخيرًا يحدد المُعامِل m أنّه ليس هناك حاجة إلى القيام بعمليّة ضمّ بوضع القراءة فقط لنظام الملفّات بأكمله لإنشاء ملفّات الفهارس.</li></ul><p>بسبب استخدام المُعامِل m، فإنّه من الممكن أن يحصل عدم تطابق صغير بين الحجم الذي قمتَ بتحديده لحصّة مساحة المستخدم وبين الحجم الذي سيتم استخدامه بالفعل من قبل برنامج <span style="font-family:courier new,courier,monospace;">quota</span>. تأكّد من أنّه لا يوجد مستخدم يقوم حاليًا برفع الملفّات إلى الخادوم عند تطبيق الأمر السابق لتقليل حجم الفرق.</p><p>يقوم الأمر التالي بتفعيل نظام الحصص على نظام الملفّات المطلوب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">quotaon /</pre><p>يمكن استخدام أمرٍ مشابه لتعطيل نظام الحصص بأكمله:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">quotaoff</pre><h2>إعداد الحصص المختلفة لحسابات المستخدمين</h2><p>يمكن إعداد الحصص باستخدام الأمر <span style="font-family:courier new,courier,monospace;">edquota</span> متبوعًا باسم المستخدم أو اسم المجموعة. سيقوم الأمر بفتح محرر الملفّات الافتراضي، في درسنا هذا، سنفترض أنّ المستخدم <span style="font-family:courier new,courier,monospace;">ftpuser</span> يجب أن يتم تخصيص مساحة 10ميغابت له. الأمر الذي سنستخدمه هو هذا:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">edquota ftpuser</pre><p>والذي سيقوم بفتح الملفّ للتعديل:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">Disk quotas for user ftpuser (uid 1001):
Filesystem                   blocks       soft       hard     inodes     soft     hard
/dev/disk/by-label/DOROOT         8      10000      10240          2        0        0</pre><p>يعرض محرر النصوص 7 أعمدة مختلفة:</p><ol><li>يحدد اسم نظام الملفّات الذي تمّ تفعيل نظام الحصص عليه.</li><li>يحدد حجم الكُتَل (Blocks) المُستخدمة حاليًا من قبل المستخدم.</li><li>يحدد حدّ <strong>soft block</strong> للمستخدم على نظام الملفّات.</li><li>يحدد حدّ <strong>hard block</strong> للمستخدم على نظام الملفّات.</li><li>يحدد عدد عُقَد inodes المُستخدمة حاليًا بواسطة المستخدم.</li><li>يحدد حدّ soft inode للمستخدم على نظام الملفّات.</li><li>يحدد حدّ hard inode للمستخدم على نظام الملفّات.</li></ol><p>تشير الكُتَل (Blocks) إلى حجم المساحة التي يجب استخدامها، بينما تشير الـinodes إلى عدد الملفّات/المجلّدات التي يمكن استخدامها. عادةً ما يتم استخدام حجم الكتلة في برنامج quota.</p><p>حدّ hard block هو المساحة القصوى من القرص الصلب التي يمكن لمستخدم أو مجموعة استخدامها. بمجرّد الوصول إلى هذا الحدّ، فلن يتم استخدام أيّ مساحة إضافية من على القرص الصلب. يُعرِِّف حدّ soft block أيضًا أقصى مساحة يمكن للمستخدم أو المجموعة استخدامها، إلّا أنّه وعلى عكس hard block، فإنّه يمكن للمستخدم أن يقوم بتخطّي الحدّ الأقصى المسموح لفترة معيّنة من الزمن فقط، تعرف هذه الفترة باسم فترة المهلة (grace period). سنتعرّف على المزيد من المعلومات عنها لاحقًا في هذا الدرس.</p><p>في المثال أعلاه، استخدمنا الحدّ الناعم (soft limit) بمساحة 9,785Mb والحدّ الصلب (hard limit) بمساحة 10Mb. يمكنك القيام ببدء عملية نقل ملفّات عبر برتوكول FTP/SFTP، حيث يكون الملفّات المرفوعة بحجم 12Mb مثلًا(طالما يكون حجمها أكبر من الحدّ الصلب hard limit). سيتم إرجاع رسالة خطأ إليك من طرف برنامج عميل FTP/SFTP تخبرك بأنّ عملية الرفع قد فشلت. بالطبع فإنّ تخصيص مساحة 10Mb للمستخدم ليس أمرًا منطقيًا، وسنخصص الآن حدًّا ناعمًا بمساحة 976Mb وحدًّا صلبًا بمساحة 1Gb:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">Disk quotas for user ftpuser (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/disk/by-label/DOROOT         8    1000000    1048576          2        0        0</pre><p>للتحقق من حصّة مستخدم معيّن، يمكن أن يتم تنفيذ الأمر التالي متبوعًا باسم المستخدم أو اسم المجموعة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">quota ftpuser</pre><p>وسيكون الخرج على شكل:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">Disk quotas for user ftpuser (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/disk/by-label/DOROOT         8    1000000    1048576          2        0        0</pre><h2>إنشاء التقارير</h2><p>من الممكن إنشاء التقارير من مختلف أنظمة الحصص عبر الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">repquota -a</pre><p>والذي سيقوم بطباعة الخرج التالي لك:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">*** Report for user quotas on device /dev/disk/by-label/DOROOT
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User                used        soft      hard    grace    used    soft  hard  grace
------------------------------------------------------------------------------------
root          --   1118708        0         0             37093     0     0
daemon        --        68        0         0                 4     0     0
man           --      9568        0         0               139     0     0
www-data      --      2908        0         0                15     0     0
nobody        --         0        0         0                 1     0     0
libuuid       --        24        0         0                 2     0     0
Debian-exim   --        44        0         0                10     0     0
mysql         --     30116        0         0               141     0     0
ftpuser       --         8  1000000   1048576                 2     0     0</pre><h2>فرعي: تحديد فترة مهلة</h2><p>لإعطاء المستخدمين الحاليين بعض الوقت لتقليل مساحة ملفّاتهم على الخادوم، يمكن إعداد فترة مهلة (grace period). تسمح هذه الفترة للمستخدمين بأن يتعدّوا الحدّ الناعم (soft limit) المحدد لهم بينما يبقون تحت سقف الحدّ الصلب (hard limit). يمكن إعداد فترة المهلة عن طريق الأمر التالي (لاحظ أنّ هذه الفترة سيتم تطبيقها على جميع المستخدمين، لا يوجد إمكانية لتطبيقها على مستخدمين معيّنين مثلًا) ويمكنك التعبير عن الفترة التي تريدها بالثواني أو الدقائق أو الساعات أو الشهور.. إلخ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">edquota -t</pre><p>سيعطيك الأمر أعلاه الخرج التالي وسيقوم بإخبارك بالوقت الذي يمكنك أن تستخدمه. في هذا الدرس، تمّ استخدام فترة 7 أيام لفترة المهلة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem                    Block grace period     Inode grace period
  /dev/disk/by-label/DOROOT                  7days                  7days</pre><h2>خاتمة</h2><p>سيتم تحديث وتطبيق الحصص تلقائيًا عندما يقوم مستخدمٌ ما بإنشاء / حذف / نقل ملفّ أو مجلّد. تذكّر أنّ برنامج quota يعمل عبر النظر إلى مجلّدات المستخدمين أو المجموعات المحددة. يمكن لمستخدمي SSH التخلّص من نظام الحصص عبر تغيير مالك الملفّات الخاصّة بهم.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-enable-user-and-group-quotas">How To Enable User and Group Quotas</a> لصاحبه: Jan Stevens.</p>
]]></description><guid isPermaLink="false">99</guid><pubDate>Sun, 16 Aug 2015 22:05:10 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; passwd &#x648; adduser &#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x643;&#x644;&#x645;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x631;&#x648;&#x631; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</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-passwd-%D9%88-adduser-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%83%D9%84%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D9%88%D8%B1-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r96/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/adduser-passwd.png.50a75d3c9e94d342fffa04bbbe3981a1.png" /></p>

<div id="wmd-preview-section-17"><p id="مقدمة">تُعتبر كلمات المرور والمصادقة من المفاهيم الأساسية التي يتعامل معها كل مستخدم لبيئة غنو لينكس، إذ تتسع هذه المواضيع لعدد من أدوات وملفات الضبط المختلفة. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/adduser-passwd.png.0885850bed31eb2a11cf1205f925f71a.png"><img data-fileid="3824" class="ipsImage ipsImage_thumbnailed" alt="adduser-passwd.thumb.png.3431f185dd47b55" src="https://academy.hsoub.com/uploads/monthly_2015_08/adduser-passwd.thumb.png.3431f185dd47b55be1c7e50eb93bcc9a.png"></a></p><p>نستكشف في هذا الدرس بعض هذه الملفات الأساسية مثل <span style="font-family:courier new,courier,monospace;">etc/passwd/ </span>و<span style="font-family:courier new,courier,monospace;">etc/shadow/ </span>إضافة إلى أدوات ضبط المصادقة مثل <span style="font-family:courier new,courier,monospace;">passwd</span> و <span style="font-family:courier new,courier,monospace;">adduser</span>. <br>سنناقش هذه المواضيع ونطبّق الأمثلة على نظام Ubuntu 14.04، إلا أنه سيكون بإمكانك العمل على أي توزيعة لينكس حديثة بطريقة مماثلة تمامًا.</p></div><div id="wmd-preview-section-18"><h2>ما هو ملف "etc/passwd/"؟</h2><p>الملف الأول الذي سنبدأ معه يُدعى <span style="font-family:courier new,courier,monospace;">etc/passwd/</span>، ورغم اسمه فهو لا يخزّن كلمات المرور في واقع الحال. <br>فيما مضى كان هذا الملف يُخزّن كلمات المرور المُشفّرة hashed passwords لكل مُستخدم على النظام، إلا أنّه ولأسباب أمنيّة تم نقل هذه المسؤولية لاحقا إلى ملف منفصل. <br>دعونا نلقي نظرة على محتويات الملف<span style="font-family:courier new,courier,monospace;"> etc/passwd/</span>: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/passwd </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:x:0:0:root:/root:/bin/bash 
daemon:x:1:1:daemon:/usr/sbin:/bin/sh 
bin:x:2:2:bin:/bin:/bin/sh 
sys:x:3:3:sys:/dev:/bin/sh 
sync:x:4:65534:sync:/bin:/bin/sync 
games:x:5:60:games:/usr/games:/bin/sh 
man:x:6:12:man:/var/cache/man:/bin/sh 
. . . </pre><p>أول ما يمكننا ملاحظته هو إمكانية الوصول لهذا الملف من قبل المستخدمين العاديين (أي الذين لا يملكون صلاحيات الجذر root)، ولأن الجميع قادر على قراءة هذا الملف فقد تمّ نقل معلومات كلمات المرور إلى ملف آخر.</p></div><div id="wmd-preview-section-19"><h2 id="كيف-تقرأ-ملف-etcpasswd">كيف تقرأ ملف "etc/passwd/"؟</h2><p>كل سطر في هذا الملف يحتوي على معلومات الولوج لمستخدم فريد على نظام التشغيل، بعض هذه الحسابات قد تكون مُنشأة لاستعمالها من قبل خدمات daemons (الخدمات التي تعمل بالخلفية). <br>لنلقي نظرة على أحد هذه الأسطر لنرى ما هي المعلومات التي يحتويها: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:x:0:0:root:/root:/bin/bash </pre><p>تُفصل حقول المعلومات ضمن هذا السطر بعلامة النقطتين (:)، وهكذا يكون لدينا سبعة حقول في كل سطر من أسطر الملف<span style="font-family:courier new,courier,monospace;"> etc/passwd<span style="line-height: 22.3999996185303px;">/</span></span>، وهي هنا: </p><ul><li><strong>root</strong>: اسم مستخدم الحساب. </li><li><strong>x</strong>: تعبير مُرمّز للدلالة على معلومات كلمة المرور والتي يتم الحصول عليها من ملف <span style="font-family:courier new,courier,monospace;">etc/shadow<span style="line-height: 22.3999996185303px; text-align: right;">/</span></span>. </li><li><strong>0</strong>: هوية المستخدم أو رقم ID الخاص به وهو مُعرفّه على نظام التشغيل. المستخدم الجذر يملك رقم ID مساويًا للصفر على الدوام. </li><li><strong>0</strong>: هوية المجموعة أو رقم ID الخاص بالمجموعة التي ينتمي لها المُستخدم بشكل افتراضي. كذلك فإن رقم ID لمجموعة الجذر هو 0 دومًا. </li><li><strong>root</strong>: حقل الملاحظات، يُستخدم هذا الحقل لوصف المستخدم أو وظيفته، كما يمكن أن يشمل معلومات الاتصال به أو وصف الخدمة التي أُنشئ من قبلها. </li><li><strong>root<span style="line-height: 22.3999996185303px; text-align: right;">/</span></strong>: الدليل الرئيسي، للمستخدمين القياسيين غالبًا ما يكون هذا الدليل هو<span style="font-family:courier new,courier,monospace;">home/username<span style="line-height: 22.3999996185303px; text-align: right;">/</span></span>، أما للمستخدم الجذر فهو <span style="font-family:courier new,courier,monospace;">root<span style="line-height: 22.3999996185303px; text-align: right;">/</span></span>. </li><li><strong>bin/bash<span style="line-height: 22.3999996185303px; text-align: right;">/</span></strong>: يضمّ هذا الحقل مسار الصدفة شِل shell الخاصة بالمستخدم أو الأمر الذي سيُنفّذ عقب ولوج المستخدم. </li></ul><p>وهكذا كلّما أضفت حساب مستخدم جديد باستعمال أوامر مثل <span style="font-family:courier new,courier,monospace;">adduser</span> و <span style="font-family:courier new,courier,monospace;">useradd</span>، أو كلما قمت بتثبيت المزيد من الخدمات؛ سينمو هذا الملف، حيث ستُضاف معلومات المستخدم الجديد إلى سطر آخر في نهاية هذا الملف. <br>في معظم الحالات لا يجب أن تُحرّر هذا الملف بشكل يدوي، حيث هناك عدّة أدوات لذلك يمكن من خلالها ضمان سلامة التعديل وصحته.</p></div><div id="wmd-preview-section-20"><h2 id="ما-هو-ملف-etcshadow">ما هو ملف "etc/shadow<span style="line-height: 22.3999996185303px; text-align: right;">/</span>"؟</h2><p>تُخزّن البيانات الفعلية لكلمات المرور في ملف يُدعى <span style="font-family:courier new,courier,monospace;">etc/shadow<span style="line-height: 22.3999996185303px; text-align: right;">/</span></span>. <br>ومع ذلك فهو لا يحتوي على النصّ الصرف لكلمات المرور، بل يستخدم دالة كمفتاح اشتقاق key derivation لإنشاء تشفيرٍ لها، وهو ما يُخزّن فعليًا ضمن الملف. <br>مفتاح الاشتقاق هو عبارة عن خوارزمية تُنشئ دومًا تشفيرًا واحدًا عندما تُعطى نفس المُدخل. تُطبّق هذه الخوارزمية على كلمة المرور عندما تُعطى أثناء تسجيل الدخول وتقارن القيمة الناتجة عن ذلك مع القيمة المُخزّنة ضمن هذا الملف. <br>يجدر الانتباه إلى أن المُستخدمين الذين لا يملكون صلاحيات الجذر غير قادرين على قراءة محتويات هذا الملف وذلك خلافًا لـ <span style="font-family:courier new,courier,monospace;">etc/passwd<span style="line-height: 22.3999996185303px; text-align: right;">/</span></span>.</p></div><div id="wmd-preview-section-21"><h2 id="كيف-تقرأ-ملف-etcshadow">كيف تقرأ ملف "etc/shadow<span style="line-height: 22.3999996185303px; text-align: right;">/</span>"؟</h2><p>لنلقي نظرة على محتويات الملف <span style="font-family:courier new,courier,monospace;">etc/shadow<span style="line-height: 22.3999996185303px; text-align: right;">/</span> </span>عبر الأمر التالي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo less /etc/shadow </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:$6$mJD3Rsj4$xUa7jru6EEGTXnhwTfTT26/j8M5XiQvUl6UH32cfAWT/6W9iSI5IuIw5OOw4khwrsOHPyMwfCLyayfYiVdhAq0:15952:0:99999:7:::
daemon:*:15455:0:99999:7::: 
bin:*:15455:0:99999:7::: 
sys:*:15455:0:99999:7::: 
sync:*:15455:0:99999:7::: 
games:*:15455:0:99999:7::: 
man:*:15455:0:99999:7::: 
. . . 
</pre><p>كما في <span style="font-family:courier new,courier,monospace;">etc/passwd<span style="line-height: 22.3999996185303px;">/</span> </span>يُعرّف كل سطر معلومات أحد المستخدمين وتفصل علامة النقطتين (:) بين الحقول المختلفة. <br>ملاحظة: تُشير علامة النجمة (*) في الحقل الثاني من بعض الأسطر أعلاه إلى أن حساب المستخدم غير قابل لتسجيل الدخول، وهو ما يعني ارتباط الحساب بأحد الخدمات المُثبّتة على النظام. <br>دعونا نلقي نظرة على أحد تلك الأسطر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">daemon:*:15455:0:99999:7:::</pre><p>لدينا في هذا السطر تسع حقول وهي: </p><ul><li><strong>daemon</strong>: اسم مُستخدم الحساب. </li><li><strong>*</strong>: تجد هنا كلمة المرور المُشفّرة (يمكن أن ترى مثالًا عنها في السطر الخاص بالمستخدم الجذر من الملف أعلاه). وكما قلنا للتوّ فإن رمز النجمة تعني أنه لا يمكن استخدام هذا الحساب لتسجيل الدخول، وبالتالي لا يملك كلمة مرور أصلًا. </li><li><strong>15455</strong>: آخر مدّة تم تغيير كلمة المرور فيها، تُقاس هذه القيمة بالأيام انطلاقًا من بداية "عصر" يونكس، وهو 1 يناير 1970. </li><li><strong>0</strong>: أصغر عُمر لكلمة المرور، وهي المدّة التي يجب أن تفصل بين تحديثين متتابعين لكلمة المرور، القيمة 0 تعني عدم وجود أي قيود. </li><li><strong>99999</strong>: أطول عُمر لكلمة المرور، وهي المدة التي يجب أن تُغيّر كلمة المرور بعد انقضائها. القيمة 99999 تعني أنّ كلمة المرور الحالية لا نهائية المدّة. </li><li><strong>7</strong>: تُمثّل أيام التحذير قبل انتهاء صلاحية كلمة المرور وذلك في حال كانت الخانة السابقة تحمل قيمةً ما، فإن المُستخدم سيحصل على تنبيه لتغيير كلمة المرور خلال هذه الأيام. </li><li><strong>[فارغة]</strong>: آخر ثلاث حقول فارغة هنا، يُستخدم الأول للإشارة إلى المُهلة الإضافية التي تلي انتهاء المدة المحدّدة بالخانة السابقة حيث سيلغى تفعيل الحساب بعدها. الحقل الثامن يُمثّل مدّة إلغاء الحساب بالأيام منذ تاريخ بداية نظام يونكس (أي منذ 1-1-1970). الحقل التاسع فارغ دومًا ويُترك لأية استعمالات مستقبلية.</li></ul></div><div id="wmd-preview-section-22"><h2 id="كيف-تغير-كلمات-المرور">كيف تغير كلمات المرور؟</h2><p>يمكن تعديل كلمات مرور المستخدمين بواسطة الأداة <span style="font-family:courier new,courier,monospace;">passwd</span>. <br>وبشكل افتراضي فإن هذا الأمر سيغيّر كلمة مرور حساب المستخدم الحالي دون أن يتطلب ذلك صلاحيات الجذر. </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">passwd </pre><p>أما إذا رغبت بتعديل كلمة مرور حساب آخر فستحتاج حينها إلى صلاحيات الجذر، حيث يمكنك استخدام الصيغة التالية: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo passwd username </pre><p>ستطلب منك الصدفة كلمة مرور الجذر، ثم ستسألك تعيين كلمة مرور جديدة للمستخدم وتأكيدها مرةً ثانية. ولو قارنت القيمة المُشفرة و المخزّنة في ملف <span style="font-family:courier new,courier,monospace;">etc/shadow<span style="line-height: 22.3999996185303px;">/</span></span> لكلمة مرور هذا المستخدم فستلاحظ تغيّرها بعد تنفيذ الأمر السابق.</p></div><div id="wmd-preview-section-23"><h2 id="كيف-تنشئ-مستخدما-جديدا">كيف تنشئ مستخدما جديدا؟</h2><p>يمكن إنشاء حسابات مستخدمين جديدة عن طريق عدد من الأدوات، ولعلّ أسهلها <span style="font-family:courier new,courier,monospace;">adduser</span>، وفي أنظمة Ubuntu تُشير هذه الأداة إلى سكربت بيرل والذي يتولى عملية إضافة مستخدم جديد. <br>يمكن استدعاء السكربت من خلال: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">adduser demo </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Adding user `demo' ... 
Adding new group `demo' (1000) ... 
Adding new user `demo' (1000) with group `demo' ... 
Creating home directory `/home/demo' ... 
Copying files from `/etc/skel' ... 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully 
Changing the user information for demo 
Enter the new value, or press ENTER for the default 
Full Name []: test 
Room Number []: room 
Work Phone []: work phone 
Home Phone []: home phone 
Other []: other 
Is the information correct? [Y/n] </pre><p>ستطلب منك الأداة الإجابة على مجموعة من الأسئلة لملئ المعلومات اللازمة عن المستخدم في ملفي <span style="font-family:courier new,courier,monospace;">etc/passwd<span style="line-height: 22.3999996185303px;">/</span> </span>و <span style="font-family:courier new,courier,monospace;">etc/shadow<span style="line-height: 22.3999996185303px;">/</span></span>. <br>يمكنك بعد ذلك أن ترى المُدخل الذي تمت إضافته إلى الملف<span style="font-family:courier new,courier,monospace;"> etc/passwd<span style="line-height: 22.3999996185303px;">/</span></span> عن طريق الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">tail -1 /etc/passwd </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">demo:x:1000:1000:test,room,work phoneme phone,other:/home/demo:/bin/bash </pre><p>وكما ترى فقد عُبّئت الحقول كما هو متوقع، باستثناء أننا حصلنا على حقل ملاحظات أكثر فائدة. <br>بنفس الطريقة يمكن تنفيذ الأمر التالي لرؤية التعديلات التي أدخلت على ملف <span style="font-family:courier new,courier,monospace;">etc/shadow<span style="line-height: 22.3999996185303px;">/</span></span>: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo tail -1 /etc/shadow</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">demo:$6$XvPCmWr4$HXWmaGSeU5SrKwK2ouAjc68SxbJgUQkQ.Fco9eTOex8232S7weBfr/CMHQkullQRLyJtCAD6rw5TVOXk39NAo/:15952:0:99999:7:::</pre><h2>الخلاصة</h2></div><div id="wmd-preview-section-24"><p>كما ترى فإنه يمكنك تعديل معلومات تسجيل الدخول لأي مستخدم على نظام التشغيل الخاص بك بأسلوب سهل من خلال هذه الأدوات البسيطة. <br>تجدر الإشارة أخيرًا إلى أهمية اختبارك لقابلية تسجيل الدخول مجددًا عقب أي تغيير تجريه، كما أنه من الضروري الإبقاء على صلاحيات ملفات الضبط السابقة كما هي للمحافظة على الأمان والقدرة على تأدية المهام.</p><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-passwd-and-adduser-to-manage-passwords-on-a-linux-vps">How To Use passwd and adduser to Manage Passwords on a Linux VPS</a> لصاحبه Justin Ellingwood.</p><p>حقوق الصورة البارزة: <a href="http://www.freepik.com/free-vector/security-vector-keys-pattern-free_715013.htm" rel="external nofollow">Designed by Freepik</a>.</p></div>
]]></description><guid isPermaLink="false">96</guid><pubDate>Fri, 14 Aug 2015 14:28:14 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; fwknop &#x644;&#x62A;&#x641;&#x639;&#x64A;&#x644; &#x627;&#x644;&#x627;&#x633;&#x62A;&#x64A;&#x62B;&#x627;&#x642; &#x630;&#x64A; &#x627;&#x644;&#x62D;&#x632;&#x645;&#x629; &#x627;&#x644;&#x648;&#x627;&#x62D;&#x62F;&#x629; &#x639;&#x644;&#x649; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fwknop-%D9%84%D8%AA%D9%81%D8%B9%D9%8A%D9%84-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D8%AB%D8%A7%D9%82-%D8%B0%D9%8A-%D8%A7%D9%84%D8%AD%D8%B2%D9%85%D8%A9-%D8%A7%D9%84%D9%88%D8%A7%D8%AD%D8%AF%D8%A9-%D8%B9%D9%84%D9%89-ubuntu-1404-r84/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_07/fwknop.png.3ea42bae8c26a325d8aca49700be5b3b.png" /></p>

<p id="مقدمة">يتضمن توفير الخدمات للعموم عبر شبكة الإنترنت خطر التعرض لهجمات، إلا أن عرض الخدمات هو الغرض الأساسي - غالبا - لتجهيز خادوم. يمكن لأي منفَذ Port أو خدمة أن تكون عُرضة لأنواع كثيرة من التجسس ومحاولات الوصول من طرف مستخدمين سيئي النوايا أو سكربتات تعمل تلقائيا.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/fwknop.png.b3fb136a2dd4bc173994e875bed01db3.png"><img data-fileid="3371" class="ipsImage ipsImage_thumbnailed" alt="fwknop.thumb.png.d9958894e85d0c46399e613" src="https://academy.hsoub.com/uploads/monthly_2015_07/fwknop.thumb.png.d9958894e85d0c46399e613d9f41ac77.png"></a></p><p>في حين أن بعض الخدمات يجب أن تبقى متاحة نظرا لأنها موجهة للاستخدام من الجميع (خادوم ويب يستضيف موقعا على سبيل المثال)، إلا أن أخرى لا ينبغي لها ذلك، إذ يجب الاستيثاق من مستخدميها ومنع من لايُرخص له الدخول من الولوج إلى الخدمة (خدمة SSH على سبيل المثال). الوضعية المُثلى هي أن تكون هذه الخدمات مؤمنة جدا ولا يتاح الوصول إليها إلا لمن نرغب في منحه هذه الصلاحية.</p><p>يتيح الاستيثاق فريد الحزمة Single Packet Authentication وسيلة تسمح للجدار الناري Firewall الإبقاء على حظر خدمة إلى حين إرسال حزمة خاصة مُعمَّاة Encrypted إلى خدمة في الاستماع. إذا صادقت خدمة الاستماع على الحزمة فإنها تغير فورا قواعد الجدار الناري من أجل عرض المنفذ المطلوب.</p><p>توجد أداة اسمها <code>fwknop</code> (اختصار ل Firewall Knock Operator وتعني عامل الطرق على الجدار الناري) تستخدم لاعتراض الحزم المخصصة ثم تغيير قواعد الجدار الناري حسب المطلوب.</p><p>سنعد في هذا الدليل خادوما لأداة <code>fwknop</code> وعميلا لها على جهازين يعملان بتوزيعة أوبنتو 14.04. يمكّننا هذا الإعداد من حماية خادوم SSH وحظر الدخول إليه ما لم تطلب إتاحته.</p><h2 id="تثبيت-fwknop-على-خادوم-أوبنتو-الأول">تثبيت fwknop على خادوم أوبنتو الأول</h2><p>سنفترض في إعداداتنا وجود خادوميْ أوبنتو 14.04 وتوفر اسم نطاق لكل واحد من الخادومين؛ مع أن استخدام عناوين IP لن يمثل عائقا. نفترض أيضا تثبيت خدمة SSH.</p><p>تثبت الأوامر التالية خادوم <code>fwknop</code> على الجهاز الأول والذي سيكون بمثابة خادوم للثاني:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get update
sudo apt-get install fwknop-server</pre><h2 id="تثبيت-عميل-fwknop-على-خادوم-أوبنتو-الثاني">تثبيت عميل fwknop على خادوم أوبنتو الثاني</h2><p>سنجعل من الخادوم الثاني عميلا؛ لذا سنحتاج لتثبيت عميل fwknop عليه. يتكفل هذا العنصر بإنشاء الحزمة المعماة لإرسالها إلى الخادوم الآخر.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get update
sudo apt-get install fwknop-client</pre><h2 id="إعداد-مفاتيح-gpg">إعداد مفاتيح GPG</h2><p>سنستخدم مفاتيح GPG لتوفير الاستيثاق أثناء نقل الحزم. نحتاج لتنفيذ الإجراءات التالية على كل من الجهاز الخادوم والجهاز العميل. تأتي أداة GPG مثبتة افتراضيا.</p><p>ولِّد مفاتيح على كل من الجهازيْن:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg --gen-key</pre><p>ستسأل بضعة أسئلة يكفي - في الغالب - اختيار الإجابات الافتراضية بالضغط على زر <code>Enter</code>. سيطلب منك أيضا إدخال ثم تأكيد عبارة سر Passphrase. سيأخذ إنشاء مفتاح عشوائي بعض الوقت؛ من الأفضل تنفيذ بعض الإجراءات على الخادوم للتسريع من العملية (مثلا افتح نافذة Shell جديدة ونفذ فيها الأمر التالي <code>find / &gt; /dev/null</code> إضافة إلى أوامر أخرى).</p><p>نحتاج بعد انتهاء توليد مفاتيح GPG إلى كتابة أو نسخ معرفات المفاتيح العمومية. لذا ننفذ الأمر التالي على كل من الجهازين (الخادوم والعميل)</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg --list-keys
/home/zeine77/.gnupg/pubring.gpg
-------------------------------
pub   1024D/<u><em><strong>FFEDEE15</strong></em></u> 2015-07-21
uid                  Mohamed Ahmed Eyil (Comment) &lt;Email&gt;
sub   1024g/95B798A4 2015-07-21</pre><p>الجزء المعلَّم هو الذي نحتاجه هنا (مفتاح عمومي). انسخ المفتاح العمومي لكل من الجهازين واحتفظ به مع تعليمِه (خادوم SERVER أو عميل CLIENT للتفريق بينهما) على النحو التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SERVER: FFEDEE15
CLIENT: 1E6E6DC4</pre><p>نفذ الأمر التالي على الجهاز العميل لإنشاء نسخة <code>client.asc</code> من المفتاح عبر تصديرها إلى ملف. ستحتاج لكتابة معرف مفتاح العميل الذي نسخته للتو:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg -a --export 1E6E6DC4 &gt; client.asc</pre><p>نفس الشيء على الجهاز الخادوم مع استخدام المفتاح العمومي للخادوم وتسمية المف ب<code>server.asc</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg -a --export FFEDEE15 &gt; server.asc</pre><h3 id="1-نقل-المفاتيح-بين-الأجهزة">1- نقل المفاتيح بين الأجهزة</h3><p>نحتاج الآن لنقل المفاتيح بين الجهازين بحيث يكون لدى كل منهما نسخة من الاثنين. نستخدم أداة <code>scp</code> لنسخ ملف <code>client.asc</code> من العميل إلى الخادوم. نفذ الأمر التالي على العميل</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">scp client.asc server_domain_or_ip:/path/to/user/home/directory</pre><p>حيث <code>server_domain_or_ip</code> اسم نطاق أو عنوان IP الخادوم و<code>/path/to/user/home/directory</code> المسار الذي سيُنقل إليه الملف (المجلد الشخصي للمستخدم). سيطلب منك بعد تنفيذ الأمر معلومات الدخول إلى الخادوم.</p><p>ثم نكرر نفس الشيء مع ملف <code>server.asc</code> لنقله من الخادوم إلى العميل (تنفيذ الأمر يكون على العميل):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">scp server_domain_or_ip:/path/to/user/home/directory/server.asc .</pre><p>توجد الآن نسخة من كل ملف على الخادوم وعلى العميل.</p><h3 id="2-استيراد-وتوثيق-المفاتيح">2- استيراد وتوثيق المفاتيح</h3><p>يوجد الآن المفتاح العمومي لكل واحد من الجهازين على الآخر (المفتاح العمومي للخادوم على العميل، والمفتاح العمومي للعميل على الخادوم) مما يعني أنه يمكننا استيراد المفتاح العمومي إلى قاعدة بيانات GPG المحلية.</p><p>نفذ الأمر التالي على الخادوم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg --import client.asc</pre><p>ثم نفذ التالي على العميل:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg --import server.asc</pre><p>يوجد لدى كل من الجهازين الآن مفتاح الآخر في قاعدة بياناته؛ ننتقل إلى توثيق المفاتيح.</p><p>نفذ الأمر التالي عل كل من الجهازين، مع استخدام معرفات المفاتيح المناسبة. في المثال لدينا سننفذ ما يلي على العميل (نوثق المفتاح العمومي للخادوم):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg --edit-key FFEDEE15</pre><p>وعلى الخادوم (نوثق المفتاح العمومي للعميل)</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gpg --edit-key 1E6E6DC4</pre><p>سيظهر سطر أوامر <code>gpg</code>؛ نطلب توثيق المفتاح عبر الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sign</pre><p>سيطلب منك التأكيد على اختيارك، اضغط زر <code>y</code> ثم <code>Enter</code>. ثم الخطوة قبل الأخيرة وهي كتابة عبارة السر (نفس عبارة السر التي أدخلتها عند توليد المفتاح). وأخيرا أمر <code>save</code> لحفظ الإعدادات والخروج من سطر أوامر <code>gpg</code>.</p><p>نحصل باكتمال هذه الخطوات على نسخة موثَّقة لمفتاح <code>gpg</code> الخاص بكل جهاز على الآخر، مما يعني أننا نثق من صحة المفاتيح.</p><h2 id="إعداد-الوصول-في-خادوم-fwknop">إعداد الوصول في خادوم fwknop</h2><p>يجب علينا إعداد خدمة <code>fwknop</code> لاستخدام مفاتيح GPG والسماح للعميل بالاتصال بالخادوم والاستيثاق لديه.</p><p>افتح ملف إعداد الأداة على الخادوم بصلاحيات إدارية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo nano /etc/fwknop/access.conf</pre><p>توجد افتراضيا بضعة أسطر نشطة، البقية تعليقات وشروح.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SOURCE:         ANY;
KEY_BASE64      __CHANGEME__
HMAC_KEY_BASE64 __CHANGEME__</pre><p>سنضبط ملف الإعداد لاستخدام الاستيثاق عبر مفاتيح GPG التي أعددناها سابقا. لذا سنضيف تعليمات لإعطاء معلومات لخدمة <code>fwknop</code> عن المفاتيح التي نستخدمها. توجد هذه التعليمات ضمن ملف الإعداد، احذف علامة التعليق (<code>#</code>) ثم أعط القيم المناسبة للتعليمات. عدل الملف لتصبح الأسطر النشطة على النحو التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">SOURCE: ANY;
OPEN_PORTS: tcp/22;   ## SSH لتمكين الاتصال عن طريق
FW_ACCESS_TIMEOUT: 30; ## مدة بقاء الاتصال مفتوحا

REQUIRE_SOURCE_ADDRESS: Y; ## طلب عنوان المصدَر
GPG_REMOTE_ID: FFEDEE15;                    ## المفتاح العمومي للعميل
GPG_DECRYPT_ID: 1E6E6DC4;                   ## المفتاح العمومي للخادوم
GPG_DECRYPT_PW: your_GPG_passphrase_here;   ## عبارة سر الخاصة بالخادوم
GPG_HOME_DIR: /home/test/.gnupg;       ## gunpg مسار مجلد
                                       ## يوجد عادة في المجلد الشخصي  للمستخدِم
</pre><p>تأكد من إعطاء معرف مفتاح العميل ضمن تعليمة <code>GPG_REMOTE_ID</code> ومعرف مفتاح الخادوم ضمن تعليمة <code>GPG_DECRYPT_ID</code>. يجب كذلك إدخال عبارة السر لمفتاح الخادوم ضمن التعليمة <code>GPG_DECRYPT_PW</code> ومسار مجلد <code>gnupg.</code> ضمن تعليمة <code>GPG_HOME_DIR</code>.</p><p>احفظ (<code>CTRL+O</code>) الملف ثم أغلقه (<code>CTRL+X</code>).</p><h2 id="اضبط-قواعد-iptables">اضبط قواعد IPTables</h2><p>ننتقل الآن، بعد أن أنهينا إعداد خادوم <code>fwknop</code>، إلى ضبط قواعد IPTables. ستعدل خدمة <code>fwknop</code> هذه القواعد حسب الحاجة؛ ولكن قبل ذلك نحتاج إلى إغلاق المنفذ.</p><p>نحتاج أولا إلى السماح للاتصال الجاري بالمتابعة قبل غلق المنفذ. تسمح القاعدة التالية للاتصال الموجودة بالمواصلة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT</pre><p><strong>ملحوظة:</strong> هذا الإجراء مهم جدا في حال كنت تعد خادوما بعيد تتصل به عن طريق SSH.</p><p>ثم نقيّد مباشرة بعد تنفيذ الأمر أعلاه الولوجَ عبر منفذ SSH بمنع بقية الاتصالات كلها:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP</pre><p>يوجد لدينا الآن جدار ناري مبدئي لمنع الاتصال عبر المنفذ 22 ويمكن بالتالي تنفيذ إعدادات <code>fwknop</code>؛ لذا نعيد تشغيل خادوم <code>fwknop</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service fwknop-server restart</pre><p>ستبدأ خدمة <code>fwknop</code> بمراقبة الخادوم بحثا عن حزم بيانات توافق القواعد التي أعددناها.</p><h2 id="الاتصال-بالخادوم-من-العميل">الاتصال بالخادوم من العميل</h2><p>سنجرب الآن الاتصال بالخادوم من العميل. إن جرى كل شيء على ما يرام فلن يمكننا الاتصال بسبب انتهاء مهلة الاتصال (Time out).</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">ssh root@server_domain_or_ip</pre><p>سيحاول العميل الاتصال بالخادوم وبعد انتهاء مهلة الاتصال تظهر الرسالة التالية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">ssh: connect to host server_domain_or_ip port 22: Connection timed out</pre><p>إن لم ترغب في انتظار اكتمال المهلة - التي قد تطول - يمكنك الضغط على مفتاحي <code>CTRL</code> و<code>C</code> معا.</p><p>يمكننا الآن إرسال حزمة معماة للاستيثاق لدى الخادوم. نستخدم عميل <code>fwknop</code> لهذا الغرض؛ ونمرر له المعطيات التالية:</p><ul><li><p>A tcp/22-: يحدد هذا الخيار البروتوكول والمنفذ الذي نطلب فتحه.</p></li><li><p>gpg-recip--: معرف مفتاح GPG الخاص بالخادوم.</p></li><li><p>gpg-sign--: معرف مفتاح GPG الخاص بالعميل.</p></li><li><p>a-: يخبر <code>fwknop</code> بعنوان IP الذي يسمح بالوصول منه؛ أي عنوان الجهاز العميل.</p></li><li><p>D-: يخبر الأمر بوجهة الطلب. نحدد هنا عنوان IP الخاص بالخادوم أو نطاقه.</p></li></ul><p>ننشئ ثم نرسل الأمر انطلاقا من هذه المعطيات والمعطيات السابقة (مفاتيح GPG):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">fwknop -A tcp/22 --gpg-recip FFEDEE15 --gpg-sign 1E6E6DC4 -a client_ip_address -D server_domain_or_ip</pre><p>سيطالب منك إدخال عبارة سر العميل لفك تعمية المفاتيح ثم ترسل الحزمة المعماة إلى الخادوم.</p><p>لديك الآن ثلاثون ثانية لمحاولة الاتصال عبر SSH.</p><p><strong>ملحوظة:</strong> لتغيير هذه المدة فعّل تعليمة <code>FW_ACCESS_TIMEOUT</code> في ملف إعداد خادوم <code>fwknop</code> ثم أعطها القيمة المرادة.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">ssh root@server_domain_or_ip</pre><p>إن جرت الأمور على النحو المخطط لها فسيمكنك الاتصال بنجاح. سيُغلق المنفذ المفتوح بعد ثلاثين ثانية غير أن الاتصال سيبقى نشطا.</p><p>تستطيع رؤية قواعد IPTables المضافة على الجهاز الخادوم بعد تنفيذ أمر إنشاء الحزمة المعماة وإرسالها على العميل (وقبل انقضاء مهلة الثلاثين ثانية). استخدم الأمر التالي لهذا الغرض:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo iptables -S</pre><p>النتيجة</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N FWKNOP_INPUT
-A INPUT -j FWKNOP_INPUT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP
-A FWKNOP_INPUT -s client_ip_address/32 -p tcp -m tcp --dport 22 -j ACCEPT
</pre><p>لاحظ إضافة سطر جديد إلى IPTables. يطبق القاعدة المضافة على جميع طلبات الاتصال، إن وافق عنوان مصدر الطلب الجهاز الذي أرسل الحزمة المعماة فإنه يسمح له بالوصول عبر المنفذ 22 وإلا يرفض الطلب.</p><h2 id="خاتمة">خاتمة</h2><p>يمكّن إعداد آلية للاستيثاق فريد الحزمة من إضافة طبقة أمان عند الاتصال بين الأجهزة. يوفر هذا الإجراء علاوة على حماية الخواديم من هجمات القوة القاسية Brute force والهجمات العشوائية، المساعدة في حال اكتشاف ثغرات أمنية ضمن الخدمات المحمية مما يتيح لك في وضعية آمنة إلى أن ترقع الثغرة.</p><p>قد تمثل آلية الاستيثاق فريد الحزمة إزعاجا للمستخدمين؛ إلا أنها مفيدة أمنيا ويمكن استخدامها مع <a href="https://academy.hsoub.com/devops/linux/7-%D8%AA%D8%AF%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A3%D9%85%D9%86%D9%8A%D9%91%D8%A9-%D9%84%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85%D9%83-r60/">إجراءات أمنية أخرى</a> للمزيد من الأمان.</p><p>ترجمة -بتصرف- لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04">How To Use fwknop to Enable Single Packet Authentication on Ubuntu 12.04</a>.</p>
]]></description><guid isPermaLink="false">84</guid><pubDate>Thu, 23 Jul 2015 18:39:01 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62C;&#x62F;&#x648;&#x644; &#x645;&#x647;&#x627;&#x645;&#x643; &#x627;&#x644;&#x631;&#x648;&#x62A;&#x64A;&#x646;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x623;&#x62F;&#x627;&#x62A;&#x64A; Cron &#x648; Anacron &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%AC%D8%AF%D9%88%D9%84-%D9%85%D9%87%D8%A7%D9%85%D9%83-%D8%A7%D9%84%D8%B1%D9%88%D8%AA%D9%8A%D9%86%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%AF%D8%A7%D8%AA%D9%8A-cron-%D9%88-anacron-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r82/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_07/linux-cron.png.6fb26fb103f8c0bcb7a21f177bd7d872.png" /></p>

<div id="wmd-preview-section-46"><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_07/linux-cron.png.38282138c4a0d201151ffd9e64a4c543.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3319" src="https://academy.hsoub.com/uploads/monthly_2015_07/linux-cron.thumb.png.f442dbc6ac27b9ba3ae7414156507a30.png" class="ipsImage ipsImage_thumbnailed" alt="linux-cron.thumb.png.f442dbc6ac27b9ba3ae"></a></p><h2 id="كيف-تجدول-مهامك-الروتينية-باستخدام-أداتي-cron-و-anacron-في-لينكس">ما هو Cron؟</h2></div><div id="wmd-preview-section-47"><p>Cron هي أداة جدولة تسمح لك بتخصيص المهام ليتمّ تشغيلها في أوقاتٍ مضبوطة بشكل مُسبق، حيث يمكن أن تُستخدم لأتمتة أي شيء تقريبًا على نظام التشغيل الخاص بك لا سيما تلك المهام التي يجب أن تُشغّل على فترات منتظمة. <br>تُعتبر Cron أداةً أساسيّة لمديري الأنظمة إذ تبرع في المهام الروتينيّة التي ينبغي تنفيذها كلّ ساعة/يوم بالمقدار الذي تبرع فيه تجاه المهام التي يجب القيام بها مرةً أو مرتين في العام. <br>نناقش في هذا الدرس كيفيّة استخدام Cron من خلال سطر الأوامر، وفهم ملف الضبط الخاص بها، إضافةً إلى حديثنا عن Anacron، وهي الأداة التي يمكن استخدامها لضمان تشغيل المهام حتى عندما يتم إيقاف تشغيل الخادوم لبعض الوقت. <br>سوف نستخدم في درسنا هذا توزيعة Ubuntu 14.04، ويمكنك بالتأكيد تطبيق الشرح هنا على أي توزيعة غنو لينكس أخرى.</p></div><div id="wmd-preview-section-48"><h2 id="كيف-تعمل-cron">كيف تعمل Cron؟</h2><p>تبدأ Cron مع إقلاع النظام وتعمل في الخلفية مع باقي خدمات Daemon، وهذا يعني أنها تعمل دون تدخّل من قبل المستخدم مُترقبةً أحداثًا معينة لتشغيل المهام المضبوطة. <br>بالنسبة لـ Cron فإن هذه الأحداث هي مواقيت محدّدة من الزمن، حيث يعمل Cron في الخلفية ويتحقّق كلّ دقيقة فيما إذا كان من المقرّر تشغيل أمر ما هذه الدقيقة، وذلك تبعًا لملف الضبط الخاص به، وفي حال الإيجاب يُنفّذ Cron الأوامر المُحددّة له بشكل مسبق لهذه اللحظة، ومن ثم يعود للعمل ضمن الخلفية مترقبًا الدقائق القادمة، أما في حال النفي فإنه سينتظر لستين ثانية قبل أن يعاود تحقّقه. <br>ونظرًا لأسلوبه في الجدولة والفحص دقيقةً بدقيقة؛ فإنه يعتبر قابلًا للضبط بشكل مرن للغاية، وحالما تُثبّت Cron على توزيعة غنو لينكس لديك فإنه سيضُبط لتشغيل مجموعة متنوعة من المهام.</p></div><div id="wmd-preview-section-49"><h2 id="كيفية-قراءة-crontab">كيفيّة قراءة Crontab</h2><p>يُقرّر Cron ما هي الأوامر التي سيتم تشغيلها وفي أي توقيت من خلال قراءة مجموعة من الملفات التي يُعرف كلّ منها باسم "crontab"، يمكنك على سبيل المثال مشاهدة ملف "crontab" المطبّق على مستوى النظام system-wide بالنظر إلى محتويات الملف "<span style="font-family:courier new,courier,monospace;">etc/crontab/</span>": </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/crontab</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command 17 * * * * root cd / &amp;&amp; run-parts –report /etc/cron.hourly 
25 6 * * * root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts –report /etc/cron.daily )   
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts –report /etc/cron.weekly )  
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts –report /etc/cron.monthly )</pre><p>يُمثّل الخرج السابق ملف crontab الخاص بالنظام والذي لا ينبغي تعديل محتوياته في معظم الحالات، لذا يجدر بك دومًا كتابة ملف crontab خاص بك، إضافةً إلى أن الملف الخاص بالنظام معُرض للاستبدال عند تحديث النظام مما يعرّض تعديلات للضياع. بكل الأحوال يحتوي الملف السابق على بضعة أجزاء مُهمّة والتي نحتاج إلى فهمها. </p><ul><li>يُحدِّد أول سطرين الصدفة shell التي ستُنفذ الأوامر المدرجة، والمسار الذي توجد به هذه الأوامر. </li><li>بينما يُحدّد ما تبقى من الملف الأوامر المجدولة مع مواقيتها، حيث كل سطر في هذه القائمة يمثّل سِجلًا أو صفًا في جدول، بينما تشير مسافات "tab" إلى أعمدة هذا الجدول، وتُمثّل كل خلية بأعمدة مفصولة بمسافات أو علامات تبويب tabs. </li><li>أما سطر التعليقات (والذي يبدأ بإشارة #) فيشرح ما يمثّله كل عمود من الأعمدة.</li></ul></blockquote></div><div id="wmd-preview-section-51"><h2 id="جدولة-الساعات-والدقائق-باستخدام-cron">جدولة الساعات والدقائق باستخدام Cron</h2><p>يُخصّص العمود الأول لدقائق الساعة التي يفترض أن يُنفذ بها الأمر ويأخذ قيمة ضمن (0-59)، بينما يُحدّد العمود الثاني قيمة "ساعة من اليوم" ضمن (0-23)، وتعني علامة النجمة (*) "كل قيمة ممكنة" وتستخدم كعلامة شاملة. <br>من خلال الجمع بين هذين العمودين نحصل على التوقيت الزمني للأمر. على سبيل المثال يحتوي السطر الثاني في الجدول على الرقم 25 ضمن عمود الدقائق و 6 لعمود الساعات: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">25 6 * * * root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.daily ) </pre><p>وهذا يعني أن السطر الثاني سيُشغّل في الساعة 6:25 صباحًا. <br>وبالمثل يُشغِّل السطر الأول الأمر الخاص به في الدقيقة 17 من كل ساعة: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">17 * * * * root cd / &amp;&amp; run-parts --report /etc/cron.hourly </pre><p>لذا سيتم تشغيله في الساعات 1:17am ،2:17am ،3:17am <span style="line-height: 22.3999996185303px;">...</span>الخ</p></div><div id="wmd-preview-section-52"><h2 id="جدولة-الأيام-باستخدام-cron">جدولة الأيام باستخدام Cron</h2><p>تُحدّد كلًا من العمود الثالث، الرابع، والخامس؛ الأيام التي يجب أن تُشغِّل الأوامر، حيث يُحدِّد العمود الثالث قيمة "يوم من الشهر" ضمن المجال (1-31) (لا تنسَ أن الشهور مختلفة بعدّد أيامها؛ لذا كن حذرًا)، ويحدّد العمود الرابع أيّ الشهور التي ستُنفّذ فيها الأوامر ويأخذ قيمة من (1-12)، بينما يُحدّد العمود الخامس أي يومٍ من أيام الأسبوع التي يجب أن تنفّذ فيها الأوامر ويأخذ قيمة من (0-7). حيث يمكنك الجدولة باستخدام واحدة "الأسبوع" عوضًا عن "الشهر". <br>إذا لم تتطابق خانتا "اليوم من الأسبوع" و "اليوم من الشهر" فإن الأمرّ سينفّذ إذا تحقّق أيٍ منهما. كما يمكن تحديد أيام الأسبوع والأشهر باستخدام الأحرف الثلاثة الأولى من أسمائها. إضافةً للنجمة يمكن استخدام الشرطة (<span style="font-family:courier new,courier,monospace;">-</span>) لتحديد نطاق ما، واستخدام الفاصلة (<span style="font-family:courier new,courier,monospace;">,</span>) لتحديد قيم متعدّدة. <br>كما يمكننا تحديد "فاصل زمني" بإتباع قيمة ما مع إشارة "<span style="font-family:courier new,courier,monospace;">/</span>"، فعلى سبيل المثال لتنفيذ الأمر كل ساعة يمكننا استخدام "*/2" في عمود الساعات. <br>إذا نظرنا إلى ملف crontab سنلاحظ أن السجل الثالث يُشغّل كل أحد الساعة 6:47 صباحا: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.weekly ) </pre><p>أما السجل الرابع فهو يعمل أوّل كل شهر في الساعة 6:52 صباحًا: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">52 6 1 * * root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.monthly )</pre><h2>استخدام اختصارات الوقت للجدولة</h2></div><div id="wmd-preview-section-53"><p>يمكننا استبدال الأعمدة الخمسة الأولى من كل سجل بـ "مُسمى مختصر" إذا لم يكن لديك طلبًا مُعقّدًا، صيغة الاختصار تبدأ بإشارة "<span style="font-family:courier new,courier,monospace;">@</span><span style="font-family:arial,helvetica,sans-serif;">"</span> ويتلوها مُسمى الفترة. <br>فعلى سبيل المثال يمكننا جدولة أمر بحيث يُنفّد كل أسبوع بتحديد "weekly@" بدلًا من إنشاء سجل بخمسة أعمدة، الخيارات الأخرى هي: "yearly" ،"@monthly" ،"@daily@" و "hourly@" <br>إضافةً لذلك لدينا الاختصار "reboot@" والذي يعمل فقط عند تشغيل النظام وبدء تشغيل cron، ولهذا يُسمى بـ "reboot@" وليس "cron-restart"أو شيئًا من هذا القبيل. <br>ضع في اعتبارك دومًا أن هذه الاختصارات لا توفّر إمكانيات تخصيص الأعمدة الخمسة، وبدلًا من ذلك فإنها تضبط الأوامر بحيث تعمل عند أول لحظة ممكنة تتطابق مع الاختصار. <br>فعلى سبيل المثال يُشغّل الاختصار <span style="line-height: 22.3999996185303px;">"monthly@" </span>الأمر في منتصف الليل من أوّل الشهر، ما يعني أن جميع الأوامر المضبوطة على هذا الاختصار ستعمل في وقتٍ واحد، حيث لا إمكانية لترتيب هذه الأوامر كما مع أسلوب الأعمدة الخمسة في الضبط.</p></div><div id="wmd-preview-section-54"><h2 id="تخصيص-الأوامر-والمستخدمين-مع-cron">تخصيص الأوامر والمستخدمين مع Cron</h2><p>يشمل العمود السادس والموجود فقط في ملف crontab الخاص بالنظام على اسم المستخدم الذي سيُنفّد الأمر من خلاله. بينما يُحدّد العمود الأخير الأوامر المطلوب تشغيلها، يمكن للأمر أن يحتوي على علامة النسبة المئوية (%) والتي تعني أن كل ما هو بعدها يتم تمريره إلى الأمر كدخل قياسي. <br>ليعمل ملف crontab بشكل صحيح يجب إنهاء كل سجل مع محرف سطر جديد، هذه ليست مشكلة بالنسبة لمعظم السجلات، لكن تأكد من وجود سطر فارغ بعد آخر مُدخل ضمن الملف، وإلا فإنه لن يعمل كما يجب.</p></div><div id="wmd-preview-section-55"><h2 id="استخدام-ميزة-run-parts-والأدلة">استخدام ميزة “run-parts” والأدلة</h2><p>لو تمعّنا في الأوامر المكتوبة ضمن ملف crontab السابق والخاص بالنظام، فسنشاهد إشارة إلى ما يسمى "anacron" (المزيد عن ذلك لاحقًا)، إضافةً لـ "run-parts". <br>يتيح لنا الأمر "run-parts" ببساطة تشغيل كل أمر قابل للتنفيذ ضمن مجلّد محدّد، ويستخدم هذا الأسلوب على نحو واسع مع cron لأنه يتيح لنا تشغيل سكربتات scripts عديدة في توقيتٍ واحد عن طريق وضعها في مكانٍ واحد، وهو ما يسمح لأن يبقى ملف crontab مرتبًا وبسيطًا، ويسمح لنا بجدولة المزيد من المهام عن طريق وضعها (أو إنشاء اختصار لها) كسكربتات في الدليل المناسب بدلًا من تعديل ملف crontab. <br>عادةً ما تُخصّص معظم التوزيعات مجلد لكل فترة بحيث يتم وضع السكربتات بها ليتم تشغيلها في تلك الفترة، فعلى سبيل المثال تخصص توزيعة Ubuntu المجلدات التالية: cron.daily ،cron.hourly  cron.monthly وcron.weekly.</p></div><div id="wmd-preview-section-56"><h2 id="إنشاء-ملفات-crontabs-للمستخدمين">إنشاء ملفات Crontabs للمستخدمين</h2><p>بعد استعراضنا لأساسيات التعامل مع Cron يمكنك الآن البدء بجدولة المهام الخاصة بك عن طريق استخدام الأمر "crontab". <br>لاحظ أن ملف "crontab" الخاص بك لن يحتوى عمود "المستخدم"، لأنه سيتم تشغيل الأوامر المضمّنة به من خلال امتيازات المستخدم الخاصّة بك.<br>لمعرفة الـ crontab الحالي، اكتب: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">crontab -l </pre><p>غالبًا فلن يكون هناك ملف مسبق إلا إذا كنت قد أنشأت واحدًا بشكل يدويّ، وفي هذه الحالة فمن الأفضل أخذ نسخة احتياطية من الملف الحالي قبل البدء بالتحرير بحيث يمكنك التراجع عن أي تغييرات قد تقوم بها. <br>لأخذ نسخة احتياطية إلى مجلد المنزل باسم "cron.bak"، نفّذ الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">crontab -l &gt; ~/cron.back </pre><p>للبدء بتحرير ملف crontab اكتب: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">crontab -e</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">no crontab for demouser - using an empty one Select an editor. To change later, run ‘select-editor’. 1. /bin/nano</pre><h2>استخدام Anacron مع Cron</h2></blockquote></div><div id="wmd-preview-section-57"><p>واحدة من أكبر نقاط ضعف Cron افتراضها أن خادومك أو جهاز الحاسوب الخاص بك يعمل طوال الوقت 24/7، حيث يُلغى تنفيذ كل مهمة مجدولة في وقتٍ يكون فيه حاسوبك مطفئًا. <br>يعتبر ذلك مشكلة خطيرة مع الأنظمة التي لا يمكن ضمان تشغيلها طوال الوقت، وكحلّ لهذه المشكلة تم تطوير أداة Anacron المبنية على anachronistic لضمان تنفيذ الأوامر طوال الوقت. <br>يستخدم Anacron المُعاملات غير المُفصّلة في خيارات Cron، وهذا يعني أن Anacron تكمل عمل Cron وليست بديلًا عنه. <br>أسلوب عمل Anacron يعتمد على إنشاء ملفات بأختام زمنية time-stamped عند تنفيذ أمر ما مجدول من خلال Cron، فإذا كان الأمر قد جُدول للتنفيذ بشكل يومي إلا أنه قد تم إيقاف تشغيل الحاسوب في الوقت الذي يفترض أن يُنفّذ به الأمر، فعندما يعمل anacron في المرة التالية سيرى أنه قد مضى أكثر من 24 ساعة على آخر تنفيذ للجدول اليومي وهذا ما يعني فوات موعده، فيقوم بتنفيذ الأوامر المجدولة. <br>تملك الأداة anacron جدولًا للمواعيد مثل Cron يدعى "anacrontab" ويخزّن في دليل "etc/" كذلك. لنلقي نظرة كيف يبدو: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/anacrontab</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# These replace cron’s entries 1 5 cron.daily nice run-parts –report /etc/cron.daily 7 10 cron.weekly nice run-parts –report /etc/cron.weekly @monthly 15 cron.monthly nice run-parts –report /etc/cron.monthly</pre><p>بالعموم فإن بنية الملف شبيهة بملفات crontab السابقة مع عدد أعمدة أقل، وبعض الملاحظات الجديرة بالانتباه. <br>يُحدّد العمود الأول عدد المرات التي يجب تنفيذ الأمر بها تبعًا للأيام، فالقيمة "1" تعني أنّه جيب تشغيل الأمر يوميًا، بينما تشغّل القيمة "3" الأمر كل ثلاثة أيام. <br>يُحدّد العمود الثاني التأخير الزمني قبل تنفيذ الأوامر، حيث لا يعمل Anacron في الخلفية daemon بل يتم تشغيله بشكل صريح لمرة واحدة، وهذا يسمح بتنظيم العمل، فلا تُنفّذ جميع الأوامر دفعةً واحدة. <br>على سبيل المثال يُشغّل السطر الأوّل كل يوم بعد خمس دقائق من استدعاء anacron: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">1 5 cron.daily nice run-parts --report /etc/cron.daily </pre><p>بينما يُشغّل السطر التالي أسبوعيًا (كل سبعة أيام) بعد عشرة دقائق من استدعاء anacron: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">7 10 cron.weekly nice run-parts --report /etc/cron.weekly </pre><p>يحتوي العمود الثالث على الاسم الذي سيعرّف مهمة السطر في رسائل anacron وفي سجلات النظام، بينما يحتوي العمود الرابع على الأوامر الفعليّة التي سيجري تشغيلها. <br>يمكنك أن ترى أنه قد تم تعيين anacron لتشغيل بعض السكربتات التي تُنفّذ أيضًا من قبل Cron، ولدرء التعارض تلجئ التوزيعات عادةً إلى إعطاء أولوية لإحدى الأداتين على الأخرى بحيث تعمل واحدة منهما فقط على تنفيذ الأمر المجدول. <br>في توزيعة Ubuntu مثلًا يختبر ملف "/etc/crontab/" إذا كانت anacron مُثبّتة على النظام، بحيث يُشغّل السكربتات النصيّة في أدلة cron فقط في حال لم يتم العثور على anacron. <br>بعض التوزيعات تتبع أسلوب آخر بجعل cron يُحدّث الأختام الزمنية ل anacron في كل مرّة يتم فيها تنفيذ مهمة مجدولة مما يمنع anacron عن تنفيذ نفس الأمر عند استدعاءه.</p></blockquote></div><div id="wmd-preview-section-61"><h2 id="خاتمة">خاتمة</h2><p>تعتبر أداتي cron و anacron من أفضل أدوات أتمتة تنفيذ المهام الروتينية، لذا من المهم استيعاب كيفية الاستفادة من نقاط القوّة في كلّ منهما وتجنب نقاط ضعفهما مما يعطيك أقصى قدر من الفائدة والفعالية. <br>ورغم أنه قد يبدو أمر إعدادهم للمرة الأولى مربكًا بعض الشيء، إلا أن ذلك سيوفّر عليك الكثير من الوقت على المدى الطويل في تكرار العمليات مرّةً بعد أخرى دون أن تحتاج غالبًا لتعديلات تذكر على ملفات الإعداد لاحقًا.</p></div>
]]></description><guid isPermaLink="false">82</guid><pubDate>Tue, 07 Jul 2015 11:47:59 +0000</pubDate></item><item><title>&#x636;&#x628;&#x637; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x64A;&#x646; &#x648;&#x627;&#x644;&#x645;&#x62C;&#x645;&#x648;&#x639;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%B6%D8%A8%D8%B7-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r78/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/users-groups-linux.png.0fe2ca780ae19daf4211a95ab4b99d3e.png" /></p>

<div id="wmd-preview-section-52"><p id="ضبط-وإعداد-المستخدمين-والمجموعات-في-لينكس">يشكّل ضبط إعدادات المستخدمين والمجموعات في لينكس واحدًا من المهارات الأساسية لإدارة نظام التشغيل، ويتضمن ذلك مراقبة تسجيلات الدخول الممكنة لكافة مكونات النظام. <br>نستعرض في هذا الدرس المعلومات الأساسية عن إدارة المستخدمين وتسجيلات الدخول، سنطبق أمثلتنا على توزيعة Ubuntu 14.04 إلا أنه يمكنك بالتأكيد المتابعة مهما كانت التوزيعة التي تستخدمها.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/users-groups-linux.png.61936e0789ae44d381e527ebb24f56bd.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3014" src="https://academy.hsoub.com/uploads/monthly_2015_06/users-groups-linux.thumb.png.9088f01ce4fcb0e0eabb4c572c3c027d.png" class="ipsImage ipsImage_thumbnailed" alt="users-groups-linux.thumb.png.9088f01ce4f"></a></p></div><div id="wmd-preview-section-54"><h2 id="استعراض-المستخدمين-الحاليين">استعراض المستخدمين الحاليين</h2><p>تخزّن أسماء ومعلومات جميع مستخدمي نظام لينكس ضمن ملف <span style="font-family:courier new,courier,monospace;">etc/passwd/</span> سواءً أكانت تشير إلى مستخدمين حقيقيين (مثلي ومثلك) أو مرتبطة بتشغيل إحدى الخدمات أو وظائف النظام. <br>يتضمن الملف <span style="font-family:courier new,courier,monospace;">etc/passwd/</span> معلومات حول المستخدمين المنشأين على نظام التشغيل موزعة على عدّة أسطر، بحيث يُخصّص سطر لكل مستخدم، لنلقِ الآن نظرة على محتويات الملف: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/passwd</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:x:0:0:root:/root:/bin/bash 
daemon:x:1:1:daemon:/usr/sbin:/bin/sh 
bin:x:2:2:bin:/bin:/bin/sh 
sys:x:3:3:sys:/dev:/bin/sh 
sync:x:4:65534:sync:/bin:/bin/sync 
games:x:5:60:games:/usr/games:/bin/sh 
…
</pre></blockquote><p>ينقسم كل سطر من الأسطر السابقة إلى عدّة خانات يفصل بينها علامة النقطتين (:)، وما يهمنا من هذه الخانات حاليًا هي الخانة الأولى والتي تعبّر عن الاسم الفريد لكل مستخدم، كما يمكن من خلال الأمر التالي الحصول على القائمة السابقة مُضمّنة بأسماء المستخدمين فحسب: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cut -d : -f 1 /etc/passwd</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root 
daemon 
bin 
sys 
sync 
games 
…
</pre></blockquote><p>وكما ترى حصلنا في هذه المرة على أسماء المستخدمين فقط، السطر الأول مثلًا يحوي اسم المستخدم الإداري ذي الصلاحيات المطلقة root، كما ستجد في القائمة اسم المستخدم الخاص بك، وبين هذا وذاك هناك عددٌ آخر من المستخدمين قد لا تكون مُلِمًا بوظائفهم، مثل المستخدم dbus والذي يُشغّل بواسطة خدمة dbus، أو polkitd المسؤول عن خدمة polkit، وهكذا.. ففي لينكس يتم فصل صلاحيات المهام كلًّا على حدى، وبهذه الطريقة نضمن ألّا تنتقل أيّة مشاكل محتملة في خدمة ما إلى سائر مكونات النظام.</p></div><div id="wmd-preview-section-55"><h2 id="استعراض-المجموعات-الحالية">استعراض المجموعات الحالية</h2><p>تخزّن أسماء المجموعات وبعض المعلومات عنها في ملف<span style="font-family:courier new,courier,monospace;"> etc/group/</span>، والذي يمكننا استعراض محتوياته بالأمر التالي: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/group</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:x:0: 
daemon:x:1: 
bin:x:2: 
sys:x:3: 
adm:x:4: 
tty:x:5: 
disk:x:6: 
…
</pre></blockquote><p>وكما ترى فإن معظم الأسماء هنا ورد ذكرها في قائمة "المستخدمين الحاليين" منذ قليل، وهذا يدفعنا للتساؤل؛ لمَ؟ <br>يعود السبب في ذلك إلى ما يسمى بـ"مجموعات المستخدم الخاصة" user private group أو UPG، وهو أسلوب في الإدارة والإعداد يسهّل إدارة المجموعات في لينكس، بحيث تنشئ مجموعة خاصة بكل مستخدم تتم إضافته، وتحمل هذه المجموعة ذات اسم المستخدم، وتُعيّن لتكون مجموعته الرئيسيّة، ويكون هو عضوها الوحيد، وحينها يغيّر قناع الطرح لـ umask من 022 إلى 002. <br>ماذا يعني ذلك؟ <br>تسمح هذه العملية بمزيد من المرونة في حالة عمل فريق ما ضمن مشروع، فبدلًا من أن تعود ملكية كل ملف يتم إنشاؤه في المشروع إلى الشخص المُنشئ، تنسد ملكية الملفات في هذه الحالة إلى ذات المجموعة المالكة للمجلد الأب، مما يسهل عملية التشارك. يتم ذلك عبر صلاحية تسمى setgid، إلا أنّ ذلك كلّه خارج نطاق موضوعنا اليوم. <br>هنا أيضًا يمكن عرض أسماء المجموعات فقط من مجمل محتويات الملف <span style="font-family:courier new,courier,monospace;">etc/group/ </span>عبر الأمر: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cut -d : -f 1 /etc/group</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root 
daemon 
bin 
sys 
adm 
tty 
disk 
…
</pre></blockquote></div><div id="wmd-preview-section-56"><h2 id="معرفة-المستخدم-المسجل-حاليا">معرفة المستخدم المُسجّل حاليًا</h2><p>يتيح الأمر <span style="font-family:courier new,courier,monospace;">w</span> في لينكس معرفة المستخدم النشط حاليًا على نظام التشغيل بالإضافة إلى مجموعة من المعلومات المهمة عنه، مثل توقيت تسجيل الدخول والأمر المستخدم حاليًا: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">w</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">19:37:15 up 5:48, 2 users, load average: 0.33, 0.10, 0.07 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 rrcs-72-43-115-1 19:15 38.00s 0.33s 0.33s -bash demoer pts/1 rrcs-72-43-115-1 19:37 0.00s 0.47s 0.00s w
</pre></blockquote><p>إضافة للأمر <span style="font-family:courier new,courier,monospace;">w</span> تعرض التعليمة <span style="font-family:courier new,courier,monospace;">who</span> معلومات أكثر اختصارًا، تتضمن اسم المستخدم النشط وتوقيت دخوله فقط:</p><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root pts/0 2013-09-05 19:15 (rrcs-72-43-115-186.nyc.biz.rr.com) demoer pts/1 2013-09-05 19:37 (rrcs-72-43-115-186.nyc.biz.rr.com)
</pre></blockquote></div><div id="wmd-preview-section-57"><h2 id="تقييد-تسجيلات-دخول-المستخدمين">تقييد تسجيلات دخول المستخدمين</h2></div><div id="wmd-preview-section-58"><h3 id="تقييد-تسجيلات-الدخول-باستخدام-etcpasswd">تقييد تسجيلات الدخول باستخدام etc/passwd/</h3><p>يمكن من خلال التعديل على ملف<span style="font-family:courier new,courier,monospace;"> etc/passwd/</span> تقييد تسجيل دخول أحد المستخدمين عن طريق إسناد قيمة معينة للصدفة shell المحدّدة له، لنفترض أنه لدينا مستخدم مسجّل بالاسم "messagebus" ضمن ملف etc/passwd/: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/passwd | grep messagebus </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">messagebus:x:102:104::/var/run/dbus:/bin/false </pre><p>قيمة الحقل الأخير في الخرج السابق تعبّر عن الأمر الذي يتم تنفيذه عقب تسجيل الدخول بنجاح، وهي في مثالنا هنا <span style="font-family:courier new,courier,monospace;">bin/false/</span>. فإذا حاولت تسجيل دخول المستخدم messagebus كمستخدم جذر root فستلاحظ عدم نجاح المحاولة، وفشل التحويل إلى المستخدم الجديد: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo su messagebus </pre><p>لنحاول الآن تسجيل الدخول بواسطة المستخدم sshd: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo su sshd </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">This account is currently not available.</pre><p>حصلنا على الرسالة السابقة بسبب قيمة الصدفة shell المستخدمة لـ ssh وهي <span style="font-family:courier new,courier,monospace;">usr/sbin/nologin/</span>. </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less /etc/passwd | grep sshd </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin </pre><p>أظن أنك قد عرفت الآن كيف نمنع دخول أحد المستخدمين بواسطة هذه الطريقة؟ <br>ببساطة سنستخدم الأداة<span style="font-family:courier new,courier,monospace;"> usermod</span> لتغيير قيمة الصدفة shell من إحدى قيمها المسموحة إلى أخرى وهمية: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo usermod -s /usr/sbin/nologin username</pre><h3>تقييد تسجيلات الدخول باستخدام etc/shadow/</h3></div><div id="wmd-preview-section-59"><p>يتيح التعديل على ملف etc/shadow/ طريقة أخرى مشابهة لتقييد تسجيلات الدخول، وهو ملف يضم كلمات سر مستخدمي النظام بشكل مشفّر، ولاستعراض محتوياته يمكننا كتابة الأمر التالي في الطرفية: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo less /etc/shadow</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:6r79Dod3Y$3hi3QklpGEQMxwQGEss4ueNNPkoUrqUe3SwyAacaxl.Lmgq1r9i4mTblV1z6NfKMNXH1Cpnq.4iKhOiQd7Riy1:15953:0:99999:7::: 
daemon:*:15455:0:99999:7::: 
bin:*:15455:0:99999:7::: 
sys:*:15455:0:99999:7::: 
sync:*:15455:0:99999:7::: 
games:*:15455:0:99999:7::: 
man:*:15455:0:99999:7::: 
…</pre><p>يُعرَض الخرج السابق على عدّة أسطر، بحيث يُخصّص سطر لكل مستخدم، ويضم كل سطر اسم المستخدم في الخانة الأولى، وكلمة السر بشكل مشفّر في الخانة الثانية "<nobr>6</nobr>r79Dod3Y#3…" مسبوقة بإشارة ($)، أما الخانات التي تبدأ بعلامة النجمة (*) ولا تتلوها قيمة مشفرة من المحارف فهي تخصّ المستخدمين المتعلقين بإدارة خدمات النظام، والتي لا تملك كلمات مرور، ولا يمكنها تسجيل الدخول كمستخدم عادي. <br>يمكننا تعطيل خانة كلمة المرور لأحد الحسابات بوضع إشارة التعجب(!) أمام قيمتها المشفّرة (تسمى هذه العملية بقفل الحساب)، ولإجراء ذلك يمكننا الاستعانة بواحدة من الأداتين التاليتين: <br>أولًا الأمر <span style="font-family:courier new,courier,monospace;">passwd</span> والذي يتيح قفل حساب مستخدم ما بواسطة الخيار "<span style="font-family:courier new,courier,monospace;">l-</span>" أو إلغاء قفله مع الخيار"<span style="font-family:courier new,courier,monospace;">u-</span>":</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo passwd -l username 
sudo less /etc/shadow | grep username </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">username:!$6$vpNJ3oFe$5GSh2aU2BDcpdjvQeNFzh0zTgyRUl26x4dn77mFE/vaoXwd19m7okX44jO8TWaVqNRL8vUVTAcZVmgUT8dR.4.:15953:0:99999:7:::</pre><p>وكما ترى فإن كلمة المرور تبقى موجودة ضمن الملف بقيمتها المشفرة إلا أنها غير فعّالة بسبب وجود إشارة التعجب (!) أمامها. <br>ولإلغاء قفل الحساب مجددًا يمكننا كتابة: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo passwd -u username </pre><p>بِذَات الطريقة يمكن استخدام الأمر <span style="font-family:courier new,courier,monospace;">usermod</span> لقفل أو إلغاء قفل حسابات المستخدمين وفق الخيارات "<span style="font-family:courier new,courier,monospace;">L-</span>"  و "<span style="font-family:courier new,courier,monospace;">U-</span>" على الترتيب: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo usermod -L username 
sudo usermod -U username </pre><p>يجب الانتباه هنا إلى أن هذه الطريقة في القفل تعمل مع حسابات المستخدمين العاديين أي تلك التي تستخدم كلمة مرور لتوثيق دخولها، بينما لا تعمل مع حسابات المستخدمين الخاصة بخدمات النظام (ممن لا تملك كلمة مرور).</p></blockquote></div><div id="wmd-preview-section-60"><h3 id="تقييد-تسجيلات-الدخول-باستخدام-etcnologin">تقييد تسجيلات الدخول باستخدام etc/nologin/</h3><p>في بعض الحالات الحرجة قد تحتاج لتعطيل تسجيلات دخول كافة المستخدمين باستثناء المستخدم الجذر root، مثل حالات الصيانة الشاملة، أو فيما لو تعرض أحد تلك الحسابات لاختراق أمني. <br>عمومًا، يمكن إنجاز ذلك ببساطة، عن طريق إنشاء ملف فارغ باسم <span style="font-family:courier new,courier,monospace;">etc/nologin/</span>: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo touch /etc/nologin </pre><p>بهذه الطريقة تمنع كافة تسجيلات الدخول للنظام باستثناء من يملك امتيازات المستخدم الجذر، حيث تتم إعادة المستخدمين إلى الصدفة المحليّة local shell أو إخبارهم بأن التوثيق خاطئ! <br>ولإضافة بعض التوضيح يجب ألا يترك الملف السابق فارغًا، بحيث تطبع عبارة على الشاشة تقدّم بعض الشرح: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo sh -c 'echo "Planned maintenance. Log in capabilities will be restored at 1545 UTC" &gt; /etc/nologin' </pre><p>لنقوم بتجربة جديدة الآن لاختبار ما سبق: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ssh user@host 
user@host's password: 
Planned maintenance. Log in capabilities will be restored at 1545 UTC 
Connection closed by host </pre><p>عند الانتهاء من التعامل مع الوضع الحرج يمكن إعادة كل شيء على حاله بحذف الملف السابق <span style="font-family:courier new,courier,monospace;">etc/nologin/</span>: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo rm /etc/nologin</pre><h2>مراقبة تسجيلات الدخول</h2></div><div id="wmd-preview-section-61"><p>بعد ضبط مختلف الإعدادات المتعلقة بالمستخدمين والمجموعات لديك، نأتي الآن إلى مهارة أخرى أساسية تتعلق بمراقبة النظام، إذ تحتفظ أنظمة لينكس الحديثة بسجلات لكافة محاولات تسجيل الدخول في ملف مستقل يخزّن على المسار <span style="font-family:courier new,courier,monospace;">var/log/auth.log/</span>: <br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo less /var/log/auth.log</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">May 3 18:20:45 localhost sshd[585]: Server listening on 0.0.0.0 port 22. May 3 18:20:45 localhost sshd[585]: Server listening on :: port 22. 
May 3 18:23:56 localhost login[673]: pam_unix(login:session): session opened fo r user root by LOGIN(uid=0) 
May 3 18:23:56 localhost login[714]: ROOT LOGIN on ‘/dev/tty1’ 
Sep 5 13:49:07 localhost sshd[358]: Received signal 15; terminating. 
Sep 5 13:49:07 localhost sshd[565]: Server listening on 0.0.0.0 port 22. 
Sep 5 13:49:07 localhost sshd[565]: Server listening on :: port 22
… 
</pre><h3>باستخدام الأمر last</h3></blockquote></div><div id="wmd-preview-section-62"><p>يتيح لنا الأمر <span style="font-family:courier new,courier,monospace;">last</span> استعراض تسجيلات الدخول الأخيرة لنظام التشغيل موزعة على جدول: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">last</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">demoer pts/1 rrcs-72-43-115-1 Thu Sep 5 19:37 still logged in 
root pts/1 rrcs-72-43-115-1 Thu Sep 5 19:37 - 19:37 (00:00) 
root pts/0 rrcs-72-43-115-1 Thu Sep 5 19:15 still logged in 
root pts/0 rrcs-72-43-115-1 Thu Sep 5 18:35 - 18:44 (00:08) 
root pts/0 rrcs-72-43-115-1 Thu Sep 5 18:20 - 18:20 (00:00) 
demoer pts/0 rrcs-72-43-115-1 Thu Sep 5 18:19 - 18:19 (00:00)</pre><p>يُستمد الخرج السابق من الملف <span style="font-family:courier new,courier,monospace;">etc/log/wtmp/</span>. <br>وكما نرى فإن السطرين الأول والثالث يوضحان لنا بأن المستخدم لا يزال قيد الدخول logged in، أما في باقي الأسطر فيعرض توقيت كل جلسة والزمن المستغرق فيها.</p></blockquote></div><div id="wmd-preview-section-63"><h3 id="باستخدام-الأمر-lastlog">باستخدام الأمر lastlog</h3><p>إذا رغبت باستعراض السجّل السابق من زاوية أخرى، فيمكنك مشاهدة توقيت آخر مرة سجّل بها مستخدمو النظام دخولهم وذلك عبر الأمر <span style="font-family:courier new,courier,monospace;">lastlog</span> والذي يعرض لنا محتويات الملف <span style="font-family:courier new,courier,monospace;">etc/log/lastlog/</span> مرتبة وفقًا لمدخلات الملف <span style="font-family:courier new,courier,monospace;">etc/passwd/</span>: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">lastlog</pre><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Username Port From Latest root pts/1 rrcs-72-43-115-1 Thu Sep 5 19:37:02 +0000 2013 
daemon **Never logged in** 
bin **Never logged in** 
sys **Never logged in** 
sync **Never logged in** 
games **Never logged in** 
…</pre><p>كما ترى يعرض الخرج السابق تاريخ آخر تسجيل دخول لكل مستخدم، بينما تُعرض العبارة "Never logged in" أمام المستخدمين الذين يتم إنشاؤهم لإدارة خدمات النظام، والذين لا يملكون كلمات مرور كما مرّ معنا.</p></blockquote></div><div id="wmd-preview-section-64"><h2 id="خاتمة">خاتمة</h2><p>إنه لمن المهم أن نعلم أين يحتفظ النظام بالمعلومات المتعلقة بتسجيلات الدخول، وذلك بهدف مراقبة التغييرات التي قد تشك بأمرها، لتعطيل تسجيل الدخول عن بعض أو كل المستخدمين. <br>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-view-system-users-in-linux-on-ubuntu">Configuring and Managing Users and Groups</a> لصاحبه Justin Ellingwood.</p></div>
]]></description><guid isPermaLink="false">78</guid><pubDate>Wed, 24 Jun 2015 14:04:23 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x628;&#x646;&#x64A; &#x648;&#x62A;&#x62B;&#x628;&#x651;&#x62A; &#x627;&#x644;&#x62D;&#x632;&#x645; &#x645;&#x646; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Make &#x639;&#x644;&#x649; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%88%D8%AA%D8%AB%D8%A8%D9%91%D8%AA-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%85%D9%86-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-make-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r77/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/make-linux.png.ad58f71400154d9e4363c0aec081b18b.png" /></p>

<meta charset="utf-8"><title></title><style type="text/css"></style><p id="-make-">عندما تعمل على أنظمة غنو لينكس Gnu Linux فإن جميع البرامج والحزم التي تحتاجها ستجدها في المستودعات الرسميّة لتوزيعتك من خلال مدير الحزم، أو في مستودعات إضافيّة يقدمها المجتمع، لكنك قد تصادف في وقتٍ ما حاجتك إلى حزمة غير متوفرة في المستودعات بشكلها الثنائي الجاهز Binary package، أو أنك ترغب في الحصول على أحدث نسخة من برنامج ما فور صدوره، دون انتظار وصوله إلى المستودعات. في مثل هذه الحالات ستلزمك مهارة بناء وتثبيت الحزم من المصدر، وهي موضوع حديثنا في هذا الدرس، حيث سنعمل معًا على بناء تطبيق curl ابتداء من شِفرته المصدرية، وبالطبع فإن الأساسيات المستخدمة في هذا المثال تصلح أيضًا لمعظم الحالات الأخرى.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/make-linux.png.0dbf15e670d80fd71f43a1f6119f35d0.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3005" src="https://academy.hsoub.com/uploads/monthly_2015_06/make-linux.thumb.png.107bec1be169d5db7c7be3df563904f9.png" class="ipsImage ipsImage_thumbnailed" alt="make-linux.thumb.png.107bec1be169d5db7c7"></a></p><h2 id="-">المتطلبات</h2><p>تتضمن عملية البناء من المصدر تحويل شيفرة البرنامج إلى حزمة ثنائية، يمكن تركيبها باستخدام مدير الحزم في توزيعتك لنحصل على التطبيق بصيغة تنفيذيّة، تُسمى هذه العملية بالترجمة Compiling، وتعني ترجمة الشيفرة المصدرية إلى لغة الآلة. في البداية نحن نحتاج إلى مجموعة من الأدوات والحزم اللازمة في أي عملية بناء، والتي تُسمى بـ "build-essential" في دبيان والأنظمة المبنية عليها، بينما يُطلق عليها اسم "Development Tools" في RedHat و CentOS، والتي تتضمن مترجمات ++gcc/g ومكتبات أخرى ضرورية، لتركيب هذه الحزمة في دبيان و Ubuntu نفّذ الأمر التالي في الطرفيّة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">apt-get install build-essential</pre><p>أما على أنظمة rpm مثل CentOS:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">yum groupinstall "Development Tools" </pre><p>يتطلب تركيب بعض البرامج في غنو لينكس وجود حزم أخرى (تُسمى اعتماديات) مُثبّتة مسبقًا؛ حيث تلزم لتشغيل البرنامج بشكل صحيح، فإذا استخدمتَ مدير حزم (مثل apt-get) في عملية التركيب فإنه عادةً ما يقوم بجلب هذه الاعتماديات وتثبيتها بشكل تلقائي، أما في حال بناءك لبرنامج ما من المصدر فإنه يتوجب عليك قراءة ملف التعليمات المرفق معه والتحقق من وجود كافة الاعتماديات التي يتطلبها البرنامج مثبّتة على نظامك قبل بدء الترجمة. في مثالنا هنا عن بناء curl سوف تحتاج إلى صلاحيات الجذر root (عبر sudo مثلا) لتثبيت الحزمة بعد ترجمتها.</p><h2 id="-curl-">مثال: الحصول على curl وبنائها من المصدر</h2><h2 id="-">تنزيل الحزمة</h2><p>يتوجب علينا أولًا الحصول على الشيفرة المصدرية للأداة curl، وأمامنا طرق كثيرة لفعل ذلك، منها استخدام النسخة المتوفرة في <a rel="external nofollow" href="http://curl.haxx.se/download.html">موقع curl الرسمي</a> وهي الطريقة التي سنستخدمها هنا، انتبه إلى زيارة الموقع لتتأكد من رقم الإصدار الحالي للبرنامج، النسخة المستخدمة في هذا المقال تحمل الرقم 7.43 وهي أحدث إصدار متوفر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">wget -O curl.tar.gz http://curl.haxx.se/download/curl-7.43.0.tar.gz </pre><p>تعمل الأداة wget على جلب الحزمة من الرابط المرفق، وتحفظها في الدليل النشط. الخطوة التالية هي فكّ ضغط الحزمة، وسنستخدم لذلك الأداة tar:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">tar -xvzf curl.tar.gz </pre><p>وهكذا نحصل على المجلد curl-7.43.0 والذي يضم الشيفرة المصدرية لـ curl، نتحقق من ذلك:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ls user@droplet:~/curl ls curl-7.43.0 curl.tar.gz </pre><p>كما هو متوقع أصبح لدينا المجلد المطلوب، والذي يُحدّد اسمه تبعًا للإصدار الذي حمّلته من الموقع، للدخول إليه استخدم الأمر cd:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd curl-7.43.0</pre><h2 id="-">تهيئة وترجمة المصدر</h2><p>داخل المجلد السابق ستجد أنواعًا مختلفة من الملفات، ما يلزمنا الآن هو الملف المُسمى "configure"، وهو عبارة عن ملف تنفيذي (سكربت) يقوم بضبط بعض الإعدادات الخاصّة التي تساعد البرنامج في العمل على أجهزة الحاسوب المختلفة، لتشغيله نفّذ الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">./configure </pre><p>يتحقق السكربت السابق من وجود كافة المكتبات والحزم اللازمة لبناء وتشغيل البرنامج بشكل صحيح مثبّتة على جهازك، ويجمع بعض المعلومات عن النظام المستخدم لضبط البرنامج بما يوافقه، إضافةً لذلك يحدّد السكربت الدليل الذي سيُثبّت فيه البرنامج. عندما ينهي السكربت عمله بشكل صحيح فإنه يولّد ملفًا يدعى "Makefile" والذي يضم كافة المعلومات اللازمة للترجمة، إذا لم تنجح العملية السابقة فينبغي عليك التحقّق مرّةً أخرى من الاعتماديات التي يحتاجها البرنامج والمحاولة من جديد. </p><p>الآن لبدء بناء البرنامج (ترجمته) نفّذ الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">make </pre><p>ستشاهد عشرات الأسطر على شاشة الطرفية تُطبع وتُنفّذ أثناء ترجمة البرنامج، انتظر قليلًا ريثما يتمّ العمل (سيحتاج إلى بضعة دقائق غالبًا)، عند الانتهاء من الترجمة سيكون بإمكانك تثبيت البرنامج على نظام التشغيل لديك، نفّذ الأمر التالي بصلاحيات الجذر root:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">make install</pre><p>يتّبع الأمر make التعليمات المتضمنة في الملف Makefile لتثبيت الحزمة المُترجمة. في معظم الحالات سيكون هذا هو كلّ شيء، يفترض أن تتمكن الآن من استخدام الأداة curl، للتحقق من ذلك يمكنك طباعة الأمر</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">curl </pre><p>في الطرفية، وفي حال تمّ كل شيء بشكل صحيح ستحصل على خرج مشابه ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">curl: try 'curl --help' or 'curl --manual' for more information </pre><p>لو حصلت على رسالة خطأ، جرّب الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ln -s /usr/local/bin/curl /usr/bin/curl </pre><p>والذي سينشئ اختصارًا للأداة curl من الدليل <span style="font-family:courier new,courier,monospace;">usr/local/bin/curl/</span> إلى<span style="font-family:courier new,courier,monospace;"> usr/bin/curl/</span>، مما سيسمح لك بتشغيلها بمجرد استدعاء الأمر curl في الطرفية من خلال. في معظم الحالات يجب أن يعمل ذلك بشكل تلقائي وكما هو متوقع، في بعض الحالات قد لا يستطيع سكربت configure إيحاد مكان التثبيت الصحيح. </p><p>الآن يمكنك التحقّق من إصدار curl المثبت:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">curl -V </pre><p>يعيد الأمر السابق رقم الإصدار المثبّت ومعلومات إضافية تشبه هذه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">user@droplet:~/curl curl -V curl 7.43.0 (x86_64-unknown-linux-gnu) libcurl/7.26.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.2 librtmp/2.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp scp sftp smtp smtps telnet tftp Features: Debug GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP</pre><p>تهانينا! لقد تمكّنت من بناء الحزمة من المصدر وتثبيتها بنجاح.</p><h2 id="-">الخلاصة</h2><p>استعرضنا في هذا المقال الخطوات الأساسية لترجمة الشيفرة المصدرية وتحويلها إلى حزمة ثنائية جاهزة للتثبيت على نظامك، والتي يمكنك إعادة استخدامها مع معظم حالات البناء من المصدر، وأشدّد مجددًا على أهمية قراءة ملف التعليمات المرفق مع الحزم التي ترغب بتثبيتها، حيث تضم قائمة بالاعتماديات الواجب توفرها على جهازك قبل البدء بالبناء، كما قد تشمل تعليمات أخرى مهمة. عمومًا تذكّر أسلوبنا القياسي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">./configure 
make 
make install</pre><p>تُرجم وبتصرف من مقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-compile-and-install-packages-from-source-using-make-on-a-vps">How To Compile and Install Packages From Source Using Make on a VPS</a> للكاتب Mathias Jensen.</p>
]]></description><guid isPermaLink="false">77</guid><pubDate>Tue, 23 Jun 2015 14:16:25 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x623;&#x630;&#x648;&#x646;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;&#x60C; &#x648;&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Umask</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%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%8C-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-umask-r75/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/linux-permissions-basics-umask.png.c48436d577f3de5922b9733643c4566a.png" /></p>

<meta charset="utf-8"><title></title><style type="text/css"></style><p id="-umask">تتيح الأذونات في لينكس لمالك ملف أو مجلد ما من حصر الوصول لهذا الملف أو المجلّد بناءً على الصلاحيات المرتبطة به، وهذا ما يسمح بتعدّد حقيقي للمستخدمين في لينكس حيث يمتلك كلّا منهم مستويات مختلفة من التحكّم لحماية ملفاته. يُحدّد الأمر <span style="font-family:courier new,courier,monospace;">umask</span> الأذونات الافتراضية للملفات التي ينشئها كل مستخدم على حدى، كما يتيح إمكانية تعديل هذه الأذونات لاحقًا لضمان حماية عالية للملفات، أو لتوسيع الأذونات بغرض مشاركة الملفات مع الآخرين، اعتمادًا على احتياجاتك الخاصة ومتطلبات النظام. نتناول في هذا الدليل أساسيات التعامل مع الأذونات في لينكس، بحيث ترى فوائد إعداد umask بشكل صحيح، كما سنتكلم باختصار عن الأمر <span style="font-family:courier new,courier,monospace;">chmod</span> باعتباره أحد أشهر الأدوات المرتبطة بإدارة الأذونات.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/linux-permissions-basics-umask.png.66a9f0d51205b6239020fe9e16ce8eff.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="2821" src="https://academy.hsoub.com/uploads/monthly_2015_06/linux-permissions-basics-umask.thumb.png.628b2689048d068e37f764aa4c1a251f.png" class="ipsImage ipsImage_thumbnailed" alt="linux-permissions-basics-umask.thumb.png"></a></p><h2 id="-">فئات المستخدمين</h2><p>بالنسبة للقادمين من Windows قد تبدو مسألة الأذونات في لينكس غامضة بعض الشيء، إلا أنه حالما تتعرف على الطريقة التي نرمّز بها للأذونات فسيغدو كلّ شيء واضحًا تمامًا، وستتمكن من التعديل بسهولة على تصاريح الملفات والمجلدات.</p><h3 id="-">فئة المالك</h3><p>صُمم لينكس ليسمح بتعدّدٍ حقيقي للمستخدمين، وهذا يعني أن كلّ ملف مملوك من قبل مستخدم واحد فقط، وحتى لو كنتَ المستخدم الوحيد لحاسبك أو خادومك الخاص، فإنه لا يزال هناك عدد آخر من المستخدمين المُنشئين مسبقًا بغرض تشغيل برامج أو خدمات معينة، ويمكنك بطباعة الأمر التالي الحصول على قائمة بأسمائهم: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cat /etc/passwd</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
. . .</pre><p>يعرض الخرج السابق محتويات ملف <span style="font-family:courier new,courier,monospace;">etc/passwd/</span> وهي عبارة عن معلومات المستخدمين المنشئين على نظام تشغيلك؛ موزعةً على عدّة أسطر (سطر لكل مستخدم)، حيث تضم الخانة الأولى من كل سطر الاسم المميز لكل مستخدم، والذي غالبًا ما يرتبط بخدمات وتطبيقات مختلفة. إذ تنشئ بعض البرامج عادةً اسم مستخدم مستقل بحيث تدار جميع الخدمات المتعلقة بها من خلاله، مما يعطينا قدرة على التحكم بالوصول لهذه الخدمات.</p><h3 id="-">فئة المجموعة المالكة</h3><p>إضافة إلى فئة المالكين يمكن إسناد الأذونات إلى "مجموعة المالك" لملف أو مجلّد معيّن، وكما ذكرنا مع فئة المالك، لا يمكن أن تعود ملكية الملف سوى لمجموعة واحدة فقط، بينما يمكن لأي مستخدم أن ينضم لأكثر من مجموعة، وأن تضم كل مجموعة عدّة أعضاء أو مستخدمين. </p><p>لمعرفة المجموعات التي ينتمي لها مستخدمك الحالي، اطبع الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">groups </pre><p>سيعرض الخرج أسماء المجموعات التي سبق لمستخدمك الانضمام لها، وبشكل افتراضي ينتمي أي مستخدم لمجموعة واحدة على الأقل (والتي تسمى باسمه وتعتبر مجموعته الخاصة)، إضافة إلى مجموعة أخرى. بينما يمكن استعراض جميع المجموعات المنشأة على نظامك الحالي من خلال الأمر: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cat /etc/group </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .</pre><p>يطبع الأمر السابق محتويات الملف <span style="font-family:courier new,courier,monospace;">etc/group/</span> على الشاشة، وهو يتألف من عدّة أسطر، يمثّل كلّ واحدٍ منها مجموعة ما، ويحمل الحقل الأول من كل سطر اسم المجموعة. وباعتبار أنه لا يمكن امتلاك الملف سوى من قبل مستخدم وحيد، ولتسهيل عملية المشاركة يتيح لينكس إمكانية إعطاء صلاحيات مخصصة لمجموعة من المستخدمين، تسمى هذه المجموعة بالمجموعة المالكة للملف.</p><h3 id="-">فئة الآخرين</h3><p>أخيرًا يمكن إعطاء صلاحيات الملفات في لينكس إلى فئة ثالثة تسمى "الآخرين"، ونقول عن مستخدم ما أنه ينتمي لتصنيف الآخرين، إذا لم يكن مالكًا للملف وليس عضوًا في مجموعة المالكين له. يتيح لك هذا التصنيف إمكانية وضع الأذونات العامة المتاحة لمن هم خارج التصنيفين السابقين (المالك، والمجموعة المالكة).</p><h2 id="-">أنواع الأذونات</h2><p>يمكن لكل فئة من الفئات الثلاث السابقة (المالك، المجموعة المالكة، والآخرين) الحصول (أو عدم الحصول) على واحدة أو أكثر من الصلاحيات التالية: القراءة، الكتابة، والتنفيذ. بالنسبة للملف، فإن صلاحية القراءة تعني إمكانية استعراض محتوى الملف، وصلاحية الكتابة ترتبط بالقدرة على التعديل عليه (بما في ذلك حذفه)، بينما تعني صلاحية التنفيذ القدرة على تشغيل الملف فيما لو كان نصًا تنفيذًا script أو برنامجًا. </p><p>أما فيما يتعلق بالمجلدات، تمنح صلاحية القراءة إمكانية الاستعلام <span style="font-family:courier new,courier,monospace;">ls </span>عن محتويات المجلد (من ملفات ومجلدات)، أما صلاحية الكتابة فتسمح بتعديل محتوياته، وصلاحية التنفيذ تسمح بالدخول إلى المجلد <span style="font-family:courier new,courier,monospace;">cd</span> والتعديل عليه. تُمثّل الصلاحيات في لينكس بطريقتين، تدعى الأولى بالترميز الأبجدي ويستخدم فيها الأحرف، بينما تسمى الأخرى بالترميز العددي (الثُماني) وتستخدم فيها الأرقام.</p><h3 id="-">الترميز الأبجدي</h3><p>يمتاز الترميز الأبجدي للصلاحيات بأنه أقرب للفهم وأسهل في الاستخدام كما أنه مستعمل من قبل عدّة برامج شائعة لإدارة الأذونات في لينكس، حيث يرمّز لكل واحدة من الصلاحيات بحرفٍ واحد:</p><ul><li>صلاحية القراءة تأخذ الحرف <span style="font-family:courier new,courier,monospace;">r</span>.</li><li>صلاحية الكتابة تأخذ الحرف <span style="font-family:georgia,serif;">w</span>.</li><li>صلاحية التنفيذ تأخذ الحرف<span style="font-family:courier new,courier,monospace;"> x</span>.</li></ul><p>ويجب الانتباه هنا إلى أن الصلاحيات في لينكس تُحدّد دومًا وفق هذا الترتيب. لإسناد صلاحية معينة لملف ما يتم استخدام الحرف المقابل لها، أما لمنع الصلاحية عن الملف فنستخدم الشرطة (<span style="font-family:courier new,courier,monospace;">-</span>)، ويتم إعطاء الصلاحية عبر تمرير ثلاث مجموعات من القيم بشكل متتابع، تحدّد الأولى صلاحية المالك، وتحدّد الثانية صلاحية المجموعة المالكة، بينما تحدّد الأخيرة صلاحية الآخرين. </p><p>يُرجع الأمر <span style="font-family:courier new,courier,monospace;">ls</span> مع الخيار <span style="font-family:courier new,courier,monospace;">l-</span> قائمة بمحتويات المجلد الحالي مزودةً بعمود يعرض صلاحيات كل منها بالأسلوب الأبجدي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd /etc 
ls -l </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">drwxr-xr-x 3 root root    4096 Apr 26  2012 acpi
-rw-r--r-- 1 root root    2981 Apr 26  2012 adduser.conf
drwxr-xr-x 2 root root    4096 Jul  5 20:53 alternatives
-rw-r--r-- 1 root root     395 Jun 20  2010 anacrontab
drwxr-xr-x 3 root root    4096 Apr 26  2012 apm
drwxr-xr-x 3 root root    4096 Apr 26  2012 apparmor
drwxr-xr-x 5 root root    4096 Jul  5 20:52 apparmor.d
drwxr-xr-x 6 root root    4096 Apr 26  2012 apt
…</pre><p>وكما نرى فإن العمود الأول من اليسار يعرض أذونات الملفات والمجلدات بالترميز الأبجدي ضمن خانة مؤلفة من عشرة محارف، يحدّد الأوّل منها نوع الملف حيث يعطي الشرطة (<span style="font-family:courier new,courier,monospace;">-</span>) للملفات، حرف (<span style="font-family:courier new,courier,monospace;">d</span>) للمجلدات، وحرف (<span style="font-family:courier new,courier,monospace;">l</span>) للروابط... الخ، بينما تُحدّد المحارف التسعة المتبقية صلاحيات الفئات الثلاث (المالك، المجموعة المالكة، والآخرين) من إمكانية قراءة، كتابة، وتنفيذ. </p><p>لنقرأ أذونات السطر الأول من الخرج السابق مجددًا، الحرف <span style="font-family:courier new,courier,monospace;">d</span> يرمز إلى أن <span style="font-family:courier new,courier,monospace;">acpi</span> هو مجلد وليس ملف، يمنح مالكه الصلاحيات الثلاث (قراءة، كتابة، وتنفيذ)، في حين تمنح كلا من المجموعة المالكة وفئة الآخرين صلاحيتا القراءة والتنفيذ فقط. بينما تحدّد الشرطة (<span style="font-family:courier new,courier,monospace;">-</span>) من أذونات السطر الرابع أن <span style="font-family:courier new,courier,monospace;">anacrontab</span> هو ملف وليس مجلد، يمنح لمالكه صلاحيات القراءة والكتابة، أما المجموعة المالكة وفئة الآخرين فتمنح صلاحية القراءة فقط.</p><h3 id="-">الترميز العددي (الثماني)</h3><p>يعطي الترميز العددي طريقة أكثر إيجازًا لكن أقل بداهةً في التعامل مع الصلاحيات، وفق هذا الأسلوب تُحدّد صلاحيات كل فئة من الفئات الثلاث (المالك، المجموعة المالكة، والآخرين) برقم ضمن المجال بين 0 و 7. لمعرفة الرقم الصحيح الذي نرغب باختياره نقوم بتحديد الصلاحيات المطلوبة من الجدول التالي، ومن ثم جمع أعدادها:</p><ul><li>صلاحية القراءة تأخذ الرقم <span style="font-family:courier new,courier,monospace;">4.</span></li><li>صلاحية الكتابة تأخذ الرقم <span style="font-family:courier new,courier,monospace;">2</span>.</li><li>صلاحية التنفيذ تأخذ الرقم <span style="font-family:courier new,courier,monospace;">1</span>.</li></ul><p>وهكذا يجب علينا جمع هذه الأرقام ثلاث مرات منفصلة (مرة لكل فئة) للحصول على الترميز المطلوب لملف ما، حيث يتم إعطاء الرقم <span style="font-family:courier new,courier,monospace;">7</span> للفئة التي نريد إسناد صلاحيات القراءة والكتابة والتنفيذ لها (4+2+1) بينما تحصل الفئة التي نرغب بمنعها من كافة الصلاحيات على الرقم (<span style="font-family:courier new,courier,monospace;">0</span>). </p><p>لنعود مجددًا إلى مجلد <span style="font-family:courier new,courier,monospace;">acpi</span> السابق كمثال، وباعتبار أن مالكه يجمع الصلاحيات الثلاث معًا فهو يأخذ الرقم <span style="font-family:courier new,courier,monospace;">7</span>، بينما تأخذ كل من المجموعة المالكة وفئة الآخرين الرقم (<span style="font-family:courier new,courier,monospace;">5</span>)، ليكون الترميز الكامل للمجلد على الشكل <span style="font-family:courier new,courier,monospace;">755</span>. وكما في الترميز الأبجدي، يمكن للترميز العددي أن يضم بادئة تعبّر عن نوع الملف، وهذا يتبع لصلاحيات المالك، والمجموعة المالكة، وفئة الآخرين على الترتيب.</p><h2 id="-chmod-">استخدام الأمر chmod</h2><p>يعتبر الأمر <span style="font-family:courier new,courier,monospace;">chmod</span> الطريقة الأكثر انتشارًا لتعديل صلاحيات ملف ما باستخدام الترميز العددي (الثماني)، لنأخذ مثالًا عمليًا على الفور:  </p><p>سوف ننشئ في مجلد المنزل ملفًا فارغًا باسم <span style="font-family:courier new,courier,monospace;">testfile</span> لذلك: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd 
touch testfile </pre><p>ولنستعرض الآن الصلاحيات التي تعطى للملف بشكل افتراضي عند إنشاءه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ls -l testfile
</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint" style="line-height: 22.3999996185303px;"> -rw-rw-r-- 1 demouser demouser 0 Jul 10 17:23 testfile</pre><p>وكما هو واضح فإن كلًا من مالك الملف والمجموعة المالكة له تملك أذونات القراءة والكتابة، بينما لا تملك فئة الآخرين سوى صلاحية القراءة. عند تحويل الترميز الأبجدي السابق إلى ترميز عددي، سيحصل كل من المالك والمجموعة المالكة على القيمة (<span style="font-family:courier new,courier,monospace;">6</span>) (4 للقراءة و 2 للكتابة)، بينما تحصل فئة الآخرين على القيمة (<span style="font-family:courier new,courier,monospace;">4</span>) فقط (للقراءة)، وهكذا يمكن تمثيل صلاحيات الملف testfile وفق الترميز العددي بالقيمة (<span style="font-family:courier new,courier,monospace;">664</span>). </p><p>لنفترض مثلًا أن الملف السابق يضم نصّ تنفيذي script، ونريد أن نضيف صلاحيات التنفيذ للمالك فقط، إضافةً لسحب صلاحيات التعديل عن المجموعة المالكة، بينما لا نعطى فئة الآخرين أيّة صلاحيات على الإطلاق. يمكن تمثيل الصلاحيات الجديدة بعد التعديل وفق الترميز الأبجدي كما يلي<span style="font-family:courier new,courier,monospace;"> -rwxr-----</span>، بينما تأخذ القيمة (<span style="font-family:courier new,courier,monospace;">740</span>) في التمثيل العددي، لنستخدم الأمر <span style="font-family:courier new,courier,monospace;">chmod</span> للتعديل على أذونات الملف: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">chmod 740 testfile 
ls -l testfile 
</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint" style="line-height: 22.3999996185303px;">-rwxr----- 1 demouser demouser 0 Jul 10 17:23 testfile </pre><p>وهكذا نتأكد أن حسابنا صحيح، وقد أسند للملف صلاحياته الجديدة، وبذات الطريقة يمكن إعادة ضبط الأذونات على ما كانت عليه: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">chmod 664 testfile 
ls -l testfile 
</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-rw-rw-r-- 1 demouser demouser 0 Jul 10 17:23 testfile</pre><h2 id="-umask">ضبط الأذونات الافتراضية باستخدام Umask</h2><p>تتحكّم الأداة <span style="font-family:courier new,courier,monospace;">umask</span> بالأذونات المبدئية للملفات والمجلدات عند إنشائها بناء على صلاحيات الأساس "base"، حيث تعطى الصلاحية ذات القيمة (<span style="font-family:courier new,courier,monospace;">666</span>) للملفات فور إنشائها، والتي تشمل أذونات القراءة والكتابة لفئات المستخدمين الثلاث (المالك، المجموعة المالكة، والآخرين)، ولا تشمل الأذونات الافتراضية صلاحية التنفيذ لأيّ من الملفات المنشأة، باعتبار أن معظمها لا يضم نصوصًا تنفيذية، كما أن إعطاء صلاحية التنفيذ بشكل افتراضي يفتح الباب أمام بعض المخاوف الأمنية. أما المجلدات فتعطى الصلاحية ذات القيمة (<span style="font-family:courier new,courier,monospace;">777</span>) أي القراءة والكتابة والتنفيذ لجميع المستخدمين. </p><p>يسمى الأسلوب الذي تعمل به الأداة umask بقناع الطرح subtractive mask، فطالما أن صلاحية التنفيذ لا يمكن أن تعطى بشكل افتراضي، فهذا يعني أن umask يعطي افتراضيًا أعلى الأذونات الممكنة، وهكذا فالتعديل الوحيد الممكن على قيمه الافتراضية هو بتقليل تلك الأذونات، وبعبارة أخرى إنشاء طبقة (أو قناع) تطرح بعض الأذونات المبدئية من صلاحيات الأساس. فعلى سبيل المثال، لو رغبنا بطرح صلاحية الكتابة من فئة الآخرين للمجلدات المنشأة (بحيث تبقى للمالك والمجموعة المالكة فقط)، فهذا يعني أن الأذونات الافتراضية يجب أن تصبح برقم (<span style="font-family:courier new,courier,monospace;">755</span>)، ولإدخال التعديلات باستخدام الأداة umask نطرح الأذونات الأساسية من الأذونات المطلوبة لنحصل على قناع الطرح لحالتنا هذه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">  777
- 775
------
  002</pre><p>الناتج (<span style="font-family:courier new,courier,monospace;">002</span>) هو القيمة التي سنمررها إلى umask لإدخال التعديلات المرغوبة، وفي الحقيقة يصادف أحيانًا أن تكون هذه هي القيمة الافتراضية لبعض الأنظمة كما مرّ معنا سابقًا عندما أنشأنا ملف جديد باستخدام الأمر touch، لنعيد المثال مرّة أخرى:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">touch test2 
ls -l test2
</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint" style="line-height: 22.3999996185303px;">-rw-rw-r-- 1 demouser demouser 0 Jul 10 18:30 test2 </pre><p>وإذا أردنا تأمين حماية أفضل لنظام تشغيلنا، فيمكن تعديل الأذونات المبدئية للملفات المنشأة بحيث لا تتيح لغير المالك أية صلاحيات على الإطلاق، عبر تمرير قناع الطرح (<span style="font-family:courier new,courier,monospace;">077</span>) للأداة umask لتصبح صلاحيات الأساس الجديدة (<span style="font-family:courier new,courier,monospace;">600</span>):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">umask 077 
touch restricted 
ls -l restricted </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint" style="line-height: 22.3999996185303px;">-rw------- 1 demouser demouser 0 Jul 10 18:33 restricted </pre><p>ولقلب العملية، أي لإعطاء كامل الصلاحيات لكافة فئات المستخدمين للملفات والمجلدات المنشأة فإننا نستخدم قناع الطرح (<span style="font-family:courier new,courier,monospace;">000</span>):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">umask 000 
touch openfile 
ls -l openfile </pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint" style="line-height: 22.3999996185303px;">-rw-rw-rw- 1 demouser demouser 0 Jul 10 18:36 openfile </pre><p>تُطبّق القيم الجديدة لصلاحيات الأساس عبر umask للجلسة الحاليّة فقط، وهذا يعني أنه عند إعادة التشغيل أو تسجيل الخروج، سيتم إعادة ضبط umask للقيم الافتراضية التي تُحدّدها توزيعتك، أما لجعل تغييراتك دائمة لكافة الجلسات القادمة فيجب تمرير قناع الطرح المطلوب إلى ملف <span style="font-family:courier new,courier,monospace;">bashrc.</span> الخاص بمستخدمك: </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd 
nano .bashrc</pre><p>تأكد أولًا فيما إذا كان هناك سطر يحدّد قيمة قناع الطرح umask، في هذه الحالة أدخل التعديل على القيمة المسندة له فقط، في غير ذلك أضف السطر التالي إلى نهاية الملف بالقيم التي تريد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">umask 022 </pre><p>في مثالنا هذا مررنا كامل الصلاحيات لفئة المالك، بينما سحبنا صلاحيات الكتابة لكل من المجموعة المالكة وفئة الآخرين، بعد تحديد القناع الذي ترغب باختياره قم بحفظ الملف وإعادة تسجيل الدخول.</p><h2 id="-">إشعار تحذير</h2><p>يجب لفت الانتباه لنقطة مهمة تتعلق بتعديل الأذونات، حيث أن بعض ملفات النظام، وبعض الخدمات أو العمليات تتطلب صلاحيات معينة لتعمل بشكل صحيح، وإلا فستؤدي الصلاحيات غير الملائمة لأخطاء في التشغيل. إضافةً إلى أن توزيع الصلاحيات بشكل متساهل (مثل تمرير أذونات التنفيذ لفئة الآخرين بشكل تلقائي) قد تعرّضك لمشاكل أمنية. لهذه الأسباب (وغيرها) لا يُنصح بتعديل أذونات الملفات أو المجلدات خارج نطاق دليل المنزل الخاص بك، إلا إذا كنتَ على درايةً دقيقة بما تقوم به. </p><p>أمرٌ آخر أودّ الإشارة إليه هنا، لأولئك الذين يقومون بضبط البرامج بشكل يدوي، وهي أهمية محاولة تمرير أقل صلاحيات ممكنة للبرنامج مع مراعاة ألّا يؤثر ذلك بالطبع على وظائفه. وفيما إذا كنتَ المستخدم الوحيد لجهازك (مدير خادوم مثلًا) فأنت تحتاج إلى صلاحيات مطلقة على الملفات، لكن إسناد أية صلاحيات لفئة الآخرين (كالكتابة أو حتى القراءة) لا داعي له سوى جلب المخاطر الأمنية، لا سيما في حال كانت كلمة المرور خاصتك مخزنة في ملف نصيّ غير مشفّر plain-text. وبالاستفادة من فئة (المجموعة المالكة) وإسناد الأذونات المناسبة لها، ومن ثم إضافة الأشخاص اللازمين من فريق العمل إليها، يمكن تحقيق أفضل منفعة ممكنة من إدارة الصلاحيات في لينكس، إضافةً إلى إلغاء صلاحيات "الآخرين" فيما لو لم يكن هناك حاجةٌ إليها، مما يحقق مستوىً عالٍ من الأمان.</p><p><strong>* الأذونات أو Permissions</strong>: هي مجموعة من القواعد تحدّد أولئك الذين يحق لهم أو لا يحق لهم امتلاك إمكانية القراءة، الكتابة، أو التعديل، على الملفات والمجلدات، وقد استخدمنا لها عدّة ترجمات في هذا الدليل؛ الأذونات، الصلاحيات، التصاريح.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/linux-permissions-basics-and-how-to-use-umask-on-a-vps">Linux Permissions Basics and How to Use Umask on a VPS</a>.</p>
]]></description><guid isPermaLink="false">75</guid><pubDate>Mon, 22 Jun 2015 13:00:10 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; (Process) &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x637;&#x631;&#x641;&#x64A;&#x629;</title><link>https://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/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/process-management-linux_(1).png.2e975b5fbe8630afdcccb47c50d00dec.png" /></p>

<p>يُعتبر تشغيل التطبيقات على خادوم لينكس أمرًا اعتياديًا كما هو الحال مع أي جهاز حاسوب آخر، ويطلق الحاسب على تلك التطبيقات اسم "العمليات" Process. وبينما يعالج لينكس من وراء الكواليس العمليات على المستوى المنخفض ويدير [دورة حياتها][1] إلا أنك لا تزال بحاجة إلى أدوات تساعدك على إدارة هذه العمليات في المستوى العالي higher-level لإدارة النظام. في هذا الدّرس سنناقش بعض الجوانب البسيطة في إدارة العمليات تحت أنظمة لينكس، والتي توفّر عددًا كبيرًا من الأدوات لهذا الغرض. تم تطبيق الأمثلة على خادوم خاص VPS يعمل بتوزيعة Ubuntu 14.04، إلا أنها ستعمل بالتأكيد بذات الطريقة مع باقي التوزيعات.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/process-management-linux_(1).png.89c02a78c47cd3121c8df5889767c456.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="2741" src="https://academy.hsoub.com/uploads/monthly_2015_06/process-management-linux_(1).thumb.png.e902bdd4a60c7577dd9f97a2ed358297.png" class="ipsImage ipsImage_thumbnailed" alt="process-management-linux_(1).thumb.png.e"></a></p><p style="text-align: center;"> </p><h2>كيفية استعراض العمليات النشطة في لينكس</h2><h3>top</h3><p>لاستعراض العمليات النشطة حاليًا على الخادوم يمكن بسهولة تشغيل الأمر top:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">top

top - 15:14:40 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   316576k used,   703024k free,     7652k buffers
Swap:        0k total,        0k used,        0k free,   258976k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/0        
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0         
    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             
    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs          
</pre><p>تضم السطور الأولى للخرج السابق معلومات عامة عن النظام مثل مدّة تشغيله، معدّل استخدام المعالج، عدد العمليات، وغيرها، ويمكن ملاحظة وجود عملية واحدة نشطة في مثالنا هذا، إضافة إلى 55 عملية في حالة سكون idle أي لا تستخدم شيئًا من موارد المعالج CPU. بينما يضم القسم الآخر والموزع في جدول على العمليات النشطة إضافةً لمعلومات مختلفة عنها (مثل مقدار استهلاكها للذاكرة أو المعالج).</p><h3>htop</h3><p>النسخة المُحسّنة من top تدعى htop، وهي متاحة في المستودعات الرسمية لمعظم التوزيعات، على Ubuntu يمكن تركيبها بالأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install htop</pre><p>يعرض الأمر htop الخرج بأسلوب أيسر في القراءة والفهم:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">htop

Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05 
CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running
Swp[                         0/0MB]     Uptime: 00:58:11

PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop
   1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init
 311 root       20   0 17224   636   440 S  0.0  0.1  0:00.07 upstart-udev-brid
 314 root       20   0 21592  1280   760 S  0.0  0.1  0:00.06 /sbin/udevd --dae
 389 messagebu  20   0 23808   688   444 S  0.0  0.1  0:00.01 dbus-daemon --sys
 407 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.02 rsyslogd -c5
 408 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
 409 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
 406 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.04 rsyslogd -c5
 553 root       20   0 15180   400   204 S  0.0  0.0  0:00.01 upstart-socket-br</pre><p>لقراءة المزيد عن استخدام الأمرين top و htop هنا.</p><h2>استخدام ps في عرض العمليات</h2><p>كما شاهدنا فكلا الأداتين top و htop تعرضان العمليات بشكل مشابه لمدير المهام في الواجهات الرسومية، إلا أنهما ليستا مرنتين كفايةً لتغطية كافة الاحتياجات، وهنا يأتي دور الأداة ps للتعويض عن هذا القصور. للوهلة الأولى قد يخيب أملنا فيما لو استدعينا الأمر ps مباشرةً ودون معطيات Arguments إضافية، حيث لن يزيد عدد أسطر الخرج عن اثنين مع ثلاثة أعمدة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ps

 PID TTY          TIME CMD
1017 pts/0    00:00:00 bash
1262 pts/0    00:00:00 ps</pre><p>والسبب هو أن الأمر ps بشكله المجرّد يعرض العمليات المرتبطة بالمستخدم الحالي وجلسة الطرفية فقط، وبالنظر إلى أننا لم نشغّل سوى الطرفية مع الأمر ps فإن الخرج السابق يبدو طبيعيًا. أما لاستعراض تفاصيل أكثر عن عمليات نظامنا الحالي يمكننا تشغيل الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24188  2120 ?        Ss   14:28   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    14:28   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:28   0:00 [ksoftirqd/0]
root         6  0.0  0.0      0     0 ?        S    14:28   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    14:28   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S&lt;   14:28   0:00 [cpuset]
root         9  0.0  0.0      0     0 ?        S&lt;   14:28   0:00 [khelper]
. . .
</pre><p>مع الخيار aur سوف يعرض الأمر ps العمليات التي تخص كافة المستخدمين على شكل جدول سهل الفهم. كما يمكننا ترتيب عرض العمليات بشكل متسلسل يوضّح العلاقات فيما بينها عن طريق إضافة الخيار axjf للأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ps axjf

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
    2     6     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2     7     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]
    2     8     0     0 ?           -1 S&lt;       0   0:00  \_ [cpuset]
    2     9     0     0 ?           -1 S&lt;       0   0:00  \_ [khelper]
    2    10     0     0 ?           -1 S        0   0:00  \_ [kdevtmpfs]
    2    11     0     0 ?           -1 S&lt;       0   0:00  \_ [netns]
. . .</pre><p>وكما ترى يمكننا بسهولة ملاحظة أن العملية kthreadd هي عملية أب للعملية ksoftirqd/0 وما يليها.</p><h2>ملاحظات حول معرّفات العمليات Process IDs</h2><p>يخصّص لينكس والأنظمة الشبيهة بيونكس رقمًا معرفًا لكل عملية<strong> Process ID</strong> أو ما يعرف بـ <strong>PID</strong>، حيث يتمكّن النظام من التعرف بذلك على العمليات وتعقبها أثناء التشغيل. يتيح الأمر pgrep أسلوبًا سهلًا للحصول على رقم PID لأيّة عملية، حيث يستعلم عنه ويعيده كخرج على الشاشة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">pgrep bash 
1017</pre><p> كمثال آخر فإن أوّل عملية يتم إطلاقها أثناء الإقلاع والتي تدعى init تعطى رقم PID يساوي الواحد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">pgrep init 
1</pre><p>تعمل هذه العملية على متابعة تشغيل باقي العمليات أثناء تشغيل النظام، كما أنها مسؤولة عن تشغيل باقي الخدمات، وفي المقابل فإن آخر عملية يتم تشغيلها تأخذ أكبر رقم PID. نقول عن عملية ما أنها عملية أب Parent Process إذا كانت تتولى تشغيل عملية أخرى، وهذا يعني أنه إذا تم إيقاف العملية الأب بشكل إجباري (أي قتلها) فستنهار العملية الابن، يشار في هذه الحالة لرقم PID الخاص بمعرّف عملية أب برقم <strong>PPID</strong>. تعرض الأدوات السابقة (top, htop, ps) أعمدة تضم أرقام كلًا من PID و PPID الخاصة بالعمليات المختلفة، إذ تتم إدارة العمليات بين المستخدم والنظام من خلال استدعاء رقم العملية بدلًا من اسمها.</p><h2>كيفية إرسال إشارات للعمليات في لينكس</h2><p>تستجيب جميع العمليات في لينكس إلى نظام الإشارات، والإشارات Signals هي أسلوب يتبعه نظام التشغيل لإدارة العمليات (كتعديلها أو إنهائها)، ويقصد بذلك تنفيذ إجراء للعملية عند تمرير إشارة ما.</p><h3>إرسال إشارة لعملية عن طريق PID</h3><p>يعتبر الأمر kill واحدًا من أكثر الأمثلة شيوعًا عن تمرير إشارة لبرنامج، وكما هو متوقع فإن الوظيفة التي تقوم بها هذه الأداة هي محاولة الإيقاف الإجباري للعملية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">kill PID_of_target_process</pre><p>يرسل الأمر السابق إشارة "إمهال" للعملية، والتي تحمل رسالة مفادها: انتهِ رجاءً.. وهذا ما يسمح للبرنامج بتنفيذ عمليات تنظيف الذاكرة والإغلاق بشكل طبيعي، أما فيما لو انتهت مهلة الإشارة ولم يستجب لها البرنامج، فيمكننا زيادة قّوة الإشارة بإضافة المعامل "-KILL" لها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">kill -KILL PID_of_target_process</pre><p>في هذه الحالة لا يتم إرسال الإشارة إلى البرنامج، وبدلًا من ذلك يتم تمريرها إلى نواة نظام التشغيل مباشرةً لإغلاق العملية، تُستعمل هذه الإشارة في الحالات التي لا تستجيب فيها العمليات لطلبات الإنهاء. وكما هو الحال مع العمليات، تملك الإشارات أرقامًا خاصة يمكن استخدامها أثناء تمريرها. على سبيل المثال يمكن تمرير الرقم "-15" بدلا من "-TERM"، و "-9" بدلًا من "-KILL".</p><h3>استخدامات أخرى للإشارات</h3><p>لا يقتصر عمل الإشارات على إيقاف تشغيل البرامج، بل يمكن تنفيذ إجراءات أخرى معها، مثل إعادة تشغيل بعض خدمات daemons عند تمرير HUP لها، أباتشي Apache واحدة من هذه الخدمات:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo kill -HUP pid_of_apache</pre><p>عند تنفيذ الأمر السابق سيعيد Apache تحميل ملف الضبط الخاص به ومن ثم يستأنف الخدمة. لاستعراض جميع الإشارات التي من الممكن استخدامها مع الأمر kill اكتب:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"><span style="line-height: 22.3999996185303px;">kill -l</span>
1) SIGHUP    2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
. . .
</pre><h3>إرسال إشارة لعملية باستخدام الاسم</h3><p>علاوةً على الأسلوب السابق في استخدام معرّفات PID لإرسال الإشارات المختلفة إلى العمليات، تتيح الأداة pkill إرسال الإشارات عن طريق أسماء العمليات نفسها، حيث الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">pkill -9 ping</pre><p>يكافئ تمامًا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">kill -9 `pgrep ping`
</pre><p>كما يمكنك إرسال إشارة ما إلى مجموعة عمليات من أسرة واحدة باستخدام الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> killall: killall firefox </pre><p>حيث يرسل الأمر السابق إشارة المهلة TERM signal لكل عملية نشطة على الكمبيوتر تحمل الاسم firefox.</p><h2>ضبط أولويات العمليات</h2><p>في إدارتك للخادوم الخاص بك كثيرًا ما ستحتاج إلى كيفية تضبط بها أولويات العمليات، لتحدّد أيها التي ترغب بإعطائها أفضلية قصوى، ففي حالاتٍ متفرقة تكون بعض العمليات حساسة وذات أهمية عالية، بينما يمكن لباقي العمليات أن تنتظر قليلًا من الوقت بينما تتوفر موارد شاغرة. يتم التحكم بأولويات العمليات في لينكس من خلال قيمة يطلق عليها اسم niceness. المهام ذات الأولوية المرتفعة تدعى less nice، باعتبار أنها لا تسمح بمشاركة موارد الخادوم كما يجب، وفي المقابل يطلق على العمليات ذات الأولوية المنخفضة اسم nice باعتبار أنها لا تستهلك سوى أقل قدر من الموارد فقط. وبالعودة إلى مخرجات الأمر top سنجد أن هناك عمود يدعى "NI" والذي يحدد قيمة الـ nice لكل عملية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">top

Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers
Swap:        0k total,        0k used,        0k free,   264812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0</pre><p>حيث العمليات التي تأخذ قيمة من المجال "-19/-20" تعتبر ذات أولوية عالية، وتلك التي تأخذ قيمة محصورة ضمن المجال "19/20" تعتبر ذات أولوية منخفضة، وهذا يعتمد على نظام التشغيل. لتشغيل برنامج وفق قيمة محدّدة لـ nice يمكن استعمال الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">nice -n 15 command_to_execute</pre><p>للتأكيد؛ الأمر السابق يُستخدم لتشغيل أمر جديد بقيمة محدّدة لـ nice، أما لتغيير قيمة nice لبرنامج يعمل بالفعل فإننا نستخدم أداة تدعي renice:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">renice 0 PID_to_prioritize</pre><p>انتبه، بينما تتعامل الأداة nice مع العمليات وفق أسمائها، فإن renice تفعل ذلك باستخدام معرّفات PID، فوجب التفريق.</p><h2>خاتمة</h2><p>أحيانًا يشعر المستخدمون الجدد بصعوبة في فهم إدارة العمليات في لينكس والتعامل معها، باعتبار أن ذلك يتمّ ضمن سطر الأوامر خلافًا لما ألفوه من بدائل في الواجهات الرسومية. غير أن هذه الأفكار ما تلبث أن تصبح مألوفة وسهلة الاستخدام مع بعض الممارسة اليومية، إذ أن تعلم إدارة العمليات في لينكس يعدّ مهارة أساسية في كل ما تفعله مع نظام التشغيل.</p><p>[1]: دورة حياة العملية أو Process Lifecycle، هي أسلوب في فهم "العمليات" انطلاقا من الحالة الابتدائية لها، مرورًا بمراحل النضج وحتى المرحلة النهائية لتطورها ونموها، حيث فهم وتحليل العمليات بهذا الأسلوب يساعدنا على فهم الكيفية التي تنسجم أو تتناسب بها العمليات مع النظام وفق صيرورة من النمو والنضج.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-ps-kill-and-nice-to-manage-processes-in-linux">How To Use ps, kill, and nice to Manage Processes in Linux</a></p>
]]></description><guid isPermaLink="false">70</guid><pubDate>Wed, 10 Jun 2015 18:02:44 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x651;&#x645;&#x629; &#x625;&#x644;&#x649; &#x623;&#x62F;&#x648;&#x627;&#x62A; &#x636;&#x63A;&#x637; &#x627;&#x644;&#x645;&#x644;&#x641;&#x651;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x646;&#x638;&#x627;&#x645; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>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%AF%D9%88%D8%A7%D8%AA-%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r67/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/linux-compression-tools.png.69b3fc5ce9cea8fdea755f9e0bf451f8.png" /></p>

<meta charset="utf-8"><title></title><style type="text/css"></style><p id="-">هناك العديد من الأسباب التي تجعلك ترغب في ضغط Compression الملفّات والمجلدات على الحاسوب، واحدة من أبسط الفوائد التي تجعلك تقوم بذلك هي توفير مساحة التّخزين على القرص واستخدام عرض نطاق bandwidth أقل في اتّصالات الشّبكة. سنناقش في هذا الدّرس بعضًا من الطّرق المختلفة لضغط البيانات وسنتحدّث قليلاً عن بعض تفضيلات الطّرق المختلفة، سنتطرّق أيضًا إلى بعض العمليّات المرتبطة بذلك كالأرشفة archiving، والتي تجعل أدوات الضّغط أكثر مرونة. سنقوم باستعراض هذه الأدوات على نظام تشغيل Ubuntu 14.04 ولكنّها ستعمل تمامًا على أي توزيعة لينِكس حديثة.</p><h2 id="-">أساسيّات الضّغط والأرشفة</h2><p>قبل أن نذهب إلى الأدوات الفعلية التي سنستخدمها، يجب أن نُعرِّف مصطلحاتنا ونناقش بعضًا من المُميّزات المختلفة للضّغط والأرشفة. الضّغط هو طريقة لتقليل حجم الملف على القرص باستخدام خوارزميات وطرق حسابية مختلفة، تكون الملفّات مُنسّقة بطريقة معيّنة تجعل بنيتها الأساسية مُتوقَّعة بشكلٍ ما حتّى ولو كان محتواها مختلفاً، بل وأكثر من ذلك فإنّ المحتوى بذاته عادةً ما يكون متكرّرًا، لذلك يتيح لنا كلا هذين الأمرين فرصة لتطبيق تقنيات الضّغط.</p><h3 id="1-lossy-and-lossless-compression">1- الضّغط الفَقُود والضّغط غير الفَقُود Lossy and Lossless Compression</h3><p>عندما نناقش موضوع الضّغط بالنّظر إلى الحواسيب وأنواع الملفّات فقد تحمل المصطلحات نفسها معاني مختلفة بحسب المحتوى، فلنأخذ كمثال ملفات الموسيقى التي تحمل صيغة MP3، حيث أنّ ملف الـ MP3 هو ملف صوتي مضغوط يتمّ استخدامُه لإنشاءِ ملفٍ ذي حجمٍ أصغر وذلك اعتماداً على ملفٍ صوتيٍّ ذي حجمٍ أكبر. يختلف هذا النّوع من الضّغط بشكلٍّ أساسيٍّ عمّا نتحدث عنه في هذا الدّرس لأنّ ملف الـ MP3 يتمُّ إنشاؤه عبر تحليل شكل الموجة الصّوتيّة من ملف الصّوت ومحاولة معرفة أيُّ البيانات يُمكنُ حذفها نهائيًا مع المحافظة على صوت الملف الأصلي. وهذا ما يُدعى طريقة الضّغط الفَقُود lossy compression لأنّه فعلًا فقدَ بيانات من الملف الأصلي، وليس بإمكانك تحويل ملف الـ MP3 مرّة أخرى إلى الملف الأصلي لاحقًا. قد لا يُلاحِظ المستخدم عمليّة الضغط ولكنَّها لا تحتوي كامل البيانات من الملف الأصلي، وكلَّما كان معدّل الضّغط أعلى كلَّما بَدأت أجزاء أكثر من الصّوت تتأثر بعمليّة الضّغط. وكمثال آخر على هذا الصّور ذات الصّيغة JPEG، فكلَّما تمَّ ضغطها بشكلٍ أكبر كلَّما تمّت خسارة المزيد من البيانات وكلَّما اتضحت عمليّة الضّغط أكثر، تُحاول أداة ضغط صيغة JPEG إيجاد الحقولِ ذاتِ الألوان المتقاربة لبعضها وتقومُ باستبدالِ الحقلِ كاملًا بلونٍ واحد، كلَّما زادَ معدَّل الضّغط المستخدم كلَّما زاد مدى الألوان الذي يتم تغطيته بهذه الطريقة. بالمقابل تقوم طريقة الضّغط غير الفَقُود lossless compression بإنشاء ملف ذي حجم أصغر من الأصل والذي يمكننا باستخدامه إعادة بناء الملف الأصلي.</p><p>الضّغط غير الفَقُود هو نوع الضّغط الذي سنقوم بتغطيته في هذا الدّرس، لا يستخدم هذا النّوع من الضّغط القيم التقريبيّة لضغط البيانات، بل يستخدم بدلاً من ذلك خوارزميّات التّعرّف على الأجزاء المتكرّرة من الملف ويقومُ بإزالتها واستبدالها بماسك المكان placeholder، ويتابع ليستبدل لاحقاً حوادث النّمط بمرجعيّات references لنفس ماسك المكان. يسمح هذا للحاسوب بتخزين المعلومات على مساحة أقلّ من القرص، تُشبه هذه العمليّة كإنشاء قائمة من المتغيّرات variables والتي تُعرِّف تركيبة من البيانات ومن ثمّ استخدام هذه المتغيّرات لاحقًا لإنشاء البرنامج، تستخدم كلّ عمليّة ضغط غير فَقُود هاتين المرحلتين الفعليّتين وهما ربط القيم المتكرّرة إلى شيءٍ ما أصغر، والذي يمكن الرّجوع له بسهولة، ومن ثمّ تبديل الأحداث لكل واحدة من هذه القيم بمرجع لها. بل وأكثر من ذلك يُقال عن طرق الضّغط غير الفَقُود أنّها قابلة للتكيّف، هذا يعني أنّها لا تقوم بتحليل كامل الملف في البداية ومن ثمّ تقوم بإنشاء قاموس من البدائل المرجعيّة منه، بل تقوم بدلاً من ذلك بتحليل الملف أثناء عمليّة الضّغط ومن ثم تعيد كتابة القاموس بناءً على البيانات التي تمّ فعلياً تكرارُها، ويُصبح القاموس تدريجيًا أكثر فائدة مع استمرار العمليّة.</p><h3 id="2-">2- خلفيّة عن الأرشفة</h3><p>تعني فكرة أرشفة البيانات بشكلٍ عام عمل نسخة احتياطيّة لها وحفظها إلى مكان آمن، عادةً في صيغة مضغوطة، يحمل الأرشيف بشكل عام معنى مختلف قليلاً على نظام لينِكس، حيث عادة ما يشير إلى ملف ذو صيغة tar. تاريخيًّا كان يتمّ النّسخ الاحتياطي للبيانات على شرائط أرشفة tape archives، والتي هي عبارة عن أجهزة أشرطة ممغنطة يُمكِن استخدامها لتخزين البيانات المتتابعة، لا زالت هذه الطريقة هي المفضّلة لدى بعض المجالات، ولكي يتم عمل هذا بشكلٍ فاعل تمّ إنشاء برنامج tar حتى تستطيع التعامل مع العديد من الملفّات في نظام الملفّات بأذونات permissions وبيانات وصفية metadata سليمة كملف واحد، ومن ثم تستطيع استخراج الملف أو كامل نظام الملفّات من الأرشيف. الملف ذو اللاحقة tar بشكل أساسي هو عبارة عن صيغة ملف تقوم بإنشاء طريقة ملائمة لتوزيع وتخزين والنسخ الاحتياطي والتّعامل بمجموعة من الملفّات المرتبطة، سنقوم أيضًا في هذا الدّرس بالتحدث عن الأرشفة لأنه عادة يتم ضغط الملفّات المُؤرشفة خلال عملية الأرشفة وذلك لكي يتم تخزين البيانات بطريقة أكثر فاعلية.</p><h2 id="-">المقارنة بين أدوات الأرشفة المختلفة</h2><p>يملك لينِكس العديد من أدوات الأرشفة المختلفة، حيث يُقدّم كلًّا منها تضحيات في بعض المجالات ويملك بعضًّا من مواطن القوة، سنقوم بالميل تجاه مخطّطات الضّغط التي تعمل بالصّيغة tar لأنها أكثر مرونة من الطّرق الأخرى.</p><h3 id="1-gzip">1- الضّغط بأداة gzip</h3><p>تمّ تصنيف أداة gzip بشكل نمطي على أنّها الطّريقة الكلاسيكية لضغط البيانات على آلة تعمل بنظام التشغيل لينِكس، فهي موجودة تقريباً منذ العام 1992م وهي لا تزال قيد التطوير ولا يزال لديها الكثير من الأمور لتسير عليها. تستخدم أداة gzip خوارزمية ضغط معروفة بـ DEFLATE، وهي خوارزمية مستخدمة أيضًا في تقنيات شائعة أخرى مثل صيغة الصورة PNG وبروتوكول الوِيب HTTP وبروتوكول القشرة الآمنة SSH secure shell protocol. إنّ السّرعة هي واحدة من أهمّ مزايا هذه الأداة، حيث يُمكن ضغط وفك ضغط البيانات بمعدّل أعلى مقارنةً بتقنيّات منافسة، خاصةً عند مقارنة معظم الصيغ المدمجة لكل أداة، وهي أيضًا أكثر فاعليّة من حيث الموارد resources بالنظر إلى استخدام الذاكرة memory usage خلال الضّغط وفك الضّغط ولا يبدو أنّها تتطلب ذاكرة أكثر عند التطلع إلى عملية الضّغط الأفضل. ونأخذ التوافقية compatibility أيضًا بعين الاعتبار، فحيث أنّ gzip هي أداة قديمة فإنّ معظم أنظمة تشغيل لينِكس بغض النظر عن عمرها ستملك الأداة لكي تتعامل مع البيانات. إنّ أكبر مساوئ هذه الأداة أنّها تضغط البيانات بشكل غير مكتمل تماماً بالمقارنة مع بعض الخيارات الأخرى، لذلك إن كنت تقوم بالكثير من عمليّات الضّغط وفك الضّغط السّريعة فإنّ هذه الصّيغة هي ملائمة بالنسبة لك، ولكن إن كنت تُخطّط لضغط الملف مرّة واحدة ومن ثمّ تخزينه حينها ستجد أنّ الخيارات الأخرى تملك مزايا أكثر. عادةً يتمّ تخزين ملفات gzip باستخدام اللاحقة .gz، تستطيع ضغط الملفّات باستخدام gzip بكتابة الأمر التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gzip sourcefile</pre><p>سيقوم هذا الأمر بضغط الملف وتغيير اسمه إلى "sourcefile.gz "على جهازك. إن كنت ترغب بضغط المجلد كاملاً عندها تستطيع تمرير العَلَم –r داخل الأمر كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gzip -r directory1</pre><p>سيقوم هذا الأمر بالتحرك داخل المجلد وضغط كل ملف على حدا، وهو عادةً شيء غير مفضل ويمكن الحصول على نتيجة أفضل بأرشفة المجلد ومن ثم ضغط الملف الناتج ككل، والتي سنقوم بشرح كيفية عملها قريباً. لإيجاد المزيد من المعلومات حول الملف المضغوط تستطيع تستطيع استخدام العَلَم –l والذي سيقوم بإعطائك بعض الإحصائيات:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gzip -l test.gz

compressed        uncompressed    ratio   uncompressed_name
5133              14073           63.7%   test
</pre><p>إذا كنت ترغب بتمرير النّتيجة إلى أداة أخرى بإمكانك إخبار gzip أن يرسل الملف المضغوط إلى مخرج معياري باستخدامك العَلَم –c، سنقوم في هذا المثال ببساطة بتمريره مباشرة إلى ملف آخر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gzip -c test &gt; test.gz</pre><p>بإمكانك ضبط إعدادات الضّغط الأمثل بتمرير علم على شكل رقم في المجال بين الـ 1 والـ 9، العَلَم -1 (يملك Alias المُسمّاة --fast) يُمثّل الطّريقة الأسرع ولكن الأقل تَعمُّقًا في الضّغط، أمّا العَلَم -9 (والـ alias الخاص به هو --best) يمثل الطريقة الأبطأ والأكثر تعمّقًا في الضّغط، إن الخيار الافتراضي هو -6 والذي يشكل أساس متوسط جيد.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gzip -9 compressme</pre><p>لكي تقوم بفك ضغط ملف ببساطة تمرّر العَلَم –d إلى الأمر gzip (يوجد أيضاً عدّة alias مثل gunzip ولكنها تقوم بنفس الفعل):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">gzip -d test.gz
</pre><h3 id="2-bzip2">2- الضّغط بأداة bzip2</h3><p>Bzip2 هي صيغة وأداة شائعة أخرى للضغط، وفي حين أنّها إلى حدٍّ ما أحدث من gzip، حيث تم تقديمها لأول مرة في عام 1996م، إلا أنه تم تنفيذ bzip2 بشكل واسع لتكون البديل التقليدي لـ gzip. بينما يعتمد gzip على خوارزمية "DEFLATE" فإنّ bzip2 هو تنفيذ لخوارزمية تدعى "Burrows-Wheeler algorithm"، ينتج عن هذا الاختلاف في المنهجية مجموعة من نقاط القوة والضعف والتي هي مختلفة تمامًا عن gzip، إنّ أهم شيء يجعل المستخدم يتنازل عن بعض الميزات للحصول على ميزات أخرى هي معدّل الضّغط العالي مقابل وقت أطول لعملية الضّغط، تستطيع أداة bzip2 إنشاء ملفات مدمجة بشكل كبير أكثر من gzip ولكنّها تأخذ وقتًا أطول لتحقيق هذه النتائج نظرًا لوجود خوارزمية أكثر تعقيدًا. لحسن الحظ فإنّ وقت فك الضّغط لا يتأثر بشكل كبير كوقت الضّغط، لذلك ربما يكون من المفيد توزيع الملفّات باستخدام صيغة bzip2 حيث أنّك فقط ستعاني خلال وقت عملية ضغطه وسيكون بإمكانك توزيع ملفات ذات حجم أصغر والتي يمكن فك ضغطها خلال وقت معقول، طبعاً لا يزال وقت فك الضّغط أطول بكثير من صيغة gzip ولكن ليس له تأثير كبير على عملية الضّغط. لا بدّ أيضًا أن نبقي في ذهننا أنّ استهلاك الذاكرة أكبر من gzip، لن يؤثر هذا على معظم الأجهزة ولكن على بعض الأجهزة الصغيرة المدمجة ممكن أن يؤثر هذا على خياراتك، بإمكانك أن تختار تمرير العَلَم –s والذي سينقص حجم الذاكرة المطلوبة تقريبًا إلى النصف، ولكن سيقودك هذا أيضًا إلى معدّل ضغط أقل. يتم إعطاء الملفّات المضغوطة بهذه الآلية لاحقة الملفّات .bz2 بشكل عام. لكي تقوم بإنشاء ملف مضغوط باستخدام bzip2 بإمكانك ببساطة كتابة ما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">bzip2 afile</pre><p>سيقوم هذا الأمر بضغط الملف وإعطائه الاسم "afile.bz2". وكما ذكرنا سابقًا تستطيع تمرير العَلَم –s للدلالة على أن الأداة المساعدة يجب أن تعمل في وضع الذاكرة المُخَفَضّة ، لن يقوم هذا بالضّغط بشكل جيد ولكنّه لن يتطلب الكثير من الموارد:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">bzip2 -s afile</pre><p>بينما تقوم bzip2 بتطبيق الأعلام المرقمة numbered flags إلّا أنها تعني شيئًا مختلفًا عمّا تعنيه في gzip، حيث تمثّل الأعلام المرقّمة هنا حجم الكتلة block size التي تنفّذ الأداة المساعدة ضغطها ، لذلك يعدّ هذا كوسيلة قياس للذاكرة المستخدمة مقابل حجم الملف المضغوط أكثر منه الوقت مقابل حجم الملف المضغوط، إنّ السلوك الافتراضي هو العَلَم -9 والذي يعني استخدامًا أعلى للذاكرة (نسبيًا) مع معدّل ضغط أعلى:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">bzip2 -1 file</pre><p>لنتمكن من فك ضغط ملف مضغوط باستخدام bzip2 نقوم بتمرير العَلَم –d كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">bzip2 -d file.bz2</pre><p>سيعطينا هذا ملفًا غير مضغوط اسمه "file".</p><h3 id="3-xz">3- الضّغط باستخدام xz</h3><p>آلية الضّغط باستخدام xz هي الوافد الجديد نسبيًا على الساحة ، تمّ إطلاق هذه الأداة لأول مرة عام 2009م واكتسبت متابعة بشكل ثابت منذ ذلك الحين. تستفيد أدوات الضّغط باستخدام xz من خوارزمية الضّغط المعروفة باسم "LZMA2" ، تمتلك هذه الخوارزمية معّدل ضغط عالٍ أكثر من المثالين السابقين ، والذي يجعل منها صيغة جيدة عندما تحتاج إلى تخزين البيانات على مساحة محدودة من القرص حيث تقوم بإنشاء ملفات أصغر حجمًا. طبعًا يأتي هنا موضوع التكلفة مرة أخرى في معظم نفس المجالات التي تعاني منها bzip2 ، فبينما يكون الملف الذي تنتجه طريقة xz أصغر حجمًا من الأدوات الأخرى إلّا أنّها تأخذ بشكل كبير وقتًا أطول للقيام بالضّغط ، فعلى سبيل المثال عندما نستخدم أعلام الضّغط بمعدّل عالٍ على ملف ذو حجم كبير فإنّ gzip يحتاج تقريبًا حوالي نصف دقيقة ، وbzip2 يحتاج تقريبًا حوالي دقيقة ، أمّا xz ربما تحتاج حوالي 4 أو 5 دقائق. تتلقى أدوات الضّغط باستخدام xz ضربة أيضًا في متطلبات الذاكرة التي تحتاجها ، تصل أحيانًا إلى حجم أكثر من الطرق الأخرى ، ربّما لا تكون هذه مشكلة بالنسبة لك إن كنت على نظام يملك ذاكرة وافرة ، ولكن يجب أن تأخذ هذا الموضوع بعين الاعتبار. بينما يكون وقت الضّغط أطول من المرغوب به ، فإنّ وقت فكّ الضّغط جيّد نسبيًا رغم أنّه لا يقارب gzip بالنظر إلى سرعة فك الضّغط ولكنّه أسرع عادة وبشكل كبير بفك الضّغط من bzip2 ، كما أنّ استهلاك الذاكرة لفك الضّغط ليس هائلًا أيضًا (ولكنّه يبقى مرتفعًا نسبيًا). تجعل هذه المجموعة من المزايا والعيوب من هذه الصّيغة صيغةً جيدةً لتوزيع الملفّات كالبرامج ، سيتوجب عليك مقدمًا أن تعاني في عملية ضغط هذه الملفّات ولكنّ مستهلكي البرامج سيستفيدون كثيرّا ، حيث أنّهم سيملكون ملفاً مدمجاً يتمّ فك ضغطه بسرعة. ومن العيوب غير الملاحظة أيضًا لهذه الصّيغة أنّها ربّما ليست مدعومة على الأنظمة الأقدم نظرًا لحداثة عهدها ، فإن كنت تبحث عن التوافقية العظمى ربّما ستكون مجبرًا بأن تنظر إلى أداة أخرى. تأخذ الملفّات المنشأة بهذه الصّيغة اللاحقة .xz بشكل عام. لكي تقوم بضغط ملف قم باستدعاء الأداة ببساطة من دون أيّة وسائط :</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">xz file</pre><p>سيقوم هذا الأمر بمعالجة الملف وإنتاج ملف يدعى "file.xz". لكي تعرض إحصائيات statistics عن عمليّة ضغط الملف تستطيع تمرير العَلَم –l على الملف المضغوط كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">xz -l test.xz

Strms  Blocks   Compressed   Uncompressed  Ratio   Check   Filename
1       1       5,016 B      13.7 KiB      0.356   CRC64   test.xz</pre><p>إن أردت إرسال خَرْج output عمليّة الضّغط إلى الخَرْج المعياري standard out فبإمكانك الإشارة إلى الأداة المساعدة بذلك عن طريق العَلَم –c، هنا في هذا المثال نستطيع إرسالها مرة أخرى مباشرة إلى ملف:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">xz -c test &gt; test.xz</pre><p>بالنسبة للأعلام المرقّمة فإنّ xz تستخدم الأرقام الأقل لكي تشير إلى عملية ضغط أسرع، وهي تملك في الواقع العَلَم -0 كالخيار الأسرع، العَلَم -6 هو الافتراضي ويشكل أرضيّة جيدة لأغلب الحالات، أمّا إن كنت ترغب بتوجيه الضّغط إلى الملفّات الأكبر حجمًا تستطيع استخدام أعلامًا ذات أرقام أعلى والتي قد تأخذ وقتًا طويلًا جدًا ولكنّها ستظهر بعض المكاسب. وإن كنت ترغب بمعدّل ضغط أعلى ولا يهمك الوقت أو متطلبات الذاكرة إلخ..، فتستطيع استخدام العَلَم –e والذي يستخدم عملية ضغط بديلة مختلفة وشديدة الفاعلية، يمكن تعديل أداء هذا العَلَم أيضًا باستخدام الأعلام الرقمية معه :</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">xz -e -9 large_file</pre><p>ستستغرق هذه العملية في النهاية وقتًا طويلًا وربّما لن تُقدّم فوائد كبيرة ولكن إن احتجت إلى هذه الوظيفة فالخيار متاح أمامك. لكي تقوم بفك الضّغط عن الملفّات مرّر العَلَم –d مرة ثانية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">xz -d large_file.xz</pre><p>سيقوم هذا الأمر بفك ضغط البيانات إلى ملف يدعى "large_file".</p><h2 id="-tar-">استخدام أرشفة Tar مع الضّغط</h2><p>في حين أن أساليب الضّغط الفردية مفيدة بحدّ ذاتها إلّا أنّك في أغلب الأحيان ستجدهم مقترنين مع الصّيغة tar لضغط أرشفة الملفّات، يسمح لنا هذا بالحفاظ على بُنى المجلدات والأذونات إلخ..، للملفات التي نقوم بحزمها. إنّ الأمر tar حريص جدًا وفعليًا على هذه العلاقة، فهو يُضَّمّن أعلام في سطر الأوامر يُمكن استخدامها لاستدعاء أدوات الضّغط المرافقة تلقائيًا بعد أن تتم عمليّة الأرشفة، وكلّ ذلك في خطوة واحدة.</p><h3 id="1-tar-gzip">1- استخدام tar مع الصّيغة gzip</h3><p>لإنشاء أرشيف tar والذي يتم ضغطه بأداة gzip تستطيع تمرير العَلَم –z، يشير هذا العَلَم إلى أنّك ترغب باستخدام ضغط بصيغة gzip على الملف المؤرشف، لا تتطلب أعلام tar فعليًا البادئة "-" كما في معظم الأدوات الأخرى، ومن الأساليب الشائعة لإنشاء ملفات مضغوطة مؤرشفة هذا المثال:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar czvf compressed.tar.gz directory1</pre><p>سيقوم هذا الأمر بإنشاء أرشيف (باستخدام العَلَم –c) من المجلد الذي يُدعى "directory1"، حيثُ يُنشئ خَرْجًا مُطوّلًا ويضغط الأرشيف الناتج باستخدام gzip ومن ثُمّ يُعطي الناتج إلى ملف يُدعى "compressed.tar.gz" (وهو ملف tar تم ضغطه). حالما يتم إنشاء الملف نستطيع إلقاء نظرة على محتوياته باستخدام العَلَم –t بدلًا من علم الإنشاء (-c) :</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar tzvf compressed.tar.gz

drwxr-xr-x demouser/demouser 0    2014-03-19 18:31 directory1/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory1/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory1/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory1/httpd.conf</pre><p>وللقيام بفك ضغط الملف لاحقًا وتوسيع الأرشيف تستطيع استخدام العَلَم –x كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar xzvf compressed.tar.gz</pre><p>سيعيد هذا الأمر إنشاء بنية المجلّد في المجلّد الحالي.</p><h3 id="2-tar-bzip2">2- استخدام tar مع bzip2</h3><p>لاستخدام الأرشفة مع bzip2 قُم باستبدال العَلَم –z (والذي هو خاص بالأمر gzip) بالعَلَم –j، هذا يعني أنّ أمر إنشاء الأرشيف المضغوط سيتم تعديله إلى التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar cjvf bzipcompressed.tar.bz2 directory2</pre><p>مرةً أخرى تستطيع النظر إلى الملفّات المُحتواة في الأرشيف بتمرير العَلَم –t :</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar tjvf bzipcompressed.tar.bz2

drwxr-xr-x demouser/demouser 0    2014-03-19 18:31 directory2/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory2/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory2/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory2/httpd.conf</pre><p>تستطيع استخراج الملفّات وبنية المجلد إلى المجلد الحالي بكتابة ما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar xjvf bzipcompressed.tar.bz2</pre><h3 id="3-tar-xz">3- استخدام tar مع xz</h3><p>أضافت الإصدارات الحديثة من الأداة tar وظيفة مشابهة للضغط باستخدام xz، نستطيع القيام بذلك باستخدام العَلَم –J :</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar cJvf xzcompressed.tar.xz directory3</pre><p>ولعرض المعلومات نستخدم نفس الآلية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar tJvf xzcompressed.tar.xz

drwxr-xr-x demouser/demouser 0    2014-03-19 18:31 directory3/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory3/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory3/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory3/httpd.conf</pre><p>نتّبع نفس الأساليب للاستخراج :</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">tar xJvf xzcompressed.tar.xz</pre><p>سيعطيك هذا الأمر بنية المجلد الكامل الخاص بك سليمة كما هي.</p><h2 id="-">الخاتمة</h2><p>آمل أنّك تملك الآن معلومات كافية لتتخذ قرارًا مستنيرًا بشأن أي وسيلة ضغط يجب أن تُفضّل في ظروفٍ مختلفة، تمتلك كل مخططات الضّغط التي ناقشناها في هذا المقال نقاط قوة جذّابة اعتمادًا على المتطلبات المحدّدة لحالتك. من الهام الانتباه إلى عيوب الأداء ومشاكل التّوافقيّة التي قد تلازم كلّ واحد من هذه الحلول، يعتمد مدى اهتمامك بهذه المخاوف كلياً على الحواسيب التي تعمل عليها وأيّ نوع من الزبائن يجب أن تدعم، لا يجب أن تعير أغلبية الحواسيب الحديثة اهتمامًا كثيرًا إلى هذه التفاصيل، ولكنّها قد تسبب مشاكل إذا قمت بتطبيق أنواع الضّغط بشكل عشوائي عند التعامل مع حواسيب أقدم.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/an-introduction-to-file-compression-tools-on-linux-servers">An Introduction to File Compression Tools on Linux Servers</a>  لصاحبه Justin Ellingwood.</p>
]]></description><guid isPermaLink="false">67</guid><pubDate>Tue, 09 Jun 2015 20:15:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x651;&#x645;&#x629; &#x625;&#x644;&#x649; &#x627;&#x62E;&#x62A;&#x635;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x637;&#x631;&#x641;&#x64A;&#x629; (Aliases) &#x648;&#x62F;&#x648;&#x627;&#x644;&#x647;&#x627; - &#x623;&#x646;&#x62C;&#x632; &#x645;&#x647;&#x627;&#x645;&#x643; &#x628;&#x633;&#x631;&#x639;&#x629;!</title><link>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%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-aliases-%D9%88%D8%AF%D9%88%D8%A7%D9%84%D9%87%D8%A7-%D8%A3%D9%86%D8%AC%D8%B2-%D9%85%D9%87%D8%A7%D9%85%D9%83-%D8%A8%D8%B3%D8%B1%D8%B9%D8%A9-r65/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/bash-alias.png.751bb84d21b32147713109f3bd18b69b.png" /></p>

<p>ما إن تقضي وقتًا أطول مع لينكس حتى تألف العمل مع سطر الأوامر command line والمعروف أيضًا بالطرفيّة Terminal، وشيئًا فشيئًا ستجد أن الأوامر التي تستخدمها تتكرر ذاتها في كلّ يوم، وأن استعمالاتك لا تخرج عن دائرة صغيرة جدًا من الأوامر والتعليمات المتاحة بالفعل.<br>وقد اجتهد مبرمجو معظم الأوامر والأدوات المستخدمة في الطرفية باختصار طرق استدعائها والعمل من خلالها (تخيّل كم توفّر من نقرات لوحة المفاتيح بكتابة "cd" بدلًا من "change-directory"، أو "ls" بدلًا من "list")، إلا أنّ هذا ليس كل شيء بالطبع، فمعظمنا يستخدم الأوامر مع مجموعة من خياراته المفضّلة.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/bash-alias.png.692a1e609bb3acdbf1454310a0cdf467.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="2502" src="https://academy.hsoub.com/uploads/monthly_2015_06/bash-alias.thumb.png.2fb5f322e2cb9ee40b08b76b42a74ffa.png" class="ipsImage ipsImage_thumbnailed" alt="bash-alias.thumb.png.2fb5f322e2cb9ee40b0"></a><br>لحسن الحظّ فإن حلًا رائعًا لا يزال بانتظارك؛ حيث تسمح لك الطرفيّة بإنشاء اختصاراتك الخاصّة وحفظ وقتك من خلال ما يسمى بالأسماء المستعارة Aliases والدوال Functions. نناقش في هذا الدرس كيفيّة إنشاء هذه الاختصارات وحفظها بشكل دائم، مع بعض الأمثلة المفيدة التي ستيسر لك عملك بالتأكيد.</p><h2>الإعلان عن اسم مستعار Alias</h2><p>إنشاء الأسماء المستعارة في الطرفيّة أمرٌ في غاية السهولة، لدرجة أنه يمكنك تجريبه على الفور، يتمّ ذلك باستخدام الأداة <code>alias</code> متبوعة بالاختصار الذي ترغب به، والتي تعرّف اسمًا مستعارًا فعّالا ضمن نافذة الطرفيّة المستخدمة فقط:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias alias_name="command_to_run"</pre><p>انتبه إلى أن أسلوب الكتابة السابق لا يتضمن مسافات فارغة قبل وبعد إشارة المساواة (=)، وهذا ليس أمرًا اختياريًا وإلا فإن الاختصار لن يعمل.<br>لننشئ الآن اسمًا مستعارًا كتجربة، حيث سنأخذ واحدًا من أكثر الأوامر استخدامًا على لينكس وليكن الأمر <code>ls</code>مع الخيار <code>-lha</code> أو <code>-lhA</code> (يهمل الثاني عرض المجلد الحالي ومجلده الأب ضمن الخرج، خلاف الخيار الأوّل)، سنختار له اسمًا مستعارًا وليكن <code>ll</code>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias ll="ls -lhA"</pre><p>يمكننا الآن كتابة <code>ll</code> للحصول على قائمة بمحتويات المجلد الحالي ضمن قائمة طويلة تتضمن المجلدات المخفيّة:<br> </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ll

-rw-r--r-- 1 root root 3.0K Mar 20 18:03 .bash_history
-rw-r--r-- 1 root root 3.1K Apr 19  2012 .bashrc
drwx------ 2 root root 4.0K Oct 24 14:45 .cache
drwx------ 2 root root 4.0K Mar 20 18:00 .gnupg
-rw-r--r-- 1 root root    0 Oct 24 17:03 .mysql_history
-rw-r--r-- 1 root root  140 Apr 19  2012 .profile
drwx------ 2 root root 4.0K Oct 24 14:21 .ssh
-rw------- 1 root root 3.5K Mar 20 17:24 .viminfo</pre><p>وفي حال رغبت بالتوقف عن استخدام الاختصار يمكنك تطبيق الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">unalias ll</pre><p>وهكذا تُحذف قاعدة الاختصار التي أنشأتها للتوّ. بينما يمكنك الهروب من قاعدة ما بشكل مؤقت عن طريق كتابة رمز الهروب "\" قبل الأمر، فلو قمت بإنشاء قاعدة تحيل الأمر <code>ls</code> إلى الأمر <code>ls -a</code>، وترغب الآن بتطبيق الأمر <code>ls</code> دون استدعاء قاعدة الاختصار، فيمكنك كتابة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">\ls</pre><p>يمكنك استعراض جميع القواعد المنشأة في أي وقت من خلال الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias</pre><p>لكن كما ذكرنا سابقًا فإن الأسماء المستعارة التي يتم إنشاؤها عن طريق الأداة <code>alias</code> لن تعمل سوى في نافذة الطرفيّة المستخدمة، وهذا يعني أنك لو فتحت نافذة أخرى واستدعيت قاعدة ما فلن تحصل على المطلوب.<br>ولجعل هذه التغييرات دائمة، نحن بحاجة إلى وضعها ضمن أحد الملفات التي تقرأها الطرفية في بداية كل تشغيل لها، الخيارات الشائعة لذلك هي استخدام الملف <code>~/.bashrc</code> أو <code>~/.bash_profile</code>، وكل ما علينا فعله هو تحرير أحد هذه الملفات وتعريف قواعد اختصارنا هناك:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">nano ~/.bashrc</pre><p>الآن أضف الأسماء المستعارة التي كنا قد كتبناها في الطرفيّة بذات الصياغة، يمكنك إضافتها في أسفل الملف، أو في أي مكان آخر، كما يمكنك استخدام التعليقات (بالعلامة #) لتوضيح ما قمتُ بإضافته:</p><blockquote><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">#########
# Aliases
#########

alias ll="ls -lhA"</pre><p>قد تلاحظ وجود بعض الأسماء المستعارة بالفعل ضمن الملف السابق، حيث تأتي العديد من التوزيعات مع بعض الاختصارات التي تجعل من استخدام الطرفية أمرًا أكثر فاعليّة وسهولة.<br>بعد حفظ الملف تصبح التعديلات المُدخلة جاهزة للاستخدام عند فتح نافذة طرفية جديدة، أما لو رغبت باستعمال قواعد الاختصار الجديدة ضمن نافذة الطرفية الحاليّة فيمكنك كتابة الأمر التالي لإعادة قراءة الملف </p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">.bashrc:
source ~/.bashrc
</pre></blockquote><h2>أمثلة أخرى</h2><p>لنمضي الآن في تعلّم بعض الأمثلة الأخرى عن إنشاء اختصارات تسهّل تعاملك مع الطرفيّة وتجعله أكثر فاعلية، تذكّر دومًا أنه يمكنك البحث في الإنترنت عن استخدامات أخرى نافعة للاختصارات، وإلقاء نظرة على تلك التي قد تكون مُعدّة بشكل افتراضي ضمن إعدادات توزيعتك.</p><h3>التنقل والاستعراض</h3><p>يمكن بإضافة بعض الخيارات على أوامر لينكس البسيطة والشائعة الحصول على نتائج أفضل وأكثر تخصيصًا، رأينا ذلك سابقًا مع الأمر <code>ls</code>، لكن هناك بالتأكيد ما هو أبعد من ذلك. فمثلًا يتيح لنا الاختصار التالي استخدام الخيار <code>-CF</code> مع الأمر <code>ls</code> بشكل افتراضي، والذي يفرّق أثناء العرض بين الملفات والمجلدات، بإضافة الرمز "/" في نهاية اسم كلّ مجلد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias ls="ls -CF"</pre><p>كما يمكننا الالتفاف حول بعض الأخطاء الكتابيّة الشائعة بالنسبة لنا لجعلها تعمل أيضًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias sl="ls"</pre><p>يُنشئ الأمر التالي قاعدة اختصار تُمرّر مخرجات الأمر <code>ls</code> إلى الأداة less لاستعراض محتويات المجلدات الكبيرة بأسلوب مريح:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias lsl="ls -lhFA | less"</pre><p>واحدة من الأخطاء المطبعيّة الشائعة نسيان المسافة بين الأمر <code>cd</code> والنقطتين <code>..</code>، هذه قاعدة تخرجنا من ذلك المأزق:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias cd..="cd .."</pre><p>أو يمكننا اختصار الأمر بالشكل التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias ..="cd .."</pre><p>وهذه قاعدة أخرى لإنشاء اسم مستعار يسهّل عملية البحث عن الملفات:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias fhere="find . -name "</pre><h3>إدارة النظام</h3><p>يحتاج مديرو الأنظمة العاملة بلينكس إلى استخدام الكثير من الأوامر مع تفضيلاتهم الخاصة باستمرار، وهذه فرصة جديدة لتعلّم وإنشاء بعض الاختصارات.<br>تتيح القاعدة التالية إنشاء اسم مستعار يسهّل عرض أقسام واستخدامات القرص الصلب لديك ومعلومات أخرى عنه بطريقة مرتبة باستخدام الأمر <code>df</code>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias df="df -Tha --total"</pre><p>ويمكن تطبيق نفس القاعدة مع كل من الأمر <code>du</code> والأمر <code>free</code>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias du="du -ach | sort -h"
alias free="free -mt"</pre><p>يستخدم الأمر <code>ps</code> لعرض العمليات والبرامج التي يقوم لينكس بتشغيلها مع معلومات تفصيلية عن كل برنامج، يمكن تسهيل قراءة الخرج من خلال الاختصار التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias ps="ps auxf"</pre><p>كما يمكن إنشاء قاعدة تتيح لنا البحث ضمن جدول الخرج عن عملية محدّدة للاكتفاء بعرضها فقط مما يوفر لنا الوقت:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"</pre><p>فمثلًا للحصول على معلومات العملية bash فقط يمكن كتابة الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">psg bash

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1001      5227  0.0  0.0  26320  3376 pts/0    Ss   16:29   0:00 bash</pre><h3>أمثلة إضافيّة</h3><p>يعمل الأمر <code>mkdir</code> على إنشاء مجلّد جديد، لكن عند اختيار اسم لمجلد موجود بالفعل يعيد لنا رسالة خطأ، يمكن استخدام الخيار <code>-p</code> مع الأمر السابق لإهمال تلك الرسالة (ودون إنشاء المجلد)، كما يمكن عن طريق قاعدة الاختصار التالية جعل هذا الخيار افتراضيًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias mkdir="mkdir -p"</pre><p>أيضًا بإضافة الخيار <code>v</code> إلى الأمر السابق نحصل على المزيد من التنسيق، ففي حال وجود مجلد بذات الاسم يتم تجاهل الأمر وعدم عرض رسالة خطأ، أما لو كان الاسم غير مُستخدم فيعيد الأمر السابق خرجًا على الشاشة يؤكّد عملية إنشاء المجلد بنجاح:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias mkdir="mkdir -pv"</pre><p>في معظم الحالات التي نستخدم بها الأمر <code>wget</code> لتحميل ملف ما من الويب فإننا غالبا ما نمرّر له الخيار <code>-c</code> لدعم استكمال التنزيل في حال حدوث خطأ بالاتصال، لجعل ذلك افتراضيًا ننشئ القاعدة التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias wget="wget -c"</pre><p>يعتبر الأمر <code>history</code> واحدًا من الأدوات الفعّالة، حيث يتيح لك البحث ضمن الأوامر التي سبق واستخدمتها، ويطبع لك النتائج المطابقة على الشاشة مرفقة بأرقامها التسلسليّة (حسب التنفيذ)، حيث يمكن استدعاء الأمر مجددًا من رقمه مسبوقًا بإشارة (!):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias histg="history | grep"</pre><p>كما هو معروف، تتوفر بعض أدوات الطرفية بنسختين، تكون الأولى أكثر بساطة، فيما تقدّم الأخرى ميزات وخدمات أكثر، ومن خلال إنشاء الاختصارات سيكون بإمكانك تشغيل النسخة المحسّنة بنفس أمر تشغيل النسخة الأولى.<br>فالأمر <code>top</code> على سبيل المثال يملك نسخة محسنة وملونة بالاسم <code>htop</code> (إذا لم تكن لديك ركبّها من مدير الحزم في توزيعتك أولًا)، وبإنشاء قاعدة الاختصار التالي نعمّم استخدام النسخة المحسنة في كل التطبيقات الأخرى التي تستعملها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias top="htop"</pre><p>تقدّم الأداة <code>ncdu</code> عرضًا تحليليًا لاستخدام مساحة القرص، الملفات والمجلدات في لينكس بأسلوب تفاعليّ وخيارات متنوّعة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias du="ncdu"</pre><p>يستبدل الأمر السابق الأداة <code>du</code> بالأداة <code>ncdu</code>، كما يمكن استبدال الأداة <code>df</code> بـ <code>pydf</code> المحسّنة من خلال:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias df="pydf"</pre><p>هل ترغب في معرفة رقم الـ IP الخاص بجهازك؟ أنشئ القاعدة التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias myip="curl http://ipecho.net/plain; echo"</pre><p>فكّر دومًا كيف يمكنك الاستفادة من القوّة الرهيبة للأسماء المستعارة، على سبيل المثال إذا كنتَ تدير موقعًا على الإنترنت بينما يلزمك باستمرار إعادة تحجيم الصور التي ترغب برفعها إلى الموقع لتناسب مقاسًا مخصصًا، يمكنك تركيب الأداة <code>imagemagick</code> من مدير الحزم في توزيعتك، وإنشاء قاعدة تسهل عليك العمل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias webify="mogrify -resize 690\&gt; *.png"</pre><p>حالما تطبّق الأمر الجديد <code>webify</code> سيتم إعادة تحجيم جميع الصور الموجودة ضمن المجلّد النشط عندما يكون عرضها أصغر من 690px. وبذات الطريقة يمكنك تسهيل رفعها إلى الخادوم الخاص بك:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alias upload="sftp username@server.com:/path/to/upload/directory</pre><h2>الدوال</h2><p>كما رأينا فإن ميزة الأسماء المستعارة توفّر أسلوبًا رائعًا في اختصار تنفيذ الأوامر وتسهيل مراكبتها، إلا أنها في النهاية محدودة القدرة، إذا لا يمكننا على سبيل المثال تطبيق سلسلة طويلة من الأوامر معًا في اختصارٍ واحد.<br>لحسن الحظ فهناك ما يساعدنا لتلبية هذه المتطلبات، تُقدّم الدوال functions أسلوبًا بسيطًا في اختصار تنفيذ قطعة من الأوامر دفعة واحدة، وهي أسلوب يقع بين ميزة الأسماء المستعارة وبين كتابة النصوص التنفيذيّة shell scripts، وتعمل بذات طريقة الأسماء المستعارة، كما يمكنها استقبال الدخل من المستخدم لمعالجته.<br>سنتحدث في هذه الفقرة عن الاستخدامات الأساسية لميزة كتابة الدوال، مع بعض الأمثلة التوضيحيّة، متجنبين التفاصيل الواسعة لها، والتي يمكن من خلالها برمجة نصوص تنفيذيّة متقدّمة.<br>لتعريف دالّة لدينا أسلوبين أساسيين، يستخدم الأوّل الأمر <code>function</code> ويأخذ الشكل العام كالتالي:</p><blockquote><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function function_name { command1 command2 }
</pre></blockquote><p>بينا يشبه الأسلوب الآخر نمط الأقواس في لغة C:</p><blockquote><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function_name () { command1 command2 }</pre><p>يمكن ضغط مساحة الأسلوب السابق ليُكتب في سطر واحد باستخدام الفاصلة المنقوطة بين الأوامر، انتبه إلى أن الفاصلة المنقوطة يجب أن تلتصق بالأمر الذي يسبقها:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function_name () { command1; command2; }</pre><p>لنبدأ مع مثال بسيط، عادةً عندما نقوم بإنشاء مجلد جديد ضمن الطرفية فإن الخطوة التالية مباشرة هي الدخول إليه، سنكتب دالة لذلك؛ تنشئ مجلد جديد ثم تنتقل إليه:</p></blockquote><blockquote><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">mcd () { mkdir -p $1 cd $1 }</pre><p>الآن يمكن استخدام الدالة <code>mcd</code> بدلًا من <code>mkdir</code> ثم <code>cd</code>:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">mcd test
pwd
/home/demouser/test</pre><p>الدالة التالية تعرض مثالًا متقدمًا على ما يمكن كتابته وتنفيذه عن طريق الطرفية، وهي تعمل على فكّ ضغط أنواع كثيرة من تنسيقات الملفات المضغوطة:</p></blockquote><blockquote><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function extract {
 if [ -z "$1" ]; then
    # display usage if no parameters given
    echo "Usage: extract &lt;path/file_name&gt;.&lt;zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz&gt;"
 else
    if [ -f $1 ] ; then
        # NAME=${1%.*}
        # mkdir $NAME &amp;&amp; cd $NAME
        case $1 in
          *.tar.bz2)   tar xvjf ../$1    ;;
          *.tar.gz)    tar xvzf ../$1    ;;
          *.tar.xz)    tar xvJf ../$1    ;;
          *.lzma)      unlzma ../$1      ;;
          *.bz2)       bunzip2 ../$1     ;;
          *.rar)       unrar x -ad ../$1 ;;
          *.gz)        gunzip ../$1      ;;
          *.tar)       tar xvf ../$1     ;;
          *.tbz2)      tar xvjf ../$1    ;;
          *.tgz)       tar xvzf ../$1    ;;
          *.zip)       unzip ../$1       ;;
          *.Z)         uncompress ../$1  ;;
          *.7z)        7z x ../$1        ;;
          *.xz)        unxz ../$1        ;;
          *.exe)       cabextract ../$1  ;;
          *)           echo "extract: '$1' - unknown archive method" ;;
        esac
    else
        echo "$1 - file does not exist"
    fi
fi
}</pre><p>تعمل الدالة على تحديد تنسيق الملف واختيار الأمر المناسب له للتنفيذ.</p></blockquote><h2>خاتمة</h2><p>نأمل أن يكون هذا الدرس قد أعطاك بعض الإلهام لكتابة قواعد الاختصار والدوال التي تناسبك، مما يسهّل عليك أداء مهامك الروتينيّة وإضافة بعض المتعة على سطر الأوامر.<br>تذكّر أن تبقى حذرًا من إعادة تعريف بعض الأوامر الأساسية بصوّرة قد تسبب مشاكل أو أخطاء قاتلة، كن حذرًا ولا تنشئ اختصارات تؤثّر على ملفات النظام.<br>نقطة البداية الجيدة هي من سجل الأوامر التي كنتَ قد استخدمتها بالفعل في الفترة الماضية، لترى مالذي يتكرّر باستمرار، وتعمل على اختصار العمل من خلال إنشاء أسماء مستعارة جديدة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] &amp;quot; &amp;quot; CMD[a]/count*100 &amp;quot;% &amp;quot; a;}' | grep -v &amp;quot;./&amp;quot; | column -c3 -s &amp;quot; &amp;quot; -t | sort -nr | nl |  head -n10</pre><p>يعرض السطر السابق خرجًا بالأوامر الأكثر تكرارًا في استخدامك اليوميّ ونسبها المئوية، مما يعطيك الفكرة عن احتياجاتك الحاليّة.<br>نسعد أيضًا بمشاركتكم لنا الاختصارات والدوال التي تستخدمونها عادةً لتبادل الخبرات.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/an-introduction-to-useful-bash-aliases-and-functions">An Introduction to Useful Bash Aliases and Functions</a>.</p>
]]></description><guid isPermaLink="false">65</guid><pubDate>Sun, 07 Jun 2015 19:08:32 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x628;&#x64A;&#x631; &#x627;&#x644;&#x646;&#x645;&#x637;&#x64A;&#x629; Regular Expressions</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-regular-expressions-r63/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/regex-intro.png.fcc7c128d73b1e8131c6d64e4b8ace68.png" /></p>

<p>
	نحتاج في أحيانٍ كثيرة إلى إدخال تعديلات محدّدة على بعض الملفات، فمديرو نظم التشغيل يحتاجون أحيانًا إلى تعديل مجموعة فقط من عناوين الـ IP التي تنتمي إلى فئة ما، أو مجموعة من أسماء النطاقات domains (أو النطاقات الفرعية)، بل ربما احتاج أحدنا إلى تصحيح بعض الأخطاء الكتابية المتكرّرة في ملفٍ طويل، كحذف الأسطر الفارغة مثلًا، أو المسافات الفارغة في بدايات الأسطر، تغطّي التعابير النمطيّة Regular Expressions التعامل مع هذا النوع من المشاكل.
</p>

<p>
	التعابير النمطيّة هي أسلوب يُستخدم لوصف النصوص والتعرّف عليها من خلال مطابقتها (أو عدم مطابقتها) مع رموز محدّدة، وتنتشر تطبيقاتها في عدد متزايد من برامج معالجة النصوص، ومحرّرات اللغات البرمجيّة وغيرها. نتناول في هذا الدرس شرح أساسيات التعامل مع هذه التعابير دون تخصيص الحديث عن برنامج ما، حيث سنستخدم الأداة egrep <span style="line-height: 22.3999996185303px;">في أمثلتنا </span>(والتي تستخدم للبحث ضمن الملفات النصيّة أو دخل المستخدم عن طريق التعابير النمطيّة وطباعة الخرج المطابق لها على شاشة الطرفية).
</p>

<h2>
	التعابير النمطيّة
</h2>

<p>
	تدعم التعابير النمطيّة نوعين من المحارف:
</p>

<ul>
<li>
		الأول هو الأحرف الأبجديّة المعروفة، 
	</li>
	<li>
		والآخر هو الرموز الخاصة Metacharacters، وهي ما تعطي التعابير النمطية فاعليتها الحقيقية.
	</li>
</ul>
<p>
	لنأخذ الملف التالي country.txt كمثال، وهو - كما نرى - مؤلف من سبعة أسطر وثلاثة أعمدة، العمود الأول يحمل اسم البلد، والثاني عدد سكانه، والأخير القارّة التي يقع فيها:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ cat country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Italy</span><span class="pun">,</span><span class="lit">57634327</span><span class="pun">,</span><span class="typ">Europe</span><span class="pln"> 
</span><span class="typ">Yemen</span><span class="pun">,</span><span class="lit">1184300</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Argentina</span><span class="pun">,</span><span class="lit">36955182</span><span class="pun">,</span><span class="typ">Latin</span><span class="pln"> </span><span class="typ">America</span><span class="pln"> 
</span><span class="typ">Brazil</span><span class="pun">,</span><span class="lit">172860370</span><span class="pun">,</span><span class="typ">Latin</span><span class="pln"> </span><span class="typ">America</span><span class="pln"> 
</span><span class="typ">Cameroon</span><span class="pun">,</span><span class="lit">15421937</span><span class="pun">,</span><span class="typ">Africa</span><span class="pln"> 
</span><span class="typ">Japan</span><span class="pun">,</span><span class="lit">126549976</span><span class="pun">,</span><span class="typ">Asia</span></pre>

	<p>
		 
	</p>
</blockquote>

<h2>
	محارف الإرساء الخاصة
</h2>

<p>
	لنبدأ في شرح المحارف الخاصة مع العلامتين ^ و $، واللتان تشيران إلى أول السطر وآخره على التتالي، وتسمى بمحارف الإرساء anchor metacharacters. فلو رغبنا مثلًا بمعرفة الأسطر التي تبدأ بحرف "I"، فإننا سنستخدم التعبير:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^I'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Italy</span><span class="pun">,</span><span class="lit">57634327</span><span class="pun">,</span><span class="typ">Europe</span></pre>
</blockquote>

<p>
	وبالمثل، لتحديد الأسطر التي تنتهي بحرف "e"، نكتب:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'e$'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">Italy</span><span class="pun">,</span><span class="lit">57634327</span><span class="pun">,</span><span class="typ">Europe</span></pre>
</blockquote>

<p>
	العلامة التالية هي النقطة (.)، والتي تشير إلى محرف واحد (حرف، رقم، أو علامة)، فللبحث عن أسماء المدن المؤّلفة من خمسة محارف نطبع الأمر:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^.....,'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Italy</span><span class="pun">,</span><span class="lit">57634327</span><span class="pun">,</span><span class="typ">Europe</span><span class="pln"> 
</span><span class="typ">Yemen</span><span class="pun">,</span><span class="lit">1184300</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Japan</span><span class="pun">,</span><span class="lit">126549976</span><span class="pun">,</span><span class="typ">Asia</span></pre>
</blockquote>

<p>
	الآن لنجرّب البحث عن الأسطر التي تبدأ بحرف "I" أو "J" ومؤلفة من خمسة محارف:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^[IJ]....,'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln">
</span><span class="typ">Italy</span><span class="pun">,</span><span class="lit">57634327</span><span class="pun">,</span><span class="typ">Europe</span><span class="pln">
</span><span class="typ">Japan</span><span class="pun">,</span><span class="lit">126549976</span></pre>
</blockquote>

<p>
	تسمّى الأقواس المستطيلة [] هنا بصفّ المحرف character class، وهي تبحث عن تطابق واحد فقط من المحارف التي تضمها مع النصّ. وإذا وضعنا بداخلها العلامة ^ فإنها تصبح صفّ استبعاد، أي تطابق كل النصّ المذكور عدا ما يلحقها، فلو أردنا البحث عن أسماء البلدان المؤلفة من خمسة محارف والتي لا يبدأ اسمها بحرف "J" ولا "I" فإننا نكتب:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^[^IJ]....,'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">Yemen</span><span class="pun">,</span><span class="lit">1184300</span><span class="pun">,</span><span class="typ">Asia</span></pre>

	<p>
		 
	</p>
</blockquote>

<h2>
	مجموعات المحارف الخاصة وتنويعاتها
</h2>

<p>
	لمطابقة جميع الأسطر التي تضم كلمة Asia أو Africa نكتب:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'Asia|Africa'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Yemen</span><span class="pun">,</span><span class="lit">1184300</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Cameroon</span><span class="pun">,</span><span class="lit">15421937</span><span class="pun">,</span><span class="typ">Africa</span><span class="pln"> 
</span><span class="typ">Japan</span><span class="pun">,</span><span class="lit">126549976</span><span class="pun">,</span><span class="typ">Asia</span></pre>
</blockquote>

<p>
	كما يمكن إجراء ذات البحث باستخدام تعبير نمطي يستخرج حرفي A و a كعوامل مشتركة في الكلمتين:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'A(si|fric)a'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Yemen</span><span class="pun">,</span><span class="lit">1184300</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Cameroon</span><span class="pun">,</span><span class="lit">15421937</span><span class="pun">,</span><span class="typ">Africa</span><span class="pln"> 
</span><span class="typ">Japan</span><span class="pun">,</span><span class="lit">126549976</span><span class="pun">,</span><span class="typ">Asia</span></pre>
</blockquote>

<h2>
	تحديد الكميّة
</h2>

<p>
	بدلًا من كتابة العبارة:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^[IJ]....,'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt</span></pre>

<p>
	 يمكننا اختصارها بالشكل:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^[IJ].{4},'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt </span></pre>

<p>
	<span style="line-height: 1.6;">يسمى القوسين المزهّرين هنا {} بمحدّدي الكمية، وتضم رقم يعبّر عن عدد المرات التي يجب أن يتكرر فيها المحرف قبل مطابقته، كما تُستخدم للتعبير عن مدى (مجال) من المرات:</span>
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^[IJ].{4,6},'</span><span class="pln"> country</span><span class="pun">.</span><span class="pln">txt 
</span><span class="typ">India</span><span class="pun">,</span><span class="lit">1014003817</span><span class="pun">,</span><span class="typ">Asia</span><span class="pln"> 
</span><span class="typ">Italy</span><span class="pun">,</span><span class="lit">57634327</span><span class="pun">,</span><span class="typ">Europe</span><span class="pln"> 
</span><span class="typ">Japan</span><span class="pun">,</span><span class="lit">126549976</span><span class="pun">,</span><span class="typ">Asia</span></pre>

<p>
	<span style="line-height: 1.6;">يبحث التعبير النمطي السابق عن أسماء البلدان التي تبدأ بالحرف "I" أو "J" وتتراوح عدد محارفها من 4 إلى 6. هناك أيضًا بعض الاختصارات التي يمكن استخدامها مع تحديد الكمية مثلًا المجال {0,1} والذي يعني "يوجد مرة واحدة على الأقل أو لا يوجد تمامًا"، يُكافئ بالرمز ؟، حيث يمكننا كتابة:</span>
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^ab{0,1}c$'</span><span class="pln"> filename</span></pre>

<p>
	<span style="line-height: 1.6;">أو:</span>
</p>

<pre class="ipsCode" id="ips_uid_3586_6">
$ egrep '^ab?c$' filename 
</pre>

<p>
	<span style="line-height: 1.6;">أيضًا المجال {0,} يُكافئ بالرمز *، والتي تعني عدد لا نهائي من المرات، حيث التعبير: </span>
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^ab{0,}c$'</span><span class="pln"> filename</span></pre>

<p>
	<span style="line-height: 1.6;">يساوي بالنتيجة:</span>
</p>

<pre class="ipsCode" id="ips_uid_3586_8">
$ egrep '^ab*c$' filename 
</pre>

<p>
	<span style="line-height: 1.6;">وكذلك المجال {1,} والذي يحدّد الكمية "مرّة واحدة على الأقل"، يُكافئ بالرمز +، ويكون التعبيرين التاليين متكافئين:</span>
</p>

<pre class="ipsCode" id="ips_uid_3586_10">
$ egrep '^ab{1,}c$' filename 

$ egrep '^ab+c$' filename</pre>

<p>
	<span style="line-height: 1.6;">لنأخذ الآن بعض الأمثلة الأكثر تعقيدًا ولندمج ما تعلمناه من تعابير، لكن عوضًا عن البحث ضمن ملف نصيّ txt سنعالج دخل قياسي من قبل المستخدم. لنبحث مثلًا عن كل الاحتمالات الممكنة في تهجئة الجملة التالية: the grey colour suit was his favourite</span>
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'the gr[ea]y colou?r suit was his favou?rite'</span><span class="pln"> 
the grey color suit was his favourite 
the grey color suit was his favourite 

the gray colour suit was his favorite 
the gray colour suit was his favorite</span></pre>
</blockquote>

<p>
	لو نظرنا إلى التعبير المستخدم في هذا المثال، فإننا سنرى:
</p>

<ul>
<li>
		الكلمة "grey" يمكن أن تلفظ grey أو gray.
	</li>
	<li>
		الكلمة "colour" تكتب بطريقتين: colour أو color،
	</li>
</ul>
<p>
	وهذا يعني بأن حرف (u) اختياري، لذلك استخدمنا العلامة ؟ والتي تعني "يوجد مرة واحدة على الأقل أو لا يوجد تمامًا. + كذلك الأمر مع الكلمة "favourite" حيث كتابة حرف (u) اختيارية لذا استخدمنا ذات العلامة ؟
</p>

<p>
	لنجرّب الآن مطابقة عنوان الرمز البريدي zip code في الولايات المتحدة:
</p>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^[0-9]{5}(-[0-9]{4})?$'</span><span class="pln"> 
</span><span class="lit">83456</span><span class="pln"> 
</span><span class="lit">83456</span><span class="pln"> 
</span><span class="lit">83456</span><span class="pun">-</span><span class="pln"> 
</span><span class="lit">834562</span><span class="pln"> 
</span><span class="lit">92456</span><span class="pun">-</span><span class="lit">1234</span><span class="pln"> 
</span><span class="lit">92456</span><span class="pun">-</span><span class="lit">1234</span><span class="pln"> 
</span><span class="lit">10344</span><span class="pun">-</span><span class="lit">2342</span><span class="pun">-</span><span class="lit">345</span></pre>
</blockquote>

<blockquote>
	<span style="line-height: 1.6;">مثال آخر يطابق جميع الأوقات الممكنة في الأربع والعشرين ساعة:</span>
</blockquote>

<blockquote>
	<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'</span><span class="pln"> 
</span><span class="lit">23</span><span class="pun">:</span><span class="lit">44</span><span class="pun">:</span><span class="lit">02</span><span class="pln"> 
</span><span class="lit">23</span><span class="pun">:</span><span class="lit">44</span><span class="pun">:</span><span class="lit">02</span><span class="pln"> 
</span><span class="lit">33</span><span class="pun">:</span><span class="lit">45</span><span class="pun">:</span><span class="lit">11</span><span class="pln"> 
</span><span class="lit">15</span><span class="pun">:</span><span class="lit">45</span><span class="pun">:</span><span class="lit">33</span><span class="pln"> 
</span><span class="lit">15</span><span class="pun">:</span><span class="lit">45</span><span class="pun">:</span><span class="lit">33</span></pre>
</blockquote>

<p>
	في المثال السابق قلنا أنه إذا كانت الخانة الأولى من الساعة إما 0 أو 1، عندها يسمح للخانة الثانية بأن تأخذ قيمة من المجال من 0 إلى 9، ولكن إذا كانت الخانة الأولى تحمل الرقم 2 حينها يسمح للخانة الثانية أن تأخذ القيم 0، 1، 2، أو 3.
</p>

<h2>
	حدود الكلمة
</h2>

<p>
	لكتابة تعبير نمطي يطابق الكلمات التي تنتهي بـ "color"، سنرى أنه يطابق الأمثلة: unicolor ،watercolor ،multicolor، لكنه لن يطابق colorless أو colorful: 
</p>

<p>
	تطابق العلامة "&lt;\" ورود كلمة color آخر الكلمة مثل unicolor، watercolor، أو multicolor،
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'color\&gt;'</span></pre>

<p>
	أما لمطابقة كلمة color في أوّل الكلمة، مثل colorless أو colorful، فإننا نكتب:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'\&lt;color'</span></pre>

<p>
	ولمطابقة كلمة color كما هي:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">'\&lt;color\&gt;'</span></pre>

<h2>
	الإحالات المرجعية
</h2>

<p>
	لنفترض أننا نريد مطابقة جميع الكلمات المكرّرة مثل "the the" أو "before before"، هنا نستخدم ما يسمى بالإحالات المرجعية backreferences والتي تستعمل لتذكّر الأنماط، مثال:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">"\&lt;the\&gt; \1"</span><span class="pln"> </span></pre>

<p>
	أو في الحالة العامّة:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4" style="">
<span class="pln">$ egrep </span><span class="str">"\&lt;(.*)\&gt; \1"</span><span class="pln"> </span></pre>

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

<p>
	ترجمة -وبتصرّف- للمقال: <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions" rel="external nofollow">An Introduction To Regular Expressions</a> للكاتب: Shantanu Kulkarni.
</p>
]]></description><guid isPermaLink="false">63</guid><pubDate>Thu, 04 Jun 2015 11:10:00 +0000</pubDate></item><item><title>&#x623;&#x644;&#x641; &#x628;&#x627;&#x621; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D9%84%D9%81-%D8%A8%D8%A7%D8%A1-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r61/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/linux-basics.png.12b3802db98eb39f5c54fe6e3940b6cd.png" /></p>

<h2>حول لينكس</h2><p>غنو لينكس GNU/Linux هو نظام تشغيل حرّ ومفتوح المصدر يدمج بين مشروعين مختلفين، الأول هو مشروع GNU لكتابة نظام تشغيل حرّ من الصفر والذي كاد يجهز مع بداية التسعينات باستثناء الجزء المسمّى بنواة النظام، في هذه الأثناء كان لينوس تورفالدز قد طوّر نواة نظام تشغيل كهواية، فجاءت الفكرة لاختصار الجهد بدمج المشروعين وتقديمهما تحت اسم غنو لينكس، والذي سيشيع لاحقًا باسم لينكس. ورغم أن لينكس سهل الاستخدام إلا أن القادمين الجدد من Windows يجدون صعوبة في فهم بنيته والتعامل معها، لذا سنستعرض في هذا الدرس بعض المفاهيم والأدوات الأساسيّة حول لينكس.</p><h3>الطرفيّة</h3><p>قبل أواخر التسعينيات زُوّد نظام التشغيل غنو لينكس بواجهات رسوميّة لتسهيل التعامل معه، إلا أنّ الطرفيّة (والتي يمكن تشبيهها مبدئيًا بموجّه الأوامر في Windows) لا تزال أداة قويّة وفعّالة في كثيرٍ من الحالات، لا سيما عند إدارتك لخادوم يعمل تحت نظام لينكس، حيث يتمّ ذلك عبر سطر الأوامر فقط، إذ تنفّذ جميع المهام الإدارية من خلال كتابة الأوامر والضغط على زرّ الإدخال <span style="font-family:courier new,courier,monospace;">Enter</span> لتنفيذها، يشمل ذلك التعديل على الملفات، تركيب الحزم، وإدارة المستخدمين. الطرفية ببساطة هي تلك النافذة السوداء التفاعلية، حيث نكتب الأوامر لتنفيذها، بينما تعيد هي الخرج لنا طباعةً على الشاشة نفسها.</p><h3>التعامل مع المجلدات ضمن الطرفية</h3><p>يُؤسّس نظام الملفات في لينكس على شكل شجرة من الأدّلة، بحيث يمكنك إنشاء المجلدات داخل بعضها البعض، وإنشاء الملفات في أيٍ مجلدٍ منها. لمعرفة ما هو الدليل الذي تقف عنده حاليًا، نفّذ الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">pwd</pre><p>يمثّل الأمر السابق اختصارًا لعبارة "print working directory" أو "اطبع مجلد العمل الحالي"، وسوف يعيد لنا على الشاشة مسار المجلد النشط حاليًا، وهو غالبًا ما سيكون شيء مشابه لما يلي: <code>/home/foo/</code> وهذا يعني بأن المجلّد النشط حاليًا هو "foo" والموجود داخل المجلد "home" والمضمّن بدوره داخل الدليل الجذر "/"، يُقصد بالمجلّد النشط ذاك الذي ستنفّذ عنده الأوامر المُدخلة، لتوضيح هذه الفكرة سنطبّق الأمر "<span style="font-family:courier new,courier,monospace;">ls</span>" والذي يعرض الملفات والمجلدات الموجودة في الدليل النشط: <code>ls</code> يعرض خرج الأمر السابق أسماء الملفات والمجلدات الموجودة ضمن الدليل "foo"، ولتغيير المجلد النشط نستخدم الأمر <span style="font-family:courier new,courier,monospace;"><code>cd</code></span>، وهو اختصار لعبارة "change directory" أو غيّر الدليل/المجلد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd &lt;name of directory&gt;</pre><p>للدخول إلى مجلد مضّمن بالدليل النشط يُكتفى بكتابة اسمه مباشرةً، بينما للانتقال إلى دليل آخر خارج "foo" فيجب كتابة مساره كاملًا، تحقّق دومًا من المسار النشط بالأمر <code>pwd</code>. إضافةً لذلك يمكن استخدام اللاحقة <span style="font-family:courier new,courier,monospace;"><code>..</code></span> للانتقال مجلد واحد إلى الأعلى ضمن المسار نفسه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd .. </pre><p>لإنشاء مجلد جديد نستخدم الأمر <span style="font-family:courier new,courier,monospace;"><code>mkdir</code></span> (لا تنس أن الأمر سينفذ ضمن المجلد النشط حاليًا وسيُنشأ المجلد هناك):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mkdir bar </pre><p>يتيح لنا الأمر<span style="font-family:courier new,courier,monospace;"> </span><code>rm</code> حذف المجلدات والملفات التي لم نعد بحاجة إليها، وعن طريق إضافة اللاحقة <code>-d</code> سينفذ الأمر فقط في حال كان المجلد فارغًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">rm -d bar</pre><p>بينما نستخدم اللاحقة <code>R-</code> تعني Recursive أي تكرارية وهي لحذف المجلد ومحتوياته.</p><h3>التعامل مع الملفات ضمن الطرفية</h3><p>لاستعراض محتويات ملف ما نستخدم الأمر <code>cat</code>؛ لنقل أنه لدينا الملف <code>baz</code> ضمن الدليل الحالي، يَطبع الأمر التالي محتويات هذا الملف على شاشة الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cat baz</pre><p>مع الملفات الطويلة لن يكون الأمر السابق مجديًا، حيث سَيَعرض لنا الصفحة الأخيرة فقط من الملف على شاشة الطرفية، وسنحتاج إلى الصعود يدويًا للوصول إلى الصفحة الأولى ومن ثم تقليب الصفحات نزولًا! للتعامل مع مثل هذه الملفات نستخدم الأمر <code>less</code> والذي يعرض الصفحة الأولى من الملف، ومن خلال الضغط على زر المسافة Space يمكننا تقليب الصفحات وصولًا إلى نهاية الملف:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">less baz</pre><p>يمكننا أيضا استخدام زر السهم السفلي للنزول سطر واحد إلى الأسفل، والضغط على زر "<span style="font-family:courier new,courier,monospace;">q</span>" لإنهاء العرض. لإنشاء ملفات جديدة سوف نستخدم الأداة</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">touch: touch foobar</pre><p>يُنشئ الأمر السابق ملفًا فارغًا باسم foobar داخل الدليل النشط لديك. إذا لم يعجبك الاسم السابق فيمكنك استخدام الأمر <code>mv</code> لإعادة تسميته:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mv foobar fizzbuzz </pre><p>الأمر <code>mv</code> هو اختصار للكلمة <code>move</code> أو "حرّك"، ويمكن استخدامه لنقل ملف أو مجلد من مكانٍ لآخر، أو لإعادة التسمية مع النقل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mv foobar Docs/fizzbuzz </pre><p>ينقل الأمر السابق الملف <code>foobar</code> إلى المجلد <code>Docs</code> الموجود ضمن الدليل الحالي، ويُعيد تسميته إلى <code>fizzbuzz</code>. كما يمكننا استخدام الأمر <code>cp</code> لنسخ الملف <code>foobar</code> إلى الدليل المطلوب باسم جديد، بحيث يبقى الملف الأصليّ دون تعديل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cp foobar Docs/fizzbuzz </pre><p>الأمر <code>cp</code> هو اختصار للكلمة "copy" أو "انسخ"، ويمكننا استخدامها بالشكل التالي أيضًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cp foobar fizzbuzz </pre><p>وهكذا نحصل على نسختين من الملف باسمين مختلفين ضمن المجلد نفسه. لكن ما هي قيمة ملف فارغ؟ للتعديل على ملف ضمن الطرفية نحتاج إلى محرّر نصيّ، ولدينا بالتأكيد العديد من الخيارات، مثل محرري <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D9%85%D8%AD%D8%B1%D9%91%D8%B1+vim">vim</a> و emacs الشهيرين، أو محرر nano الأكثر بساطة وشبيهه pico. للمبتدئين فإن المحرر nano هو خيار ممتاز، نظرًا لسهولة التعامل معه وبساطة تعلمه، دون الحاجة إلى كتب أو دورات تعليمية! ببساطة؛ للتعديل على الملف <code>foobar</code> نستخدم الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">nano foobar </pre><p>والذي سينقلنا إلى واجهة المحرّر البسيطة ومساحة فارغة للكتابة، بعد الانتهاء من الكتابة ولحفظ العمل نضغط على Ctrl-X ، حيث يسألنا المحرر عن رغبتنا بحفظ التعديلات، نضغط <code>y</code> للموافقة ثم Enter لنعود مجددًا إلى الطرفية. ملفنا الآن يضم بعض النصوص التي أدخلناها للتوّ، ويمكن التحقق من ذلك بعرض محتوياته باستخدام إحدى الأداتين <code>cat</code> أو <code>less</code>. أخيرًا، يمكنك حذف الملف بواسطة الأمر <code>rm</code>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">rm fizzbuzz </pre><p>وخلافًا للمجلدات، تُحذف الملفات بغض النظر عن وجود محتوى ضمنها من عدمه.</p><h2>التسلسل الهرمي القياسي لنظام الملفات</h2><p>تتوافق جميع توزيعات لينكس تقريبًا مع ما يسمى بالتسلسل الهرمي القياسي لنظام الملفات أو FHS، والذي يحدّد الأدلة الرئيسية؛ أغراضها ومحتوياتها في نظام التشغيل. ووفق هذا النظام يشار بالرمز "/" إلى المجلد الأساسي أو جذر النظام، والذي تتفرع منه جميع الملفات والأدلة الأخرى. الدليل "/home/" يحتوى على المجلدات الخاصة بمستخدمي النظام، والتي تضم ملفاتهم وإعدادات برامجهم، فمثلًا يمكنك مشاهدة مجلد يحمل اسم مستخدمك الحالي ضمنه، أما المستخدم الجذر فله دليل آخر وهو "/root/". بشكل عام غالبًا ما يمكنك الاعتماد على بديهتك في فهم أغراض الأدلة الرئيسيّة، فحالما تجد الدليل boot ستتوقع أنه مخصّص لملفات الإقلاع، والدليل dev متعلّق بالأجهزة، وهكذا..</p><p>ندعوك لمراجعة مقالة <a title="أكمل قراءة كيف تفهم هيكلية نظام الملفات في لنكس" href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%81%D9%87%D9%85-%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%86%D9%83%D8%B3-r53/">كيف تفهم هيكلية نظام الملفات في لنكس</a> على أكاديمية حسوب.</p><h2>الأذونات</h2><p>يُعتبر لينكس نظام متعدّد المستخدمين بشكل حقيقي، إذ يتيح إمكانية تحديد أيّ الملفات يمكن للآخرين مشاهدتها أو التعديل عليها وأيّها تُحفظ بحيث يتمكن مالكها فقط من التعامل معها. تُسمّى القواعد التي تُنظّم وتدير هذه الإمكانية بالأذونات أو الصلاحيات Permissions. وعلى غرار يونكس، يقسّم لينكس المستخدمين إلى ثلاث فئات؛ المالك، المجموعة المالكة، والآخرين، كما يقسّم الصلاحيات إلى ثلاثة أنواع؛ القراءة، الكتابة، والتنفيذ. للمزيد حول موضوع الأذونات يمكنكم قراءة مقالنا السابق عنها من هنا.</p><h2>تعلّم ذاتيًا</h2><p>لم نقدّم في درسنا هذا سوى بعض المفردات الأساسيّة في التعامل مع بيئة أنظمة لينكس، إلا أنك بالتأكيد تحتاج إلى ما هو أبعد من ذلك لتممكن من فهم واستخدام لينكس بشكل مثالي. يمكنك قراءة المزيد حول كيفيّة إنجاز مختلف المهام في لينكس ضمن الأكاديميّة هنا، كما يمكنك استخدام محركات البحث لاستطلاع المزيد وإيجاد حلول لمشكلاتك، تذكّر أنّ السؤال الذي يدور ببالك قد سأله آخرون من قبل وتمّت إجابتهم بشكل شافٍ، لذا ابحث أولًا ودومًا عن كل ما يعترض طريقك، كُن فضوليًا حيال ذلك. يأتي لينكس أيضًا مع مجموعة ضخمة من الدلائل التعليميّة المتعلّقة بكافة الأوامر التي يمكن استخدامها ضمن الطرفية، للقراءة حول أي أمر استخدم التعليمة التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">man &lt;command&gt; </pre><p>فعلى سبيل المثال للقراءة حول الأمر rm نكتب:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">man rm </pre><p>حيث يعرض لنا دليل مفصّل يشمل الغرض من الأمر، الخيارات المتاحة له، أمثلة عن الاستخدام، والمزيد من المعلومات القيّمة. البحث عن المعلومات مهارة أساسية في عصرنا اليوم، وهي ستخدمك كثيرًا بتعزيز مهاراتك وإمكانياتك المهنيّة في التعامل مع نظام التشغيل لينكس، طالما تحلّيت بالصبر والفضول.</p>
]]></description><guid isPermaLink="false">61</guid><pubDate>Mon, 01 Jun 2015 22:25:14 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644; &#x645;&#x64A;&#x64E;&#x633;&#x651;&#x64E;&#x631; &#x644;&#x643;&#x62A;&#x627;&#x628;&#x629; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; Shell</title><link>https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D9%8A%D9%8E%D8%B3%D9%91%D9%8E%D8%B1-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-shell-r56/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/shell-basics.png.96914ca2d945308a95194c9b392f8aa3.png" /></p>

<p id="دليل-ميسر-لكتابة-سكربتات-shell">يهدِف هذا الدّليل إلى شرح طريقة كتابة سكربتات <code>Shell</code> لتحقيق أغراض مختلفة. يُمكن أن تُستخدم سكربتات Shell لتنفيذ أوامر عديدة، أمر واحد بمعطَيات Arguments كثيرة معقَّدة، أو واجهات أكثر سهولةً في الاستخدام لتوزيع عملك. في الأساس، تُستخدَم سكربتات <code>Shell</code> لتسهيل بعض الأعمال بتشغيلها آليًّا دون اللّجوء لإعادة كتابتها في كلّ مرة تحتاجها.</p><h2 id="أساسيات-كتابة-سكربتات-shell">أساسيّات كتابة سكربتات Shell</h2><h3 id="1-تهيئة-مجلد-العمل">1- تهيئة مجلّد العمل</h3><p>من الجيّد، قبل البدء في كتابة سكربتات <code>Shell</code>، إعدادُ مجلّد لوضعها فيه. يُنصَح بوضع السكربتات الشّخصيّة في مجلّد يوجد على المسار bin/~. ننشئ هذا المجلّد عبر الأمر التّالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">mkdir ~/bin</pre><p>نُضيف مسار المجلّد إلى المتغيّر PATH وذلك بتعديل ملفّ etc/profile/ على النّحو التّالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo nano /etc/profile</pre><p>ونُضيف الأسطُر التّالية إلى الملفّ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">PATH=$PATH:$HOME/bin
export PATH</pre><p>استخدم زرّي CTRL وO لحفظ التّعديلات، وCTRL+X للخروج من محرّر النّصوص nano.</p><p>ثمّ نعتمد التّغييرات عبر تنفيذ الأمر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">source /etc/profile</pre><p>بعض توزيعات لينكس لا تدعم أمر source، في هذه الحالة ينبغي إعادة تشغيل النّظام لاعتماد التّعديلات:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo reboot</pre><p>ملحوظة: للتّأكّد من اعتماد التّغييرات استخدِم الأمر التّالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">printenv PATH</pre><p>وتأكّد من وجود مسار مجلّد السكربتات ضمن المسارات العروضة (يُفصَل بين المسارات بنقطتيْن عموديّتيْن هكذا <code>:</code>).</p><h3 id="2-إنشاء-ملف">2- إنشاء ملفّ</h3><p>ينبغي إنشاء ملفّ تنفيذيّ Executable file حتى يُمكن تشغيل السكربت. الأمران التّاليّان يؤدّيان هذه المهمّة؛ الأوّل ينشِئ ملفًّا والثّاني يجعله قابلًا للتّنفيذ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">touch ~/bin/firstscript
chmod +x ~/bin/firstscript</pre><p>نفتح الملفّ بمحرّر نصوص nano للبدْء في إضافة الأوامر إلى السكربت:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">nano ~/bin/firstscript</pre><p>تجب إضافة السّطر التّالي في بداية الملفّ حتّى يعرف النّظام أنّه سكربت <code>Shell</code> وبالتّالي ينفّذ الأوامر الموجودةَ فيه بالطّريقة الصّحيحة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/sh</pre><p>أصبح الملفّ الآن جاهِزًا ليستقبل أي أمر من أوامر لينكس، مثلًا:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">clear
echo "Hello World!"</pre><p>نحفظ الملفّ (CTRL+O) ثمّ نخرج من محرّر النّصوص (CTRL+X). تكفي الآن كتابة اسم السكربت ثم الضّغط على Enter لتنفيذه:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">firstscript</pre><p>لا يهمّ من أيّ المسارات نفّذت السكربت، مادام مجلّد العمل موجودًا ضمن متغيّر البيئة PATH.</p><p>ينبغي أن تحصُل على النّتيجة التّاليّة:</p><p><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_05/01_first_script.png.338a889303c8b0bab4bbb63a3b2da768.png"><img data-fileid="2201" class="ipsImage ipsImage_thumbnailed" alt="01_first_script.thumb.png.f065531026ed75" src="https://academy.hsoub.com/uploads/monthly_2015_05/01_first_script.thumb.png.f065531026ed75ec9351a76cf7267af3.png"></a></p><h3 id="3-مثال-لسكربت">3- مثال لسكربت</h3><p>يُعدّ التّشغيل الآليّ للأعمال المتكرّرة أحد أكثر المجالات الّتي تُستخدَم فيها سكربتات <code>Shell</code>. على سبيل المثال؛ إذا كنت دائمًا تنقل الكثير من الملفّات إلى مجلّد نسخ احتيّاطي Backup، وليكن backup/~، فإنّ بإمكانك إعداد سكربت ينقل أي ملفّ تحدّده إلى المجلّد المطلوب. بهذه الطّريقة يمكن أن تكتُب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">filebackup file-name1 file-name2 ...</pre><p>فلنلقِ نظرة على ما نحتاج لمعرفته، قبل البدْء في كتابة السكربتات. أوّل ملحوظة هي أنّ سكربتات <code>Shell</code> لا تستخدم التّرميز الصّلب Hard coding. يعني هذا، في إطار مثالنا، أنّه يمكنك بسهولة تغيير مجلّد النّسخ الاحتيّاطي إذا أردت. كلّ ما عليك فعله هو تعديل أحد الأسطُر الأولى في ملفّ السكربت؛ حيثُ سيظهر المتغيّر الّذي سيخزّن مسار المجلّد مرةً واحدة فقط. لن تحتاج لتعديل ملفّ السكربت لتجربة التّعامل مع المتغيّرات، يمكن ذلك مباشرةً في سطر الأوامر عن طريق كتابة ما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">testvariable=teststring</pre><p>أعطينا القيمة <code>teststring</code> للمتغيّر <code>testvariable</code>. يطبع أمر <code>echo</code> محتوى المتغيّر (لاحِظ استخدام <code>$</code> أمام اسم المتغيّر):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">echo $testvariable</pre><p>ستظهر في سطر الأوامر قيمة المتغيّر <code>testvariable</code> أيّ <code>teststring</code>. يمكننا الآن بعد هذا الاختبار البسيط لعمل المتغيّرات البدءُ في كتابة السّكربت؛ الخطوات هي نفسُها الّتي تحّثنا عنها أعلاه: إنشاء الملفّ، جعله قابلًا للتّنفيذ، ثمّ البدْء في تحريره:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">touch ~/bin/filebackup
chmod +x ~/bin/filebackup
nano ~/bin/filebackup</pre><p>ينبغي الانتباه إلى أنّ أي سطر يبدأ بعلامة <code>#</code> تعليق، أي أنّه لن يؤثّر على عمل السكربت إلا إذا أُتبعت <code>#</code> بعلامة تعجّب <code>!</code> في السّطر الأوّل من برنامجك؛ في هذه الحالة يُطلق عليها اسم shebang والّتي شرحنا سابقًا أنّ نظام التّشغيل يعرف عن طريقها أنّ هذا الملفّ سكربت <code>Shell</code> ويُنفّذ الأوامر الموجودة فيه. يأخذ السكربت الشّكلَ التّالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/sh
#Backup script
#Description: makes a copy of any given file at the backup folder
#Author: Your Name
#Date: 8/10/2013

#Backup folder; set this variable to any folder you have write permissions on
BACKUPFOLDER=~/backup

#The script will make sure the folder exists
mkdir -p $BACKUPFOLDER

#Now the script will copy the given file to the folder
cp -a $@ $BACKUPFOLDER</pre><p>نشرح، بعد حفظ الملفّ (CTRL+O) والخروج من محرّر النّصوص (CTRL+X)، عمل السكربت. الأسطُر الأولى كلّها تعليقات؛ عرّفنا بعدها متغيّرًا باسم <code>BACKUPFOLDER</code> نضع فيه مسار المجلّد حيث نُريد نسخ الملفّات. ننفّذ بعدها الأمر <code>mkdir -p $BACKUPFOLDER</code> الّذي يُنشئ مجلّدًا في المسار الموجود في المتغيّر <code>BACKUPFOLDER</code>، إذا كان المجلّد موجودًا مسبقًا لن تظهر أي رسالة خطأ نظرًا لاستخدام خيّار <code>p-</code>. تدلّ علامة <code>@$</code> في الأمر التّالي، <code>cp</code>، على المعطيات الّتي يمرّرها المستخدِم أثناء تنفيذ السّكربت. لتمرير المعطيات للسكربت فإنّ المستخدِم يكتبها مباشرةً بعد اسم السكربت. يوجد مجلّد الحفظ (وِجهة النّسخ، في هذه الحالة قيمة المتغيّر <code>BACKUPFOLDER</code>) مباشرةً بعد المعطيات الّتي يمرّرها المستخدِم.</p><p>لتجربة السكربت نفّذ ما يلي، على اعتبار أنّ <code>file1</code> و<code>file</code> ملفّان يوجدان في المجلّد حيثُ تنفّذ السكربت:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">filebackup file1 file</pre><p>يمكنك إضافة ملفّات بالعدد الّذي تريد، بكتابة أسمائها بعد اسم السكربت، وستُنقَل جميعها إلى مجلّد النّسخ الاحتيّاطيّ.</p><h2 id="أوامر-أساسية-في-shell">أوامر أساسيّة في Shell</h2><p>توجد بعض الأوامر الأساسيّة لعرض المعلومات للمستخدِم، ولأخذها منه أيضًا.</p><h3 id="1-أمر-echo">1- أمر echo</h3><p>يُستخدَم أمر <code>echo</code> لعرض معلومات للمستخدِم، سواءٌ كانت هذه المعلومات نصًّا أو متغيّرات أو خليطًا من الاثنين. يُمكن استخدام الخيّاريْن <code>n-</code> و<code>e-</code> مع أمر <code>echo</code>؛ يمنع خيّار <code>n-</code> طباعة سطر جديد بعد النّصّ المعروض، أما خيّار <code>e-</code> فيُفعّل استخدام مجموعة الرموز التّالية داخل النّصّ:</p><ul><li><font face="monospace">a\</font>: صوت تحذير - Alert sound</li><li><font face="monospace">b\</font>: فراغ للخلف Backspace</li><li><font face="monospace">c\</font>: لا تطبع سطرًا جديدًا</li><li><font face="monospace">e\</font>: مِحرف الخلوص Escape character</li><li><font face="monospace">n\</font>: سطر جديد</li><li><font face="monospace">r\</font>: رجوع إلى السّطر</li><li><font face="monospace">t\</font>: جدولة أفقيّة</li><li><code>0xx\</code>: محرف ASCII</li><li><code>\\</code>: خط مائل عكسي Backslash.</li></ul><p>على سبيل المثال، يؤدّي الأمران التّاليّان نفس الشّيئ بالضّبط (لاحِظ وجود النّص بين علامتيْ اقتباس):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">echo -e “Text\c”
echo -n “Text”</pre><p>لعرض قيمة متغيّر عن طريق أمر <code>echo</code> أضف اسم المتغيّر مسبوقًا بعلامة <code>$</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">string=World!
echo "Hello $string"</pre><p>يُمكنك خلط نص، أوامر ومتغيّرات في سلسلة محارف String واحدة. يمكنك أيضًا كتابة أمر من سطر واحد يعرض نصًّا من أسطر عديدة؛ كلّ ما عليك فعله هو كتابة <code>n\</code> في المكان الّذي تُريد بدْءَ سطرٍ جديد منه.</p><h3 id="2-تهيئة-النصوص-باستخدام-أمر-echo">2- تهيئة النّصوص باستخدام أمر echo</h3><p>يُمكن لأمر <code>echo</code> عرض النّصوص وتهيئتها بألوان وأساليب متنوّعة؛ ولكنّ نتائج هذه التّهيئة قد لا تكون دومًا متشابهة في الطّرفيّات الموجودة. يجب الانتباه إلى أنّ بعض المستخدمين قد لا يرون نتيجة تهيئة النّصوص بنفس الطّريقة الّتي تظهر لديك. لا يُشكّل هذا الأمر، بما أنّ التّغيير ظاهريّ أساسًا، مشكلًا كبيرًا في غالب الأوقات. يُعرَّف كلُّ تخصيص (جعل الخطّ عريضًا Bold، وضع خطّ تحت النّص، أو تلوينه) بمتتاليّة من محارف الخلوص Escape characters، وهي مجموعة من الرّموز تتبع المِحرف `e\’، على النّحو التّالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">echo -e "This is \e[1mBold"</pre><p>ينتُج عن الأمر السّابق كتابة الجملة <code>This is Bold</code> مع تمييز كلمة <strong>Bold</strong> بخط عريض.</p><p>يوضّح الجدول التّالي بعض الرّموز شائعة الاستخدام:</p><table border="1" cellpadding="5"><tbody><tr><td>خطّ عريض</td><td>خطّ عاديّ</td><td>خطّ تحت النّصّ</td><td>عكس الألوان</td></tr><tr><td><code>e[1m\</code></td><td><code>e[2m\</code></td><td><code>e[4m\</code></td><td><code>e[7m\</code></td></tr></tbody></table><p><br>يُمكن استخدام هذه الرّموز معًا للحصول على نصّ عريض ومخطوط تحته، ثمّ إعادة تعيين التّأثيرات باستخدام الرّمز <code>e[0m\</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">echo -e "\e[4mThis \e[1mis\e[0m \e[7man example \e[0mstring"</pre><p>جرّب الأمر وشاهد عمل الرّموز.</p><p>يعمل تلوين النّصوص بنفس الطّريقة حيثُ يوجد رمز لكلّ لون. تُدرج رموز الألوان مثل ما تُدرج رموز تهيئة النّص المذكورة في الفقرة السّابقة. يوضّح الجدول التّالي رموز الألوان الأكثر شيوعًا. يوجد رمز للون النّص وآخر لخلفيّته.</p><table border="1" cellpadding="5"><tbody><tr><td>أسود</td><td>e[30m\</td><td>e[40m\</td></tr><tr><td>أحمر</td><td>e[31m\</td><td>e[41m\</td></tr><tr><td>أخضر</td><td>e[32m\</td><td>e[42m\</td></tr><tr><td>أصفر</td><td>e[33m\</td><td>e[43m\</td></tr><tr><td>أزرق</td><td>e[34m\</td><td>e[44m\</td></tr><tr><td>أرجوانيّ</td><td>e[35m\</td><td>e[45m\</td></tr><tr><td>سماويّ</td><td>e[36m\</td><td>e[46m\</td></tr><tr><td>رمادي فاتح</td><td>e[37m\</td><td>e[47m\</td></tr><tr><td>اللّون الافتراضيّ</td><td>e[39m\</td><td>e[49m\</td></tr></tbody></table><p>إن أردنا مثلًا نصًّا بلون أحمر فالرّمز هو<code>e[31m\</code>، أمّا إذا أردنا خلفيّة بلون أحمر فالرّمز هو <code>e[41m\</code>.</p><p>يُمكنك استخدام ألوان مختلفة لكلّ من النّص والخلفيّة، كما أنّ بإمكانك استخدام رموز تهيئة النّصّ المذكورة في الفقرة السّابقة إلى جانب رموز ألوان النّصّ والخلفيّة.</p><h3 id="3-أمر-read">3- أمر read</h3><p>يُستدعى أمر <code>read</code> لأخذ بيانات من المستخدِم. يسجّل أمر <code>read</code> كلّ ما يكتبه المستخدِم ابتداءً من استدعاء الأمر إلى أن يضغط على زرّ <code>ENTER</code>، يسجّله في متغيّر. يوجد معطًى واحد للاستخدام مع أمر <code>read</code> وهو اسم المتغيّر الّذي سيُحتفظ فيه بما يكتبه المستخدِم. في ما يلي مثال لسكربت مختصَر يُنشئ مجلّدًا بالاسم الّذي يختاره المستخدِم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/bash
read foldername
mkdir foldername</pre><p>يُمكن ملاحظة أنّ السكربت السّابق لا يمتلك أيّ واجهة للتّفاعل مع المستخدم. كيف يُمكن للمستخدِم أن يعرف مالّذي عليه كتابته؟</p><h3 id="4-مثال-على-سكربت">4- مثال على سكربت</h3><p>سنطبّق، عبر المثال التّالي، كلّ ما تعلّمناه حتى الآن. سنعرِض رسائل مخصَّصة ومنسَّقة للمستخدِم، ثمّ نأخذ منه البيانات الّتي نحتاجها. عرضنا في بداية هذا الشّرح مثالًا لسكربت ينسخ احتيّاطيًّا مجموعة من الملفّات؛ سنعيد كتابة هذا السّكربت لنطلُب من المستخدِم مالملفّات الّتي يُريد نسخَها.</p><p>نعدّ بدايةً الملفّ ونفتحه للتّحرير:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">touch ~/bin/filebackup2
chmod +x ~/bin/filebackup2
nano ~/bin/filebackup2</pre><p>ونُعيد كتابته بحيث تكون لديه واجهة مع المستخدِم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/bash
#Backup script 2.0
#Description: makes a copy of any given file at the backup folder
#Author: Your Name
#Date: 5/27/2015
#Request the backup folder from the user:
echo -e "\e[1m\e[32mFile Backup Utility\n\e[39m\e[0mPlease input your backup folder:"
read BACKUPFOLDER
#The script will make sure the folder exists
mkdir -p $BACKUPFOLDER
#Request files to be backed up:
echo -e "\e[47m\e[30mWhich files do you want backed up?\e[39m\e[49m"
read FILES
cp -a $FILES $BACKUPFOLDER</pre><p>يُظهر السكربت رسالة للمستخدِم، بطريقة منسَّقة، تدعوه أوّلًا لإدخال اسم المجلّد الّذي ستُحفَظ فيه النّسخ الاحتيّاطيّة ويحتفظ باسم المجلّد في المتغيّر <code>BACKUPFOLDER</code>، ثمّ يُنشئ السكربت المجلّد إن لم يكن موجودًا. الخطوة التّاليّة هيّ إظهار رسالة تطلُب من المستخدم إدراج أسماء الملفّات المُراد نسخُها ويحفظها في متغيّر باسم <code>FILES</code>. الخطوة الأخيرة هي نسخ الملفّات إلى المجلّد عبر الأمر <code>cp</code>.</p><p>غطّينا في الفقرات السّابقة الأوامر الأساسيّة الّتي تُمكِّن من كتابة سكربتات تتفاعل مع المستخدِم حتّى يعلم بالضّبط كيف يعمل السكربت ومالمعلومات الّتي يطلُبها. ليست كلّ السكربتات تحتاج إلى واجهة مستخدِم؛ السكربت الأوّل الّذي كتبناه أسرع من الثّاني وأفضل في كثير من الأحيان. لا تُضِف واجهة استخدام إلّا للسكربتات الّتي يحتاج المستخدِم للمساعدة في استخدامها، في هذه الحالة ستحتاج لأمر <code>echo</code>.</p><h2 id="التعليمات-الشرطية-conditional-statements">التّعليمات الشّرطيّة Conditional statements</h2><p>تُعدّ التّعليمات الشّرطيّة من الأمور الّتي لا غنى عنها لأيّ لغة برمجة متكاملة. سنتطرّق في هذا الجزء من الدّرس لطريقة وضع شروط وتنفيذ أوامر عند تحقّق - أو عدم تحقّق - هذه الشّروط.</p><h3 id="1-أمر-if">1- أمر if</h3><p>تُستخدَم التّعليمات الشّرطيّة لوضع شروط تُنفَّذ عند تحقّقها إجراءات معيّنة. يوجد في <code>Shell</code> أمر <code>if</code> الّذي يُتبَع بعبارة ستُختَبَر صحّتها. يُمكن لهذا العبارة أن تكون عبارة منطقيّة، رمز خروج Exit code لأمر أو بعض الأمور الأخرى. عند العمل على رموز الخروج من أوامر فإن استخدامَها مباشِر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">if ls folder
then
echo "Folder exists"
fi</pre><p>إذا وُجد ملفّ باسم <code>folder</code> فإنّ السّكربت السّابق سيُنفّذ الأمر <code>echo "Folder exists"</code> لأنّ رمز الخروج من أمر <code>ls</code> في هذه الحالة هو <code>0</code> (يُشير الرّمز <code>0</code> إلى أنّه لا توجد أخطاء في تنفيذ الأمر). أمّا إذا لم يوجد المجلَّد فلن تُعرَض الرّسالة.<br>يجب أن تتبع كلَّ تعليمة <code>if</code> ب<code>then</code> ,وتُختَم ب<code>fi</code>.</p><p>إذا أردت التّعامل مع عبارات منطقيّة في تعليمة <code>if</code> فستحتاج لأمر <code>test</code>. توجد في <code>Shell</code> العوامل Operators التّاليّة لمقارنة الأعداد:</p><ul><li>eq-: يُساوي</li><li>ne-: لا يُساوي</li><li>lt-: أصغر من</li><li>le-: أصغر من أو يُساوي</li><li>gt-: أكبر من</li><li>ge-: أكبر من أو يُساوي</li></ul><p>توجد طريقتان لكتابة أمر <code>test</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">if test 4 -gt 3</pre><p>أو:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">if [ 4 -gt 3]</pre><p>تؤدّي الكتابتان نفس العمل تمامًا، كما أنّهما تحتاجان أيضًا ل<code>then</code> و<code>fi</code>. مثال:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">if [ 20 -lt 10 ]
then
echo "What?"
fi</pre><p>إذا جرّبت تنفيذ السكربت السّابق فستُلاحِظ ألّا شيءَ يُعرَض على الشّاشة؛ لأنّ الشّرط غير متحقّق، فالعدد 20 ليس أصغر من 10. ماذا لو أردنا عرض رسالة للزّائر في حال عدم تحقّق الشرط، مثل ماهو الحال في المثال السّابق؟</p><h3 id="1-أمر-else">2- أمر else</h3><p>تُضيف <code>else</code> بديلًا يُنفَّذ عند عدم تحقّق الشّرط في تعليمة <code>if</code>. طريقة الاستخدام:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">if [ 20 -lt 10 ]
then
  echo "What?"
else
echo "No, 20 is greater than 10."
fi</pre><p>في هذا المثال نتحقّق من شرط “20 أصغر من 10”، في حال كان صحيحًا نطبع كلمة “?What”، أمّا إذا لم يكن صحيحًا فنطبع عبارة “No, 20 is greater than 10.” (أي لا، 20 أكبر من 10).</p><p>يُمكن، إلى جانب العبارات المنطقيّة، مفارنة سلسلة محارف ضمن تعليمة <code>if/else</code>. تتطلّب مقارنة المحارف صيغةً مختلفة قليلًا عن مقارنة الأعداد، ولكنّها تسخدم أمر <code>test</code> أيضًا. في ما يلي صيغة مقارنة سلسلة محارِف:</p><ul><li>string = string: تكون العبارة صحيحة عندما تكون السّلسلتان متساويّتيْن</li><li>string != string: تكون العبارة صحيحة عندما <strong>لا تكون</strong> السّلسلتان متساويّتيْن.</li><li>string: سلسلة غير خاويّة أو غير معرَّفة</li><li>n string-: سلسلة معرَّفة وغير خاويّة</li><li>z string-: سلسلة معرَّفة وغير خاويّة</li></ul><p>توجد أيضًا طُرُق لاختبار خصائص الملفّات:</p><ul><li>s file-: تكون العبارة صحيحة إذا كان الملفّ file غير فارغ.</li><li>f file-: عبارة صحيحة إذا كان الملفّ file موجودًا وليس</li><li>d folder-: العبارة صحيحة إذا كان folder مجلّدًا وليس ملفًّا.</li><li>w file-: عبارة صحيحة إذا كان يُمكن الكتابة في الملف file</li><li>r file-: يتحقّق الشّرط عندما يكون الملفّ file للقراءة فقط.</li><li>x file-: تختبر هل الملفّ قابل للتّنفيذ.</li></ul><h3 id="3-تعليمات-if-متداخلة-nested-ifs">3- تعليمات if متداخلة Nested if’s</h3><p>يُمكن كتابة تعليمة <code>if</code> كاملة ضمن تعليمة <code>if</code> أخرى، في ما يُعرف بتعليمات <code>if</code> متداخلة. نتعرّف على عمل بتعليمات <code>if</code> المتداخلة في المثال التّالي بالاستعانة بأمر <code>read</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/bash
echo "Input which file you want created"
read file
if [ -f $file ]
then
echo "The file already exists"
else
  touch $file
  if [ -w $file ]
  then
    echo "The file was created and is writable"
  else
    echo "The file was created but isn't writable"
  fi
fi</pre><p>يطلُبُ السكربت من المستخدِم إدخال اسم ملفّ ليُنشئه، ويخزّن اسم الملفّ في المتغيّر <code>file</code>؛ ثمّ يختبر إن كان الملفّ موجودًا <code>f $file-</code>، ويُظهر رسالة بذلك إن كانت نتيجة التّحقّق إيجابيّة وإلّا يُنشئ الملفّ (<code>touch $file</code>). بعد إنشاء الملفّ يختبر هل يُمكن الكتابة عليه (<code>w $file-</code>) وإذا كانت الإجابة نعم يطبع الرّسالة <code>The file was created and is writable</code> وإلّا يطبع رسالة مغايِرة <code>The file was created but isn't writable</code>.</p><h3 id="4-مثال-على-سكربت-1">4- مثال على سكربت</h3><p>نُكمل مع سكربت النّسخ الاحتيّاطي لتحسينه. تتضمّن هذه النّسخة اختبارًا لمعرفة ما إذا كان مجلّد النّسخ موجودًا (<code>d $BACKUPFOLDER-</code>) وما إذا كان لدى المستخدِم امتيّاز Privilege إنشاء مجلّد. نبدأ بإنشاء السّكربت وإعداده:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">touch ~/bin/filebackup3
chmod +x ~/bin/filebackup3
nano ~/bin/filebackup3</pre><p>ثمّ تحريره:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">#!/bin/bash
#Backup script 3.0
#Description: makes a copy of any given file at the backup folder
#Author: Your Name
#Date: 9/29/2013
#Request the backup folder from the user:
echo -e "\e[47m\e[1m\e[32mFile Backup Utility\n\e[39m\e[0m\e[47mPlease input your backup folder:"
read BACKUPFOLDER
#The script will make sure the folder exists
if [ -d $BACKUPFOLDER ]
then
  echo "You backup folder exists and will be used."
else
  mkdir $BACKUPFOLDER
  if [ -d $BACKUPFOLDER ]
  then
    echo "Backup folder created successfully."
  else
    echo -e "I do not have the rights to create your backup folder.\nThis script will now exit."
    exit 1
 #exit 1 is a command that exits the script with an error code
  fi
fi
#Request files to be backed up:
echo -e "\e[30mWhich files do you want backed up?\e[39m\e[49m"
read FILES
if [ -n $FILES ]
then
  cp -a $FILES $BACKUPFOLDER
else
  echo "File does not exist."
fi</pre><p>لاحِظ أمر <code>exit</code> الّذي يُستخدَم لإيقاف السّكربت مع رمز خطأ. يعرض السّكربت رسالة عندما لا يوجد مجلّد للنّسخ الاحتيّاطيّ، عند إنشائه، إن لم يكن بالإمكان إنشاؤه، وعند كتابة سلسلة محارف خاويّة لأسماء الملفّات.</p><h2 id="خاتمة">خاتمة</h2><p>يضع هذا الدّرس اللّبنات الأساسيّة الّتي تمكّن من كتابة سكربتات <code>Shell</code> يُمكن للمستخدِم التّفاعل معها. لا زال هناك الكثير لتعلّمه من أجل كتابة برامج <code>Shell</code> بإمكانيّات أكبر وحلول أكثر إبداعًا، إلّا أنّ إتقان المحتوى الموجود هنا خطوة أولى في الطّريق.</p><p>ترجمة بتصرّف لسلسلة مقالات  <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorial_series/an-introduction-to-shell-scripting"> An Introduction to Shell Scripting</a></p>
]]></description><guid isPermaLink="false">56</guid><pubDate>Fri, 29 May 2015 02:18:03 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x641;&#x647;&#x645; &#x647;&#x64A;&#x643;&#x644;&#x64A;&#x629; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%81%D9%87%D9%85-%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%86%D9%83%D8%B3-r53/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/linux-file-system.png.758c2707a586f6db644870c04cf233ac.png" /></p>

<div id="wmd-preview-section-36"><p dir="rtl">إذا كنت جديدا على أنظمة تشغيل لينكس ويونكس، فإن الطرق الأساسية للتفاعل والتنقل داخل نظام التشغيل الخاص بك يمكن أن تبدو معقدة ومربكة، في نفس النطاق يجب على المستخدمين الجدد أن يكافحوا لمعرفة كيفية استيساغ الطريقة التي تم بها هيكلة نظام الملفات.</p><p dir="rtl">في هذه المقالة، سوف نناقش مختلف أجزاء نظام ملفات لينكس القياسي، سوف نستعرض بعض المجلدات (directories) الأكثر إثارة للاهتمام، ونبحث عن المكونات المختلفة في بيئة الخادم الخاص بك.</p><p dir="rtl">لغرض الشرح والتوضيح، سوف نستخدم توزيعة Ubuntu، لأن توزيعات لينكس الأخرى تقوم بتنفيذ الأشياء بطرق مختلفة قليلا، وإذا لاحظت تعارض مع النظام الخاص بك، راجع توثيق التوزيعة الخاصة بك.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_05/linux-file-system.png.4a69f137482e72cbd8c20cfd41bee3a7.png"><img data-fileid="2117" class="ipsImage ipsImage_thumbnailed" alt="linux-file-system.thumb.png.d5e1080ccf73" src="https://academy.hsoub.com/uploads/monthly_2015_05/linux-file-system.thumb.png.d5e1080ccf73e23a1848d23668765506.png"></a></p><h2 dir="rtl">بعض الملاحظات المختصرة عن تاريخ هيكلية نظام الملفات في لينكس</h2><p dir="rtl">يرث لينكس الكثير من المفاهيم لتنظيم الملفات من أسلافه من أنظمة Unix، الذي يعود إلى عام 1979، وقد وضع يونكس معاييرًا للتحكم في كيفية تنظيم ملفات المستخدمين.</p><p dir="rtl">معيار هيكلية نظام الملفات FHS هو معيار توجيهي تحتفظ به مؤسسة لينكس ويحدد هيكلية الملفات التي يجدر بمختلف توزيعات لينكس أن تتبعها، وذلك لتسهيل الإدارة والحفاظ على طريقة توزيع/تثبيت موحّدة وآمنة للتطبيقات على مختلف التوزيعات.</p><p dir="rtl">شيء واحد يجب ذكره عند التعامل مع هذه الأنظمة، هو أن كل شيء في لينكس هو ملف، فالملف النصي (Text file) ملف، والمجلد ملف أيضا (عبارة عن مجرد قائمة من الملفات الأخرى)، والطابعة تُمَثَّل في النظام عن طريق ملف (يمكن لبرنامج تشغيل الطابعة أن يرسل أي شيء مكتوب إلى ملف الطابعة ثم إلى الطابعة الفعلية)، وهكذا...</p><p dir="rtl">في هذه المقالة، لن نذكر كافة التفاصيل والمواصفات بالضبط، لأن التوزيعات تبتعد عن المستوى القياسي غالباً، لذلك سوف نستخدم توزيعة Ubuntu لإيجاد بنية المجلد الفعلية، حيث أنها التوزيعة الأسهل والأكثر انتشارًا بين مستخدمي لينكس المتوسطين.</p><h2 dir="rtl">لمحة بسيطة</h2><p dir="rtl">قبل الخوض في هيكلية نظام الملفات، تحتاج إلى معرفة بعض الأساسيات حول كيفية التعامل مع نظام الملفات والأوامر، ونحن سوف نغطي الحد الأدنى هنا لتستطيع البدء لوحدك.</p><p dir="rtl"><strong>ملاحظة:</strong> وجود علامة <span style="font-family:courier new,courier,monospace;">$</span> يعني أن هذا أمر يمكنك كتابته على سطر الأوامر، وما يتبعه من الأسطر الخالية من علامة <span style="font-family:courier new,courier,monospace;">$</span> هو ناتج الأمر السابق.</p><h3 dir="rtl">توجيه نفسك</h3><p dir="rtl">أول شيء عليك القيام به هو معرفة التعامل مع نظام الملفات، هناك عدد قليل من الطرق للقيام بذلك، ومن أبسط الطرق هي طباعة مجلد العمل:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ pwd
/root</pre><p dir="rtl">هذا ببساطة يعود لمكان كتابة الأمر نفسه، أي المجلد الذي أنت به، سوف نتعلم كيفية تفسير النتائج لاحقا.</p><h3 dir="rtl">انظر حولك</h3><p dir="rtl">لمعرفة ما هي الملفات الموجودة في المجلد الحالي، يمكنك تطبيق الأمر ls، ,وهو اختصار قائمة "List":</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ ls

bin etc lib mnt root selinux tmp vmlinuz
boot home lost+found opt run srv usr
dev initrd.img media proc sbin sys var</pre><p dir="rtl">هذا الأمر يوضّح كل الامتدادات والملفات في المجلد الحالي.</p><p dir="rtl">الأمر <span style="font-family:courier new,courier,monospace;">ls</span> يمكن أن يأخد بعض الخيارات، وهذه الخيارات تُعدّل على سلوك الأمر الافتراضي إما لعملية أخرى أو عرض البيانات بطريقة مختلفة.</p><p dir="rtl">على سبيل المثال، إذا أردنا أن نفرق بسهولة بين الملفات والمجلدات، وذلك بإضافة "<span style="font-family:courier new,courier,monospace;">/</span>"  بعد مخرجات المجلد، يمكنك تمرير الخيار <span style="font-family:courier new,courier,monospace;">F-</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">$ ls –F

bin/ home/ media/ root/ srv/ var/
boot/ initrd.img@ mnt/ run/ sys/ vmlinuz@
dev/ lib/ opt/ sbin/ tmp/
etc/ lost+found/ proc/ selinux/ usr/</pre><p>ومن أكثر الخيارات شيوعا هي <span style="font-family:courier new,courier,monospace;">l-</span> و<span style="font-family:courier new,courier,monospace;">a-</span>، فالأمر الأول يقوم بإخراج المعلومات الناتجة بشكل طويل ومفصل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">$ ls –l

total 76
drwxr-xr-x 2 root root 4096 Apr 26 2012 bin
drwxr-xr-x 3 root root 4096 Apr 26 2012 boot
drwxr-xr-x 13 root root 3900 Dec 4 18:03 dev
drwxr-xr-x 78 root root 4096 Dec 4 19:29 etc
drwxr-xr-x 3 root root 4096 Dec 4 19:28 home
lrwxrwxrwx 1 root root 33 Apr 26 2012 initrd.img -&gt; /boot/initrd.img-3.2.0-24-virtual
drwxr-xr-x 16 root root 4096 Apr 26 2012 lib
...</pre><p dir="rtl">ينتج سطر واحد لكل ملف واحد أو مجلد (الاسم في أقصى اليمين). ويكون لديه الكثير من المعلومات التي لانهتم بها في الوقت الحالي، جزء واحد مهتمون به حاليا هو الذي يوضح لنا ما هو نوع الملف. هناك 3 أنواع ملفات (الأكثر شيوعا):</p><ol dir="rtl"><li>ملف عادي.</li><li>ملف مجلد (ملف من صيغة محددة يحتوي ملفات أخرى).</li><li>ملف ارتباط حقيقي أو وهمي (hard link, soft link وكلاهما اختصار لملف آخر على النظام).</li></ol><p dir="rtl">أما الخيار <span style="font-family:courier new,courier,monospace;">a-</span> يستعرض كل الملفات بما فيها الملفات المخفية، وفي لينكس، يتم إخفاء الملفات تلقائيا إذا بدأ الاسم بنقطة (.) dot:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ ls -a
.  ..  bash_logout  .bashrc  .profile</pre><p dir="rtl">في هذا المثال، كافة الملفات مخفية، أول مخرجين <span style="font-family:courier new,courier,monospace;">.</span> و<span style="font-family:courier new,courier,monospace;">..</span> عبارة عن مجلدات خاصة. فالمجلد <span style="font-family:courier new,courier,monospace;">"."</span> هو اختصار يعني "المجلد الحالي"، والمجلد<span style="font-family:courier new,courier,monospace;">".."</span> أيضا اختصار يعني "المجلد الأب للمجلد الحالي"، سوف نتعلم لاحقا بعض الطرق للاستفادة منها.</p><h3 dir="rtl">جولة</h3><p dir="rtl">الآن يمكنك معرفة أين أنت في نظام الملفات وترى ما يدور حولك، حان الوقت لمعرفة كيفية التعامل مع نظام الملفات.</p><p dir="rtl">للتغيير إلى مجلد مختلف، استخدم الأمر <span style="font-family:courier new,courier,monospace;">cd</span>، (اختصار <strong>C</strong>hange <strong>D</strong>irectory) والذي يقوم بتغيير المجلد:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ cd /bin</pre><p dir="rtl">يمكنك التعامل مع الأمر بمسار كامل أو مسار نسبي. حيث:</p><ul dir="rtl"><li><strong>المسار الكامل (Full path):</strong> هو مسار الملف الذي يحدد مكان وجود المجلد من على قمة شجرة المجلد الجذر (سنشرح ذلك لاحقا)، تبدأ المسارات الكاملة بـ <span style="font-family:courier new,courier,monospace;">"/"</span>، كما ترون أعلاه.</li><li><strong>المسار النسبي (Relative path):</strong> هو مسار الملف نسبةً إلى مجلد العمل الحالي، هذا يعني أنه بدلا من تحديد مكان من الجزء العلوي من المجلد، فإنه يمكن تحديد المكان بالنسبة لمجلد العمل المتواجد به أنت حاليا.</li></ul><p dir="rtl">على سبيل المثال، إذا كنت ترغب في الانتقال إلى مجلد ضمن المجلد الحالي يدعى documents، يمكنك استخدام هذا الأمر:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ cd documents</pre><p dir="rtl">عدم وجود <span style="font-family:courier new,courier,monospace;">"/"</span> من البداية تدفعك لاستخدام المجلد الحالي كأساس لتبحث عن مسار المجلد الهدف.</p><p dir="rtl">للانتقال إلى المجلد الأصل من المجلد الحالي الخاص بك، يمكنك كتابة، حيث -كما تم الإشارة إليه مسبقا- فـ <span style="font-family:courier new,courier,monospace;">".."</span> تعني المجلد الأب للمجلد الحالي:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ cd ..</pre><h2>نظرة عامة على هيكلية نظام الملفات في اللنكس</h2><p dir="rtl">أول شيء تحتاج إلى معرفته عند عرض نظام الملفات في لينكس هو أن نظام الملفات يحتوي على شجرة واحدة، بغض النظر عن عدد الأجهزة المرتبطة به.</p><p dir="rtl">ما يعنيه هذا هو أن جميع المكونات لديك في نظام التشغيل ممثلة في مكان ما في نظام الملفات الرئيسي، اذا كنت تستخدم Windows كنظام أساسي لديك، هذا يختلف عن ما كنت تستخدمه، حيث في Windows كل قرص صلب أو مساحة التخزين والملفات لها تمثيل خاص في نظام الملفات، التي تكون مسماة بالأحرف كـ <span style="font-family:courier new,courier,monospace;">C</span> مثلا، وهو كناية عن مستوى عالي من التسلسل الهرمي في نظام الملفات، الأقراص الإضافية أو مساحات تخزين تعطى أحرف تسمية أخرى.</p><p dir="rtl"><span style="font-family: 'courier new', courier, monospace; line-height: 22.3999996185303px;">"/" </span>في لينكس، تعني أنه كل ملف أو جهاز على النظام موجود تحت " الجذر" (root)، فهو يرمز لنقطة بداية شجرة الملفات.</p><p dir="rtl"><strong>ملاحظة</strong>: هذا يختلف عن المستخدم الإداري الافتراضي، وهو ما يسمى أيضا "الجذر" (root). وهو يختلف أيضا من المجلد الرئيسي للمستخدم الإداري الافتراضي، والذي يقع في <span style="font-family:courier new,courier,monospace;">"root/"</span>.</p><p dir="rtl">وبالتالي، إذا كنا نريد أن نذهب إلى المستوى الأعلى من المجلد داخل نظام التشغيل ونرى ما هناك، يمكن أن نكتب:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">$ cd /
$ ls

bin etc lib mnt root selinux tmp vmlinuz
boot home lost+found opt run srv usr
dev initrd.img media proc sbin sys var</pre><p dir="rtl">كل ملف، جهاز، مجلد، أو تطبيق فهو يقع تحت مجلد واحد، ويمكننا أن نرى بداية بنية المجلد، سنذهب إلى المزيد من التفاصيل أدناه:</p><h3>bin<span style="line-height: 22.3999996185303px;">/</span></h3><p dir="rtl">يحتوي هذا المجلد على الأوامر والبرامج الأساسية اللازمة لتحقيق بيئة عمل الحد الأدنى، يتم الاحتفاظ بها منفصلة عن بعض البرامج الأخرى على النظام للسماح لك لتشغيل النظام للصيانة حتى لو أجزاء أخرى من نظام الملفات قد تكون معطوبا أو غير متوفر.</p><p dir="rtl">إذا كنت تبحث في هذا المجلد، وسوف تجد أن كل LS, pwd الموجودة هنا ، والأمر cd مبنى بداخل الشل (shell) التي نستخدم باش (bash)، كما أنها موجودة في هذا المجلد.</p><h3>boot/</h3><p dir="rtl">هذا المجلد يحتوي على الملفات الفعلية، والصور، والنواة(Kernel) اللازمة لتشغيل النظام، وعلى العناصر الأساسية التي تسمح فعليا للنظام بالإقلاع، في حين /bin يحتوي على الأساسيات.</p><p dir="rtl">إذا كنت بحاجة إلى تعديل ملف الإقلاع في النظام الخاص بك، أو إذا كنت ترغب في رؤية الملفات النواة (Kernel) و(ramdisk)، يمكنك العثور عليها هنا، يجب أن يصل هذا المجلد إلى النظام في وقت مبكر جداً.</p><h3>dev/</h3><p dir="rtl">يشمل المجلد الملفات التي تمثل أجهزة القرص الصلب والأجهزة الطرفية وأجهزة الإدخال والاخراج المتوفرة في النظام، وبالاعتماد على كل جهاز تستطيع تشغيل الأجهزة بطرق مختلفة.</p><p dir="rtl">على سبيل المثال، الجهاز الذي يمثل القرص الصلب /dev/sda تستطيع أن ترفعه من الملف الى مركز النظام وبالمقابل لوكان لديك ملف يمثل رابط الطابعة /dev/lpr فبإمكانك كتابته مباشرة ليرسل المعلومات الى الطابعة.</p><h3>etc/</h3><p dir="rtl">تعتبر احدى مناطق نظام الملفات التي تستهلك الكثير من الوقت والعمل اذا استخدمتها كمدير للنظام.</p><p dir="rtl">هذا المجلد معد خصيصا لنظام الخدمات المتعددة واسعة المجال، اذا كان المجلد يتكون من عدة ملفات فرعية فهو يحتوي عدة ملفات معدة لأكثر الانشطة على النظام، بغض النظر عن وظيفة تلك الأنشطة.</p><p dir="rtl">في حال الحاجة إلى الملفات متعددة الإعدادات فانه يتم انشاء التطبيق الفرعي الخاص لجلب هذه الملفات ،اذا حاولت أن تعد جهاز أو برنامج للنظام المدخل فان /etc هي المكان الانسب لذلك.</p><h3>home/</h3><p dir="rtl">يحتوي هذا المجلد على جميع المجلدات الرئيسية لكافة مستخدمي النظام ( باستثناء المستخدم الجذر)، اذا أنشأت مستخدمين جدد فسيقوم المجلد بمقارنتها مع الاسماء الموجودة لديه سابقا حتى لا يحدث تعارض في أسماء المستخدمين.</p><p dir="rtl">في داخل كل مجلد رئيسي يرتبط كل مستخدم بالصلاحية المخصصة له، فالمستخدم العادي له صلاحية على المجلد الرئيسي الذي يمتلكه مما يعمل على حفظ نظام الملفات خالية من التغييرات التي قد يقوم بها أشخاص غير مخولين.</p><p dir="rtl">غالبا ما يوجد مجلدات ملفات مخفية داخل المجلد الرئيسي (ممثلة بنقطة البداية)، والتي تسمح للمستخدم بالقيام بإعدادات خاصة للقوائم</p><p dir="rtl">تستطيع غالبا انشاء نظام فرضيات في مجلد /etc يمكن أن يتجاوزها المستخدم في مجلده الرئيسي للضرورة.</p><h3>lib/</h3><p dir="rtl">يستخدم هذا المجلد لجميع المكتبات نظام المشتركة التي تطلب من المجلداتbin /،sbin/ ، هذه الملفات تزود البرامج بالوظائف الأساسية داخل النظام، وهي إحدى المجلدات التي لن تستطيع الوصول اليها أحيانا.</p><h3>lost+found/</h3><p dir="rtl">المجلد الخاص الذي يحتوي على الملفات المسترجعة /fsck، إذا كان نظام الملفات معطوب أو يتم استرجاعه حاليا، فإن نظام الملفات في اللنكس يقوم بإصلاح البرامج، وأحيانا يتم العثور على الملفات ولكن يتم فقدان الموقع الخاص بها، في هذه الحالة، سيقوم النظام بوضعها في هذا المجلد.</p><p dir="rtl">في معظم الحالات، يبقى هذا المجلد فارغ، وإذا وجدت ملفات معطوبة أو أي مشاكل أخرى مشابهة، تقوم بإجراء عملية الاسترجاع ، ويجب عليك التحقق من الموقع عند الانتهاء من عملية الاسترجاع.</p><h3>media/</h3><p dir="rtl">هذا المجلد يكون فارغ في عملية الإقلاع، والغرض الحقيقي ببساطة هو تزويد موقع لتحميل الوسائط القابلة للإزالة مثل الأقراص المدمجة(CDs). في بيئة الخادم، وغالبا لن يتم استخدامها في بيئة الخوادم، ولكن إذا كان نظام التشغيل لنكس الخاص بك يقبل تحميل وسائط قابلة للإزالة وانت لست متأكد منها، يمكنك اللجوء لهذه الطريقة الآمنة.</p><h3>mnt/</h3><p dir="rtl">هذا المجلد يشبه المجلد السابق، وعادة ما يستخدم هذا المجلد لتحميل نظام الملفات مثل الأقراص الصلبة الخارجية، الخ.</p><p dir="rtl">وكثيرا ما يستخدم هذا المجلد في بيئة VPS لتركيب محركات أقراص الشبكة، إذا كان لديك نظام ملفات على خادم بعيد وترغب في تركيب نظام شبكة عليه فمن الجيد استخدام هذا المجلد لعمل ذلك.</p><h3>opt/</h3><p dir="rtl">استخدام هذا المجلد هو غامض إلى حد ما، ويتم استخدامه من قبل بعض التوزيعات وبعضها تتجاهله، وعادة يتم استخدامه لتخزين حزم اختيارية، وتعني في اللنكس الحزم والتطبيقات التي لم يتم تثبيتها من المستودعات.</p><p dir="rtl">على سبيل المثال، إذا كان التوزيع يوفر عادة حزم من خلال مدير الحزم، ولكن قمت بتثبيت برنامج X من المصدر، فإن هذا المجلد سيكون موقعا جيدا لهذا البرنامج، هناك خيار أكثر شيوعا لبرامج من هذا النوع موجود في المجلد المحلي /usr/local.</p><h3>proc/</h3><p dir="rtl">هو أكثر من مجرد مجلد منتظم، يشبه نظام الملفات التي تكون موجودة في المجلد، لا يحتوي ملفات حقيقية، ولكنه يستبدل بشكل تلقائي ليعكس الحالة الداخلية للنواة (Kernel) في اللنكس.</p><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> هذا يعني أننا نقوم بالتحقق وتعديل معلومات مختلفة من نواة اللنكس نفسها (Kernel)، على سبيل المثال، يمكنك الحصول على معلومات مفصلة حول استخدام الذاكرة عن طريق كتابة cat /proc/meminfo.</p><h3>root/</h3><p dir="rtl">هو المجلد الرئيسي للمستخدم المدير (ويسمى "الجذر"). وهو يعمل تماما مثل المجلدات الرئيسية العادية.</p><h3>run/</h3><p dir="rtl">هذا المجلد هو نظام التشغيل لكتابة معلومات مؤقتة أثناء التشغيل خلال المراحل الأولى من عملية الإقلاع، بشكل عام، ويجب أن لا تقلق كثيراً بشأن المعلومات الواردة في هذا المجلد.</p><h3>sbin/</h3><p dir="rtl">هذا المجلد هو اشبه ما يكون للمجلد /bin لأنه يحتوي على البرامج التي تعتبر أساسية لنظام التشغيل، وهو عادة يحتوي على الأوامر المتوفرة لمسؤول النظام، بينما مجلد آخر يحتوي على برامج لجميع المستخدمين للنظام.</p><h3>selinux/</h3><p dir="rtl">هذا المجلد يحتوي على المعلومات التي لها علاقة بأمن نظام التشغيل، وهو وحدة النواة(Kernel) التي يتم استخدامها لتوفير التحكم في الوصول إلى نظام التشغيل.</p><h3>srv/</h3><p dir="rtl">يحتوي هذا المجلد على بيانات عن الخدمات المقدمة من قبل الكمبيوتر، في معظم الحالات، لا يتم استخدام هذا المجلد كثيرا لأن وظائفه يمكن تنفيذها في أي مكان آخر في نظام الملفات.</p><h3>tmp/</h3><p dir="rtl">هذا هو المجلد الذي يستخدم لتخزين الملفات المؤقتة على النظام، هو قابل للكتابة من قبل أي شخص على الكمبيوتر و لا وتبقى فعالة حتى إعادة التشغيل، وهذا يعني أن أي الملفات التي تحتاج فقط للقليل من العمل يمكن وضعها هنا، سيتم حذفها تلقائيا بمجرد إيقاف تشغيل النظام.</p><h3>usr/</h3><p dir="rtl">هذا المجلد هو واحد من أكبر المجلدات على النظام، وتشمل في الأساس مجموعة من المجلدات التي تبدو مشابهة لتلك الموجودة في مجلد الجذر</p><p dir="rtl">مثل //usr,/bin ,/usr/,lib تستخدم هذا الموقع أساسا لتخزين كافة البرامج غير الضرورية والتوثيق والمكتبات، وغيرها من البيانات الخاصة بهم غير المطلوب من أجل استخدام الحد الأدنى من النظام.</p><p dir="rtl">هذا هو المكان الذي سيتم تخزين معظم الملفات على النظام، بعض المجلدات الفرعية الهامة هي /usr/local، وهو يعتبر بديل إلى المجلد /opt لتخزين البرامج المترجمة محليا، شيئ آخر مثير للاهتمام هو التحقق من /usr/share directory، والذي يحتوي على وثائق وملفات وملفات الاعدادت، وملفات أخرى مفيدة.</p><h3>var/</h3><p dir="rtl">يفترض في هذا المجلد احتواء البيانات المتغيرة، في الممارسة العملية، وهذا يعني أنه يستخدم لتخزين معلومات أو مجلدات والتي من المتوقع أن تنمو مع استخدام النظام.</p><p dir="rtl">على سبيل المثال، توجد سجلات النظام والنسخ الاحتياطي، وهناك استخدام شائع لهذا المجلد هو تخزين محتوى الويب إذا كنت تعمل على خادم للويب.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">على الرغم من أن التفاصيل التي تخزن فيها الأشياء تختلف من توزيعة إلى أخرى إلا أن المواقع التي تمت مناقشتها سترشدك إلى الاتجاه الصحيح.</p><p dir="rtl">وإن من افضل الطرق لاكتشاف نظام الملفات هي طريقة اجتياز الاتجاهات المتعددة من أجل محاولة معرفة وظيفة ما بداخل الملفات .</p><p dir="rtl">سيكون بإمكانك ربط المجلدات المختلفة بوظائف مختلفة وتستطيع أن تقرر أين ستذهب لإنجاز مهمة معينة.</p><p dir="rtl">اذا كنت تريد مرجعاً سريعاً يخبرك بوظيفة كل مجلد فيمكنك استخدام المجلد الداخلي اليدوي للصفحات وذلك بكتابة الأمر التالي :</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">man hier</pre><p dir="rtl">هذا سيعطيك فكرة عامة عن نظام الملفات النموذجية والوظائف المتعلقة بكل موقع.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-understand-the-filesystem-layout-in-a-linux-vps">How To Understand the Filesystem Layout in a Linux VPS</a>.</p></div>
]]></description><guid isPermaLink="false">53</guid><pubDate>Sat, 23 May 2015 15:37:28 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x650;&#x645; Rsync &#x644;&#x645;&#x632;&#x627;&#x645;&#x646;&#x629; &#x645;&#x62C;&#x644;&#x651;&#x62F;&#x627;&#x62A; &#x628;&#x64A;&#x646; &#x627;&#x644;&#x62C;&#x647;&#x627;&#x632; &#x627;&#x644;&#x645;&#x62D;&#x644;&#x651;&#x64A; &#x648;&#x627;&#x644;&#x62E;&#x627;&#x62F;&#x648;&#x645;</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%90%D9%85-rsync-%D9%84%D9%85%D8%B2%D8%A7%D9%85%D9%86%D8%A9-%D9%85%D8%AC%D9%84%D9%91%D8%AF%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AC%D9%87%D8%A7%D8%B2-%D8%A7%D9%84%D9%85%D8%AD%D9%84%D9%91%D9%8A-%D9%88%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-r50/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/rsync_480x300.jpg.a5a1e71086d02d0fa6f1ddbbd97f5439.jpg" /></p>

<h2 id="مقدمة">مقدّمة</h2><p>تُستخدم أداة <code>Rsync</code> - الّتي يأتي اسمها اختصارًا ل”مزامنة عن بُعد” (Remote synchronization) - لمزامنة ملفّات على الجهاز المحلّي وأخرى على الخادوم. تعتمد أداة <code>rsync</code> على خوارزميّة Algorithm تُقلِّل من حجم البيانات المُتبادَلة بين الطّرفين بنقل الأجزاء الّتي حَدَث فيها تغيير فقط، دون غيرها.</p><p>سنغطّي في هذا الدّليل أساسيّات استخدام هذه الأداة الفعَّالة. اعتمدنا للشّرح على خادوم Ubuntu 14.04؛ ولكن يجدُر بالأمثلة المقدَّمة هنا العمل على أيّ توزيعة لينوكس حديثة.</p><h2 id="ماهي-أداة-rsync">ماهيّ أداة Rsync؟</h2><p>أداة <code>Rsync</code> هيّ وسيلة مرنة للمزامنة عبر الشّبكة. يُمكن أن يُحيل الاسمُ أيضًا إلى البروتوكول المُطوَّر لاستخدام هذه الأداة. نتحدّث في هذا الدّليل عن <code>Rsync</code> الأداة وليس البروتوكول.</p><p>تُضمَّن أداة <code>rsync</code> افتراضيًّا في أغلب توزيعات لينوكس؛ نظرًا لشعبيّتها وانتشار استخدامها على الأنظمة الشبيهة بيونكس Unix-like.</p><h2 id="الصيغة-القاعدية-ﻷمر-rsync">الصّيغة القاعديّة ﻷمر rsync</h2><p>من اليسير تنفيذ أمر <code>rsync</code> فهو يعمل كما تعمل أوامر <code>scp</code>، <code>ssh</code> و<code>cp</code>.</p><p>سننشئ، من أجل تجربة عمل <code>rsync</code>، مجلّديْن وبعض الملفّات؛ عبر الأوامر التّاليّة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">cd ~
mkdir dir1
mkdir dir2
touch dir1/file{1..100}</pre><p>يُصبِح لدينا بعد تنفيذ هذه الأوامر مجلّدان، <code>dir1</code> و<code>dir2</code>؛ الأوّل يحوي 100 ملفّ فارغة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">ls dir1</pre><p>محتوى المجلّد <code>dir1</code>:</p><p> </p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99</pre><p>لمزامنة محتوى المجلَّديْن <code>dir1</code> و<code>dir2</code> الموجوديْن على نفس النّظام، ننفّذ الأمر:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -r dir1/ dir2</pre><p>خيّار <code>r-</code> يعني Recursive، أيّ تكراريّ؛ وهو ضروريّ لمزامنة المجلّدات.</p><p>يوجد أيضًا خيّار بديل هو <code>a-</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a dir1/ dir2</pre><p>خيّار <code>a-</code>، الّذي يعني archive، هو في الواقع تجميع لخيّاريْن؛ إذ يُزامن المجلّدات (عمل <code>r-</code>) ويُحافِظ على الوصلات الرّمزيّة Symbolic links، ملفّات الأجهزة المُلحَقة Devices والملفّات الخاصّة، تاريخ التّعديل، المجموعة، المالِك والأذون Permissions. يُستخدم خيّار <code>a-</code> أكثر من خيّار <code>r-</code>؛ وربّما يكون الأنسب لك.</p><h3 id="1-ملحوظة-مهمة-للغاية">1- ملحوظة مهمّة للغاية</h3><p>ربّما لاحظت شَرْطة مائلة Slash زائدة في نهاية المُعطى الأوّل في الأوامر أعلاه، مثلًا بعد <code>dir1</code> في الأمر التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a dir1/ dir2</pre><p>هذه الشَّرطة ضروريّة عندما نُريد نقل “محتوى المجلّد <code>dir1</code>“. لو لم نستخدِم الشَّرطة في نهاية اسم المجلَّد فإنّ <code>rsync</code> ستنقل المجلّد <code>dir1</code> ومحتواه داخل <code>dir2</code>. سينتُج إذن مجلّدات تكون بنيتُها على النّحول التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">~/dir2/dir1/[files]</pre><p>تأكّد دائمًا من معطيات <code>rsync</code> قبل تنفيذ الأمر.</p><p>تُوفّر <code>rsync</code> طريقة للتحقّق عند تمرير خيّار <code>n-</code> أو <code>dry-run--</code>، الّذي يُحاكي عمل الأمر دون إجراء التّغييرات فعليًّا. خيّار <code>v-</code> (أي Verbose، مُطنِب) ضروريّ أيضًا للحصول على المُخرجات المُناسبة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -anv dir1/ dir2</pre><p>مثال على النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .</pre><p>قارِن مُخرجات الأمر أعلاه، مع مخرجات الأمر عند حذف الشَّرطة المائلة من نهاية اسم المجلّد الأوّل:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -anv dir1 dir2</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .</pre><p>يُمكن ملاحظة أنّه في الحالة الأخيرة يُنقَل المجلَّد <code>dir1</code> نفسه. انتبه إلى أنّ الأوامر الأخيرة لا تُزامِن المجلّدات إذ أنّ هذه الأوامر محاكاة ولا تُنفَّذ فعليًّا نظرًا لاستخدام خيّار <code>n-</code>.</p><h2 id="كيف-تستخدم-rsync-للمزامنة-عن-بعد-مع-خادوم">كيف تستخدم Rsync للمزامنة عن بعد مع خادوم</h2><p>يُمكن - بيُسر - مزامنة الملفّات عن بعد مع خادوم إذا كانت لديك إمكانيّة الولوج عبر <code>SSH</code> مع وجود <code>rsync</code> على الجهازيْن المحلّي والبعيد. إذا أردت إعداد مفاتيح SSH، ف<a rel="external nofollow" href="https://www.digitalocean.com/community/articles/how-to-set-up-ssh-keys--2">الدّرس التّالي</a> يشرح كيف يكون ذلك.</p><p>تستطيع، بعد التّأكّد من إمكانيّة الاتّصال بين الجهازَين عبر <code>SSH</code>، مزامنةَ المجلَّد <code>dir1</code> أعلاه بجهاز بعيد عن طريق الأمر التّالي (يُرجى ملاحظة عدم استخدام الشّرطة المائلة في آخر اسم المجلَّد، إذ أنّنا نُريد نقل المجلَّد نفسِه):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a ~/dir1 username@remote_host:destination_directory</pre><p>حيثُ <code>username</code> اسم المستخدِم على الخادوم، <code>remote_host</code> عنوان الخادوم، و<code>destination_directory</code> مسار المجلَّد الوجهة. تُسمَّى هذه العمليّة بالدّفع Push؛ إذ تدفع بالمجلّد من الجهاز المحلّي إلى الجهاز البعيد.</p><p>تُسمَّى العمليّة المُعاكسة بالسّحب Pull؛ وتُستخدَم لمزامنة مجلَّد على جهاز بعيد مع النّظام المحلّي. إن كان المجلَّد <code>dir1</code> موجودًا على الجهاز البعيد فالأمر المُستخدَم لمزامنته مع الجهاز المحلّي هو:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine</pre><p>حيث <code>place_to_sync_on_local_machine</code> مكان المزامنة على الجهاز المحلّي، و<code>home/username/dir1/</code> مسار المجلَّد <code>dir1</code> على الجهاز البعيد.</p><p>المُعطى الأوّل في أمر <code>rsync</code> - مثل <code>cp</code> والأوامر المُشابهة - يُمثّل دائمًا المصدَر (Source)، بينما يُمثِّل المُعطى الثّاني الوجهة (Destination).</p><h2 id="خيارات-مفيدة-للاستخدام-في-rsync">خيّارات مفيدة للاستخدام في Rsync</h2><p>تُتيح Rsync خيّارات عديدة للتّعديل على السّلوك الافتراضيّ للأداة. تطرّقنا في الفقرات السّابقة لأكثرها ضرورة.</p><h3 id="1-خيار-z">1- خيّار z-</h3><p>إذا كنت تنقل ملفّات لم تُضغَط بعد، مثل ملفّات نصيّة، يُمكنك تقليل تبادل البيانات عبر الشّبكة بتفعيل ضغط الملفّات Compression عن طريق خيّار <code>z-</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -az source destination</pre><h3 id="2-خيار-p">2- خيّار P-</h3><p>خيّار مهمّ آخر هو <code>P-</code>. حيثُ يجمع بين عمل خيّاريْن آخريْن هما <code>progress--</code> و<code>partial--</code>. يعرِض الأوّل شريطًا بتقدّم عمليّات النّقل، أمّا الثّاني فيسمح باستكمال نقل الملفّ بعد انقطاعه:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -azP source destination</pre><p>مثال على النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sending incremental file list
./
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file100
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101)
file11
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101)
…</pre><p>إذا أعدنا تنفيذ الأمر مرةً أخرى سنلاحِظ مخرجاتٍ أقلّ نتيجةً لعدم وجود تغييرات على الملفّات. يُوضِّح هذا المثال قابليّة <code>rsync</code> لاستخدام تاريخ التّعديل لتحديد وجود تعديلات من عدمها.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -azP source destination</pre><p> </p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sending incremental file list

sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00</pre><p>نُحدِّث تاريخ تعديل بعض هذه الملفّات ونلاحِظ أنّ <code>rsync</code> تنقل فقط الملفّات الّتي عُدِّل عليها:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">touch dir1/file{1..10}
rsync -azP source destination</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sending incremental file list
file1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
file10
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
file2
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101)
file3
           0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101)
. . .</pre><h3 id="3-خيار-delete">3- خيّار delete–</h3><p>لا يحذف الإعداد الافتراضيّ ل<code>rsync</code> ملفّات من الوِجهة عند حذفها من المصدَر، إذا أردنا مزامنة مجلَّدين بحيث يتطابق محتواهما فمن الضّروريّ حذف هذه الملفّات. يوجد خيّار <code>delete--</code> للتّعديل عل هذا السّلوك. من الجيّد - احترازًا - استخدام خيّار <code>dry-run--</code> لاختبار الأمر والتّأكّد من عدم ضياع ملفّات.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a --delete source destination</pre><h3 id="4-خيارا-exclude-وinclude">4- خيّارا exclude– وinclude–</h3><p>يوجد أيضًا خيّار <code>exclude--</code> لاستبعاد ملفّات أو مجلّدات من المزامنة. يُفرَّق بين الملفّات أو المجلّدات بفاصلة (,):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a --exclude=pattern_to_exclude source destination</pre><p>في المثال أعلاه <code>pattern_to_exclude</code> هو نمط تتبعه الملفّات المُراد استبعادها من المزامنة. مثلًا لاستبعاد صور ذات لاحقة <code>jpg</code> يكون النّمط <code>jpg.*</code>.</p><p>يوجد كذلك خيّار <code>include</code> لإدراج بعض الملفّات أو المجلّدات الّتي ينطبق عليها نمط الاستبعاد، لإدراجها في المزامنة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination</pre><h2 id="خاتمة">خاتمة</h2><p>تُسهِّل أداة Rsync نقل الملفّات عبر الشّبكة وتُحسّن من جودة مزامنة المجلّدات الموجودة على الجهاز المحلّي. تجعل المزامنة من Rsync خيّارًا جدًّا لكثير من العمليّات على مستوى الملفّات.</p><p>يسمح لك إتقان التّعامل مع <code>rsync</code> بتصميم عمليّات نسخ احتيّاطيّ Backup والتحكّم الدّقيق بما يُنقَل وكيف.</p><p>ترجمة بتصرّف لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps">How To Use Rsync to Sync Local and Remote Directories on a VPS</a> لصاحبه <a rel="external nofollow" href="https://www.digitalocean.com/community/users/jellingwood">Justin Ellingwood</a>.</p>
]]></description><guid isPermaLink="false">50</guid><pubDate>Fri, 15 May 2015 01:37:29 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x64F;&#x62D;&#x631;&#x651;&#x650;&#x631; &#x645;&#x644;&#x641;&#x651; Sudoers &#x639;&#x644;&#x649; Ubuntu &#x648;CentOS</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%AD%D8%B1%D9%91%D9%90%D8%B1-%D9%85%D9%84%D9%81%D9%91-sudoers-%D8%B9%D9%84%D9%89-ubuntu-%D9%88centos-r45/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/linux-sudoers_(1).png.8c7ae9aab33e5c471b7814e08b0279d1.png" /></p>

<p id="مقدمة">يُمثِّل الفصل بين الامتيّازات Privileges أحد المبادئ الأمنيّة الأساسيّة المُدرجَة في Linux والأنظمة الشّبيهة بيونكس Unix-like. تجسيدًا لهذا المبدأ يعمل المسخدمون العاديّون بامتيّازات محدودة لحدّ دائرة تأثيرهم على بيئتهم الخاصّة وليس على كامل نظام التّشغيل. يوجد مستخدم خاصّ يُسمّى المستخدم الجذر <code>root user</code> ويملك امتيّازات “المستخدم الأعلى”. حساب المستخدم الجذر هو حساب إداريّ لا توجد عليه القيود الموجودة على المستخدمين العاديّين. يُمكن للمستخدمين العاديّين تنفيذ أوامر بامتيّازات المستخدم الأعلى (المستخدم الجذر) بطرق مختلفة.</p><p>سنناقش في هذا الدّليل الطّريقة الصّحيحة والآمنة للحصول على امتيّازات المستخدم الجذر، مع التّركيز على ملفّ <code>etc/sudoers/</code>. سنطبّق الخطوات المشروحة هنا على خادوم Ubuntu 14.04؛ يجب أن تكون هذه الخطوات صالحة لأغلب توزيعات لينوكس الحديثة.</p><p>نفترض في هذا الدّرس، أنّك أكملت خطوات درس <a href="http://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الإعداد الابتدائي لخادوم أوبنتو</a>.سجِّل الدّخول إلى خادوم أوبنتو بحساب مستخدم عادي (غير المستخدم الجذر).</p><h2>كيف يمكن الحصول على امتيّازات المستخدم الجذر</h2><p>توجد ثلاث طرق للحصول على امتيّازات المستخدم الجذر، تختلف في مستوى صعوبتها.</p><h3>1- تسجيل الدّخول بحساب المستخدم الجذر</h3><p>أسهل طريقة وأكثرها مباشرة للحصول على امتيّازات <code>root</code> هيّ تسجيل الدّخول بدْءًا بحساب المستخدم الجذر. يكون تسجيل الدّخول عن بعد عبر <code>SSH</code> على النّحو التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">ssh root@your_IP_address_or_domain</pre><p>حيث <code>your_IP_address_or_domain</code> يمثّل عنوان IP العموميّ للخادوم أو نطاق الموقع. سيُطلب منك إدخال كلمة السّر قبل الولوج.</p><h3 id="الانتقال-إلى-حساب-المستخدم-الجذر-عن-طريق-su">2- الانتقال إلى حساب المستخدم الجذر عن طريق “su”</h3><p>لا يُنصَح بتسجيل الدّخول إلى الخادوم بحساب المستخدم الجذر؛ إذ قد يؤدّي ذلك إلى استخدام مُدير النّظام (<code>root</code>) في مهامّ غير إداريّة، وهو أمر خطير أمنيًّا. الطّريقة الثّانيّة تسمح بالحصول على امتيّازات المستخدم الجذر في أيّ وقت، حال الحاجة إليها. يؤدّي أمر <code>su</code>، وهو اختصار ل<code>substitute user</code> (أي “غيّر المستخدم”)، هذه المهمّة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">su</pre><p>سيُطلب منك إدخال كلمة سرّ حساب المستخدم الجذر، ثمّ تنتقل بعدها إلى جلسة <code>Shell</code> خاصّة بالمستخدم الأعلى. للخروج من جلسة المستخدم الجذر، بعد الانتهاء من أداء المهامّ الّتي تتطلّب امتيّازات إداريّة، نفّذ الأمر التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">exit</pre><h3 id="استخدام-sudo-لتنفيذ-الأوامر-بحساب-المستخدم-الجذر">3- استخدام “Sudo” لتنفيذ الأوامر بحساب المستخدم الجذر</h3><p>الطّريقة الأخيرة، والأكثر تعقيدًا للحصول على امتيّازات <code>root</code> هيّ استخدام أمر <code>sudo</code>. يسمح أمر <code>sudo</code> بتنفيذ أمر واحد بامتيّازات <code>root</code>، دون الحاجة لإنشاء جلسة <code>Shell</code> جديدة. تُنفَّذ الأوامر على النّحو التّالي (تُمثِّل <code>command_to_execute</code> الأمر المُراد تنفيذه بامتيّازات المستخدم الجذر):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo command_to_execute</pre><p>على عكس <code>su</code>، يطلب أمر <code>sudo</code> كلمة سرّ المستخدِم الّذي يُنفّذ الأمر وليس كلمة سرّ حساب المستخدِم الجذر.</p><p>لا يعمل أمر <code>sudo</code> افتراضيًّا، نظرًا لتداعيّاته الأمنيّة، ويجب أن يُضبَط قبل أن يؤدّي وظائفه. إذا كنت تابعت خطوات درس <a href="http://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الإعداد الابتدائي لخادوم أوبنتو</a> فقد أكملت الإعدادات الأساسيّة لضبط مستخدم بامتيّازات الجذر.</p><p>سنناقش في الفقرة التّاليّة كيفيّة ضبط الإعداد بتفصيل أكثر.</p><h2 id="ماهو-visudo">ماهو Visudo؟</h2><p>يُضبَط أمر <code>sudo</code> عبر ملفّ يُتَوَّصل إليه عبر المسار <code>etc/sudoers/</code>.</p><p><em>ملحوظة:</em> <strong>لاتحرّر أبدًا</strong> هذا الملفّ بمحرّر نصوص عاديّ. استخدِم دائمًا أمر <code>visudo</code> لهذا الغرض.</p><p>من المهمّ جدًّا استخدام أمر <code>sudo</code> لتحرير ملفّ <code>sudoers</code>، إذ يمكن أن يؤدّي استعمال صيغة خاطئة في هذا الملفّ إلى جعل نظام التشغيل في وضع لا يصحّ معه الحصول على امتيّازات إداريّة.</p><p>يعرض أمر <code>visudo</code> محرّر نصوص شبيهًا بالمحرّرات العاديّة، ولكنّه يُضيف آليّة للتحقّق من صيغة التّعليمات الموجودة في الملفّ؛ تعمل عند محاولة الحفظ. تحول هذه الآليّة دون وجود أخطاء تمنع عمليّات <code>sudo</code>.</p><p><em>ملحوظة:</em> استخدِم الزرّيْن <code>CTRL</code> و<code>O</code> معًا لحفظ الملفّ ثمّ <code>Enter</code> للتّأكيد. للخروج اضغط زرّيْ <code>CTRL</code> و<code>X</code>.</p><p>تاريخيًَا، كان أمر <code>visudo</code> يفتح ملفّ <code>etc/sudoers/</code> في محرّر <code>vi</code> للنّصوص (اسم الأمر <code>visudo</code> هو مزيج من <code>vi</code> و<code>sudo</code>)، إلّا أنّه في أوبنتو مُعَدّ لاستخدام محرّر <code>nano</code>. في حال أردت العودة لاستخدام <code>vi</code> لتحرير ملفّ <code>sudoers</code> فالأمر التّالي يؤدّي هذه المهمّة</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo update-alternatives --config editor</pre><p>مثال على النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">There are 3 choices for the alternative editor (providing /usr/bin/editor).
    
      Selection    Path                Priority   Status
    ------------------------------------------------------------
    * 0            /bin/nano            40        auto mode
      1            /bin/nano            40        manual mode
      2            /usr/bin/vim.basic   30        manual mode
      3            /usr/bin/vim.tiny    10        manual mode</pre><p>اختر العدد الموافق للمحرّر الّذي تريد اختيّاره.</p><p>على <code>CentOS</code>، يمكن تغيير هذه القيمة بالتّعديل على السّطر التّالي، الموجود في ملفّ <code>bashrc./~</code> (تمثّل <code>/path/to/editor</code> المسار إلى المحرّر المطلوب):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">export EDITOR=/path/to/editor</pre><p>لأخذ التّغييرات في الحسبان، نفِّذ الأمر:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">~/.bashrc</pre><p>نفّذ الأمر التّالي، بعد الانتهاء من ضبط <code>visudo</code>، للوصول إلى ملفّ <code>etc/sudoers/</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo visudo</pre><h2 id="كيف-تحرر-ملف-sudoers">كيف تحرّر ملفّ Sudoers</h2><p>سيظهر - بعد تنفيذ أمر <code>visudo</code> - ملفّ <code>sudoers</code> في محرّر النّصوص.</p><p>أدناه ملفّ <code>sudoers</code> في أوبنتو 14.04 بعد حذف التّعليقات (يتضمّن الإعدادات الّتي ضبطناها في درس <a href="http://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%B6%D9%8A%D9%81-%D8%A3%D9%88-%D8%AA%D8%AD%D8%B0%D9%81-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ubuntu-1404-r44/">كيف تُضيف أو تحذف المستخدمين على خادوم أوبنتو 14.04</a>).</p><p>في CentOS يحوي الملفّ أسطرًا أكثر؛ لن نناقشَها كلَّها في هذا الدّليل.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

root    ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL</pre><p>فلنلقِ نظرة على عمل هذه الأسطر.</p><h3 id="أسطر-defaults">1- أسطر Defaults</h3><p>السّطر الأوّل <code>Defaults env_reset</code> يُعيد تعيين بيئة عمل الطّرفيّة من أجل حذف المتغيّرات الخاصّة بالمستخدمين من بيئة العمل. هذا الإجراء احترازيّ لمسح متغيّرات قد تكون مضرّة من جلسة <code>sudo</code>، Sudo session. تعليمة <code>Defaults mail_badpass</code> تطلب إرسال بريد إلى عنوان إلكتروني تُحدّده تعليمة أخرى (<code>mailto</code>) عندما يُدخل مستخدم كلمة سرّ خاطئة أثناء تنفيذ أمر <code>sudo</code>. هذه التّعليمة مُعطَّلة افتراضيًّا. أمّا التّعليمة الّتي تبدأ ب <code>=Defaults secure_path</code> فتحدّد المسارات Paths الآمنة الّتي سيُبحَث فيها عن أمر <code>sudo</code>. يحول هذا الإجراء دون استخدام مسارات قد تحوي برامج ضارّة.</p><h3 id="أسطر-امتيازات-المستخدم">2- أسطر امتيّازات المستخدم</h3><p>يتعلّق السّطر الرّابع بالامتيّازات الّتي ينالها المستخدم عند تنفيذه أمر <code>sudo</code>.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">root  ALL=(ALL:ALL) ALL</pre><p>يُشير الحقل الأوّل من السّطر إلى المستخدِم الّذي تنطبق عليه التّعليمة (المستخدِم الجذر في هذه الحالة).</p><ul><li>قيمة الحقل التّالي (<code>ALL</code>) تُشير إلى أنّ القاعدة تُطبَّق على جميع المستضيفات Hosts.</li><li>الحقل الثّالث يُعيّن المستخدمين الّذين يُمكن للمستخدم المحدّد في الحقل الأوّل من السّطر (<code>root</code> في هذه الحالة) تنفيذُ أوامر بامتيّازاتهم. قيمة <code>ALL</code> تعني “كلّ المستخدمين”.</li><li>الحقل الرّابع يُعيّن مجموعات المستخدمين Groups الّتي يُمكن للمستخدم المحدّد في الحقل الأوّل من السّطر (<code>root</code> في هذه الحالة) تنفيذُ أوامر بامتيّازاتهم. قيمة <code>ALL</code> هنا تعني “كلّ المجموعات”.</li><li>الحقل الأخير يُشير إلى الأوامر الّتي ينال المستخدم المحدّد في الحقل الأوّل من السّطر امتيّاز تنفيذها بامتيّازات إداريّة. قيمة <code>ALL</code> هنا تعني “جميع الأوامر”.</li></ul><p>يُمكن تفسير السّطر على النّحو التّالي: لدى المستخدم <code>root</code> امتيّاز تنفيذ <code>sudo</code> على أي أمر بشرط تقديمه لكلمته للسّر.</p><h3 id="أسطر-امتيازات-مجموعات-المستخدمين">3- أسطر امتيّازات مجموعات المستخدمين</h3><p>يُشبه السّطران الأخيران سطرَ امتيّازات المستخدِم، لكنّها تحدّد امتيّازات مجموعة من المستخدمين. تُشير الكلمات الّتي تسبقها علامة <code>%</code> إلى أسماء مجموعات مستخدمين. نلاحِظ أن مجموعة المستخدمين <code>admin</code> يُمكنها تنفيذ أيّ أمر بامتيّازات أي مستخدم على جميع المستضيفات؛ أمّا مجموعة <code>admin</code> فلديها، زيّادةً على امتيّازات مجموعة <code>admin</code>، إمكانيّة تنفيذ أوامر بامتيّازات أي مجموعة مستخدمين.</p><h2 id="كيف-تضبط-قواعد-مخصصة">كيف تضبُط قواعد مخصَّصة</h2><p>نتناول، بعد التّعرف على الصّيغة العامة لقواعد ملفّ <code>sudoers</code>، في هذه الفقرة طريقة إنشاء قواعد جديدة.</p><h3 id="كيف-تنشئ-كنى-aliases">1- كيف تُنشئ كِنى Aliases</h3><p>يُمكن تنظيم ملفّ <code>sudoers</code> عن طريق تجميع بعض التّعليمات بواسطة كِنى مختلفة. يُنشئ المثال التّالي ثلاث مجموعات مستخدمين (تعليمة <code>User_Alias</code>)، بعضويّات متداخلة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">User_Alias      GROUPONE = abby, brent, carl
User_Alias      GROUPTWO = brent, doris, eric, 
User_Alias      GROUPTHREE = doris, felicia, grant</pre><p>يجب أن يبدأ اسم المجموعة بحرف كبير Capital letter.</p><p>يُمكننا الآن إنشاء قاعدة في ملفّ <code>sudoers</code> تسمح لأعضاء المجموعة <code>GROUPTWO</code> تحديث قاعدة بيانات <code>apt-get</code> :</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">GROUPTWO    ALL = /usr/bin/apt-get update</pre><p>إن لم نُحدّد مستخدمًا أو مجموعة مستخدمين يُنفّذ بامتيّازاتها الأمر، فإن <code>sudo</code> تأخذ المستخدم الجذر <code>root</code> لتنفيذ الأوامر باسمه.</p><p>في المثال أدناه نمنح أعضاء <code>GROUPTHREE</code> صلاحيّة إيقاف وإعادة تشغيل الجهاز؛ عبر إنشاء “كنية أوامر” Command alias (تعليمة <code>Cmnd_Alias</code>) واستخدامها في قاعدة للمجموعة <code>GROUPTHREE</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER</pre><p>أنشأنا في السّطر الأوّل كنية باسم <code>POWER</code> تحوي أوامر لإيقاف وإعادة تشغيل الجهاز. ثمّ نعطي لأعضاء المجموعة <code>GROUPTHREE</code> امتيّاز تنفيذ هذه الأوامر.</p><p>توجد أيضًا إمكانيّة إنشاء كنية بأسماء مستخدمين لتنفيذ الأوامر بامتيّازاتهم (<code>Runas_Alias</code>)، ثمّ إبدال جزء القاعدة الّذي يحدّد المستخدم الّذي لديه صلاحيّة تنفيذ الأمر بكنية أسماء المستخدمين.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL</pre><p>في المثال السّابق، أنشأنا كنية <code>WEB</code> لتنفيذ أوامر بامتيّازات <code>www-data</code> أو <code>apache</code>؛ ثمّ قاعدة تسمح لكلّ عضو في <code>GROUPONE</code> بتنفيذ أوامر بامتيّازات العضوَيْن المذكورَيْن.</p><p>يجب الانتباه إلى أنّه في حال وجود تناقض بين قاعدتَيْن في ملفّ <code>sudoers</code> فإنّ القاعدة الأخيرة هيّ الّتي ستُطبَّق.</p><h3 id="كيف-تؤمن-القواعد">2- كيف تؤمِّن القواعد</h3><p>توجد طرُق عدّة لتمكين تحكّم أكبر حول كيفيّة تفاعل <code>sudo</code> مع المستخدم.</p><p>إذا أردنا مثلًا السّماح للمستخدمين بتنفيذ أمر <code>updatedb</code>، وهو أمر آمِن نسبيًّا، بامتيّازات المستخدم الجذر دون الحاجة لإدخال كلمة سرّ <code>root</code> فالقاعدة التّاليّة تؤدّي هذه المهمّة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb</pre><p>يظهر في القاعدة أعلاه وسم tag هو <code>NOPASSWD</code> والّذي يعني أنّه لن يُطلَب من المستخدم إدخال كلمة سرّ <code>root</code>. يوجد وسم آخر مصاحِب هو <code>PASSWD</code> (سلوك افتراضيّ) والّذي يطلُب إدخال كلمة السّر. ينطبق الوسم على بقيّة القاعدة ما لم يُذكر توءَمُه بعده. يُمكِن أن نجد قاعدةً على الشّكل التّالي مثلًا:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill</pre><p>يوجد وسم آخر مهمّ هو <code>NOEXEC</code> والّذي يُستخدم لمنع السّلوك غير الآمن لبعض البرامج. على سبيل المثال؛ تسمح بعض البرامج، مثل <code>less</code>، بتنفيذ أوامر أخرى داخل واجهتها:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">less file</pre><p>حيثُ <code>file</code> اسم ملفّ يُنفَّذ عليه أمر <code>less</code>. الآن يُمكن تنفيذ أمر بنفس الصّلاحيّات الّتي نفّذنا بها <code>less</code> على النّحو التّالي (حيثُ <code>command_to_run</code> اسم أمر):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">!command_to_run</pre><p>لمنع هذا الأمر من الحصول، يُمكن كتابة قاعدة كالتّالية:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">username    ALL = NOEXEC: /usr/bin/less</pre><h2 id="معلومات-متفرقة">معلومات متفرّقة</h2><p>نعرض في هذه الفقرة لمعلومات إضافيّة مفيدة عند التّعامل مع أمر <code>sudo</code>.</p><p>إذا حدّدت مستخدمين، أو مجموعة مستخدمين، لتنفيذ أوامر بامتيّازاتهم عبر تعليمة <code>Runas_Alias</code> في ملفّ الإعداد؛ فيُمكنك تنفيذ أوامر بامتيّازات هؤلاء المستخدمين عن طريق خيّار <code>u-</code> أو <code>g-</code> على التّوالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo -u run_as_user command
sudo -g run_as_group command</pre><p>حيثُ <code>run_as_user</code> و<code>run_as_group</code> اسم المستخدم أو مجموعة المستخدمين على التّوالي، و <code>command</code> الأمر المُراد تنفيذه.</p><p>يحفظ أمر <code>sudo</code> بعد استخدامه تفاصيلَ الاستيثاق Authentication (كلمة السّرّ) في الطّرفيّة الّتي نُفِّذ فيها لفترة من الوقت. يعني هذا أنّك لن تحتاج لإعادة كتابة كلمة السّرّ في كلّ مرّة تستخدم فيها <code>sudo</code>، ما لم تنقضِ فترة الحفظ. إن أردت تصفير المؤقّت، لأغراض أمنيّة مثلًا، نفّذ الأمر التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo -k</pre><p>إذا رغبت في معرفة الامتيّازات المُعيَّنة للحساب الّذي تستخدمه فخيّار <code>l-</code> يعطيك هذه المعلومة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo -l</pre><p>سيعرض الأمر قائمة بالقواعد الّتي تعني حساب المستخدم ضمن ملفّ <code>etc/sudoers/</code>، وهو ما يُعطي فكرة جيّدة عن المسموح وغير المسموح به لمستخدم عند تنفيذ <code>sudo</code>.</p><p>يحدُث أن تنسى كتابة <code>sudo</code> أمام أمر تريد تنفيذه بامتيّازات إداريّة، ممّا يؤدّي إلى فشل الأمر. يوجد الاختصار التّالي لتفادي كتابة الأمر مجدّدًا:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo !!</pre><p>علامة التّعجّب مرّتين تعني “أعد تنفيذ الأمر الأخير”، وبما أنّها مسبوقة ب <code>sudo</code> فالأمر يُصبح “أعد تنفيذ الأمر الأخير بامتيّازات إداريّة”.</p><p>إذا كنت تتمتّع بحسّ الفكاهة فيُمكنك إضافة تعليمة <code>Defaults insults</code> إلى ملفّ <code>sudoers</code>؛ عمل هذه التّعليمة يتلخّص في كتابة تقريع (بالإنجليزيّة) عندما يُخطئ المستخدم في كلمة السرّ عند تنفيذ أوامر ب<code>sudo</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo visudo</pre><p>أضف التّعليمة التّاليّة بعد تعليمات <code>Defaults</code> الأخرى:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">Defaults    insults</pre><p>لتجربة الإعداد الأخير، نمسح كلمة السّرّ المحفوظة حتّى نتأكّد من أنّ <code>sudo</code> سيطلُب إدخال كلمة السّرّ:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo -k</pre><p>ثمّ ننفّذ الأمر التّالي، ونكتب كلمة سرّ خاطئة في المرّة الأولى:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo ls</pre><p>مثال على النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">[sudo] password for demo:    # أدخِل  كلمة سرّ خاطئة
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo: 
My mind is going. I can feel it.</pre><h2 id="خاتمة">خاتمة</h2><p>يجب أن يكون لديك بعد إكمال هذا الدّرس فهمٌ جيّد لأساسيّات التّعامل مع ملفّ <code>sudoers</code> وطريقة قراءة وتعديل هذا الملفّ؛ إضافةً إلى معرفة طُرُق الحصول على امتيّازات إداريّة. تذكّر أنّه يوجد سبب لعدم منح امتيّازات المستخدم الأعلى للمستخدمين العاديّين؛ لذا من المهمّ جدًّا فهم آليّة عمل أيّ أمر قبل تنفيذه بامتيّازات <code>root</code>. لا تستهِر في التّعامل مع الصّلاحيّات الإداريّة، وتعلّم أفضل الطّرق لاستخدام هذه الأدوات لتلبيّة حاجاتك. احظُر أي ميزة لا ترى حاجة لاستخدامها.</p><p>ترجمة بتصرّف لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file-on-ubuntu-and-centos">How To Edit the Sudoers File on Ubuntu and CentOS</a> لصاحبه <a rel="external nofollow" href="https://www.digitalocean.com/community/users/jellingwood"> Justin Ellingwood.</a></p>
]]></description><guid isPermaLink="false">45</guid><pubDate>Sun, 17 May 2015 06:00:01 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x650;&#x645; &#x623;&#x645;&#x631;&#x64E;&#x64A; find &#x648; locate &#x644;&#x644;&#x628;&#x62D;&#x62B; &#x639;&#x646; &#x627;&#x644;&#x645;&#x644;&#x641;&#x651;&#x627;&#x62A; &#x639;&#x644;&#x649; Linux</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%90%D9%85-%D8%A3%D9%85%D8%B1%D9%8E%D9%8A-find-%D9%88-locate-%D9%84%D9%84%D8%A8%D8%AD%D8%AB-%D8%B9%D9%86-%D8%A7%D9%84%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-linux-r43/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/find-locate.png.7e15f8515136d0e5692b2da6133ae71d.png" /></p>

<p id="كيف-تستخدم-أمرى-find-وlocate-للبحث-عن-الملفات-على-خادوم-linux">يُواجه الكثير من مستخدمي Linux الجدُد مشكلة العثور على الملفّات الّتي يبحثون عنها على أجهزتهم. يَعرض هذا الدّرس لكيفيّة استخدام أمر <code>find</code>، ممّا يُساعد في البحث عن الملفّات على Linux عن طريق مُرْشِحات Filters ومُعاملات عدّة. سنتطرّق أيضًا لأمر <code>locate</code> وهو طريقة أخرى للبحث عن الملفّات.</p><h2 id="البحث-عن-ملف-باسمه">البحث عن ملفّ باسمه</h2><p>الطّريقة البديهيّة للبحث عن الملفّات هي استخدام أسمائها. للعثور على ملفّ باسمه أدخِل الأمر التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -name query
</pre><p>حيث <code>query</code> هي عبارة البحث، الّذي سيفرّق عند استخدام خيّار <code>name-</code> بين حالة الأحرف (كبيرة Upper case أو صغيرة Lower case). يعني هذا أنّ البحث عن <code>file</code> سيُعطي نتائج مختلفة عن البحث عن <code>File</code>.</p><p><strong>ملحوظة:</strong> عند عدم ذكر مجلّد للبحث فيه، فإنّ أمر <code>find</code> يبحث في مجلّد العمل.</p><p>للبحث عن ملفّ باسمه دون أخذ حالة الأحرف في الحسبان نستخدِم خيّار <code>iname-</code>.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -iname query</pre><p>إن كنت تريد العثور على كل الملفّات الّتي <strong>لا تُوافق</strong> نمطًا Pattern مُحدّدًا، يُمكنك عكس البحث باستخدام <code>!</code> أو <code>not-</code>. في حال استخدام <code>!</code> فيجب تخليصها Escape حتّى لا يُحاول سطرُ الأمر تفسيرها قبل بدْء عمل <code>find</code>.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -not -name query_to_avoid</pre><p>أو</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find \! -name query_to_avoid</pre><p>حيثُ <code>query_to_avoid</code> هي عبارة البحث الّتي نُريد تجنب وجودها في اسم الملفّ.</p><h2 id="العثور-على-ملف-بنوعه-type">العثور على ملفّ بنوعه Type</h2><p>توجد أيضًا إمكانيّة البحث عن ملفّات حسب نوعها. يُستخدَم خيّار <code>type-</code>. آليّة العمل هي كالتّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -type type_descriptor query</pre><p>حيث <code>type_descriptor</code> مُعطًى يصِف نوع الملفّ. يُمكن أن يأخذ هذا المُعطى القيّم التّاليّة:</p><ul><li><p>f: ملفّ عادي،</p></li><li><p>d: مُجلّد،</p></li><li><p>l: وصلة رمزيّة،</p></li><li><p>c: جهاز مِحرفي Character device،</p></li><li><p>b: جهاز كُتلي Block device.</p></li></ul><p>يبحث الأمر التّالي، مثلًا، عن كلّ الأجهزة المِحرفيّة الموجودة في النّظام:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -type c</pre><p>مثال على النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .
</pre><p>إذا أردنا البحث عن كلّ الملفّات ذات اللّاحقة <code>conf.</code> فيُمكننا ذلك باستخدام الأمر:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -type f -name *.conf</pre><p><strong>ملحوظة:</strong> في الأمر السّابق حدّدنا مكان البحث بالمجلّد الجذر <code>/</code>. إن أردنا أن يكون البحث مقتصِرًا على مجلّد معيَّن نُضيف مساره مباشرةً بعد الأمر.<br>النّتيجة:<code> </code></p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf
/usr/share/base-files/nsswitch.conf
/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf
/usr/share/rsyslog/50-default.conf
/usr/share/adduser/adduser.conf
/usr/share/davfs2/davfs2.conf
/usr/share/debconf/debconf.conf
/usr/share/doc/apt-utils/examples/apt-ftparchive.conf
. . .
</pre><h2 id="ترشيح-المخرجات-حسب-التاريخ-والحجم">ترشيح المُخرجات حسب التّاريخ والحجم</h2><p>يُتيح أمر <code>find</code> ترشيح النّتائج حسب التاريخ والحجم.</p><h3 id="الحجم">الحجم</h3><p>يُستخدَم خيّار <code>size-</code> لترشيح نتائج البحث حسب الحجم. نُضيف لاحقة للقيمة المعطاة لتحديد الوحدة المُستخدَمة. في ما يلي بعض الخيّارات المُنتشرة:</p><ul><li>c: بايت Byte،</li><li>k: كيلوبايت Kilobytes،</li><li>M: ميغابايت Megabytes،</li><li>G: غيغابايت Gigabytes،</li><li>b: كتلة بحجم 512 بايت.</li></ul><p>للبحث عن كلّ الملفّات ذات الحجم المُساوي ل50 بايت بالضّبط:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -size 50c</pre><p>للبحث عن الملفّات الّتي يقلّ حجمها عن 50 بايت نستخدم الصّيغة التّاليّة (لاحظ علامة <code>-</code> أمام <code>50c</code> ):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -size -50c</pre><p>بالنّسبة للملفّات ذات الحجم الأكبر من 700 ميغابايت فالأمر يكون على النّحو التّالي (لاحِظ علامة <code>+</code>):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -size +700M</pre><h3 id="التاريخ">التّاريخ</h3><p>يُخزِّن لينوكس بياناتٍ عن تواريخ الوصول Access time، تواريخ التّعديل Modification وتواريخ التّبديل Change:</p><ul><li><strong>تاريخ الوصول:</strong> آخر مرّة قُرئ من الملفّ أو كُتب فيه.</li><li><strong>تاريخ التّعديل:</strong> آخر مرّة عُدِّل فيها على محتوى الملفّ.</li><li><strong>تاريخ التّبديل:</strong> آخر مرّة غُيّرت فيها البيانات الوصفيّة Meta-data المُتعلّقة بوضع الملفّ ضمن نظام الملفّات.</li></ul><p>تُوفّر خيّارات <code>atime</code> ، <code>-mtime-</code>، و<code>ctime-</code> إمكانيّة ترشيح نتائج البحث حسب هذه التّواريخ. ولتحديدٍ أدقّ نستخدم علامتيْ <code>+</code> و<code>-</code> الّلتان تعنيان على التّوالي قبل وبعد. تُمثّل قيمة هذه المعطيات عدد الأيّام التي نُريد البحث فيها.</p><p>الأمر التّالي يبحث عن الملفّات الّتي عُدِّل على محتواها في آخر يوم:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -mtime 1</pre><p>إن أردنا البحث عن الملفّات المقروءة في مدّة أقلّ من يوم ننفّذ الأمر التّالي (الملفّات المقروءة منذ يوم بالضّبط لن تظهر في النّتائج):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -atime -1</pre><p>للبحث عن الملفّات الّتي غُيّر في بياناتها الوصفيّة قبل ثلاثة أيّام (الملفّات المُغيّر فيها قبل يوم أو اثنين لن تظهر في النّتائج):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -ctime +3</pre><p>توجد أيضًا خيّارات بديلة للبحث حسب الدّقائق وليس الأيّام:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -mmin -1</pre><p>يبحث الأمر أعلاه عن الملفّات الّتي عُدِّل على محتواها في آخر دقيقة.</p><p>يُمكِن أيضًا أخذُ ملفّ آخر مرجعًا للمقارنة على أساسه. الأمر التّالي يبحث عن الملفّات الأجدد (خيّار <code>newer-</code>) من ملف باسم myfile.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -newer myfile</pre><h2 id="البحث-عن-ملفات-باسم-المالك-والأذونات-permission">البحث عن ملفّات باسم المالِك والأذون Permission</h2><p>توجد أيضًا إمكانيّة البحث عن الملفّات باسم مالكها أو مجموعة المستخدِمين الّتي ينتمي إليها المالك عن طريق الخيّارين <code>user-</code> و<code>group-</code> على التّوالي.</p><p>الأمر التّالي يبحث عن الملفّات الّتي يملكهاالمستخدِم <code>syslog</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -user syslog</pre><p>بطريقة مُشابهة نبحث عن الملفّات الّتي ينتمي مالكها لمجموعة <code>shadow</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -group shadow</pre><p>بالنّسبة للبحث اعتمادًا على أذون الملفّات فالشّكل العام هوّ التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -perm 644</pre><p>يبحث الأمر أعلاه عن الملفّات الّتي ضُبِطت أذونها على <code>644</code>.</p><p>إن أردنا البحث عن الملفّات بأذون تشمل على الأقل الأذون السّابقة ننفّذ الأمر التّالي (لاحِظ علامة <code>-</code> أمام الأذون):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find / -perm -644</pre><p>سينتُج عن هذا الأمر عرضُ كلّ الملفّات الّتي لديها أذون <code>644</code> والملفّات ذات الأذون الإضافية. مثلًا، سيظهر ضمن النّتائج ملفّ بأذون <code>744</code>.</p><h2 id="ترشيح-المخرجات-حسب-الموقع-في-نظام-الملفات">ترشيح المُخرجات حسب الموقع في نظام الملفّات</h2><p>سننشئ في هذه الفقرة بنية مجلّدات ضمن مجلّد مؤقّت. ستشتمل هذه البنية على ثلاث مستويات، يوجد في المستوى الأوّل منها عشر مجلَّدات. سيحوي كلّ واحد من هذه المجلّدات (بما فيها المجلّد المؤقَّت الّذي سنسمّيه <code>test</code>) عشر ملفّات وعشر مجلّدات.</p><p>أنشِئ بنية الملفّات هذه بتنفيذ الأوامر التّاليّة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">cd
mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test</pre><p>يمكنك التّأكّد من بنية المجلّدات باستخدام أوامر <code>ls</code> و<code>cd</code>. تأكّد من العودة إلى المجلّد <code>test</code> قبل تنفيذ الأوامر المقبلة.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">cd ~/test</pre><p>سنعمل على الحصول على ملفّات محدّدَة ضمن ينسة الملفّات هذه. فلنبدأ عن ملفّ باسمه:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -name file1</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
./level1dir7/level2dir8/file1
. . .
</pre><p>توجد الكثير من النّتائج. فلنجرِّب عدَّ نتائج الأمر أعلاه:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -name file1 | wc -l</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">1111</pre><p>توجد - إذن - ملفّات عديدة. سنُحاول في ما يلي الاقتصار على بعضها.</p><p><br>يُحدّد الأمر التّالي المستوى الأعلى الّذي يصله الأمر بحثًا عن الملفّات، وذلك انطلاقًا من مجلّد البحث.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -maxdepth num -name query</pre><p>للبحث عن الملفّات باسم <code>file1</code> الموجودة فقط في المجلّدات الّتي تبدأ أسماؤها بـ<code>level1</code> يُمكن تحديد المستوى الثّاني بوصفه العمقَ الأقصى (مجلّد البحث هو المستوى الأوّل، <code>level1</code> هو المستوى الثّاني):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -maxdepth 2 -name file1</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1
</pre><p>قائمة أخفّ كثيرًا من قائمة الملفّات السّابقة.</p><p>يُمكِن أيضًا تحديد مستوى أدنى بحيثُ تُتَجاهل المجلّدات الموجودة في مستوى لا يصِل للمستوى الأدنى المُحدَّد.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -mindepth num -name query</pre><p>في المثال التّالي نبحث عن ملفّات باسم <code>file1</code> ضمن المستوى الرّابع وما يليه (المستوى الخامس، السّادس …إلخ). في بنية الملفّات الّتي أنشأناها يوجد آخر مجلّد ضمن المستوى الرّابع، وهو ما يعني أنّنا هنا نبحث عن ملفّات في المستوى الأخير من بنية المجلّدات المعنيّة.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -mindepth 4 -name file1</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .
</pre><p>حصلنا مجدّدًا على الكثير من الملفّات (1000).</p><p>يُمكن دمجُ خيّاريْ <code>mindepth-</code> و<code>maxdepth-</code> لحَصر النّتائج ضمن مستويات معيَّنة.<br>نحدّد في الأمر التّالي المستوى الأدنى <code>mindepth-</code> والمستوى الأقصى <code>mindepth-</code> للبحث عن الملفّات:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find -mindepth 2 -maxdepth 3 -name file1</pre><p>النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .</pre><p>تنفيذ وتجميع أوامر find</p><p>يُتيح أمر find إمكانيّة تنفيذ أوامر على نتائج البحث مباشرةً عن طريق مُعطَى <code>exec-</code>. آليّة العمل هي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find find_parameters -exec command_and_params {} \;</pre><p>حيثُ <code>find_parameters</code> تُمثّل خيّارات البحث و<code>command_and_params</code> الأمر المُراد تنفيذه على نتيجة البحث. علامة <code>{}</code> هي ماسك مكان Placeholder تحلّ محلَّ الملفّات المُطابقة لخيارات البحث. تُشير علامة <code>;\</code> إلى نهاية الأمر.</p><p>يُمكن، على سبيل المثال، البحثُ عن ملفّات المجلَّدات السّابقة الّتي لديها أذون <code>644</code> وتعديلها إلى <code>664</code>.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">cd ~/test
find . -perm 644 -exec chmod 664 {} \;</pre><p>الأمر التّالي يُعدِّل أذون مجلَّد العمل (يُشار إليه بنقطة <code>.</code>):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find . -perm 755 -exec chmod 700 {} \;</pre><p>إذا أردنا تجميع عدّة خيارات بحث فيُمكن استخدام أوامر <code>and</code> أو <code>or</code> لهذا الغرض. تعني <code>and</code> أنّ نتيجة البحث يجب أن تُطابق خيّارات البحث <strong>كلّها</strong>، أمّا <code>or</code> فتعني أنّ نتيجة البحث يكفي أن تُوافق <strong>أحد الخيارات</strong>. عند إضافة أكثر من خيار وعدم ذكر طريقة التّجميع (<code>and</code> أو <code>or</code>) فإنّ <code>find</code> تُطبّق <code>and</code> في هذه الحالة.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">find . -name file1 -or -name file9</pre><h2 id="البحث-عن-ملفات-باستخدام-locate">البحث عن ملفّات باستخدام locate</h2><p>أمر <code>Locate</code> هو طريقة بديلة وأسرع - في الغالب- للبحث عن الملفّات، حيثُ يمكنه البحث في كامل ملفّات النّظام بكلّ يُسر؛ إلّا أنّه يُقدِّم خيّارات أقّل من تلك الّتي يُوفّرها أمر <code>find</code>.</p><p>قدتحتاج لتثبيت حزمة <code>mlocate</code> من أجل استخدام أمر <code>locate</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo apt-get update
sudo apt-get install mlocate</pre><p>السّبب وراء كون <code>locate</code> أسرَع من <code>find</code> هوّ أنّه يعتمد على قاعدة بيانات تخزّن بيانات الملفّات الموجودة في النّظام.<br>تُحدَّث قاعدة البيانات هذه عادةً تلقائيًّا مرةً في اليوم، ولكن يُمكن أيضًا تحديثُها يدويًّا عن طريق الأمر<code>updatedb</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo updatedb</pre><p>نفِّذ هذا الأمر الآن وتذكّر أنّ قاعدة بيانات <code>locate</code> يجب أن تكون مُحدَّثَة حتى تضمن ظهور الملفّات المنشأة أو المنقولة حديثًا في نتائج البحث.<br>صيغة البحث عن ملفّات باستخدام <code>locate</code> هي التّاليّة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">locate query</pre><p>حيث <code>query</code> تُمثّل عبارة البحث.</p><p>يُتيح أمر <code>locate</code> إمكانيّة ترشيح نتائج البحث.<br>نستخدم خيّار <code>b-</code> سبيل المثال، للبحث عن الملفّات الّتي توجد عبارة البحث في أسمائها؛ بدلًا من البحث عن كلّ ملفّ توجد عبارة البحث في المسار المؤدّي إليه، الّذي هو الإعداد الافتراضي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">locate -b query</pre><p>يُعرَف اسم الملفّ بالاسم القاعدي Basename لتمييزه عن الاسم الكامل للملفّ الّذي يتضمّن مساره.</p><p>يوجد أيضًا خيّار <code>e-</code> لقصر نتائج البحث على الملفّات الموجودة فعلًا على النّظام؛ أي تلك الّتي لم تُحذَف منذ آخر تحديث لقاعدة البيانات عبر الأمر <code>updatedb</code>.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">locate -e query</pre><p>استخدِم خيار <code>S-</code> لعرض إحصاءات عن المعلومات الّتي تُخزّنها قاعدة بيانات <code>locate</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">locate -S</pre><p>مثال على النّتيجة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">Database /var/lib/mlocate/mlocate.db:
    3,315 directories
    37,228 files
    1,504,439 bytes in file names
    594,851 bytes used to store database</pre><h2 id="خاتمة">خاتمة</h2><p>يُعدّ أمرا <code>find</code> و<code>locate</code> طرقتيْن جيّدتَيْن للبحث عن الملفّات الموجودة على النِّظام. يرجع إليك قرار استخدام أيّ من الأداتيْن. يُمكن الرّفع من إمكانيّات الأداتيْن عبر تمرير مُخرجاتهما إلى أوامر أخرى مثل <code>sort</code> ،<code>wc</code> و<code>grep</code>.</p><p>ترجمة - وبتصرّف - لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-find-and-locate-to-search-for-files-on-a-linux-vps">How To Use Find and Locate to Search for Files on a Linux VPS</a>.</p>
]]></description><guid isPermaLink="false">43</guid><pubDate>Fri, 08 May 2015 15:42:19 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x64F;&#x636;&#x64A;&#x641; &#x623;&#x648; &#x62A;&#x62D;&#x630;&#x641; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x64A;&#x646; &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%B6%D9%8A%D9%81-%D8%A3%D9%88-%D8%AA%D8%AD%D8%B0%D9%81-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ubuntu-1404-r44/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/linux-add-user.png.50f142fb0e890ece7f3d3eccc3f33406.png" /></p>

<p id="كيف-تضيف-أو-تحذف-مستخدمين-على-خادوم-ubuntu-14.04">تُمثِّل إضافة وحذف المستخدمين واحدةً من المهمَّات الأساسيّة الّتي يتوجَّب على كلّ مسؤول خواديم معرفةُ كيفيّة إجرائها. يوجد، افتراضًا، عند إنشاء خادوم جديد حسابُ مستخدِم واحدٌ فقط هو المستخدِم الجذر Root.</p><p>يمنح حساب المستخدم الجذر الكثير من الإمكانيّات والمرونة، إلّا أنّه قد يكون في نفس الوقت مدمِّرًا وخطِرًا. من الجيّد في هذا الإطار إنشاء مستخدِم إضافيّ بامتيّازات Privileges محدودة لإجراء المهمّات الشّائعة. يجب أن تُنشئ حساباتٍ أخرى لكلّ شخص على نظامك بحيث يكون لدى كلّ مستخدم حساب مستقلّ، خاصّ به.</p><p>ستبقى لدى المستخدم، إذا رأى مُدير النّظام ذلك مناسِبًا، إمكانيّة الحصول على الامتيّازات الإداريّة عندما يحتاجها، عبر آليّة تُسمَّى <code>sudo</code>.</p><p>يشتمل هذا الدّليل على كيفيّة إنشاء حسابات للمستخدمين، منح امتيّازات <code>sudo</code>، وحذف المستخدمين.</p><h2 id="كيفية-إضافة-مستخدم">كيفيّة إضافة مستخدم</h2><p>يُمكنك، عند التّسجيل بحساب المستخدم الجذر <code>root</code>، إنشاءُ مستخدمين جدد عبر تنفيذ الأمر التّالي (<code>newuser</code> هوّ اسم المستخدم):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">adduser newuser</pre><p>في حال سجّلت الدّخول باسم مستخدم آخر، غير المستخدم الجذر، يملك امتيّازات <code>sudo</code>؛ أُنشِئ حسب الطّريقة المشروحة في درس <a href="http://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الإعداد الابتدائي لخادوم أوبنتو 14.04</a> فيُمكنك إضافة مستخدم جديد عبر تنفيذ الأمر:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo adduser newuser</pre><p>في كلتا الحالتيْن ستُطرَح عليك مجموعة من الأسئلة. تتلخّص العمليّة في ما يلي:</p><ul><li>تعيين ثمّ تأكيد كلمة سرّ المستخدم الجديد.</li><li>إدخال معلومات إضافيّة عن المستخدم الجديد. هذا الجزء اختيّاري ويُمكن تجاوزه بضغط زرّ Enter.</li><li>أخيرًا سيُطرح عليك سؤال للتأكّد من المعلومات المُعطاة؛ ضغط زرّ Y يعني الموافقة.</li></ul><p>يُصبح الحساب الجديد، بعد إتمام هذه الخطوات، جاهِزًا للاستخدام؛ ويُمكن الدّخول إليه باستخدام كلمة السّر المعيّنة.</p><p>في الفقرة التّاليّة سنشرح طريقة منح صلاحيّات إداريّة للمستخدم الجديد.</p><h2 id="منح-امتيازات-sudo-لمستخدم">منح امتيّازات Sudo لمستخدم</h2><p>إذا احتاج المستخدم الجديد لتنفيذ أوامر بامتيّازات إداريّة، فسيتوجّب علينا منحه امتيّاز الوصول إلى <code>sudo</code>. أمر <code>visudo</code> يؤدّي هذه المهمّة. يفتح <code>visudo</code> ملفّ الإعداد المناسب في المحرّر لديك. هذه هيّ الطّريقة الآمَن لإجراء هذه التّعديلات.</p><p>نفّذ الأمر على النّحو التّالي، إذا سجّلت الدّخول بالمستخدم الجذر:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">visudo</pre><p>وعلى النّحو التّالي إن كنت سجّلت الدّخول بمستخدم آخر لديه صلاحيّات <code>sudo</code>:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo visudo</pre><p>ابحث عن سطر يأخذ الشّكل التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">root    ALL=(ALL:ALL) ALL</pre><p>أضف أسفلَ هذا السّطر سطرًا جديدًا بنفس الصّيغة، مع إحلال اسم المستخدِم <code>newuser</code> مكان <code>root</code>. يُصبح الملفّ بالشّكل التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">root    ALL=(ALL:ALL) ALL
newuser ALL=(ALL:ALL) ALL</pre><p>يجب أن تضيف سطرًا جديدًا لكلّ مستخدم تُريد منحه كلّ صلاحيّات <code>sudo</code>. بعد الانتهاء من تحرير الملفّ يُمكنك حفظه ثم إغلاقه عبر الضّغط على زرّيْ CTRL وX في نفس الوقت. اضغط بعدها على زرّ Y ثمّ Enter للتّأكيد. يُمكن للمستخدم <code>newuser</code> الآن تنفيذ أوامر بصلاحيّات إداريّة.</p><p>تُنفَّذ الأوامر عند تسجيل الدّخول بالحساب الجديد بنفس طريقة تنفيذها عند تسجيل الدّخول بالمستخدم العاديّ؛ فقط يُكتب اسم الأمر، <code>ls</code> على سبيل المثال:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">ls</pre><p>تُضاف <code>sudo</code> أمام نفس الأمر لتنفيذه بصلاحيّات إداريّة:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo ls</pre><p>سيُطلب منك بعدها إدخال كلمة سرّ الحساب الّذي سجّلت به الدّخول.</p><h2>كيفيّة حذف مستخدم</h2><p>أحيانًا يُصبح وجود حساب مستخدِم غير ضروريّ؛ الأفضل في هذه الحالة حذف هذا الحساب. أمر <code>deluser</code> يحذف حساب المستخدم دون المساس بملفّاته. عند استخدام الحساب الجذر <code>root</code> (حيث <code>newuser</code> الحساب المُراد حذفُه):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">deluser newuser</pre><p>بالنّسبة لمستخدم آخر يملك امتيّازات <code>sudo</code> فإنّ الأمر يُصبح على النّحو التّالي:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo deluser newuser</pre><p>أمّا إذا كان الهدف حذف حساب المستخدم وحذف ملفّاته فيجب إضافة خيّار <code>remove-home--</code> فيُصبح :</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">deluser --remove-home newuser</pre><p>أو (عند استخدام حساب آخر غير <code>root</code>):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo deluser --remove-home newuser</pre><p>إذا كنت قد أعددت حساب المستخدم المحذوف ليحصُل على امتيّازات <code>sudo</code> فمن المستحسن تحرير ملفّ الإعداد مرةً أخرى وحذف السّطر الموافق لحساب المستخدم المعنيّ.</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">visudo</pre><p>أو (عند استخدام حساب آخر غير <code>root</code>):</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">sudo visudo</pre><p>يظهر ملفّ الإعداد:</p><pre class="html ipsCode prettyprint" data-pbcktabsize="4" data-pbcklang="html">root    ALL=(ALL:ALL) ALL
newuser ALL=(ALL:ALL) ALL   # احذف هذا السّطر</pre><p>سيمنع هذا الإجراء الاحترازيّ حصولَ حساب مستخدم يُنشأ مستقبلًا على امتيّازات <code>sudo</code> بطريقة غير مقصودة.</p><h2 id="خاتمة">خاتمة</h2><p>ينبغي أن تكون لديك الآن معرفة جيّدة بكيفيّة إضافة وحذف المستخدمين في أوبنتو 14.04. تُمكِّن الإدارة الفعّالة للمستخدمين من الفصل بين حسابات هؤلاء، فلا يُمنح المستخدم سوى الامتيّازات الّتي يحتاجها لأداء عمله. للمزيد حول إعداد <code>sudo</code> راجع <a href="http://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%AD%D8%B1%D9%91%D9%90%D8%B1-%D9%85%D9%84%D9%81%D9%91-sudoers-%D8%B9%D9%84%D9%89-ubuntu-%D9%88centos-r45/">دليل تحرير ملفّ sudoers</a></p><p>ترجمة بتصرّف لمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04-vps">How To Add and Delete Users on an Ubuntu 14.04 VPS</a></p>
]]></description><guid isPermaLink="false">44</guid><pubDate>Fri, 08 May 2015 16:41:02 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x645;&#x646;&#x635;&#x651;&#x629; Java &#x639;&#x644;&#x649;  Ubuntu</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%86%D8%B5%D9%91%D8%A9-java-%D8%B9%D9%84%D9%89-ubuntu-r49/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/java-for-ubuntu.png.e136bba61adbab4ef42885902094bb4f.png" /></p>

<p dir="rtl">بما أن العديد من الدروس المتعلقة بـِ Java وUbuntu تفترض وجود Java مُثبتة مُسبقا على النظام، فإن هذا المقال سيرشدك إلى تعلم تثبيت وإدارة إصدارات مختلفة من Java حتى يتسنى لك البدء في العمل، تتبع الدروس والمضي قدما.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_05/java-for-ubuntu.png.46355514095efd89b2a6368375b10f3b.png" class="ipsAttachLink ipsAttachLink_image" rel="external nofollow"><img data-fileid="1969" src="https://academy.hsoub.com/uploads/monthly_2015_05/java-for-ubuntu.thumb.png.c89dcb53cd202a2a2f6fca4ff65184d8.png" class="ipsImage ipsImage_thumbnailed" alt="java-for-ubuntu.thumb.png.c89dcb53cd202a"></a></p><h2 dir="rtl">تثبيت JRE/JDK الإفتراضي</h2><p dir="rtl">هذا هو الخيار الأكثر سهولة والمنصوح به. هذه العملية ستثبت OpenJDK 6 على أبنتو 12.04 وسابقاتها وحتى على 12.10+ فسيُثبّتُ هذا OpenJDK 7</p><p dir="rtl">تثبيت جافا مع apt-get سهل للغاية.</p><p dir="rtl"><strong>أولا، حدث مستودع الحزم:</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update</pre><p dir="rtl">ثم، تأكد من أن جافا ليست مثبتة على الجهاز:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">java -version</pre><p dir="rtl">إذا كانت مخرجات الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">"The program java can be found in the following packages"</pre><p dir="rtl">فهذا يعني أن جافا لم تُثبت بعد، لذلك طبق الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install default-jre</pre><p>هذا الأمر سيثبتُ (Java Runtime Enviroment (JRE، إذا كنت تريد (Java Development Kit (JDK عوضا عن ذلك، والتي تكون ضرورية لترجمة (compile) تطبيقات Java (مثلا Apache Ant, Apache Maven, Eclipse و IntelliJ IDEA ) طبق الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install default-jdk</pre><p dir="rtl">هذا كل ما تحتاجه من خطوات لتثبيت Java.</p><p dir="rtl"><strong>جميع الخطوات القادمة اختيارية ويجب تطبيقها فقط عند الحاجة.</strong></p><h2>تثبيت OpenJDK 7 (اختياري)</h2><p dir="rtl">لتثبيت OpenJDK 7 ، طبق الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install openjdk-7-jre</pre><p>هذا الأمر يثَبّتُ (Java Runtime Environment (JRE. إن كنت ترغب بتثبيت (Java Development Kit (JDK عوضا عن ذلك فنفذ الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install openjdk-7-jdk</pre><h2>تثبيت Oracle JDK (اختياري)</h2><p dir="rtl">Oracle JDK هو JDK الرسمي؛ لكنه لم يعد مقدما من Oracle بشكل افتراضي لـ Ubuntu، لكن لا يزال بإمكانك تثبيته باستخدام apt-get. لتثبيت أي نسخة أولا نفذ الأوامر التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update</pre><p dir="rtl">بعد ذلك، حسب النسخة المراد تثبيتها، نفذ أحد الأوامر التالية حسب النسخة المراد تثبيتها:</p><h3>Oracle JDK 6</h3><p dir="rtl">هذه نسخة قديمة لكنها لا زالت تُستعمَل في كثير من التطبيقات والأدوات، لذلك نذكرها هنا من باب العلم بالشيء:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install oracle-java6-installer</pre><h3>Oracle JDK 7</h3><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install oracle-java7-installer</pre><h3>Oracle JDK 8</h3><p dir="rtl">هذه آخر نسخة مستقرة لحد كتابة هذا الدرس. تم الإعلان عن الإطلاق بشكل عام في مارس 2014. <a rel="external nofollow" href="http://www.techempower.com/blog/2013/03/26/everything-about-java-8/">هذا الرابط الخارجي عن Java </a><a rel="external nofollow" href="http://www.techempower.com/blog/2013/03/26/everything-about-java-8/">8</a> يمكن أن يساعدك لفهم الأمور بشكل جيد.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install oracle-java8-installer</pre><p dir="rtl"><strong>ملاحظة:</strong></p><p dir="rtl">إذا حدث وأعطاك الأمر بعد مُدّة خطأً كالتالي (شخصيا، واجهتني المُشكلة، أظنّ أن السبب راجع إلى كوني أعيش في المغرب مع سرعة شبكة بطيئة):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">download failed
Oracle JDK 8 is NOT installed.
/usr/bin/dpkg returned an error code (1)</pre><p dir="rtl">لقد بحثت عن حلّ للمُشكلة ولكنّني لم أجد سوى حلّ بدائي وهو أن تعيد أمر التثبيت كلّما أعطاك هذا الخطأ (ستحتاج إلى تكرار الأمر 4 أو 5 مرّات لإكمال التحميل والتّثبيت بنجاح):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install oracle-java8-installer</pre><p dir="rtl">حيث ستكون المُخرجات كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">2 not fully installed or removed.</pre><p dir="rtl">هذا يعني أنّ الأمر الذي أدخلته سيستكمل التحميل ولن يحتاج إلى إعادته من جديد.</p><h2 dir="rtl">إدارة Java</h2><p dir="rtl">إذا كان لديك العديد من نسخ جافا المثبتة في الخادوم، يمكن اختيار النسخة الافتراضية، للقيام بذلك طبق الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo update-alternatives --config java</pre><p dir="rtl">المخرجات عادة ستكون كهذا إذا كنت تملك تثبتيتين (إذا كان لديك أكثر من ذلك، بالطبع ستكون المخرجات أكثر):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">There are 2 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 auto mode
1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode
2 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 manual mode

Press enter to keep the current choice[*], or type selection number:</pre><p><br>يمكنك الآن اختيار الرقم لاستخدامه كخيار افتراضي. هذه العملية يمكن فعلها كذلك بالنسبة لمترجم جافا (javarc):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo update-alternatives --config javac</pre><p>ستظهر نفس شاشة الاختيار السابقة ويجب استعمالها بنفس الطريقة. هذا الأمر يمكن تنفيذه لجميع الأوامر التي تملك تثبيتات مختلفة. في جافا، مثلاً: keytool ، javadoc و jarsigner</p><h3>ضبط متغير بيئة “JAVA_HOME” </h3><p dir="rtl">لضبط متغير بيئة JAVA_HOME ، والذي تحتاجه بعض البرامج، أولا عليك إيجاد مسار تثبيت جافا الخاص بك:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo update-alternatives --config java</pre><p>والمخرجات تكون كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">There are 2 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 auto mode
1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode
2 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 manual mode

Press enter to keep the current choice[*], or type selection number:</pre><p>مسار التثبيت هو كل من:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/usr/lib/jvm/java-7-oracle
/usr/lib/jvm/java-6-openjdk-amd64
/usr/lib/jvm/java-7-oracle</pre><p>أنسخ المسار من تثبيتك الذي تريده ثم عدل الملف <span style="font-family:courier new,courier,monospace;">etc/environment/</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/environment</pre><p dir="rtl">في هذا الملف أضف السطر التالي (مغيرا مسار_التثبيت إلى ما نسخته):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">JAVA_HOME="مسار_التثبيت"</pre><p dir="rtl">هذا كاف لضبط متغير البيئة. الآن أعد تحميل هذا الملف:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">source /etc/environment</pre><p dir="rtl">جرب الآن تطبيق الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">echo $JAVA_HOME</pre><p dir="rtl">إذا كان المخرج مسارك، فمتغير البيئة قد ضُبط بنجاح. إذا لم يكن الأمر كذلك، المرجو التأكد من أنك اتبعت جميع الخطوات بشكل صحيح.</p><p dir="rtl">ترجمة  -وبتصرّف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-java-on-ubuntu-with-apt-get">How To Install Java on Ubuntu with Apt-Get</a>.</p>
]]></description><guid isPermaLink="false">49</guid><pubDate>Mon, 11 May 2015 14:57:00 +0000</pubDate></item></channel></rss>
