آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

قابلیت تست اسکریپت


چگونگی افزودن قابلیت آزمایش کردن به برنامه‌ها

‎[توسط Jari Aalto] اگر شما در حال توسعه برنامه‌های بزرگتر می‌باشید، قابلیت آزمایش(آنچه برنامه انجام خواهد داد) قبل از استفاده واقعی، می‌تواند در تشخیص مشکلات، پیش از وقوع آنها در عمل، به شما کمک کند. در اینجا ما تابع ‎Run()‎ را تعریف می‌کنیم که برای نمایندگی تمام فرمانها به کار می‌رود. اگر وضعیت TEST فعال باشد، فرمانها به طور واقعی اجرا نمی‌شوند، بلکه فقط برای بازبینی در صفحه نمایش چاپ می‌شوند. حالت آزمایش با گزینه خط فرمان ‎-t‎ برنامه فعال می‌شود که از طریق دستور داخلی getopt پوسته Bash خوانده می‌شود.

قلب نمایش تجربی، تابع ‎Demo()‎ است که در آن می‌بینیم فراخوان‌ها چگونه آزمایش را به کار می‌بندند. دقت به خرج بدهید که موقع وجود هر فوق کاراکتر پوسته در فرمان، چگونه از نقل‌قولها استفاده می‌شود. همچنین توجه نمایید که چگونه به فراخوان ‎ 'Run'‎ در فراخوانی‌های داخل پوسته فرعی نیز نیاز دارید. نمایش فراخوان‌های پوسته فرعی تحت وضعیت آزمایش چنانکه از آخرین خروجی می‌توانید ببینید، محدود است.

می‌توانید راهکار آزمایش مشابهی به برنامه خودتان اضافه کنید، به وسیله: ‎ (1‎کپی ‎Run()‎ ‏ ‎(2‎ به کار گرفتن متغیر TEST‎ ‏‎(3‎ ویرایش تمام فراخونی‌های فرمان پوسته برای انجام ‎Run()‎. در عمل، قرار دادن برنامه پوسته به طور کامل تحت وضعیت آزمایش کردن خالص بسیار دشوار ست، زیرا ممکن است برنامه‌ها ساختارهای خیلی پیچیده‌ای از پوسته را استفاده کنند و وابسته به خروجی‌هایی باشند که توسط دستورات قبلی تولید می‌شوند. بازهم، امکان پیشرفت قابلیت آزمایش کردن بهتر از هیچ است و شانس بهتری برای بازبینی اجرای برنامه قبل از انجام آن در عمل، می‌باشد.

ادامه مطلب

BashLoadable


BASH به منظور ایجاد فرمانهای جدید دارای قابلیت بارگیری واحدهای اجرایی ترجمه شده است، که این واحدها نسبت به آنچه با فراخوانی فرمانهای خارجی می‌تواند به دست آید، ارتباط مستقیم‌تری با سیستم‌عامل فراهم می‌کنند. اینها دستورات داخلی قابل بارگیری نامیده می‌شوند.

دستورات داخلی قابل بارگیری، به طور معمول باید از میان درخت منابع bash برای سیستم شما کامپایل بشوند:

.../bash-4.0$ CC=whatever ./configure
.../bash-4.0$ make
.../bash-4.0$ exec ./bash
.../bash-4.0$ cd examples/loadables/
.../loadables$ make
.../loadables$ enable -f finfo finfo
.../loadables$ help finfo

این مطلب نیاز به پایگاهی دارد که bash در آن می‌داند چگونه بارگیری اشیاء و کتابخانه‌های مشترک را پشتیبانی کند. در اکثر سیستم‌ها، bash این مورد را با تابع ‎dlopen()‎ پشتیبانی می‌کند. اگر شما در نگارشهای قدیمی‌تر ‎HP-UX‎ هستید، یک وصله وجود دارد: bash-4.2-shl.diff (نگارش قدیمی‌تر آن: bash-4.0-shl.diff) که توسط GreyCat ایجاد شده است.

همچنین اطلاعات کمی مفصل‌تر را در این آدرسها می‌توانید پیدا کنید:


CategoryShell

Bash قابل بارگیری (آخرین ویرایش ‎2012-10-05 13:51:15‎ توسط GreyCat)


Wrapper Script


یک اسکریپت wrapper یکی از معمول‌ترین موارد استفاده برای اسکریپت پوسته است. کار یک wrapper به جای تلاش برای دوباره پیاده‌سازی قابلیت یک ابزار موجود، انتقال دادن ورودی‌هایش همراه با تغییر و تبدیل اندک به برخی ابزارهای دیگر است. این مورد، مقدار قابل توجهی از زحمت و دردسر را کاهش می‌دهد.

اصلی‌ترین شکل یک اسکریپت wrapper این است:

#!/bin/sh
exec /some/weird/place/toolname ${1+"$@"}

به طور کلی، موقع نوشتن یک wrapper، ما قابل‌حمل‌ترین ترکیب دستوری ممکن را به کار می‌بریم. اگر تمام آنچه می‌خواهیم انجام بدهیم، انتقال دادن ورودی‌ها به برخی برنامه‌های دیگر است، معمولاً به کد تجملی، مختص-پوسته یا مختص-پلاتفرم نیازی نیست. در حقیقت، شاید کد فوق می‌توانست با یک پیوند نمادین جایگزین شده باشد. یک اسکریپت wrapper کمی واقع‌گرایانه‌تر، می‌تواند مانند این به نظر آید:

#!/bin/sh
CDR_SECURITY=8:dvd,clone,....
export CDR_SECURITY
exec cdrecord-prodvd ${1+"$@"}

این wrapper یک متغیر محیط را تنظیم می‌کند، و سپس یک برنامه دیگر را با همان شناسه‌ها و ورودی که اسکریپت wrapper دریافت کرده، فراخوانی می‌کند.

ادامه مطلب

Process Management


این صفحه هنوز در حال توسعه می‌باشد. احتمال دارد برخی قسمت‌ها کیفیت خیلی خوبی نداشته باشند.

مندرجات

  1. مبانی
  2. پرسش‌های ساده
    1. چگونه یک job پس‌زمینه اجرا کنم؟
    2. اسکریپت من یک job در پس‌زمینه اجرا می‌کند. چطور می‌توانم PID آن را به دست آورم؟
    3. خب، من PID آن را دارم. چگونه کنترل کنم که آیا هنوز در حال اجرا می‌باشد؟
    4. می‌خواهم با پردازشی که قبلاً شروع کرده‌ام، کاری انجام بدهم
    5. چگونه پردازش را توسط نام آن kill کنم؟ بیرون رفتن آن از ‎ps aux | grep‎ را لازم دارم ....
    6. اما من روی سیستم قدری قدیمی یونیکس سنتی هستم که pgrep ندارد! چکار کنم؟
    7. می‌خواهم موردی را در پس‌زمینه اجرا کنم و سپس قطع اتصال (log out) کنم.
    8. من سعی می‌کنم job خود را ‎kill -9‎ کنم، اما ...
    9. مطمئن شوید شما این فرمانها را اجرا کرده‌اید و فهمیده‌اید:
  3. پرسش‌های پیشرفته
    1. می‌خواهم دو job را در پس‌زمینه اجرا کنم، و سپس تا پایان یافتن هر دو منتظر بمانم.
    2. چگونه می‌توانم کنترل کنم که اگر سرویس‌دهنده game من هنوز در حال اجرا می‌باشد؟ من یک اسکریپت در crontab قرار بدهم، و اگر در حال اجرا نیست آن را مجدداً راه‌اندازی کنم...
    3. چگونه مطمئن شوم که در یک لحظه فقط یک نسخه از اسکریپت من می‌تواند اجرا گردد؟
    4. می‌خواهم یک دسته از فایلها را به طور موازی پردازش کنم، و موقعی که یکی تمام می‌شود، بعدی را شروع کنم. و می‌خواهم مطمئن شوم در هر لحظه دقیقاً پنج job در حال اجرا می‌باشد.
    5. اسکریپت من یک خط‌لوله را اجرا می‌کند. می‌خواهم وقتی اسکریپت کشته می‌شود، خط‌لوله نیز بمیرد.
  4. چگونگی کار کردن با پردازش ها
    1. PIDها و والدین
    2. ریسک اجازه مردن والد
    3. ریسک تجزیه درخت پردازش
    4. درست انجام بدهید
      1. شروع یک پردازش و به خاطر سپردن PID آن
      2. معاینه کامل پردازش خود یا خاتمه دادن آن
      3. شروع یک سرویس کمکی «daemon» و کنترل آنکه آیا به طور موفق شروع گردیده است
  5. در مورد پردازش‌ها، محیط‌ها و وراثت

مبانی

یک پردازش، نمونهِ در حال اجرایِ یک برنامه در حافظه است. هر پردازش به وسیله یک شماره تحت عنوان PID، یا تعیین کننده هویت پردازش شناخته می‌شود. هر پردازش دارای قطعهِ تخصیص یافته‌ای از حافظه است، که مخصوص خودش می‌باشد، و از سایر پردازشها قابل دستیابی نیست. این جایی است که پردازش متغیرها و سایر داده‌هایش را ذخیره می‌کند.

کرنل تمام این پردازشها را پیگردی می‌کند، و مقدار اندکی از فوق‌داده‌های اصلی در باره آنها را در جدول پردازش ذخیره می‌نماید. به هرحال، هر پردازش در حدود حقوق ویژه اعطایی توسط کرنل، خود مختار است. وقتی یک پردازش آغاز شده باشد، انجام هر کاری با آن غیر از تعلیق(pause)، یا خاتمه دادن آن دشوار است.

فوق‌داده‌های ذخیره شده توسط کرنل، یک «نام» پردازش و «سطر فرمان» را شامل می‌گردد. این موارد قابل اعتماد نیستند، «نام» پردازش آن است که شما وقتی برنامه را اجرا کردید، بیان نمودید، و ممکن است هیچگونه رابطه‌ای با نام فایل برنامه نداشته باشد. (در برخی سیستم‌ها، پردازشهای در حال اجرا نام خودشان را نیز می‌توانند تغییر بدهند. برای مثال، sendmail از این مورد برای نشان دادن وضعیت خود استفاده می‌کند.) بنابراین، موقع کار با یک پردازش، برای اینکه قادر باشید با آن کاری انجام بدهید باید PID آن را بدانید. جستجوی پردازش‌ها به وسیله نام، به شدت لغزش‌پذیر است.

ادامه مطلب

ssh keys


این صفحه روشهایی را که در آنها اعتبار سنجی مبتنی بر کلید SSH ممکن است ناموفق گردد، و برخی اقداماتی را که شما می‌توانید برای حل آنها به عمل آورید، تشریح می‌کند. شکست تصدیق اعتبارِ کلید، احتمالاً رایج‌ترین مشکل برای کاربران جدید در آزمودن SSH است، و پاسخگویی مکرر به این پرسشها خسته کننده است....

نگاه کلی

این نظر اجمالی، مفاهیم اصلی تصدیق اعتبار کلید عمومی را برای آنهایی که هنوز چیز زیادی در مورد آن نمی‌دانند، شرح می‌دهد.

کلید عمومی اعتبار سنجی، به کار بردن رمزنگاری برای اثبات آنکه شما مالک مطمئن اعتبارنامه می‌باشید را شامل می‌گردد، بدون آنکه واقعاً آن اعتبارنامه را برای طرف دیگر آشکار سازد. مخصوصاً، سرویس‌گیرنده یک کلید خصوصی را نگهداری می‌کند، که ممکن است با یک عبارت عبور رمزی شده یا نشده باشد. سرویس‌دهنده یک کلید عمومی را نگهداری می‌کند. سرویس‌دهنده و گیرنده یک روش Zero-knowledge proof ‎ [1] ‎  را به کار می‌برند، که در این روش سرویس‌گیرنده ثابت می‌کند که نگهدارنده کلید خصوصی است، اما در عمل کلید محرمانه را انتقال نمی‌دهد.

ادامه مطلب