diff --git a/README-fa.md b/README-fa.md new file mode 100644 index 0000000..66d06ac --- /dev/null +++ b/README-fa.md @@ -0,0 +1,1969 @@ +# نقشه راه لینوکس: دوره کاربردی و جامع از صفر تا مدیریت مطمئن سیستم + +این یک مسیر گام‌به‌گام برای یادگیری لینوکس با تمرکز بر کار عملی است. هر بخش شامل توضیحاتی درباره «چرا این‌گونه طراحی شده است»، بررسی دستورات و تمرین‌های اجباری است که باید خودتان در ترمینال انجام دهید. خواندن بدون تکرار مهارت، حاصلی ندارد؛ پس ترمینال را در کنار این متن باز نگه دارید. + +> نحوه کار با این دوره: از بالا به پایین حرکت کنید و از بخش‌ها جهش نکنید؛ هر دستور را خودتان تایپ کنید و کپی-پیست نکنید؛ در پایان هر بخش، تمرین‌ها را انجام دهید؛ عمداً سیستم را در ماشین مجازی خراب کنید و آن را تعمیر کنید — این بهترین راه برای یادگیری است. + +### توصیه‌های تکمیلی برای یادگیری + +- **یادداشت‌برداری کنید.** کاربرد هر دستور جدید و سوییچ‌های کلیدی آن را با زبان خود یادداشت کنید؛ این کار فهم شما را بهتر از چند بار خواندن تثبیت می‌کند. +- **خواندن مستندات را یاد بگیرید.** کار با دستورات `man` و `help--` و ابزار `tldr` را یاد بگیرید. توانایی پیدا کردن سریع پاسخ، بسیار مهم‌تر از حفظ کردن دستورات است. +- **قبل از آزمایش‌های خطرناک، از ماشین مجازی خود اسنپ‌شات (Snapshot) بگیرید** تا بتوانید بلافاصله سیستم را به حالت قبل بازگردانید و بدون ترس، دست به کارهای ریسک‌دار بزنید و سیستم را «خراب» کنید. +- **با فاصله زمانی تکرار کنید.** بعد از چند روز به بخش‌های خوانده‌شده برگردید؛ تکرار با فاصله زمانی مهارت را به حافظه بلندمدت منتقل می‌کند. +- **در کارهای واقعی به کار ببرید.** سرور خانگی یا یک پروژه شخصی (pet project) راه‌اندازی کنید و مشکلات واقعی را حل کنید، نه فقط تمرین‌های آموزشی. +- **یک برگه تقلب شخصی (cheat sheet) برای خود بسازید** و با پیشرفت در دوره آن را کامل‌تر کنید؛ این برگه به مرور زمان به مهم‌ترین راهنمای شما تبدیل خواهد شد. + +### اخبار لینوکس را از کجا دنبال کنیم؟ + +برای به‌روز ماندن در مورد آخرین اخبار، انتشارها و ابزارهای اکوسیستم لینوکس: + +- **تلگرام:** [t.me/linuxkalii](https://t.me/linuxkalii) +- **وی‌کنتاکت (VK):** [vk.com/kali_linux_backtrack](https://vk.com/kali_linux_backtrack) + +**بخش دوم: عملی** + +1. [آماده‌سازی محیط](#1-آماده‌سازی-محیط) +2. [ترمینال и فلسفه لینوکس](#2-ترمینال-и-فلسفه-لینوکس) +3. [پوسته (shell): خط فرمان چگونه کار می‌کند](#3-پوسته-shell-خط-فرمان-چگونه-کار-می‌کند) +4. [ناوبری در سیستم فایل](#4-ناوبری-در-سیستم-فایل) +5. [کار با فایل‌ها و پوشه‌ها](#5-کار-با-فایل‌ها-و-پوشه‌ها) +6. [مشاهده و ویرایش متن](#6-مشاهده-و-ویرایش-متн) +7. [مجوزهای دسترسی و مالکان](#7-مجوزهای-دسترسی-و-مالکان) +8. [کاربران، گروه‌ها و sudo](#8-کاربران-گروه‌ها-و-sudo) +9. [مدیریت بسته‌ها (پکیج منیجرها)](#9-مدیریت-بسته‌ها-پکیج-منیجرها) +10. [ویرایشگرهای متن](#10-ویرایشگرهای-متن) +11. [جستجوی فایل‌ها و محتوا](#11-جستجوی-فایل‌ها-و-محتوا) +12. [لوله‌ها، فیلترها و پردازش متن](#12-لوله‌ها-فیلترها-و-پردازش-متن) +13. [تغییر مسیر جریان‌ها](#13-تغییر-مسیر-جریان‌ها) +14. [فرآیندها و سیگنال‌ها](#14-فرآیندها-و-سیگنال‌ها) +15. [systemd و سرویس‌ها](#15-systemd-و-سرویس‌ها) +16. [لاگ‌ها و ثبت وقایع](#16-لاگ‌ها-و-ثبت-وقایع) +17. [شبکه](#17-شبکه) +18. [فایروال و امنیت پایه](#18-فایروال-و-امنیت-پایه) +19. [آرشیو و فشرده‌سازی](#19-آرشیو-و-فشرده‌سازی) +20. [متغیرهای محیطی و PATH](#20-متغیرهای-محیطی-و-path) +21. [لینک‌ها: سخت (hard) و نمادین (symbolic)](#21-لینک‌ها-سخت-hard-و-نمادین-symbolic) +22. [اسکریپت‌نویسی Bash](#22-اسکریپت‌نویسی-bash) +23. [دیسک‌ها، پارتیشن‌ها و سوار کردن (Mount)](#23-دیسک‌ها-پارتیشن‌ها-و-سوار-کردن-mount) +24. [Cron و تایمرهای systemd](#24-cron-و-تایمرهای-systemd) +25. [SSH و دسترسی از راه دور](#25-ssh-و-دسترسی-از-راه-دور) +26. [نصب نرم‌افزار از سورس کد](#26-نصب-نرم‌افزار-از-سورس-کد) +27. [عیب‌یابی و حل مشکلات](#27-عیب‌یابی-و-حل-مشکلات) +28. [پروژه‌هایی برای تثبیت یادگیری](#28-پروژه‌هایی-برای-تثبیت-یادگیری) +29. [ترفندها و دستورات پیشرفته](#29-ترفندها-و-دستورات-پیشرفته-) +30. [اصول محافظت از سرورها](#30-اصول-محافظت-از-سرورها-) +31. [چک‌لیست دستورات: خود را بسنجید](#31-چک‌لیست-دستورات-خود-را-بسنجید-) +32. [برگه تقلب دستورات](#32-برگه-تقلب-دستورات) +33. [واژه‌نامه](#33-واژه‌نامه) +34. [مسیرهای بعدی برای پیشرفت](#34-مسیرهای-بعدی-برای-پیشرفت) +35. [مدیریت پیشرفته لینوکس](#35-مدیریت-پیشرفته-لینوکس-) +36. [کتاب‌های رایگان و مفید](#36-کتاب‌های-رایگان-و-مفید-) +37. [کانال‌های تلگرامی مفید](#37-کانال‌های-تلگرامی-مفید-) + +**بخش اول: تئوری: لینوکس از درون چگونه کار می‌کند** + +- [T1. لینوکس در واقع چیست](#t1-لینوکس-در-واقع-چیست) +- [T2. فضای هسته (Kernel space) و فضای کاربر (User space)، فراخوانی‌های سیستم](#t2-فضای-هسته-kernel-space-و-فضای-کاربر-user-space-فراخوانی‌های-سیستم) +- [T3. فرآیندها: تولد، زندگی و مرگ](#t3-فرآیندها-تولد-زندگی-و-مرگ) +- [T4. مدیریت حافظه: حافظه مجازی، صفحات، swap](#t4-مدیریت-حافظه-حافظه-مجازی-صفحات-swap) +- [T5. سیستم‌فایل‌ها و inode: داده‌ها چگونه روی دیسک قرار می‌گیرند](#t5-سیستم‌فایل‌ها-و-inode-داده‌ها-چگونه-روی-دیسک-قرار-می‌گیرند) +- [T6. بوت شدن سیستم: از دکمه پاور تا اعلان ورود](#t6-بوت-شدن-سیستم-از-دکمه-پاور-تا-اعلان-ورود) +- [T7. پوسته به عنوان مفسر: هنگام وارد کردن دستور چه اتفاقی می‌افتد](#t7-پوسته-به-عنوان-مفسر-هنگام-وارد-کردن-دستور-چه-اتفاقی-می‌افتد) + +**بخش مرجع** + +- [نمودارهای بصری](#نمودارهای-بصری) +- [اصل اساسی](#اصل-اساسی) + +> آیا می‌خواهید درک کنید که *چرا* همه‌چیز این‌گونه کار می‌کند؟ قبل از شروع کار عملی یا هم‌زمان با آن، **بخش اول: تئوری: لینوکس از درون چگونه کار می‌کند** (پایین‌تر، بخش‌های T1 تا T7) را بخوانید: هسته، فراخوانی‌های سیستم، فرآیندها، حافظه، inode و فرآیند بوت. + +--- + +## نمودارهای بصری + +چند نمودار که برای دسترسی سریع بهتر است جلوی چشمتان باشد. آن‌ها مواردی را که به تفصیل در بخش‌های تئوری (بخش اول) و عملی (بخش دوم) بررسی شده‌اند، به تصویر می‌کشند. + +**جایی که شما و هسته قرار دارید (لایه‌های سیستم):** + +``` +┌─────────────────────────────────────────────┐ +│ برنامه‌های شما (user space) │ +│ bash · nginx · python · ls · vim │ +└───────────────┬───────────────────────────────┘ + │ فراخوانی‌های سیستم (open/read/write/fork…) +┌───────────────▼───────────────────────────────┐ +│ هسته لینوکس (kernel space) │ +│ فرآیندها · حافظه · سیستم‌فایل · شبکه · درایورها│ +└───────────────┬───────────────────────────────┘ + │ +┌───────────────▼───────────────────────────────┐ +│ سخت‌افزار: پردازنده · رم · دیسک‌ها · شبکه │ +└────────────────────────────────────────────────┘ +``` + +**درخت سیستم‌فایل (شاخه‌های اصلی):** + +``` +/ +├── bin, usr/bin → برنامه‌ها +├── etc → فایل‌های پیکربندی (متنی) +├── home/ → داده‌های شما +│ └── user/ → ~/.bashrc, ~/.ssh/ … +├── var/ → لاگ‌ها، کش‌ها، پایگاه داده‌ها (var/log/) +├── tmp/ → فایل‌های موقت (پس از ریبوت پاک می‌شوند) +├── dev/ → فایل‌های دستگاه‌ها (دیسک‌ها، ترمینال‌ها) +├── proc/, sys/ → سیستم‌فایل‌های مجازی (اطلاعات هسته) +└── boot/ → هسته (vmlinuz) و بوت‌لودر +``` + +**بوت شدن سیستم (گام‌به‌گام):** + +``` +[برق/پاور] → BIOS/UEFI → GRUB → هسته + initramfs + → سوار کردن / → systemd (PID 1) + → اجرای سرویس‌ها بر اساس وابستگی‌ها → target → ورود +``` + +**چرخه حیات فرآیند:** + +``` + fork() execve() +والد ──────────► فرزند ──────────► برنامه جدید + │ در حال اجرا (R/S) + ▼ + exit(کد خروج) + │ + ┌─────────┴──────────┐ + والد زنده است؟ والد مرده است؟ + │ │ + Z (زامبی، منتظر «یتیم» → + تابع wait والد) تحت سرپرستی PID 1 +``` + +**لوله (pipe) — جریان متن در فیلترها:** + +``` +cat access.log │ awk '{print $1}' │ sort │ uniq -c │ sort -rn │ head + کل لاگ → فقط IPها → مرتب‌سازی → شمارش → ترتیب نزولی → ۱۰ تای برتر +``` + +**بررسی مجوزهای دسترسی `-rwxr-xr--`:** + +``` + - rwx r-x r-- +نوع مالک گروه سایرین + │ │ │ └─ r-- = 4 (فقط خواندنی) + │ │ └────────── r-x = 5 (خواندن + اجرا) + │ └─────────────────── rwx = 7 (دسترسی کامل) + └──────────────────────── - فایل، d پوشه، l لینک نمادین + + chmod 754 file → 7=rwx 5=r-x 4=r-- +``` + +**لینک سخت (Hard link) در مقابل لینک نمادین (Symbolic link) (از طریق inode):** + +``` + نام۱ ─┐ + ├──► [inode #1234] ──► داده‌ها روی دیسک (لینک‌های سخت: اینود یکسان) + نام۲ ─┘ + + symlink ──► [inode #5678: "مسیر/به/مقصد"] ┄┄► نام۱ (فایل مجزا حاوی مسیر مقصد) +``` + +--- + +## 1. آماده‌سازی محیط + +قبل از شروع به یک سیستم لینوکس در حال کار نیاز دارید. یکی از گزینه‌های زیر را انتخاب کنید: + +- **ماشین مجازی (برای شروع پیشنهاد می‌شود).** نرم‌افزار VirtualBox یا VMware را نصب کنید، یک ایمیج Ubuntu Server یا Debian یا Fedora دانلود کنید. خراب کردن ماشین مجازی اصلاً نگران‌کننده نیست — بالاخره آن را خراب خواهید کرد و این کاملاً عادی است. بلافاصله پس از نصب یک اسنپ‌شات (Snapshot) بگیرید تا در صورت بروز هر مشکلی، بتوانید فوراً به حالت اول برگردید. +- **WSL2 در ویندوز.** دستور `wsl --install` را در PowerShell با دسترسی Administrator اجرا کنید. سریع است اما یک محیط محدود است: در نسخه‌های قدیمی بوت‌لودر هسته اختصاصی و systemd کامل وجود ندارد؛ بنابراین اجرای بخش‌های مربوط به سرویس‌ها و بوت سیستم در آن ممکن نیست. +- **نصب به عنوان سیستم‌عامل دوم روی دیسک (dual boot).** واقعی‌ترین حالت است، اما بهتر است زمانی به سراغش بروید که کاملاً با لینوکس آشنا شده‌اید. +- **سرور مجازی ابری (VPS).** با هزینه کمی می‌توانید یک سرور اجاره کنید و روی یک محیط عملیاتی با IP عمومی واقعی تمرین کنید — این گزینه برای بخش‌های مربوط به SSH، فایروال و وب‌سرور عالی است. + +برای آموزش، یک توزیع **بدون رابط گرافیکی** (مانند Ubuntu Server یا نسخه netinstall از Debian) انتخاب کنید. این‌گونه سریع‌تر به زندگی در ترمینال عادت می‌کنید. + +تفاوت توزیع‌ها در چیست: خانواده **Debian/Ubuntu** از بسته‌های `.deb` و مدیریت بسته `apt` استفاده می‌کند، محبوب‌ترین توزیع است و بیشترین راهنماها برای آن نوشته شده است. توزیع‌های **Fedora/RHEL/CentOS** از بسته‌های `.rpm` و `dnf` استفاده می‌کنند که پایه دنیای سازمانی است (RedHat). توزیع **Arch** مخصوص کسانی است که می‌خواهند سیستم را به صورت دستی سرهم کنند و هر بخش آن را عمیقاً درک کنند. پیشنهاد ما شروع با Ubuntu/Debian است. + +**تمرین:** یک توزیع در ماشین مجازی نصب کنید، اسنپ‌شات بگیرید، وارد سیستم شوید و دستور `uname -a` را اجرا کنید. نسخه هسته و معماری سیستم خود را یادداشت کنید. + +--- + +## راهنمای انتخاب توزیع لینوکس + +توزیع (distro) یک بسته آماده شامل: هسته لینوکس، ابزارهای سیستم، یک مدیریت بسته و مجموعه‌ای از برنامه‌های پیش‌فرض است. هسته در همه توزیع‌ها تقریباً یکسان است و تفاوت اصلی در مدیریت بسته، چرخه به‌روزرسانی‌ها، برنامه‌های پیش‌فرض و فلسفه پروژه است. «بهترین» توزیع وجود ندارد — بلکه باید توزیعی را انتخاب کنید که مناسب کار شماست. + +### نحوه انتخاب: سه پرسش اساسی + +1. **مدیریت بسته و فرمت آن چیست؟** این موضوع مشخص می‌کند که با چه دستوراتی نرم‌افزارها را نصب کنید و چه راهنماهایی برای شما مناسب خواهند بود. خانواده Debian/Ubuntu بسته‌های `.deb` و ابزار `apt`؛ خانواده RHEL/Fedora بسته‌های `.rpm` و ابزار `dnf`؛ توزیع Arch ابزار `pacman` و توزیع openSUSE ابزار `zypper` را به کار می‌برند. +2. **چرخه انتشار نسخه‌ها چگونه است؟** نسخه پایدار (*Stable* مانند Debian و RHEL) — به‌روزرسانی‌های کمتر، پیش‌بینی‌پذیری بالا، ایده‌آل برای سرورها. نسخه غلتان (*Rolling* مانند Arch و openSUSE Tumbleweed) — همواره جدیدترین نرم‌افزارها، اما نیازمند مراقبت و دانش بیشتر. +3. **چه کسی پشت پروژه است و چقدر پشتیبانی می‌شود؟** پشتیبانی شرکتی (Red Hat, Canonical, SUSE) و زمان پشتیبانی طولانی (LTS) برای محیط‌های کاری بسیار حیاتی است. توزیع‌های جامعه‌محور (Community-driven) آزادی عمل بیشتری به شما می‌دهند. + +### خانواده‌ها و دلایل انتخاب آن‌ها + +- **Debian** — نماد پایداری و نرم‌افزار آزاد. بسته‌های `.deb` و مدیریت بسته `apt`. مناسب برای سرورهایی که امنیت و پایداری در آن‌ها بر جدید بودن نرم‌افزار اولویت دارد. +- **Ubuntu** (بر پایه Debian) — محبوب‌ترین دروازه ورود به لینوکس. نسخه‌های LTS به مدت ۵ سال پشتیبانی می‌شوند. جامعه کاربران بسیار بزرگ و راهنماهای فراوان دارد. **Ubuntu Server** بهترین نقطه شروع برای یادگیری مدیریت سرور است. +- **Linux Mint** (بر پایه Ubuntu) — دسکتاپی کاربرپسند برای مهاجرت از ویندوز. برای اولین تجربه سیستم گرافیکی خوب است، اما برای یادگیری بهتر است از نسخه سرور استفاده کنید. +- **Fedora** — ویترینی از فناوری‌های جدید Red Hat. بسته‌های `.rpm` و ابزار `dnf`. نرم‌افزارهای به‌روز، اما طول عمر هر نسخه کوتاه است (حدود ۱۳ ماه). +- **RHEL / Rocky Linux / AlmaLinux / CentOS Stream** — پایه سیستم‌های سازمانی. Rocky و Alma کلون‌های رایگان RHEL هستند. اگر هدفتان کار در سازمان‌های بزرگ و دریافت مدارک Red Hat (RHCSA/RHCE) است، حتماً روی این‌ها تمرین کنید. +- **Arch Linux** — سیستم را به صورت دستی و از پایه سرهم می‌کنید و فقط ابزارهای مورد نیاز خود را نصب می‌کنید. دارای به‌روزرسانی غلتان (rolling release) و بهترین مستندات در دنیا (Arch Wiki). برای درک اجزای سیستم عالی است اما برای شروع کار مبتدیان توصیه نمی‌شود. +- **openSUSE** (نسخه Leap پایدار، Tumbleweed غلتان) — استفاده از `zypper` و ابزار گرافیکی فوق‌العاده YaST برای پیکربندی سیستم. +- **Alpine** — توزیعی بسیار کوچک بر پایه musl و BusyBox. به دلیل حجم بسیار کم، به یک استاندارد برای ایمیج‌های Docker تبدیل شده است. +- **Kali / Parrot** — به طور خاص برای تست نفوذ و امنیت طراحی شده‌اند و مجموعه‌ای از ابزارهای امنیت را به طور پیش‌فرض دارند. این سیستم‌ها تخصصی هستند و برای کارهای روزمره یا اولین آشنایی با لینوکس مناسب **نیستند**. + +### چه توزیعی برای چه کاری مناسب است؟ + +- **یادگیری لینوکس از صفر** ← Ubuntu Server LTS یا Debian (نسخه netinstall، بدون گرافیک). بیشترین راهنما، کمترین غافلگیری. +- **دسکتاپ به جای ویندوز** ← Linux Mint یا Ubuntu. +- **شغل سازمانی / مدارک لینوکس** ← Rocky Linux یا AlmaLinux (همان کلون‌های RHEL). +- **نرم‌افزار همیشه به‌روز، علاقه به حل چالش‌ها** ← Fedora یا openSUSE Tumbleweed. +- **درک عمیق سیستم تا آخرین پیچ** ← Arch Linux (به همراه مطالعه مستمر Arch Wiki). +- **کانتینرها و ایمیج‌ها** ← Alpine. + +> توصیه: برای پیدا کردن سیستم ایده‌آل مدام بین توزیع‌ها «پرش» نکنید. یکی از توزیع‌های جریان اصلی (Ubuntu/Debian) را انتخاب کرده و مسلط شوید. مفاهیم پایه در همه جا یکسان است و مهارت‌های شما به راحتی به توزیع‌های دیگر منتقل خواهد شد. + +**تمرین:** دو توزیع از خانواده‌های متفاوت (مثلاً Ubuntu Server و Rocky Linux) را در ماشین مجازی نصب کنید. نحوه نصب یک بسته مشخص را مقایسه کنید (مثلاً `apt install` در برابر `dnf install`) و تفاوت‌ها را در یادداشت‌های خود بنویسید. + +--- + +## تنظیم کالی لینوکس: از نصب تا آمادگی عملیاتی 🐉 + +کالی لینوکس توزیعی بر پایه دبیان است که برای تست نفوذ و تحلیل امنیت طراحی شده است. کالی یک سیستم برای «استفاده روزمره» نیست و برای افراد تازه‌کار نیز مناسب نیست: زمانی به سراغش می‌روید که مبانی لینوکس را درک کرده‌اید و می‌خواهید کار با ابزارهای امنیتی را یاد بگیرید. در ادامه مسیر کاربردی تنظیم این سیستم آمده است. + +> ⚠️ مهم: از تمام ابزارهای کالی فقط در آزمایشگاه شخصی خود یا در جاهایی که مجوز کتبی دارید استفاده کنید. اسکن یا حمله به سیستم دیگران بدون اجازه، جرم است و نامش «یادگیری» نیست. + +### کجا و چگونه نصب کنیم؟ + +- **در ماشین مجازی (توصیه می‌شود)** — مانند VirtualBox یا VMware. سایت رسمی کالی ایمیج‌های آماده برای هر دو منتشر می‌کند. فایل‌ها را فقط از سایت رسمی `kali.org/get-kali` دانلود کنید و هش SHA256 را مطابقت دهید. +- **Live-USB** — بوت کردن سیستم از روی فلش مموری بدون نیاز به نصب. حالت *persistence* به شما اجازه می‌دهد فایل‌های خود را بین دفعات راه‌اندازی ذخیره کنید. +- **WSL2 (ویندوز)** — بسته `kali-linux` از Microsoft Store قابل نصب است؛ برای ابزارهای خط فرمان راحت است اما بدون رابط گرافیکی سنگین و قابلیت‌های مربوط به شبکه وایرلس خواهد بود. +- **نصب مستقیم روی سخت‌افزار توصیه نمی‌شود** — برای استفاده‌های روزمره این کار ناامن و غیرکاربردی است. + +### نخستین گام‌ها پس از نصب + +```bash +# ۱. به‌روزرسانی کل سیستم (کالی دارای انتشار غلتان است و آپدیت‌ها مهم هستند) +sudo apt update && sudo apt full-upgrade -y + +# ۲. نصب ابزارهای مهمان برای VirtualBox (جهت استفاده از کلیپ‌بورد مشترک و تنظیم رزولوشن صفحه) +sudo apt install -y virtualbox-guest-x11 && sudo reboot + +# ۳. تغییر رمز عبور پیش‌فرض کاربر (قبلاً نام کاربری و رمز عبور هر دو kali بود) +passwd + +# ۴. بررسی بسته‌های متا برای ابزارهای در دسترس +sudo apt install -y kali-tweaks # ابزار تنظیمات ساده سیستم +``` + +### مجموعه‌های ابزار (بسته‌های متا - Metapackages) + +نسخه کامل کالی بسیار سنگین است. اغلب منطقی‌تر است که بسته‌های ابزار مورد نیاز خود را به صورت گروهی نصب کنید: + +- `kali-linux-headless` — بدون رابط گرافیکی، فقط خط فرمان (مناسب سرورها و VPS). +- `kali-linux-default` — مجموعه ابزار پیش‌فرضی که همراه با فایل نصب ارائه می‌شود. +- `kali-linux-large` — مجموعه گسترده‌تری از ابزارها. +- `kali-tools-web` ،`kali-tools-wireless` ،`kali-tools-forensics` — گروه‌های تخصصی بر اساس نوع کار. + +```bash +apt search kali-tools # مشاهده تمام گروه‌ها +sudo apt install -y kali-tools-web +``` + +### بهداشت و امنیت سیستم کالی + +- **به طور مستمر با کاربر root کار نکنید.** در نسخه‌های جدید کالی به طور پیش‌فرض یک کاربر عادی ساخته می‌شود؛ این شیوه را حفظ کنید و دسترسی‌ها را با `sudo` بالا ببرید. +- **بلافاصله پس از نصب تمیز، اسنپ‌شات بگیرید** تا در صورت بروز مشکل بتوانید به راحتی سیستم را بازگردانید. +- **آزمایشگاه خود را ایزوله کنید.** اهداف آسیب‌پذیر (مانند Metasploitable ،DVWA یا ماشین‌های سایت‌های HackTheBox/TryHackMe) را در یک شبکه داخلی مجزا در ماشین مجازی قرار دهید، نه در شبکه خانگی مشترک با سایر دستگاه‌ها. +- **سیستم را به طور مرتب به‌روزرسانی کنید.** + +### آزمایشگاه برای تمرین (قانونی و رایگان) + +- **TryHackMe** و **HackTheBox** — ماشین‌های آسیب‌پذیر آماده و سناریوهای گام‌به‌گام برای یادگیری. +- **Metasploitable 2/3** ،**DVWA** ،**OWASP Juice Shop** — اهدافی که به صورت عمدی آسیب‌پذیر شده‌اند و روی شبکه محلی شما نصب می‌شوند. +- **VulnHub** — فایل ایمیج ماشین‌های مجازی آسیب‌پذیر برای دانلود و تمرین. + +**تمرین:** در محیط VirtualBox دو ماشین مجازی در یک شبکه داخلی (Host-Only یا Internal) راه‌اندازی کنید: یکی Kali و دیگری Metasploitable 2. از سیستم کالی دستور `nmap -sV ` را اجرا کرده و پورت‌های باز و نسخه‌های سرویس‌ها را شناسایی و یادداشت کنید. هیچ شبکه واقعی را هدف قرار ندهید — فقط آزمایشگاه شخصی خودتان. + +--- + +## 2. ترمینال و فلسفه لینوکس + +چند ایده اساسی که بدون دانستن آن‌ها، دستورات لینوکس فقط مجموعه‌ای از کلمات نامفهوم به نظر می‌رسند: + +- **همه‌چیز یک فایل است.** دیسک‌ها، فرآیندها، دستگاه‌ها و حتی تنظیمات هسته به صورت فایل نشان داده می‌شوند. با درک این موضوع، نیمی از لینوکس را فهمیده‌اید. +- **برنامه‌های کوچک که یک کار را به بهترین نحو انجام می‌دهند.** این برنامه‌ها را می‌توان به هم زنجیره کرد و خروجی یکی را به عنوان ورودی به دیگری فرستاد. +- **متن به عنوان رابط عمومی.** خروجی هر دستوری را می‌توان فیلتر کرد، شمرد، مرتب کرد و به دستور بعدی منتقل کرد. +- **تنظیمات در قالب فایل‌های متنی ذخیره می‌شوند.** تقریباً تمام تنظیمات سیستم با ویرایش فایل‌های متنی در مسیر `/etc` انجام می‌شود، نه با کلیک در پنجره‌های گرافیکی. این یعنی می‌توانید تنظیمات را ذخیره کنید، به سرورهای دیگر کپی کنید یا در سیستم‌های مدیریت نسخه (مانند git) قرار دهید. + +دستورات اولیه برای گشت‌وگذار در سیستم: + +```bash +whoami # کاربری که با آن وارد شده‌اید +hostname # نام کامپیوتر شما در شبکه +pwd # پوشه فعلی شما (print working directory) +uname -a # اطلاعات کامل درباره هسته سیستم‌عامل +date # تاریخ و زمان فعلی +uptime # مدت زمانی که سیستم بدون ریبوت روشن بوده است +cat /etc/os-release # نام و نسخه توزیع لینوکس شما +``` + +چگونه برای هر دستور راهنما دریافت کنیم (این کار از حفظ کردن دستورات مهم‌تر است): + +```bash +man ls # دفترچه راهنمای کامل دستور ls (خروج با کلید q، جستجو با کاراکتر /) +ls --help # راهنمای خلاصه مستقیم در ترمینال +type ls # ماهیت دستور ls: آیا یک برنامه است، یک نام مستعار (alias) است یا تابع +apropos copy # جستجوی دستورات مرتبط با کلیدواژه copy +``` + +**تمرین:** نسخه هسته را با `uname -r` و نام توزیع خود را از `/etc/os-release` استخراج کنید. راهنمای `man ls` را باز کنید، پیدا کنید سوییچ `-h` چه کاری انجام می‌دهد و سپس از راهنما خارج شوید. + +--- + +## 3. پوسته (shell): خط فرمان چگونه کار می‌کند + +پوسته برنامه‌ای است که دستورات ورودی شما را می‌خواند و آن‌ها را اجرا می‌کند. رایج‌ترین پوسته **bash** است و در سیستم‌های جدیدتر اغلب از **zsh** استفاده می‌شود. درک نحوه کار با پوسته در وقت شما بسیار صرفه‌جویی می‌کند. + +ساختار دستور: `command -flags arguments`. به عنوان مثال در دستور `ls -l /etc`: کلمه `ls` خود دستور است، `-l` سوییچ (گزینه) و `/etc` آرگومان است. + +کلیدهای میان‌بر که سرعت کار را به شدت بالا می‌برند: + +```text +Tab # تکمیل خودکار دستورات، نام فایل‌ها و مسیرها +کلیدهای جهت‌نما ↑ ↓ # مرور تاریخچه دستورات قبلی +Ctrl+R # جستجو در تاریخچه دستورات (بخشی از دستور را تایپ کنید) +Ctrl+A / Ctrl+E# رفتن به ابتدای خط / انتهای خط +Ctrl+U / Ctrl+K# حذف نوشته‌ها از مکان‌نما تا ابتدای خط / انتهای خط +Ctrl+W # حذف کلمه قبلی +Ctrl+L # پاک کردن صفحه ترمینال (مشابه دستور clear) +Ctrl+C # متوقف کردن دستور فعلی در حال اجرا +Ctrl+D # خروج از پوسته / اتمام ورودی متنی +``` + +تاریخچه و نام‌های مستعار (Aliases): + +```bash +history # نمایش تاریخچه دستورات +!! # تکرار دقیقاً آخرین دستور اجرا شده +!42 # اجرای دستور شماره ۴۲ از تاریخچه سیستم +alias ll='ls -lah' # ایجاد یک نام مستعار کوتاه +``` + +نام‌های مستعار و تنظیمات موقتی هستند و با بستن ترمینال از بین می‌روند. برای ذخیره دائمی آن‌ها، باید کدهای مربوطه را به انتهای فایل `~/.bashrc` (برای پوسته bash) اضافه کنید و دستور `source ~/.bashrc` را اجرا کنید. + +الگوهای جستجو (globbing) — پوسته خودش الگوها را به لیستی از فایل‌ها بسط می‌دهد: + +```bash +ls *.txt # نمایش تمام فایل‌هایی که با پسوند .txt تمام می‌شوند +ls file?.txt # تطابق با file1.txt یا fileA.txt؛ علامت سوال یعنی دقیقاً یک کاراکتر دلخواه +ls [abc]* # نمایش فایل‌هایی که با حروف a یا b یا c شروع می‌شوند +``` + +**تمرین:** یک نام مستعار به نام `ll` برای دستور `ls -lah` بسازید، کارکرد آن را تست کنید و سپس آن را در فایل `~/.bashrc` ذخیره کنید تا پایدار بماند. با استفاده از `Ctrl+R` یکی از دستوراتی را که قبلاً اجرا کرده‌اید جستجو و پیدا کنید. + +--- + +# بخش اول: تئوری: لینوکس از درون چگونه کار می‌کند + +این بخش توضیح می‌دهد که *چرا* سیستم این‌گونه رفتار می‌کند. کارشناسانی که تئوری را می‌شناسند، مشکلات را به جای ساعت‌ها حدس زدن، در عرض چند دقیقه برطرف می‌کنند. می‌توانید هم‌زمان با کارهای عملی این بخش را بخوانید — هر زمان احساس کردید دستوری «مثل جادو» کار می‌کند و خواستید مکانیزم آن را درک کنید، به اینجا مراجعه کنید. + +## T1. لینوکس در واقع چیست + +اگر بخواهیم دقیق بگوییم، **لینوکس فقط هسته (Kernel) سیستم‌عامل است** که توسط لینوس توروالدز در سال ۱۹۹۱ نوشته شد. آنچه ما نصب می‌کنیم (مانند اوبونتو، دبیان یا فدورا) در واقع یک **توزیع (Distribution)** است: یعنی هسته لینوکس به همراه ابزارهای سیستم (که بیشتر از پروژه GNU هستند)، مدیریت بسته، سیستم مدیریت راه‌اندازی (init system) و برنامه‌های کاربردی. به همین دلیل از نظر فنی عبارت «GNU/Linux» دقیق‌تر است. + +هسته لایه واسط میان سخت‌افزار و برنامه‌ها است و چهار وظیفه اصلی دارد: مدیریت فرآیندها (کدام برنامه چه زمانی روی پردازنده اجرا شود)، مدیریت حافظه (چه مقدار رم به هر برنامه اختصاص یابد)، مدیریت سیستم‌فایل (نحوه ذخیره داده‌ها روی دیسک) و مدیریت دستگاه‌ها به کمک درایورها (دیسک‌ها، شبکه، کارت گرافیک و غیره). + +هسته لینوکس **یکپارچه اما ماژولار** (Monolithic but modular) است: بخش اصلی آن به صورت یکپارچه کار می‌کند اما درایورها را می‌توان در زمان اجرا به عنوان ماژول بارگذاری یا خارج کرد. + +```bash +uname -r # نسخه هسته در حال کار +lsmod # لیست ماژول‌های فعال هسته +modinfo # اطلاعات مربوط به یک ماژول خاص +ls /boot # فایل‌های هسته (vmlinuz) و initramfs در اینجا قرار دارند +``` + +**تمرین:** نسخه هسته را بررسی کرده و لیستی از ماژول‌های بارگذاری‌شده را دریافت کنید. ماژول مربوط به کارت شبکه یا سیستم‌فایل خود را در میان آن‌ها پیدا کنید. + +## T2. فضای هسته (Kernel space) و فضای کاربر (User space)، فراخوانی‌های سیستم + +حافظه و اجرای برنامه‌ها به دو دنیای مجزا تقسیم می‌شوند. **فضای هسته (Kernel space)** محیطی با دسترسی‌های کامل و ویژه است که هسته در آن اجرا می‌شود و به سخت‌افزار دسترسی کامل دارد. **فضای کاربر (User space)** محیطی است که تمام برنامه‌های عادی در آن اجرا می‌شوند و دسترسی مستقیم آن‌ها به سخت‌افزار ممنوع است. این یک سیستم حفاظتی است: یک باگ یا ویروس در یک برنامه عادی نمی‌تواند کل سیستم را مستقیماً از کار بیندازد. + +اما اگر برنامه‌ای بخواهد فایلی را بخواند یا اتصالی در شبکه ایجاد کند در حالی که دسترسی به سخت‌افزار ندارد، چه می‌کند؟ این کار از طریق **فراخوانی‌های سیستم (System Calls)** انجام می‌شود. فراخوانی‌های سیستم در واقع یک «لیست درخواست‌ها» از هسته است، مانند: `open` ،`read` ،`write` ،`fork` ،`execve` ،`socket` و حدود ۳۰۰ مورد دیگر. برنامه به هسته می‌گوید «این فایل را برای من بخوان»، هسته مجوزهای دسترسی را بررسی می‌کند و کار را به نمایندگی از برنامه انجام می‌دهد. انتقال از فضای کاربر به فضای هسته *Context Switch* نامیده می‌شود و زمان پردازنده را مصرف می‌کند. + +```bash +strace ls # نشان دادن تمام فراخوانی‌های سیستم برای دستور ls +strace -c ls # خلاصه آماری: چه فراخوانی‌هایی و به چه تعداد انجام شده‌اند +ltrace # کاری مشابه برای فراخوانی‌های توابع کتابخانه‌ای +``` + +این ابزار قدرتمندترین وسیله برای عیب‌یابی است: وقتی برنامه‌ای «قفل می‌کند» یا «فایلی را پیدا نمی‌کند»، ابزار `strace` به شما نشان می‌دهد برنامه دقیقاً روی کدام فراخوانی سیستم و کدام مسیر فایل متوقف شده است. + +**تمرین:** دستور `strace -c ls` را اجرا کنید و ببینید دستور ساده `ls` چه فراخوانی‌هایی انجام می‌دهد. فراخوانی‌های `openat` ،`read` و `write` را پیدا کنید. سپس دستور `strace cat nonexistent_file` را اجرا کنید تا ببینید چگونه فراخوانی `openat` خطای `ENOENT` را برمی‌گرداند. + +## T3. فرآیندها: تولد، زندگی و مرگ + +فرآیند (Process) برنامه‌ای در حال اجراست که فضای آدرس حافظه، فایل‌های باز و وضعیت خاص خود را دارد. هر فرآیند یک شناسه عددی (PID) و یک والد (PPID) دارد. + +**نحوه ایجاد فرآیندها:** در لینوکس فرآیند جدید تقریباً همیشه با دو فراخوانی سیستم ایجاد می‌شود: `fork()` یک کپی دقیق از فرآیند فعلی (فرزند) ایجاد می‌کند و `execve()` کد فرآیند فرزند را با برنامه جدید جایگزین می‌کند. به همین دلیل تمام فرآیندها یک والد دارند و درختی را تشکیل می‌دهند که ریشه آن فرآیند با شناسه PID 1 (که همان سیستم init/systemd است) می‌باشد که ابتدا توسط هسته راه‌اندازی می‌شود. + +```bash +pstree -p # نمایش درخت فرآیندها به همراه شناسه‌های عددی +ps -ef --forest # نمایش درخت فرآیندها در قالبی دیگر +echo $$ # شناسه PID پوسته فعلی شما +ps -o ppid= -p $$ # شناسه والد پوسته شما (PPID) +``` + +**وضعیت‌های فرآیند:** در ستون STAT خروجی دستور `ps aux` حروف مختلفی را مشاهده می‌کنید: `R` یعنی در حال اجرا یا آماده برای اجرا (running)، `S` یعنی خواب قابل قطع، در انتظار یک رویداد (interruptible sleep)، `D` یعنی خواب غیرقابل قطع که معمولاً منتظر عملیات دیسک است (به همین دلیل فرآیندی که در وضعیت `D` است را نمی‌توان حتی با `kill -9` متوقف کرد)، `Z` یعنی زامبی (فرآیند پایان یافته اما والد هنوز کد خروج آن را دریافت نکرده است)، `T` یعنی متوقف شده (Stopped). + +**فرآیندهای زامبی و یتیم:** وقتی فرآیندی کار خود را پایان می‌دهد، تا زمانی که والدش کد خروج او را با فراخوانی `wait()` نخواند، به صورت «زامبی» در سیستم باقی می‌ماند. اگر والد زودتر از فرزند بمیرد، فرآیند فرزند «یتیم» شده و فرآیند PID 1 سرپرستی آن را بر عهده می‌گیرد. وجود تعداد زیادی فرآیند زامبی نشانه وجود باگ در برنامه والد است که منابع فرزندانش را پاک‌سازی نمی‌کند. + +**زمان‌بند (Scheduler):** در هر هسته پردازنده در یک لحظه فقط یک فرآیند اجرا می‌شود، اما هسته ده‌ها بار در ثانیه فرآیندها را جابه‌جا می‌کند تا حس اجرای هم‌زمان را به کاربر القا کند. اینکه چه فرآیندی چه زمان اجرا شود را زمان‌بند بر اساس اولویت تصمیم می‌گیرد. اولویت با مقدار `nice` از ۲۰- (بسیار مهم) تا ۱۹+ (بسیار کم‌اهمیت و سازگار) تنظیم می‌شود. + +```bash +nice -n 10 # اجرای یک برنامه با اولویت پایین‌تر +renice -n 5 -p # تغییر اولویت یک فرآیند در حال کار +top # ستون‌های PR و NI اولویت‌ها را نشان می‌دهند +``` + +**تمرین:** با دستور `pstree -p` درخت فرآیندها را مشاهده کرده و فرآیند با شناسه PID 1 را بیابید. شناسه عددی پوسته خود را با `echo $$` به دست آورید. دستور `sleep 1000 &` را اجرا کنید، وضعیت آن را در `ps aux` بررسی کنید (باید `S` یعنی خوابیده باشد) و سپس اولویت آن را با `renice` تغییر دهید. + +## T4. مدیریت حافظه: حافظه مجازی، صفحات و swap + +هر فرآیندی تصور می‌کند که کل حافظه سیستم را به صورت اختصاصی و پیوسته (از آدرس صفر) در اختیار دارد. این یک توهم است که هسته با همکاری پردازنده از طریق **حافظه مجازی (Virtual Memory)** ایجاد می‌کند. هر فرآیند *فضای آدرس مجازی* مخصوص به خود را دارد و هسته آدرس‌های مجازی را از طریق جداول صفحه (Page Tables) به آدرس‌های فیزیکی واقعی رم نگاشت می‌کند. به همین دلیل فرآیندها از هم ایزوله هستند و هیچ فرآیندی نمی‌تواند حافظه فرآیند دیگر را بخواند یا خراب کند. + +حافظه به جای تک‌بایت‌ها، در بلوک‌های با اندازه ثابت به نام **صفحه (Page)** مدیریت می‌شود (که معمولاً ۴ کیلوبایت است). وقتی برنامه‌ای به حافظه نیاز دارد، هسته به آن صفحه اختصاص می‌دهد. صفحات فیزیکی فقط زمانی به رم اختصاص داده می‌شوند که برنامه واقعاً به آن‌ها مراجعه کند (lazy allocation)؛ به همین دلیل است که برنامه‌ها می‌توانند گیگابایت‌ها فضا رزرو کنند ولی مقدار واقعی رم مصرفی آن‌ها کم باشد. + +**حافظه مبادله (Swap):** بخشی روی دیسک است که وقتی رم سیستم پر می‌شود، هسته صفحات کم‌مصرف حافظه را به آنجا منتقل می‌کند. این کار سیستم را از سقوط و کرش نجات می‌دهد اما سرعت دیسک هزاران بار کمتر از رم است؛ بنابراین استفاده شدید از swap یعنی کاهش شدید سرعت سیستم. اگر swap پر شود و رم هم تمام شود، مکانیسم **OOM Killer** (Out Of Memory Killer) فعال می‌شود؛ هسته پرمصرف‌ترین فرآیند را می‌کشد تا کل سیستم پایدار بماند. + +همچنین درک ستون‌های خروجی دستور `free -h` مهم است: حافظه مصرفی برای کش فایل‌ها (`buff/cache`) هدر نرفته است و هسته در صورت نیاز برنامه‌ها فوراً آن را آزاد می‌کند. به همین دلیل کم بودن فضا در ستون free در لینوکس عادی است و شما باید به ستون `available` توجه کنید. + +```bash +free -h # وضعیت رم و swap؛ به ستون available نگاه کنید +cat /proc/meminfo # اطلاعات بسیار دقیق درباره حافظه +vmstat 1 # آمار حافظه و مبادله در هر ثانیه +cat /proc//status # میزان حافظه مصرفی یک فرآیند خاص +dmesg | grep -i oom # بررسی اینکه آیا OOM Killer فعال شده است یا خیر +``` + +**تمرین:** دستور `free -h` را اجرا کرده و ستون `available` را که نشان‌دهنده حافظه واقعی در دسترس برنامه‌هاست بیابید. فایل `/proc/meminfo` را باز کنید. دستور `vmstat 1` را اجرا کرده و ستون‌های `si`/`so` (ورود و خروج به swap) را بررسی کنید؛ در حالت عادی این ستون‌ها باید صفر باشند. + +## T5. سیستم‌فایل‌ها و inode: داده‌ها چگونه روی دیسک قرار می‌گیرند + +این بخش یکی از کلیدی‌ترین مباحث تئوری است که بدون آن مفاهیمی مثل مجوزهای دسترسی و لینک‌ها عجیب به نظر می‌رسند. + +هر فایل روی دیسک از دو بخش تشکیل شده است: **متاداده یا فرا داده** (مالک فایل، مجوزها، اندازه، زمان‌ها و موقعیت بلوک‌های داده) و خود **داده‌ها**. متاداده‌ها در ساختاری به نام **inode** (index node یا گره نشانه) ذخیره می‌شوند. هر فایل در سیستم‌فایل یک inode اختصاصی با یک شماره منحصر‌به‌فرد دارد. نکته بسیار مهم این است که **نام فایل در خود inode ذخیره نمی‌شود**. + +پس نام فایل کجاست؟ نام فایل در **پوشه (Directory)** ذخیره می‌شود. پوشه در لینوکس در واقع جدولی است که نام فایل را به شماره inode نگاشت می‌کند. وقتی فایلی مانند `/etc/hosts` را باز می‌کنید، هسته مسیر پوشه‌ها را دنبال می‌کند: ابتدا در پوشه ریشه `/` ورودی `etc` را پیدا کرده و شماره inode آن را به دست می‌آورد، سپس درون آن ورودی `hosts` و شماره inode آن را پیدا می‌کند و در نهایت متاداده‌ها و داده‌های فایل را بر اساس آن inode می‌خواند. + +از این ساختار می‌توان فهمید لینک‌ها چگونه کار می‌کنند: **لینک سخت (Hard link)** فقط یک ورودی جدید در جدول پوشه با همان شماره inode قبلی است. فایل تا زمانی روی دیسک باقی می‌ماند که حداقل یک پیوند به inode آن وجود داشته باشد (شمارنده پیوندها در inode). **لینک نمادین (Symbolic link یا میان‌بر)** یک فایل کوچک مجزا با inode جدید است که درون آن مسیر متنی فایل مقصد نوشته شده است؛ اگر فایل مقصد حذف شود، لینک نمادین خراب می‌شود. + +اکنون مشخص است چرا برای حذف یک فایل به دسترسی نوشتن روی *پوشه* نیاز دارید نه روی خود فایل؛ زیرا شما در حال ویرایش جدول پوشه هستید نه خود فایل. همچنین مشخص می‌شود چرا دستور انتقال `mv` در یک سیستم‌فایل، حتی برای فایل‌های چندگیگابایتی آنی انجام می‌شود؛ زیرا فقط نام فایل در جدول پوشه تغییر می‌کند و داده‌های روی دیسک جابه‌جا نمی‌شوند. + +```bash +ls -i file # نمایش شماره inode فایل +stat file # نمایش تمام متاداده‌ها: inode، مجوزها، لینک‌ها و زمان‌ها +df -i # نمایش تعداد inodeهای آزاد (ممکن است تعداد آن‌ها تمام شود!) +ln target hardlink # ایجاد لینک سخت — استفاده از همان inode +ln -s target symlink # ایجاد لینک نمادین — inode جدید حاوی مسیر فایل مقصد +``` + +یک واقعیت کاربردی: ممکن است دیسک شما پر شود در حالی که دستور `df -h` فضای خالی را نشان می‌دهد؛ این اتفاق زمانی می‌افتد که تعداد فایل‌های بسیار کوچک زیاد باشد و کل اینودها تمام شده باشد (`df -i`). + +انواع سیستم‌فایل‌ها: **ext4** استاندارد و پایدار لینوکس است؛ **XFS** برای فایل‌های بزرگ عالی است؛ **Btrfs** و **ZFS** سیستم‌فایل‌های مدرن با قابلیت‌هایی مثل اسنپ‌شات و بررسی خودکار سلامت داده‌ها هستند؛ **vfat/exFAT** برای سازگاری با فلش‌مموری‌ها و ویندوز استفاده می‌شوند. سیستم‌فایل‌های دارای ژورنال (مانند ext4 و XFS) تغییرات را ابتدا در لاگ می‌نویسند تا در صورت قطع ناگهانی برق، یکپارچگی داده‌ها حفظ شود. + +**تمرین:** یک فایل بسازید، شماره اینود آن را با `ls -i` و متاداده‌های آن را با `stat` بررسی کنید. یک لینک سخت بسازید و با `ls -i` ببینید که شماره inode آن‌ها کاملاً یکسان است و تعداد لینک‌ها در خروجی `stat` به ۲ افزایش یافته است. یک لینک نمادین بسازید و ببینید که شماره اینود متفاوتی دارد. فایل اصلی را حذف کنید و وضعیت هر دو لینک را بسنجید. + +## T6. بوت شدن سیستم: از دکمه پاور تا اعلان ورود + +درک فرآیند بوت زمانی به کار می‌آید که سیستم بالا نمی‌آید. مراحل به ترتیب عبارتند از: + +1. **سخت‌افزار سیستم (BIOS یا UEFI).** با روشن شدن کامپیوتر، پردازنده کدهای فیرم‌ور مادربورد را اجرا می‌کند. سخت‌افزار بررسی می‌شود (تست POST) و بوت‌لودر پیدا می‌شود. سیستم‌های قدیمی BIOS بخش MBR (بخش اول دیسک) را می‌خوانند، سیستم‌های مدرن UEFI بخش EFI را بررسی کرده و فایل‌های با پسوند `.efi` را اجرا می‌کنند. +2. **بوت‌لودر (Bootloader) که معمولاً GRUB است.** منوی انتخاب سیستم‌عامل و نسخه هسته را نشان می‌دهد، هسته لینوکس (`vmlinuz`) و ایمیج موقت سیستم‌فایل `initramfs` را در حافظه بارگذاری کرده و پارامترها را به هسته پاس می‌دهد. +3. **راه‌اندازی هسته لینوکس.** هسته از حالت فشرده خارج شده و مدیریت حافظه و پردازنده را فعال می‌کند. سیستم‌فایل موقت `initramfs` را سوار (mount) می‌کند که شامل درایورهای اولیه برای دسترسی به دیسک اصلی است (مثلاً درایورهای RAID یا رمزنگاری دیسک). +4. **سوار کردن دیسک اصلی `/`** و هسته اولین فرآیند یعنی **init** را اجرا می‌کند که در سیستم‌های مدرن همان **systemd** با شناسه PID 1 است. +5. **سیستم systemd بقیه بخش‌ها را بالا می‌آورد:** دیسک‌ها را از فایل `/etc/fstab` سوار می‌کند، سرویس‌ها را بر اساس وابستگی‌ها اجرا می‌کند، سیستم را به نقطه هدف نهایی خود (target) می‌رساند که معمولاً `multi-user.target` برای سرورها و `graphical.target` برای دسکتاپ‌ها است و در نهایت صفحه ورود را نمایش می‌دهد. + +```bash +systemd-analyze # زمان بارگذاری و بوت شدن سیستم +systemd-analyze blame # سرویس‌هایی که بیشترین زمان بوت را گرفته‌اند +systemctl get-default # هدف (target) پیش‌فرض بوت سیستم +journalctl -b # بررسی تمام لاگ‌های مربوط به بوت فعلی +cat /proc/cmdline # پارامترهای ارسالی به هسته در زمان بوت +``` + +مفهوم **target** جایگزین سطوح اجرای قدیمی (runlevels) شده است. تارگت در واقع مجموعه‌ای از سرویس‌ها است که باید اجرا شوند. برای مثال با دستور `systemctl isolate multi-user.target` می‌توانید سیستم را به حالت متنی و بدون رابط گرافیکی ببرید. + +**تمرین:** بررسی کنید سیستم شما با دستور `systemd-analyze` چقدر زمان برای بوت نیاز داشته است و کدام سرویس‌ها بر اساس خروجی `systemd-analyze blame` بوت را طولانی کرده‌اند. هدف پیش‌فرض سیستم و پارامترهای راه‌اندازی هسته را مشاهده کنید. + +## T7. پوسته به عنوان مفسر: هنگام وارد کردن دستور چه اتفاقی می‌افتد + +وقتی عبارت `ls -l /etc` را تایپ کرده و Enter می‌زنید، پوسته مراحل زیر را به ترتیب طی می‌کند: خط ورودی را به کلمات مجزا تقسیم می‌کند؛ الگوهای جستجو (`*` و `?`)، متغیرها (`$HOME`) و خروجی دستورات درون پرانتز (`$(...)`) را جایگزین می‌کند؛ برنامه `ls` را در مسیرهای معرفی‌شده در متغیر `PATH` جستجو می‌کند؛ فراخوانی سیستم `fork()` را برای ساخت یک کپی از خود انجام داده و سپس با `execve()` کد فرآیند فرزند را با برنامه `ls` جایگزین می‌کند؛ در نهایت منتظر پایان کار فرآیند مانده و **کد خروج** آن را دریافت می‌کند. + +**کد خروج (Exit Code):** عددی بین ۰ تا ۲۵۵ است که هر برنامه پس از پایان کار خود برمی‌گرداند: مقدار ۰ یعنی موفقیت و هر مقداری غیر از آن به معنی بروز خطا است. این مفهوم اساس نوشتن اسکریپت‌ها و خودکارسازی است. + +```bash +ls /etc; echo $? # نمایش کد خروج آخرین دستور ($? مقدار ۰ یعنی موفقیت) +ls /nonexistent; echo $? # کدی غیر از صفر را برمی‌گرداند +true && echo "ok" # دستور && بعدی را فقط در صورت موفقیت اولی اجرا می‌کند +false || echo "error" # دستور || بعدی را فقط در صورت شکست اولی اجرا می‌کند +``` + +بر اساس این ساختار می‌توان کارهایی مثل `make && sudo make install` را انجام داد تا نصب برنامه فقط در صورت موفقیت‌آمیز بودن کامپایل انجام شود. درک fork/exec به ما نشان می‌دهد چرا دستور `cd` یک دستور داخلی پوسته (shell builtin) است نه یک برنامه مجزا؛ زیرا اگر `cd` به عنوان یک فرآیند فرزند اجرا می‌شد، مسیر را برای فرآیند خودش تغییر می‌داد و مسیر پوسته اصلی شما بدون تغییر باقی می‌ماند. + +**تمرین:** یک دستور موفقیت‌آمیز و یک دستور همراه با خطا اجرا کنید و هر بار مقدار `echo $?` را بررسی کنید. یک زنجیره مثل `mkdir test && cd test && pwd` بسازید و با برداشتن دسترسی‌ها کاری کنید که زنجیره در وسط کار متوقف شود و کارکرد `&&` را ببینید. + +--- + +# بخش دوم: عملی + +--- + +## 4. ناوبری در سیستم فایل + +سیستم فایل لینوکس مانند یک درخت یکپارچه از ریشه `/` شروع می‌شود. دیسک‌های C: یا D: وجود ندارند؛ تمام موارد از جمله فلش‌مموری‌ها و پوشه‌های تحت شبکه در این درخت یکپارچه سوار (mount) می‌شوند. + +```bash +ls # لیست فایل‌ها و پوشه‌ها +ls -l # جزئیات کامل: مجوزها، مالک، حجم، تاریخ +ls -la # نمایش فایل‌های مخفی (فایل‌هایی که با نقطه شروع می‌شوند) +ls -lh # نمایش حجم فایل‌ها به صورت خوانا برای انسان (K, M, G) +cd /etc # رفتن به پوشه مورد نظر +cd .. # برگشتن به یک پوشه عقب‌تر +cd ~ # رفتن به پوشه خانگی کاربر فعلی (Home) +cd - # برگشتن به پوشه قبلی که در آن بودید +tree # نمایش درختی پوشه‌ها (نیازمند نصب بسته tree) +``` + +مسیرهای مطلق و نسبی: مسیرهایی که با `/` شروع می‌شوند مطلق (از ریشه سیستم) هستند و سایر مسیرها نسبت به موقعیت فعلی شما سنجیده می‌شوند. علامت `.` نشان‌دهنده پوشه فعلی و `..` نشان‌دهنده پوشه والد (یک پوشه عقب‌تر) است. + +پوشه‌های کلیدی سیستم: + +| پوشه | محتوا | +|------------|----------------------------------------------| +| `/` | ریشه اصلی کل سیستم فایل | +| `/home` | پوشه‌های خانگی کاربران سیستم | +| `/root` | پوشه خانگی کاربر ارشد root | +| `/etc` | فایل‌های تنظیمات و پیکربندی سیستم | +| `/var` | داده‌های متغیر: لاگ‌ها، کش‌ها، پایگاه‌های داده | +| `/usr/bin` | فایل‌های اجرایی برنامه‌های کاربر و سیستم | +| `/usr/lib` | کتابخانه‌های مورد نیاز برنامه‌ها | +| `/tmp` | فایل‌های موقت (پس از راه‌اندازی مجدد پاک می‌شوند) | +| `/dev` | فایل‌های مربوط به سخت‌افزارها و دستگاه‌ها | +| `/proc` | سیستم فایل مجازی حاوی اطلاعات فرآیندها و هسته| +| `/sys` | سیستم فایل مجازی حاوی تنظیمات دستگاه‌ها | +| `/mnt`, `/media` | محل سوار کردن دیسک‌ها و فلش‌مموری‌ها | +| `/opt` | برنامه‌های جانبی که دستی نصب شده‌اند | +| `/boot` | فایل‌های مربوط به هسته و بوت‌لودر سیستم | + +**تمرین:** از پوشه `/` شروع کنید، به مسیر فایل `/etc/ssh/sshd_config` بروید، مجوزهای آن را با `ls -l` بررسی کنید و معنی تک‌تک حروف مجوز را برای خود تحلیل کنید. سپس با دستور `tree -L 1 /` محتویات شاخه اصلی ریشه را ببینید. + +--- + +## 5. کار با فایل‌ها و پوشه‌ها + +```bash +mkdir projects # ساخت پوشه جدید +mkdir -p a/b/c # ساخت پوشه‌های تو در تو به صورت هم‌زمان +touch notes.txt # ساخت یک فایل خالی یا به‌روزرسانی تاریخ فایل +cp notes.txt backup.txt # کپی کردن فایل +cp -r projects projects_copy # کپی کردن یک پوشه به همراه محتویات آن +cp -i file dest # درخواست تایید قبل از بازنویسی روی فایل مقصد +mv notes.txt readme.txt # تغییر نام یا انتقال فایل +rm readme.txt # حذف فایل +rm -r projects_copy # حذف پوشه به همراه محتویات آن +rm -i file.txt # درخواست تایید قبل از حذف فایل +``` + +در استفاده از دستور `rm` بسیار احتیاط کنید؛ در محیط ترمینال سطل زباله‌ای وجود ندارد و فایل‌های حذف شده قابل بازیابی نیستند. یک قانون خوب برای مبتدیان: قبل از اجرای دستور `rm -r` ابتدا دستور `ls` را روی همان مسیر اجرا کنید تا مطمئن شوید فایل درستی را حذف می‌کنید. هرگز دستوراتی مثل `rm -rf /` را اجرا نکنید و متغیرهای تست‌نشده را در مسیر دستور قرار ندهید. + +**تمرین:** پوشه‌ای به نام `linux-practice` بسازید، درون آن سه فایل ایجاد کنید؛ یکی را کپی کنید، نام دومی را تغییر دهید و سومی را حذف کنید. ساختار تو در توی `a/b/c` را با یک دستور واحد ایجاد کنید. + +--- + +## 6. مشاهده و ویرایش متن + +```bash +cat file.txt # چاپ کل محتویات فایل در خروجی +less file.txt # مرور فایل به صورت صفحه‌به‌صفحه (خروج با q، جستجو با /، رفتن به انتها با G) +head -n 20 file.txt # نمایش ۲۰ سطر اول فایل +tail -n 20 file.txt # نمایش ۲۰ سطر آخر فایل +tail -f /var/log/syslog # مشاهده تغییرات فایل لاگ به صورت زنده و در لحظه +wc -l file.txt # شمارش تعداد سطور فایل +nl file.txt # نمایش محتویات فایل به همراه شماره خطوط +``` + +ابزار `less` بهترین ابزار برای خواندن لاگ‌ها است: کلید `/` برای جستجو به جلو، کلید `?` برای جستجو به عقب، کلید `n` برای رفتن به نتیجه بعدی، کلید `G` برای رفتن به انتهای فایل و کلید `g` برای رفتن به ابتدای فایل استفاده می‌شود. + +**تمرین:** یک فایل لاگ بزرگ سیستم را با ابزار `less` باز کنید، کلمه `error` را در آن جستجو کنید، به انتهای فایل بروید و سپس از برنامه خارج شوید. در نهایت ۵ خط آخر همان فایل لاگ را با یک دستور مشاهده کنید. + +--- + +## 7. مجوزهای دسترسی و مالکان + +موضوعی که بیشتر کاربران تازه‌کار در آن دچار اشتباه می‌شوند. این بخش را به طور اساسی یاد بگیرید. + +یک خط مربوط به مجوزها در خروجی `ls -l` به این شکل است: `-rwxr-xr--` + +- کاراکتر اول نشان‌دهنده نوع فایل است: `-` یعنی فایل معمولی، `d` پوشه، `l` لینک نمادین. +- ۹ کاراکتر بعدی به سه گروه سه تایی تقسیم می‌شوند: مجوزهای **مالک** (owner)، مجوزهای **گروه** (group) و مجوزهای **سایرین** (others). +- کاراکتر `r` یعنی خواندن (ارزش عددی: ۴)، `w` یعنی نوشتن (ارزش عددی: ۲)، `x` یعنی اجرا (ارزش عددی: ۱). + +معنی مجوزها برای پوشه کمی متفاوت است: مجوز `r` یعنی دیدن لیست فایل‌های درون پوشه، `w` یعنی توانایی ساخت و حذف فایل در آن، و `x` یعنی وارد شدن به پوشه با دستور `cd`. + +```bash +chmod 644 file.txt # مجوز rw-r--r-- (فایل معمولی) +chmod 755 script.sh # مجوز rwxr-xr-x (اسکریپت یا برنامه اجرایی) +chmod 600 secret.key # مجوز rw------- (فقط مالک دسترسی دارد، مناسب کلیدهای خصوصی) +chmod +x script.sh # اضافه کردن قابلیت اجرایی به فایل +chmod -R 755 mydir # اعمال مجوز به پوشه و تمام زیرمجموعه‌های آن به صورت بازگشتی +chown user file.txt # تغییر مالک فایل (نیازمند دستور sudo) +chown user:group file # تغییر هم‌زمان مالک و گروه فایل +``` + +محاسبه مقادیر عددی: مجوز `rwx` یعنی ۴+۲+۱ = ۷. مجوز `r-x` یعنی ۴+۱ = ۵. مجوز `-r` یعنی ۴. بنابراین کد مجوز `755` یعنی: مالک دسترسی کامل (۷)، گروه و سایرین دسترسی خواندن و اجرا (۵) دارند. به عنوان یک راهنمای سریع: از `755` برای برنامه‌ها و پوشه‌ها، از `644` برای فایل‌های معمولی و از `600` برای فایل‌های حساس و کلیدها استفاده کنید. + +**تمرین:** یک اسکریپت به نام `hello.sh` بسازید که خط درون آن `echo "hello"` باشد. آن را اجرا کنید؛ با خطای «Permission denied» مواجه می‌شوید. مجوز اجرای آن را با دستور `chmod +x` بدهید و دوباره آن را با `hello.sh/.` اجرا کنید. دلیل خطا در مرحله اول را تحلیل کنید. سپس مجوز فایل را روی `600` تنظیم کنید و مطمئن شوید کاربر دیگری در سیستم نمی‌تواند آن را بخواند. + +--- + +## 8. کاربران، گروه‌ها و sudo + +در لینوکس همه‌چیز چندکاربره است. کاربر `root` کاربر ارشد سیستم است که به همه‌چیز دسترسی دارد. کار کردن مداوم با کاربر root خطرناک است؛ به همین دلیل از دستور `sudo` برای اجرای دستورات با دسترسی‌های مدیریتی موقت استفاده می‌شود. + +```bash +sudo apt update # اجرای دستور با دسترسی root +sudo -i # باز کردن یک شل کامل با دسترسی root (با احتیاط استفاده شود) +id # نمایش شناسه‌ها و گروه‌های کاربر فعلی +whoami # نمایش نام کاربر فعلی سیستم +sudo adduser alex # ساخت کاربر جدید به نام alex +sudo passwd alex # تنظیم رمز عبور برای کاربر جدید +sudo usermod -aG sudo alex # اضافه کردن کاربر به گروه sudo (جهت دسترسی به دستور sudo) +groups alex # نمایش گروه‌هایی که کاربر alex در آن‌ها عضو است +su - alex # سوئیچ کردن به کاربر alex +``` + +محل ذخیره اطلاعات کاربران: فایل `/etc/passwd` (لیست کاربران)، `/etc/group` (گروه‌ها) و `/etc/shadow` (هش رمزهای عبور کاربران که فقط برای root خواندنی است). گروه‌ها به ما اجازه می‌دهند دسترسی‌ها را به صورت دسته‌جمعی مدیریت کنیم؛ مثلاً تمام کاربران عضو گروه `docker` می‌توانند کانتینرها را مدیریت کنند. + +**تمرین:** کاربری به نام `test` بسازید، او را به گروه sudo اضافه کنید، با دستور `su - test` به این کاربر سوئیچ کنید، مقادیر خروجی دستورات `whoami` و `id` را بررسی کنید و در نهایت کاربر را حذف کنید: `sudo deluser test`. + +--- + +## 9. مدیریت بسته‌ها (پکیج منیجرها) + +برنامه‌ها در لینوکس از فایل‌های با پسوند exe نصب نمی‌شوند، بلکه از مخازن رسمی (Repositories) به کمک مدیریت بسته‌ها دانلود و نصب می‌شوند. مدیریت بسته به طور خودکار برنامه و تمام نیازمندی‌های (Dependencies) آن را نصب می‌کند. دستورات بسته به نوع توزیع متفاوت است. + +**خانواده Debian / Ubuntu (ابزار apt):** + +```bash +sudo apt update # به‌روزرسانی لیست بسته‌های در دسترس مخازن +sudo apt upgrade # ارتقای تمام بسته‌های نصب‌شده سیستم به آخرین نسخه +sudo apt install htop # نصب برنامه htop +sudo apt remove htop # حذف برنامه htop +sudo apt autoremove # پاک‌سازی وابستگی‌های بلااستفاده سیستم +apt search nginx # جستجوی بسته nginx در مخازن +apt show nginx # نمایش جزئیات و اطلاعات مربوط به بسته nginx +``` + +**خانواده Fedora / RHEL (ابزار dnf):** + +```bash +sudo dnf install htop +sudo dnf remove htop +sudo dnf upgrade +dnf search htop +``` + +**توزیع Arch (ابزار pacman):** + +```bash +sudo pacman -S htop # نصب برنامه +sudo pacman -Syu # به‌روزرسانی کامل سیستم +sudo pacman -R htop # حذف برنامه +pacman -Ss htop # جستجوی برنامه +``` + +فرمت‌های جهانی که روی تمام توزیع‌ها کار می‌کنند: **Snap** (دستور `snap install`)، **Flatpak** (دستور `flatpak install`) و **AppImage** (فایل‌های اجرایی پرتابل بدون نیاز به نصب). این بسته‌ها حجم بیشتری دارند اما زمانی که برنامه در مخزن رسمی توزیع وجود ندارد بسیار کاربردی هستند. + +یک عادت خوب: همیشه قبل از اجرای دستور `apt install` دستور `apt update` را اجرا کنید تا لیست بسته‌های شما به‌روز باشد. + +**تمرین:** برنامه‌های `htop` ،`tree` و `ncdu` را نصب کنید. هر کدام را اجرا کرده و کارکرد آن‌ها را ببینید: htop برای فرآیندها، tree برای درخت پوشه‌ها و ncdu برای بررسی فضای مصرفی دیسک. در نهایت برنامه `tree` را حذف کرده و دوباره نصب کنید. + +--- + +## 10. ویرایشگرهای متن + +بدون توانایی ویرایش فایل‌های پیکربندی در محیط ترمینال، روی سرورها کارایی نخواهید داشت. حداقل کار با `nano` را یاد بگیرید و در صورت امکان مبانی کار با ویرایشگر قدرتمند `vim` را فرا بگیرید. + +**ویرایشگر nano** (ساده و مناسب برای شروع): + +```bash +nano file.txt +# کلید Ctrl+O برای ذخیره، Ctrl+X برای خروج، Ctrl+W برای جستجو و Ctrl+K برای بریدن خط فعلی +``` + +**ویرایشگر vim** (بسیار قدرتمند اما نیازمند تمرین). حالت‌های کارکرد اصلی: + +- حالت درج یا `i` (Insert mode): در این حالت می‌توانید متن خود را تایپ کنید. +- حالت دستور یا کلید `Esc` (Command mode): برای وارد کردن دستورات ویرایشگر. +- دستور `:w` برای ذخیره، `:q` برای خروج، `:wq` برای ذخیره و خروج، `:q!` برای خروج بدون ذخیره تغییرات. +- دستور `dd` برای حذف خط، `yy` برای کپی خط، `p` برای چسباندن خط کپی شده، و دستور `/word` برای جستجوی واژه. + +اگر به طور تصادفی وارد محیط vim شدید و راه خروج را پیدا نکردید: کلید `Esc` را فشار دهید، عبارت `:q!` را تایپ کرده و کلید Enter را بزنید. + +توصیه: در بسیاری از سرورها به صورت پیش‌فرض ویرایشگر vim نصب است؛ پس یادگیری اصول اولیه آن حتی در حد باز کردن و ویرایش ساده فایل‌ها ضروری است. + +**تمرین:** در ویرایشگر vim یک فایل بسازید، ۵ خط متن بنویسید، یک خط را با `dd` حذف کنید، خط دیگری را با `yy` کپی و با `p` بچسبانید، فایل را ذخیره کرده و خارج شوید. همین مراحل را در ویرایشگر nano نیز تمرین کنید. + +--- + +## 11. جستجوی فایل‌ها و محتوا + +در ترمینال دو کار متفاوت داریم: پیدا کردن فایل بر اساس نام و پیدا کردن متن خاصی در درون فایل‌ها. + +جستجوی فایل‌ها بر اساس نام و ویژگی‌ها — ابزار `find`: + +```bash +find / -name "*.conf" # پیدا کردن تمام فایل‌هایی که با پسوند .conf تمام می‌شوند +find /home -type f -size +100M # پیدا کردن فایل‌های بزرگ‌تر از ۱۰۰ مگابایت در شاخه خانه +find /var/log -name "*.log" -mtime -7 # پیدا کردن فایل‌های لاگ تغییر یافته در ۷ روز اخیر +find . -type d -name "cache" # پیدا کردن پوشه‌هایی به نام cache +find . -name "*.tmp" -delete # پیدا کردن و حذف خودکار فایل‌های با پسوند .tmp (با احتیاط!) +``` + +جستجوی سریع بر اساس ایندکس سیستم — ابزار `locate` (نیازمند نصب بسته و به‌روزرسانی دیتابیس با دستور `sudo updatedb`): + +```bash +locate nginx.conf # جستجوی آنی بر اساس ایندکس ساخته‌شده در دیتابیس سیستم +which python3 # پیدا کردن مسیر دقیق فایل اجرایی برنامه python3 +``` + +جستجوی متن در درون فایل‌ها — ابزار `grep`: + +```bash +grep "error" /var/log/syslog # پیدا کردن خطوط حاوی کلمه error در فایل لاگ سیستم +grep -i "error" file # جستجو بدون حساسیت به حروف کوچک و بزرگ +grep -r "TODO" . # جستجوی بازگشتی عبارت TODO در تمام فایل‌های پوشه فعلی +grep -n "error" file # نمایش شماره خطوط در کنار نتایج جستجو +grep -v "debug" file # نمایش خطوطی که شامل کلمه debug نیستند +grep -c "error" file # شمارش تعداد دفعات تکرار عبارت مورد نظر در فایل +``` + +**تمرین:** در پوشه `/etc` تمام فایل‌های دارای پسوند `.conf` را بیابید. سپس در همان پوشه تمامی فایل‌هایی را که شامل عبارت `port` (بدون حساسیت به حروف کوچک و بزرگ) هستند به همراه شماره خطوط پیدا کنید. + +--- + +## 12. لوله‌ها، فیلترها و پردازش متن + +قدرت واقعی ترمینال در ترکیب دستورات با استفاده از کاراکتر لوله `|` (pipe) است؛ با این کار خروجی یک دستور به ورودی دستور بعدی تبدیل می‌شود. + +ابزارهای پایه در فیلتر کردن و پردازش متن: + +```bash +wc -l # شمارش خطوط ورودی +sort # مرتب‌سازی خطوط متنی +sort -n # مرتب‌سازی بر اساس مقادیر عددی +uniq # حذف خطوط تکراری پشت سر هم (معمولاً بعد از دستور sort استفاده می‌شود) +uniq -c # شمارش تعداد دفعات تکرار هر خط متنی +cut -d: -f1 # برش متن بر اساس جداکننده : و استخراج ستون اول +awk '{print $1}' # چاپ ستون اول از ورودی متنی +sed 's/foo/bar/g' # جایگزینی تمام عبارت‌های foo با bar در متن ورودی +tr 'a-z' 'A-Z' # تبدیل حروف کوچک انگلیسی به حروف بزرگ +``` + +نمونه‌ای از یک سناریوی واقعی — استخراج ۱۰ آی‌پی برتر که بیشترین درخواست را در فایل لاگ وب‌سرور داشته‌اند: + +```bash +cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10 +``` + +تحلیل دستور بالا: دستور `cat` فایل را می‌خواند، `awk` ستون اول (IP) را جدا می‌کند، `sort` آی‌پی‌های مشابه را کنار هم قرار می‌دهد، `uniq -c` تعداد هر آی‌پی را می‌شمارد، دستور `sort -rn` نتایج را بر اساس تعداد به صورت نزولی مرتب می‌کند و در نهایت `head -10` ده نتیجه برتر را نشان می‌دهد. + +**تمرین:** نام تمام کاربران سیستم را از فایل `/etc/passwd` (ستون اول، با جداکننده `:`) استخراج کرده و آن‌ها را به ترتیب حروف الفبا مرتب کنید. در نهایت تعداد کل کاربران سیستم را محاسبه و چاپ کنید (راهنمایی: استفاده از `wc -l`). + +--- + +## 13. تغییر مسیر جریان‌ها + +هر برنامه‌ای در لینوکس دارای سه جریان اصلی است: جریان ورودی استاندارد (stdin)، جریان خروجی استاندارد (stdout) و جریان خطای استاندارد (stderr). ما می‌توانیم این جریان‌ها را به فایل‌ها هدایت کنیم. + +```bash +echo "hello" > file.txt # نوشتن خروجی در فایل (محتویات قبلی فایل پاک می‌شود) +echo "more" >> file.txt # اضافه کردن متن جدید به انتهای فایل فعلی +command 2> errors.txt # هدایت فقط پیام‌های خطا به فایل مشخص‌شده +command > out.txt 2>&1 # هدایت هم خروجی معمولی و هم خطاها به یک فایل واحد +command < input.txt # خواندن ورودی برنامه از روی فایل به جای کیبورد +command 2>/dev/null # دور ریختن کامل پیام‌های خطا و عدم نمایش آن‌ها +``` + +مسیر `/dev/null` مانند یک «سیاه‌چاله» در لینوکس کار می‌کند؛ هر داده‌ای که به آن ارسال شود نابود می‌شود. این ویژگی برای نادیده گرفتن خروجی‌ها یا خطاهای مزاحم بسیار مفید است. + +ترکیب با لوله‌ها: دستور `command | tee file.txt` خروجی را هم‌زمان روی مانیتور نشان می‌دهد و در فایل مشخص‌شده نیز می‌نویسد. + +**تمرین:** خروجی دستور `ls -la /etc` را در فایلی به نام `etc-list.txt` ذخیره کنید، سپس تاریخ فعلی را با دستور `date >> etc-list.txt` به انتهای همان فایل اضافه کنید. در نهایت درستی کار را با دستور `cat` بسنجید. + +--- + +## 14. فرآیندها و سیگنال‌ها + +هر برنامه‌ای که در سیستم اجرا می‌شود یک فرآیند (Process) نام دارد که دارای یک شناسه منحصر‌به‌فرد به نام PID است. + +```bash +ps aux # نمایش لیست تمام فرآیندهای در حال اجرای سیستم +ps aux | grep nginx # پیدا کردن فرآیند مربوط به برنامه nginx +top # مانیتورینگ زنده و پویای فرآیندهای سیستم (خروج با q) +htop # ابزاری بسیار راحت‌تر و رنگی‌تر از top با پشتیبانی از ماوس +kill 1234 # ارسال سیگنال خاتمه معمولی (TERM) به فرآیند شماره ۱۲۳۴ +kill -9 1234 # کشتن اجباری فرآیند (KILL) به عنوان آخرین راهکار ممکن +pkill firefox # کشتن فرآیند بر اساس نام برنامه +nice / renice # تنظیم اولویت اجرای فرآیندها در پردازنده +``` + +سیگنال‌ها راه ارتباطی ما با فرآیندها هستند. سیگنال `SIGTERM` (کد ۱۵) از برنامه می‌خواهد که به آرامی کار خود را پایان دهد، سیگنال `SIGKILL` (کد ۹) برنامه را فوراً و بدون اجازه ذخیره داده‌ها نابود می‌کند و سیگنال `SIGHUP` (کد ۱) معمولاً برای بارگذاری مجدد فایل تنظیمات سرویس‌ها استفاده می‌شود. همیشه ابتدا از دستور `kill` معمولی استفاده کنید و فقط در صورتی که برنامه قفل کرده بود از `kill -9` استفاده کنید. + +مدیریت کارهای پس‌زمینه (Background Tasks): + +```bash +sleep 100 & # اجرای برنامه در پس‌زمینه ترمینال +jobs # نمایش لیست کارهای در حال اجرای پس‌زمینه در ترمینال فعلی +fg # انتقال برنامه پس‌زمینه به پیش‌زمینه ترمینال +bg # ادامه اجرای برنامه متوقف‌شده در پس‌زمینه +nohup long.sh & # اجرای برنامه به گونه‌ای که با بستن ترمینال نیز متوقف نشود +``` +(کلید میان‌بر `Ctrl+Z` اجرای فرآیند فعلی در پیش‌زمینه را موقتاً متوقف می‌کند.) + +**تمرین:** دستور `sleep 300 &` را اجرا کنید، شناسه PID آن را با دستور `ps aux | grep sleep` بیابید و آن را با دستور `kill` معمولی خاتمه دهید. سپس فرآیند جدیدی از همان نوع بسازید و این بار آن را با دستور `pkill` از بین ببرید. + +--- + +## 15. systemd و سرویس‌ها + +توزیع‌های مدرن لینوکس مدیریت سرویس‌ها را با ابزار systemd انجام می‌دهند. هر مدیر سروری باید کار با این ابزار را بلد باشد. یک سرویس (unit) برنامه‌ای است که در پس‌زمینه سیستم اجرا می‌شود؛ مانند وب‌سرور، پایگاه داده یا سرویس SSH. + +```bash +systemctl status ssh # نمایش وضعیت فعلی سرویس ssh +sudo systemctl start nginx # راه‌اندازی و اجرای سرویس nginx +sudo systemctl stop nginx # متوقف کردن سرویس nginx +sudo systemctl restart nginx # راه‌اندازی مجدد (ری‌استارت) سرویس nginx +sudo systemctl reload nginx # بارگذاری مجدد تنظیمات بدون قطع شدن کار سرور +sudo systemctl enable nginx # فعال‌سازی اجرای خودکار سرویس هم‌زمان با روشن شدن سیستم +sudo systemctl disable nginx # غیرفعال‌سازی اجرای خودکار سرویس در زمان بوت +systemctl list-units --type=service # نمایش لیست تمام سرویس‌های فعال سیستم +systemctl is-enabled nginx # بررسی وضعیت اجرای خودکار سرویس در زمان بوت +``` + +تفاوت این دو بسیار مهم است: دستور `start` سرویس را همین حالا اجرا می‌کند و دستور `enable` تنظیم می‌کند که با بالا آمدن مجدد سیستم در آینده، سرویس به طور خودکار اجرا شود. معمولاً برای سرویس‌های جدید هر دو را با هم اجرا می‌کنند: `systemctl enable --now nginx`. + +**تمرین:** وب‌سرور nginx را نصب کنید، آن را با سوییچ `now--` فعال و اجرا کنید، وضعیت سرویس را بررسی کنید و آدرس `http://localhost` را در مرورگر باز کنید. در نهایت سرویس را متوقف کنید و مطمئن شوید صفحه وب دیگر باز نمی‌شود. + +--- + +## 16. لاگ‌ها و ثبت وقایع + +وقتی مشکلی در سیستم پیش می‌آید، پاسخ حل آن معمولاً در فایل‌های لاگ است. لاگ‌ها اولین جایی هستند که یک مدیر سیستم به سراغشان می‌رود. + +بررسی ژورنال سیستم در systemd — ابزار `journalctl`: + +```bash +journalctl -u nginx # نمایش لاگ‌های مربوط به یک سرویس خاص (nginx) +journalctl -f # رصد و مشاهده لاگ‌های سیستم به صورت زنده و در لحظه +journalctl --since "1 hour ago" # نمایش لاگ‌های یک ساعت اخیر +journalctl --since today # نمایش لاگ‌های امروز از ابتدای روز +journalctl -p err # نمایش فقط پیام‌های مربوط به خطاها (Errors) +journalctl -b # نمایش لاگ‌ها از زمان آخرین بارگذاری سیستم (بوت فعلی) +journalctl -k # نمایش پیام‌های مربوط به هسته سیستم‌عامل (dmesg) +``` + +فایل‌های لاگ متنی سنتی در مسیر `/var/log` ذخیره می‌شوند: + +```bash +ls /var/log # نمایش لیست تمام لاگ‌های موجود +tail -f /var/log/syslog # لاگ عمومی سیستم (در توزیع‌های Debian/Ubuntu) +less /var/log/auth.log # لاگ‌های مربوط به ورود کاربران و استفاده از دستور sudo +``` + +**تمرین:** لاگ‌های سرویس ssh را با دستور `journalctl -u ssh` بررسی کنید، سپس فقط خطاهای امروز را فیلتر و چاپ کنید. فایل `/var/log/auth.log` را باز کرده و لاگ‌های مربوط به دفعاتی که از دستور `sudo` استفاده کرده‌اید را پیدا کنید. + +--- + +## 17. شبکه + +```bash +ip a # نمایش کارت‌های شبکه و آی‌پی آدرس‌های آن‌ها +ip route # نمایش جدول مسیریابی سیستم (مسیر خروج به اینترنت) +ping 8.8.8.8 # بررسی ارتباط شبکه بر اساس آی‌پی +ping google.com # بررسی ارتباط شبکه و صحت کارکرد سرور DNS +curl ifconfig.me # یافتن آی‌پی عمومی (خارجی) سیستم شما +ss -tulpn # نمایش پورت‌های باز سیستم و سرویس‌های متصل به آن‌ها +dig google.com # استعلام از سرور DNS برای یافتن آی‌پی دامنه مشخص‌شده +traceroute google.com # نمایش مسیر حرکت بسته‌ها در شبکه تا مقصد گام‌به‌گام +nc -zv host 80 # بررسی باز بودن یک پورت مشخص روی سرور مقصد +``` + +منطق مراحل عیب‌یابی شبکه: ابتدا دستور `ping 8.8.8.8` را اجرا کنید (تا ببینید اصلاً به اینترنت متصل هستید یا خیر)، سپس `ping google.com` را بزنید (تا بفهمید DNS درست کار می‌کند یا خیر)، و در نهایت یک درخواست `curl` به سایت مورد نظر بفرستید. این‌گونه سریع‌تر محل قطعی را پیدا می‌کنید. + +دانلود فایل‌ها و ارسال درخواست به APIها: + +```bash +curl -O https://example.com/file.zip # دانلود فایل از اینترنت +wget https://example.com/file.zip # دانلود فایل با ابزار دیگر +curl -s https://api.github.com/users/torvalds # ارسال درخواست به یک API و دریافت پاسخ متنی +curl -I https://example.com # دریافت فقط هدرهای پاسخ سرور بدون بدنه فایل +``` + +**تمرین:** آی‌پی داخلی خود را با `ip a` و آی‌پی خارجی خود را با `curl ifconfig.me` پیدا کنید، اتصال اینترنت را با `ping` بسنجید، پورت‌های باز سیستم را با `ss -tulpn` ببینید و تحلیل کنید چه برنامه‌هایی این پورت‌ها را اشغال کرده‌اند. یک درخواست `curl -I` به یک وب‌سایت بفرستید و کد پاسخ سرور را بخوانید. + +--- + +## 18. فایروال و امنیت پایه + +فایروال وظیفه دارد مشخص کند چه اتصالاتی اجازه ورود به سرور را دارند. فعال کردن فایروال روی سرورهایی که آی‌پی عمومی دارند کاملاً حیاتی است. + +ابزار `ufw` (فایروال ساده و پرکاربرد در سیستم‌های اوبونتو و دبیان): + +```bash +sudo ufw status # نمایش وضعیت فعلی فایروال و قوانین آن +sudo ufw allow 22 # اجازه ورود به پورت SSH (پورت ۲۲) +sudo ufw allow 80,443/tcp # اجازه ورود به پورت‌های وب (HTTP و HTTPS) +sudo ufw deny 23 # مسدود کردن یک پورت مشخص (مثل پورت تلت‌نت ۲۳) +sudo ufw enable # فعال کردن و روشن کردن فایروال +``` + +نکته بسیار حیاتی: قبل از اجرای دستور `ufw enable` در سرورهای ابری و راه دور، حتماً ابتدا پورت SSH را مجاز کنید (`sudo ufw allow 22`)؛ در غیر این صورت اتصال شما با سرور قطع شده و دیگر نمی‌توانید به آن وصل شوید! + +اصول اولیه امنیت سرور: همیشه با کلید SSH وارد شوید و ورود با رمز عبور را غیرفعال کنید؛ هرگز به طور مداوم با کاربر root کار نکنید؛ سیستم را همواره به‌روز نگه دارید (`apt upgrade`)؛ ابزار `fail2ban` را برای مقابله با حملات Brute-Force نصب کنید؛ و فقط پورت‌هایی را باز بگذارید که واقعاً به آن‌ها نیاز دارید. + +**تمرین (در ماشین مجازی تمرین کنید نه روی سرور واقعی کاری):** وضعیت `ufw` را بررسی کنید، پورت‌های ۲۲ و ۸۰ را باز کنید، فایروال را فعال کرده و قوانین را بررسی کنید. در نهایت با دستور `sudo ufw disable` فایروال را خاموش کنید. + +--- + +## 19. آرشیو و فشرده‌سازی + +فایل‌های آرشیو برای پشتیبان‌گیری، انتقال آسان فایل‌ها و صرفه‌جویی در فضای دیسک استفاده می‌شوند. + +```bash +tar -czf archive.tar.gz mydir/ # ساخت یک آرشیو فشرده‌شده از پوشه مشخص‌شده +tar -xzf archive.tar.gz # باز کردن و استخراج فایل آرشیو فشرده +tar -tzf archive.tar.gz # مشاهده لیست فایل‌های درون آرشیو بدون باز کردن آن +zip -r archive.zip mydir/ # ساخت یک فایل فشرده zip از پوشه +unzip archive.zip # باز کردن فایل zip +gzip file.txt # فشرده‌سازی یک تک‌فایل (تبدیل به file.txt.gz) +gunzip file.txt.gz # خارج کردن تک‌فایل از حالت فشرده +``` + +نحوه حفظ کردن سوییچ‌های دستور `tar`: حرف `c` یعنی ساختن (create)، حرف `x` یعنی استخراج (extract)، حرف `z` یعنی فشرده‌سازی با الگوریتم gzip، حرف `f` یعنی فایل (تعیین نام فایل آرشیو)، حرف `t` یعنی لیست کردن محتویات و حرف `v` یعنی نمایش جزئیات فرآیند کار (verbose). پرکاربردترین‌ها: `czf` برای ساختن و `xzf` برای باز کردن آرشیو است. + +**تمرین:** پوشه `/etc` را در آرشیوی به نام `etc-backup.tar.gz` فشرده کنید، بدون باز کردن آرشیو محتویات آن را لیست کنید و سپس آن را در پوشه‌ای جدید استخراج کنید و از درستی فایل‌ها مطمئن شوید. + +--- + +## 20. متغیرهای محیطی و PATH + +متغیرهای محیطی (Environment Variables) تنظیماتی هستند که در دسترس تمام برنامه‌ها قرار دارند. مهم‌ترین آن‌ها متغیر `PATH` است که لیستی از پوشه‌ها را ذخیره می‌کند که سیستم در آن‌ها به دنبال برنامه‌های اجرایی می‌گردد. + +```bash +echo $HOME # مسیر پوشه خانگی کاربر فعلی +echo $PATH # مسیرهایی که سیستم در آن‌ها به دنبال برنامه‌ها می‌گردد (با کاراکتر : جدا می‌شوند) +echo $USER # نام کاربری فعلی سیستم +env # نمایش تمام متغیرهای محیطی سیستم +export MYVAR=hello # تعریف یک متغیر محیطی جدید برای نشست فعلی ترمینال +echo $MYVAR # چاپ مقدار متغیر تعریف‌شده +``` + +وقتی دستور `ls` را تایپ می‌کنید، سیستم به نوبت در تمام پوشه‌های نوشته‌شده در متغیر `PATH` به دنبال فایلی به نام `ls` می‌گردد. به همین دلیل برای اجرای برنامه‌ای که در پوشه فعلی شما قرار دارد، باید از عبارت `program/.` استفاده کنید؛ زیرا کاراکتر نقطه به معنی «همین‌جا» است و پوشه فعلی معمولاً در متغیر PATH قرار ندارد. + +برای پایدار کردن یک متغیر محیطی به صورت دائمی، دستور `export MYVAR=...` را در انتهای فایل `~/.bashrc` یا `~/.profile` بنویسید. + +**تمرین:** متغیر `PATH` خود را چاپ کنید و ببینید چه پوشه‌هایی در آن قرار دارند. متغیری به نام `export PROJECT=/home/$USER/projects` بسازید، آن را با دستور `echo` بررسی کنید و سپس آن را در فایل `~/.bashrc` بنویسید تا پس از بستن ترمینال نیز حفظ شود. + +--- + +## 21. لینک‌ها: سخت (hard) و نمادین (symbolic) + +لینک‌ها به ما اجازه می‌دهند یک فایل را در چندین مسیر مختلف در دسترس داشته باشیم. + +```bash +ln -s /path/to/file link # ساخت لینک نمادین (مانند Shortcut در ویندوز) +ln /path/to/file hardlink # ساخت لینک سخت +ls -l # لینک‌های نمادین در خروجی به صورت link -> target دیده می‌شوند +readlink link # نمایش مسیر مقصد لینک نمادین +``` + +لینک نمادین (Symlink) در واقع فایلی است که به یک مسیر اشاره می‌کند؛ اگر فایل اصلی حذف شود، این لینک خراب و غیرقابل استفاده می‌شود. لینک سخت مستقیم به داده‌های روی دیسک اشاره می‌کند؛ بنابراین تا زمانی که حداقل یک لینک سخت وجود داشته باشد، فایل و داده‌های آن زنده خواهند ماند. در ۹۵ درصد سناریوها در کارهای واقعی از لینک نمادین استفاده می‌شود. + +کاربرد عملی: لینک‌های نمادین در همه جای سیستم وجود دارند؛ مثلاً `/usr/bin/python3` معمولاً یک لینک نمادین به نسخه دقیق نصب‌شده یعنی `/usr/bin/python3.11` است. + +**تمرین:** یک فایل بسازید، یک لینک نمادین از آن در پوشه دیگری ایجاد کنید، فایل را از طریق لینک نمادین ویرایش کنید و مطمئن شوید تغییرات روی فایل اصلی اعمال شده است. در نهایت فایل اصلی را حذف کنید و وضعیت لینک نمادین را بررسی کنید. + +--- + +## 22. اسکریپت‌نویسی Bash + +وقتی تعداد دستوراتی که باید اجرا شوند زیاد باشد، آن‌ها را در یک فایل اسکریپت جمع می‌کنیم که این شروع فرآیند خودکارسازی است. + +نمونه اسکریپت پشتیبان‌گیری ساده `backup.sh`: + +```bash +#!/bin/bash +# بکاپ ساده از پوشه خانگی + +DATE=$(date +%Y-%m-%d) +SRC="$HOME/documents" +DEST="$HOME/backups" + +mkdir -p "$DEST" +tar -czf "$DEST/backup-$DATE.tar.gz" "$SRC" +echo "بکاپ آماده شد: $DEST/backup-$DATE.tar.gz" +``` + +خط اول یعنی `#!/bin/bash` (که shebang نام دارد) به سیستم اعلام می‌کند که این فایل باید توسط مفسر برنامه bash اجرا شود. فراموش نکنید که پس از ساخت فایل، مجوز اجرای آن را بدهید: `chmod +x backup.sh`. + +ساختارهای کنترلی پایه در اسکریپت: + +```bash +name="Linux" # تعریف متغیر (دقت کنید اطراف علامت مساوی فاصله نباشد) +echo "Hello $name" # استفاده از متغیر در متن +read answer # خواندن ورودی از کاربر در زمان اجرا + +if [ -f "/etc/passwd" ]; then # بررسی اینکه آیا فایل مورد نظر وجود دارد یا خیر + echo "فایل وجود دارد" +else + echo "فایل وجود ندارد" +fi + +for i in 1 2 3; do # حلقه تکرار روی لیست مشخصی از مقادیر + echo "تکرار شماره $i" +done + +for f in *.txt; do # حلقه تکرار روی لیست فایل‌ها + echo "پیدا شد: $f" +done + +while [ $count -lt 5 ]; do # حلقه شرطی تا زمانی که شرط برقرار باشد + echo $count + count=$((count+1)) +done +``` + +بررسی‌های پرکاربرد در بخش شرطی `[ ]`: سوییچ `-f` برای بررسی وجود فایل، `-d` برای بررسی وجود پوشه، `-z` برای بررسی خالی بودن متغیر متنی، و سوییچ‌های `-eq`/`-lt`/`-gt` برای مقایسه اعداد استفاده می‌شوند. آرگومان‌های ارسالی به اسکریپت با متغیرهای `$1` و `$2` و تعداد کل آرگومان‌ها با متغیر `$#` در دسترس هستند. + +**تمرین:** اسکریپتی بنویسید که مسیر یک پوشه را به عنوان آرگومان ورودی اول (`$1`) دریافت کند، وجود آن را با شرط `[ -d ]` بررسی کند و تعداد کل فایل‌های درون آن را محاسبه و چاپ کند. نحوه اجرای دستور به این صورت باشد: `count.sh /etc./`. در صورتی که پوشه معرفی نشود یا وجود نداشته باشد، اسکریپت باید پیام خطای مناسبی چاپ کند. + +--- + +## 23. دیسک‌ها، پارتیشن‌ها و سوار کردن (Mount) + +```bash +df -h # نمایش فضای مصرفی و خالی دیسک‌های سوار شده در سیستم +du -sh /var/log # محاسبه حجم یک پوشه مشخص روی دیسک +du -h --max-depth=1 /var | sort -rh # یافتن پوشه‌های پرحجم در مسیر /var به ترتیب نزولی +lsblk # نمایش لیست دیسک‌ها و پارتیشن‌های سیستم به صورت درختی +mount # نمایش دیسک‌های سوار شده و مسیرهای آن‌ها در سیستم +sudo mount /dev/sdb1 /mnt # سوار کردن پارتیشن sdb1 روی پوشه /mnt +sudo umount /mnt # آزاد کردن و برداشتن دیسک از روی پوشه /mnt +free -h # نمایش وضعیت مصرف حافظه موقت (رم) سیستم +``` + +مفهوم سوار کردن (Mounting) یعنی «متصل کردن» یک پارتیشن یا دیسک سخت به یک پوشه مشخص در درخت سیستم‌فایل. پس از اجرای دستور `mount /dev/sdb1 /mnt` تمام فایل‌های درون فلش‌مموری از پوشه `/mnt` قابل دسترس خواهند بود. تنظیمات مربوط به سوار کردن خودکار دیسک‌ها در زمان بوت سیستم در فایل `/etc/fstab` ذخیره می‌شوند. + +**تمرین:** ۵ پوشه بزرگ درون مسیر `/var` را با دستور ترکیبی پیدا کنید: `du -h /var --max-depth=1 | sort -rh | head -5`. لیست دیسک‌های سیستم را با `lsblk` مشاهده کنید و فضای خالی دیسک‌ها را با `df -h` بسنجید. + +--- + +## 24. Cron و تایمرهای systemd + +ابزاری برای اجرای خودکار برنامه‌ها و دستورات در زمان‌های مشخص و بر اساس جدول زمان‌بندی: + +```bash +crontab -e # ویرایش و تعریف کارهای زمان‌بندی شده برای کاربر فعلی +crontab -l # نمایش لیست کارهای زمان‌بندی شده فعلی +``` + +فرمت یک خط در جدول زمان‌بندی cron (شامل ۵ بخش زمانی و در نهایت دستور مورد نظر): + +```text +# دقیقه ساعت روز_ماه ماه روز_هفته دستور_مورد_نظر +0 3 * * * /home/user/backup.sh # اجرای اسکریپت بکاپ هر روز ساعت ۳:۰۰ بامداد +*/15 * * * * /home/user/check.sh # اجرای اسکریپت بررسی هر ۱۵ دقیقه یک‌بار +0 0 * * 0 /home/user/weekly.sh # اجرای اسکریپت هفتگی هر یکشنبه در نیمه‌شب +30 2 1 * * /home/user/monthly.sh # اجرای اسکریپت ماهانه روز اول هر ماه در ساعت ۲:۳۰ بامداد +``` + +علامت ستاره `*` در هر بخش به معنی «هر مقداری» است. یک سیستم مدرن‌تر برای زمان‌بندی، استفاده از تایمرهای systemd است (`systemctl list-timers`)؛ این تایمرها لاگ‌های خود را در journald می‌نویسند و برای سناریوهای پیچیده کاربردی‌تر هستند. + +**تمرین:** یک کار زمان‌بندی شده در cron تعریف کنید که هر دقیقه تاریخ فعلی را به فایلی در مسیر خانگی اضافه کند (دستور `date >> ~/cron-test.log`). پس از چند دقیقه فایل لاگ را بررسی کنید تا مطمئن شوید خطوط جدید اضافه شده‌اند و سپس کار زمان‌بندی شده را با دستور `crontab -e` حذف کنید. + +--- + +## 25. SSH و دسترسی از راه دور + +مهم‌ترین ابزار برای مدیریت سرورها از راه دور به کمک پروتکل امن و رمزنگاری شده SSH: + +```bash +ssh user@192.168.1.10 # اتصال به سرور راه دور +ssh -p 2222 user@host # اتصال به سرور روی یک پورت غیرپیش‌فرض +ssh-keygen -t ed25519 # ساخت یک جفت کلید SSH جدید +ssh-copy-id user@host # نصب کلید عمومی خود روی سرور مقصد جهت ورود بدون رمز +scp file.txt user@host:/tmp/ # کپی کردن فایل از کامپیوتر خود به سرور مقصد +scp user@host:/tmp/file.txt . # کپی کردن فایل از سرور مقصد به کامپیوتر خود +rsync -av dir/ user@host:/dir/ # همگام‌سازی پوشه‌ها در شبکه (بسیار هوشمندتر از scp) +``` + +ورود با کلید بسیار امن‌تر و راحت‌تر از ورود با رمز عبور است. جفت‌کلید شامل دو بخش است: کلید خصوصی (`~/.ssh/id_ed25519` که باید فقط نزد خودتان بماند و هرگز به کسی داده نشود) و کلید عمومی (`id_ed25519.pub` که روی سرور قرار می‌گیرد). پس از اجرای دستور `ssh-copy-id` بدون نیاز به تایپ رمز عبور می‌توانید وارد سرور شوید. + +برای مدیریت آسان‌تر اتصالات می‌توانید تنظیمات آن‌ها را در فایل `~/.ssh/config` ذخیره کنید: + +```text +Host myserver + HostName 192.168.1.10 + User alex + Port 2222 +``` + +پس از نوشتن این فایل، برای اتصال به سرور فقط کافی است دستور کوتاه `ssh myserver` را وارد کنید. + +**تمرین:** یک جفت کلید SSH جدید با دستور `ssh-keygen` بسازید و محتویات پوشه `~/.ssh` را بررسی کنید. در صورت داشتن دو ماشین مجازی، کلید خود را با دستور `ssh-copy-id` به ماشین دوم بفرستید و بدون رمز وارد شوید. تنظیمات آن را در فایل `~/.ssh/config` ثبت کنید. + +--- + +## 26. نصب نرم‌افزار از سورس کد + +گاهی برنامه مورد نیاز در مخازن رسمی توزیع وجود ندارد و باید آن را مستقیماً از روی سورس کد کامپایل و نصب کنید. مراحل استاندارد این کار عبارتند از: + +```bash +sudo apt install build-essential # نصب کامپایلر و ابزارهای مورد نیاز برای ساخت برنامه +git clone https://github.com/user/project.git +cd project +./configure # بررسی نیازمندی‌های سیستم و آماده‌سازی فایل کامپایل (Makefile) +make # کامپایل کردن برنامه +sudo make install # نصب فایل‌های کامپایل‌شده روی سیستم +``` + +همه پروژه‌ها فایل `configure/.` ندارند؛ برخی از ابزار `cmake` یا سایر ابزارها استفاده می‌کنند. همیشه فایل‌های `README` یا `INSTALL` را درون پوشه سورس کد پروژه مطالعه کنید. عیب بزرگ نصب دستی این است که این برنامه‌ها با مدیریت بسته سیستم ارتقا نمی‌یابند و باید برای آپدیت آن‌ها، مراحل فوق را دوباره تکرار کنید. + +**تمرین:** بسته `build-essential` را نصب کنید، یک پروژه متن‌باز کوچک نوشته‌شده با زبان C را از گیت‌هاب کلون کنید، راهنمای ساخت آن را بخوانید و سعی کنید آن را کامپایل کنید. + +--- + +## 27. عیب‌یابی و حل مشکلات + +مهارتی که یک مدیر سیستم حرفه‌ای را از یک کاربر تازه‌کار متمایز می‌کند، توانایی جستجوی روشمند علت بروز مشکل است. + +مراحل عمومی عیب‌یابی در زمان مواجهه با مشکلات سیستم: + +1. پیام خطا را کامل و دقیق بخوانید؛ در بسیاری از اوقات علت خطا درون خود پیام نوشته شده است. +2. وضعیت و لاگ‌های سرویس خراب را بررسی کنید: با دستورات `systemctl status` و `journalctl -u`. +3. وضعیت منابع سیستم را بسنجید: فضای دیسک (`df -h`)، میزان رم آزاد (`free -h`) و پردازنده (`top`). +4. مجوزهای دسترسی به فایل‌های مورد نظر را با دستور `ls -l` بررسی کنید. +5. در صورت وجود مشکلات تحت شبکه، ابزارهای شبکه را به کار بگیرید (`ping` ،`ss -tulpn`). +6. متن دقیق خطا را استخراج کرده و آن را در موتورهای جستجو سرچ کنید. + +شایع‌ترین دلایل مشکلات در سیستم‌های لینوکس: پر شدن کامل دیسک (نمایش درصد ۱۰۰ در خروجی `df -h`)؛ عدم داشتن دسترسی مناسب (خطای `Permission denied` که با دستور `sudo` یا اصلاح `chmod` برطرف می‌شود)؛ عدم اجرای سرویس مورد نظر؛ غلط‌های املایی در فایل‌های تنظیمات؛ و مسدود بودن پورت‌ها توسط فایروال. + +```bash +df -h # بررسی پر نبودن فضای دیسک +free -h # بررسی میزان حافظه رم در دسترس +dmesg | tail # نمایش آخرین پیام‌های هسته (مناسب برای عیب‌یابی سخت‌افزار یا درایورها) +systemctl --failed # نمایش لیست سرویس‌هایی که با خطا مواجه شده‌اند +journalctl -p err -b # نمایش تمام خطاهای رخ داده از زمان بوت فعلی سیستم +``` + +**تمرین:** فایل تنظیمات وب‌سرور nginx را عمداً خراب کنید (یک کاراکتر نامربوط درون فایل `/etc/nginx/nginx.conf` بنویسید)، سرویس را مجدداً راه‌اندازی کنید، از طریق وضعیت سرویس و لاگ‌ها محل دقیق خطا را پیدا کرده، آن را اصلاح کنید و مطمئن شوید سرویس دوباره بدون خطا اجرا می‌شود. + +--- + +## 28. پروژه‌هایی برای تثبیت یادگیری + +برای تبدیل دستورات بالا به یک مهارت ماندگار، حتماً پروژه‌های زیر را انجام دهید: + +1. **وب‌سرور شخصی.** وب‌سرور nginx را روی ماشین مجازی نصب کنید، یک صفحه وب ساده HTML را در آن قرار دهید، اجرای خودکار سرویس را تنظیم کنید، پورت وب را در فایروال مجاز کنید و دسترسی به صفحه را از بیرون بررسی کنید. +2. **اسکریپت مانیتورینگ سیستم.** اسکریپتی بنویسید که هر ۵ دقیقه یک‌بار (با استفاده از cron) فضای خالی دیسک و رم را بررسی کند و در صورتی که فضای آزاد دیسک کمتر از ۱۰ درصد شد، یک هشدار درون فایل لاگ بنویسد. +3. **سیستم پشتیبان‌گیری خودکار.** اسکریپتی بنویسید که هر شب پوشه خاصی را فشرده و بکاپ بگیرد و این کار را طوری تنظیم کند که فقط فایل‌های ۷ روز اخیر را نگه دارد و نسخه‌های قدیمی‌تر را به طور خودکار حذف کند. +4. **پیکربندی کامل سرور از صفر (پروژه اصلی).** یک سیستم‌عامل اوبونتو سرور خام نصب کنید: یک کاربر جدید بسازید، دسترسی ورود با کلید SSH را برای او تنظیم کنید، ورود با رمز عبور و همچنین ورود مستقیم کاربر root را غیرفعال کنید، فایروال ufw را با قوانین پیش‌فرض بلاک فعال کرده و پورت‌های مورد نیاز را باز کنید، ابزار fail2ban را نصب کنید و وب‌سرور را راه‌اندازی کنید. این مراحل پایه تنظیم امن هر سروری در دنیای واقعی است. +5. **تحلیل‌گر فایل‌های لاگ.** اسکریپتی بنویسید که فایل لاگ وب‌سرور را بخواند و ۱۰ آی‌پی پربازدید، بیشترین صفحات درخواست شده و تعداد خطاهای ۴۰۴ یا ۵۰۰ را استخراج و چاپ کند. + +--- + +## 29. ترفندها و دستورات پیشرفته 🧠 + +این بخش برای کسانی است که مفاهیم اولیه را یاد گرفته‌اند و می‌خواهند سریع‌تر و حرفه‌ای‌تر در خط فرمان کار کنند. در اینجا ترفندهایی آمده است که به شما در کارهای روزمره سرعت می‌دهند و در سناریوهای خاص نجات‌دهنده خواهند بود. هر ترفند را تک‌تک در ترمینال خود تست و تمرین کنید. + +### 29.1. جادوی تاریخچه و تکرار دستورات + +```bash +sudo !! # تکرار دستور قبلی با دسترسی sudo (اگر فراموش کردید sudo بنویسید، نیازی به تایپ مجدد دستور نیست) +!$ # استفاده از آخرین آرگومان دستور قبلی: mkdir /opt/app && cd !$ +!* # استفاده از تمام آرگومان‌های دستور قبلی +^foo^bar # اجرای مجدد دستور قبلی با جایگزین کردن کلمه foo با bar +cd - # بازگشت به پوشه قبلی (سوییچ سریع بین دو پوشه اخیر) +``` + +میان‌بر `Alt+.` آخرین آرگومان دستور قبلی را در خط فرمان درج می‌کند — با فشردن مجدد آن می‌توانید آرگومان‌های دستورات قدیمی‌تر را نیز مرور کنید. این ترفند از نوشتن مجدد مسیرهای طولانی جلوگیری می‌کند. + +### 29.2. قدرت کروشه‌ها (Brace Expansion) + +پوسته قبل از اجرای دستور، عبارت‌های درون `{}` را بسط می‌دهد که در نوشتن دستورات بسیار صرفه‌جویی می‌کند: + +```bash +mkdir -p project/{src,tests,docs} # ساخت سه پوشه به طور هم‌زمان +touch file{1..5}.txt # ساخت ۵ فایل متنی از شماره ۱ تا ۵ +cp config.yml config.yml{,.bak} # بکاپ سریع: ساخت فایل پشتیبان config.yml.bak +mv report.txt{,.old} # تغییر نام سریع فایل به report.txt.old +echo {a,b,c}{1,2} # چاپ ترکیب‌های: a1 a2 b1 b2 c1 c2 +``` + +ترفند `cp file{,.bak}` به عبارت `cp file file.bak` بسط داده می‌شود که سریع‌ترین راه برای کپی گرفتن از یک فایل تنظیمات قبل از ویرایش آن است. + +### 29.3. کار با فایل‌هایی با نام‌های خاص + +فایل‌هایی که نام آن‌ها با خط تیره شروع می‌شود یا دارای کاراکترهای خاص هستند می‌توانند چالش‌ساز باشند: + +```bash +rm ./-rf # حذف فایلی با نام rf-: اضافه کردن /. در ابتدا، مانع از تفسیر نام به عنوان سوییچ می‌شود +rm -- -rf # کاراکترهای -- به معنی پایان سوییچ‌ها هستند و عبارات بعدی فقط به عنوان نام فایل تفسیر می‌شوند +find . -name "* *" -type f # پیدا کردن فایل‌هایی که در نام آن‌ها کاراکتر فاصله وجود دارد +``` + +یک قانون طلایی: در اسکریپت‌ها **همیشه** متغیرهای مسیر فایل را درون کوتیشن قرار دهید: `"$file"` به جای `$file`؛ در غیر این صورت وجود فاصله در نام مسیر، دستور را با خطا مواجه می‌کند. + +### 29.4. ابزار xargs — پلی میان جستجو و عملیات + +ابزار `xargs` خروجی را از stdin دریافت کرده و آن را به عنوان آرگومان به دستور بعدی ارسال می‌کند. ترکیب آن با `find` یکی از ابزارهای قدرتمند مدیریت سرور است: + +```bash +find . -name "*.log" -print0 | xargs -0 rm # حذف تمام فایل‌های لاگ (ایمن در برابر نام‌های دارای فاصله) +find . -name "*.txt" | xargs grep -l "TODO" # یافتن فایل‌های متنی که شامل کلمه TODO هستند +echo "1 2 3" | xargs -n1 echo "number:" # اجرای دستور به ازای تک‌تک آرگومان‌های ورودی به صورت جداگانه +ls *.png | xargs -I{} cp {} backup/{} # کاراکترهای {} محل قرارگیری نام فایل‌های ورودی در دستور بعدی هستند +find . -name "*.jpg" | xargs -P4 -I{} convert {} {}.webp # سوییچ P4- یعنی اجرای هم‌زمان عملیات در ۴ پردازش موازی +``` + +استفاده از گزینه‌های `print0-` در find و `0-` در xargs برای مدیریت درست فایل‌هایی با نام‌های دارای کاراکترهای خاص یا فاصله کاملاً ضروری است. + +### 29.5. جایگزینی پردازش (Process Substitution) + +عبارت `(command)>` خروجی دستور را به یک «فایل موقت» مجازی تبدیل می‌کند که می‌تواند به عنوان ورودی فایل به دستورات دیگر فرستاده شود: + +```bash +diff <(ls dir1) <(ls dir2) # مقایسه محتویات دو پوشه بدون نیاز به ساخت فایل موقت روی دیسک +diff <(sort a.txt) <(sort b.txt) # مقایسه محتویات مرتب‌شده دو فایل +comm -13 <(sort a) <(sort b) # نمایش خطوطی که فقط در فایل b وجود دارند +``` + +این ترفند برای مقایسه مستقیم خروجی دو دستور بدون کثیف کردن دیسک با فایل‌های موقت اضافی بسیار عالی است. + +### 29.6. بقای پردازش‌ها در پس‌زمینه + +قطع شدن اتصال SSH به طور پیش‌فرض باعث بسته شدن برنامه‌های در حال اجرای آن نشست می‌شود. راهکارها: + +```bash +nohup ./long.sh &> out.log & # اجرای برنامه به صورتی که با قطع نشست نیز به کار خود ادامه دهد +disown -h %1 # جدا کردن یک کار در حال اجرای پس‌زمینه از نشست فعلی ترمینال +``` + +اما ابزار اصلی و حرفه‌ای برای این کار، استفاده از **ابزار مدیریت ترمینال** `tmux` (یا `screen`) است: + +```bash +tmux new -s work # ساخت یک نشست جدید با نام work +# فشردن کلید Ctrl+b و سپس d برای خروج موقت (جدا شدن) از نشست بدون متوقف شدن برنامه‌ها +tmux attach -t work # اتصال مجدد به نشست کار قبلی (حتی از یک کامپیوتر دیگر) +tmux ls # نمایش لیست نشست‌های tmux فعال +``` + +اگر آپدیت سرور را درون محیط `tmux` اجرا کنید، حتی در صورت قطع شدن اینترنت، عملیات بدون مشکل تا انتها روی سرور انجام خواهد شد و پس از اتصال مجدد می‌توانید ادامه کار را ببینید. این یک عادت کاری مهم برای هر ادمینی است. + +### 29.7. بازسازی ترمینال خراب شده + +گاهی پس از نمایش محتویات یک فایل باینری با دستور `cat` یا به دلیل باگ‌ها، کاراکترهای ترمینال به هم می‌ریزند و به دستورات واکنش درستی نشان نمی‌دهند: + +```bash +reset # بازنشانی کامل وضعیت ترمینال به حالت اولیه +stty sane # بازگرداندن تنظیمات ورودی استاندارد به حالت پیش‌فرض +Ctrl+C then reset # اگر ترمینال اصلاً به ورودی‌ها واکنش نشان نمی‌دهد، این را به صورت نابینا تایپ و اجرا کنید +``` + +### 29.8. ویرایش ایمن فایل‌های پیکربندی + +```bash +sudoedit /etc/nginx/nginx.conf # (یا سوییچ sudo -e) روش استاندارد و ایمن برای ویرایش فایل‌های سیستم با کاربری غیر root +visudo # تنها روش درست برای ویرایش فایل /etc/sudoers (بررسی خطاهای نگارشی قبل از ذخیره) +nginx -t && systemctl reload nginx # تست صحت ساختار تنظیمات nginx قبل از اعمال و بارگذاری مجدد سرویس +sshd -t # تست تنظیمات سرویس SSH قبل از ری‌استارت (مانع از قطع دسترسی شما به سرور در صورت بروز خطا) +``` + +یک اصل مهم امنیتی: برای سرویس‌های حیاتی (مانند تنظیمات sudoers، سرویس SSH یا وب‌سرور) **همیشه ابتدا تنظیمات را تست کنید و سپس سرویس را ری‌استارت کنید**. یک اشتباه کوچک در فایل `/etc/sudoers` می‌تواند دسترسی به `sudo` را برای همه کاربران قطع کند. + +### 29.9. بررسی دقیق: چه برنامه‌ای فایل یا پورت را اشغال کرده است + +```bash +lsof /var/log/app.log # نمایش پردازشی که این فایل را باز نگه داشته است +lsof -i :80 # نمایش برنامه‌ای که روی پورت ۸۰ در حال گوش دادن است +fuser -k 8080/tcp # کشتن پردازشی که پورت ۸۰۸۰ را اشغال کرده است +lsof +D /mnt # یافتن علت خطای اشغال بودن دستگاه در زمان خروج دیسک (umount) از مسیر mnt +``` + +خطای معروف «device is busy» در زمان خروج دیسک را با دستور `lsof +D` بررسی کنید تا پردازشی که مانع از کار شده است را پیدا کنید. + +### 29.10. ابزار watch — رصد مداوم تغییرات خروجی + +```bash +watch -n 2 df -h # اجرای دستور df هر ۲ ثانیه یک‌بار برای رصد تغییرات فضا +watch -d free -h # سوییچ d- بخش‌های تغییر یافته خروجی را هایلایت می‌کند +watch -n1 'ss -tunp | grep :443' # مشاهده اتصالات به پورت ۴۴۳ به صورت زنده در هر ثانیه +``` + +### 29.11. حذف حجم عظیمی از فایل‌ها و پیدا کردن فایل‌های حجیم + +```bash +du -ah / 2>/dev/null | sort -rh | head -20 # نمایش ۲۰ فایل و پوشه بسیار بزرگ در کل سیستم +ncdu / # ابزار تعاملی و عالی برای بررسی حجم دیسک (نیازمند نصب) +find /tmp -type f -atime +30 -delete # حذف فایل‌هایی که بیش از ۳۰ روز است هیچ دسترسی به آن‌ها ثبت نشده +journalctl --vacuum-size=200M # پاک‌سازی فایل‌های لاگ systemd و محدود کردن حجم آن‌ها به ۲۰۰ مگابایت +``` + +اگر دیسک شما پر شده است اما با دستور `du` نمی‌توانید فایل حجیمی پیدا کنید، ممکن است فایل حذفی همچنان توسط پردازشی باز نگه داشته شده باشد. با دستور `lsof | grep deleted` پردازش مربوطه را پیدا کرده و آن را ری‌استارت کنید تا فضا آزاد شود. + +### 29.12. عادت‌های ایمن که شما را نجات می‌دهند + +```bash +alias rm='rm -i' # درخواست تایید قبل از هر حذف فایل (در فایل ~/.bashrc نوشته شود) +set -euo pipefail # نوشتن در ابتدای اسکریپت‌ها جهت توقف اسکریپت با اولین بروز خطا در هر بخش +trap 'echo "Error on line $LINENO"' ERR # چاپ شماره خطی که اسکریپت در آن با خطا مواجه شده است +``` + +نوشتن دستور `set -euo pipefail` در ابتدای اسکریپت‌ها نشانه نویسنده حرفه‌ای است: سوییچ `-e` کار اسکریپت را با اولین خطا متوقف می‌کند، سوییچ `-u` خطاهای مربوط به متغیرهای تعریف‌نشده را می‌گیرد و `pipefail` کدهای خطای میانی در زنجیره لوله‌ها را بررسی می‌کند. + +**تمرین:** سه ترفند را به دلخواه تمرین کنید: از فایل خود با روش کروشه‌ها کپی پشتیبان بگیرید، با دستور `lsof` پردازش روی پورت ۲۲ را پیدا کنید، و یک کار طولانی را در نشست `tmux` اجرا کرده، از آن خارج شده و دوباره متصل شوید. + +--- + +## 30. اصول محافظت از سرورها 🛡️ + +یک سرور با آی‌پی عمومی در عرض چند دقیقه پس از روشن شدن توسط ربات‌ها اسکن می‌شود. این بخش حداقل‌های کاربردی برای تبدیل یک سرور خام به یک سرور امن را آموزش می‌دهد. مراحل را به ترتیب طی کنید. تمام مراحل را ابتدا در ماشین مجازی تمرین کنید و پس از درک کامل، روی سرور واقعی اعمال کنید. + +> **قانون طلایی تغییر تنظیمات امنیتی از راه دور:** هرگز نشست فعلی خود را نبندید مگر اینکه نشست جدید را تست کرده باشید. اگر پورت SSH یا قوانین فایروال را تغییر می‌دهید، یک ترمینال متصل دیگر را باز نگه دارید و در پنجره جدید اتصال را تست کنید. + +> 📜 **اسکریپت آماده:** تمام مراحل این بخش در قالب یک اسکریپت آماده به نام **[`secure-server-setup.sh`](secure-server-setup.sh)** آماده شده است. این اسکریپت سیستم را به‌روزرسانی کرده، آپدیت‌های امنیتی خودکار را فعال می‌کند، یک کاربر با دسترسی sudo می‌سازد، کلید SSH را به آن منتقل می‌کند، امنیت SSH را بالا می‌برد (ورود فقط با کلید، غیرفعال کردن root و پورت غیرپیش‌فرض)، فایروال ufw را تنظیم کرده و ابزار fail2ban را فعال می‌کند. قبل از اجرا حتماً فایل را باز کرده و متغیرهای ابتدای آن را متناسب با نیاز خود ویرایش کنید: +> +> ```bash +> # ابتدا متغیرهای ابتدای فایل را ویرایش کنید! +> sudo bash secure-server-setup.sh +> ``` +> +> ⚠️ این اسکریپت تنظیمات دسترسی به سرور را تغییر می‌دهد. این یک نمونه آموزشی است؛ پس تک‌تک خطوط آن را بفهمید و کورکورانه اجرا نکنید. + +### 30.1. مدل تهدید: از چه چیزی محافظت می‌کنیم؟ + +قبل از شروع کار باید بدانید چه چیزهایی بیشتر مورد حمله قرار می‌گیرند: حملات Brute-Force روی پورت SSH؛ سوءاستفاده از نرم‌افزارهای قدیمی با آسیب‌پذیری‌های شناخته‌شده؛ سرویس‌های داخلی باز روی اینترنت که باید فقط روی لوکال‌هاست گوش می‌دادند؛ دسترسی‌های ضعیف روی فایل‌های حساس؛ و ارتقای دسترسی غیرمجاز از طریق تنظیمات اشتباه sudo. + +### 30.2. به‌روزرسانی‌ها — سپری که نادیده گرفته می‌شود + +بسیاری از هک‌ها از آسیب‌پذیری‌هایی استفاده می‌کنند که آپدیت رفع آن‌ها قبلاً ارائه شده است. به‌روز نگه‌داشتن سیستم ساده‌ترین راه حفاظت است. + +```bash +sudo apt update && sudo apt upgrade -y # به‌روزرسانی دستی کل سیستم +sudo apt install unattended-upgrades # نصب ابزار به‌روزرسانی‌های امنیتی خودکار +sudo dpkg-reconfigure unattended-upgrades # فعال‌سازی ابزار +``` + +در خانواده توزیع‌های RHEL/Fedora معادل این ابزار `dnf-automatic` است. فعال کردن به‌روزرسانی‌های امنیتی خودکار اولین کاری است که باید روی سرور جدید انجام دهید. + +### 30.3. بالا بردن امنیت سرویس SSH (Hardening) + +سرویس SSH اولین دروازه ورود به سرور و هدف اول ربات‌ها است. تغییرات را در فایل `/etc/ssh/sshd_config` اعمال کنید، سپس با `sshd -t` بررسی و در نهایت ری‌استارت کنید. + +```bash +# گزینه‌های کلیدی در فایل /etc/ssh/sshd_config: +PermitRootLogin no # ممنوعیت ورود مستقیم با کاربر root +PasswordAuthentication no # غیرفعال کردن ورود با رمز عبور (فقط ورود با کلید مجاز باشد) +PubkeyAuthentication yes # فعال‌سازی ورود با کلید SSH +Port 2222 # تغییر پورت پیش‌فرض برای کاهش ۹۹ درصدی اسکن‌های تصادفی ربات‌ها +AllowUsers alex # لیست سفید کاربرانی که اجازه ورود به سیستم را دارند +MaxAuthTries 3 # کاهش تعداد دفعات تلاش مجاز برای ورود در یک نشست +ClientAliveInterval 300 # قطع اتصالات غیرفعال و رها شده +``` + +```bash +sudo sshd -t # بررسی صحت ساختار فایل تنظیمات (حیاتی!) +sudo systemctl restart ssh # اعمال تغییرات با ری‌استارت سرویس +``` + +**مراحل ایمن تغییر:** ابتدا مطمئن شوید ورود با کلید کار می‌کند و سپس گزینه `PasswordAuthentication no` را اعمال کنید؛ در غیر این صورت ممکن است دسترسی خود را به طور کامل از دست بدهید. + +### 30.4. ورود با کلید به جای رمز عبور + +```bash +ssh-keygen -t ed25519 -C "your_comment" # در سیستم خودتان: ساخت جفت کلید +ssh-copy-id -p 2222 alex@server # ارسال کلید عمومی به سرور مقصد +ssh -p 2222 alex@server # تست اتصال بدون نیاز به رمز عبور +``` + +کلید خصوصی (`~/.ssh/id_ed25519`) **هرگز** نباید از سیستم شما خارج شود. روی سرور فقط کلید عمومی با پسوند `.pub` قرار می‌گیرد. در زمان ساخت کلید روی آن یک رمز عبور بگذارید تا حتی در صورت دزدیده شدن فایل کلید، بدون داشتن رمز عبور غیرقابل استفاده باشد. + +### 30.5. فایروال: فقط بسته‌های مورد نیاز را مجاز کنید + +با استفاده از اصل «بستن همه‌چیز به صورت پیش‌فرض»: + +```bash +sudo ufw default deny incoming # مسدود بودن تمام ترافیک‌های ورودی به صورت پیش‌فرض +sudo ufw default allow outgoing # مجاز بودن تمام ترافیک‌های خروجی +sudo ufw allow 2222/tcp # ابتدا پورت SSH خود را مجاز کنید! +sudo ufw allow 80,443/tcp # مجاز کردن پورت‌های وب در صورت نیاز +sudo ufw enable # فعال‌سازی و روشن کردن فایروال +sudo ufw status verbose # بررسی وضعیت فایروال +``` + +**بسیار حیاتی:** قبل از فعال کردن فایروال حتماً پورت SSH را باز کنید تا اتصال شما با سرور قطع نشود. اگر پورت SSH را تغییر داده‌اید، همان پورت جدید را باز کنید. + +### 30.6. ابزار fail2ban: مسدودسازی خودکار حملات + +ابزار `fail2ban` لاگ‌ها را اسکن کرده و آی‌پی‌هایی که تلاش‌های ناموفق مکرر دارند را در فایروال مسدود می‌کند. + +```bash +sudo apt install fail2ban +sudo systemctl enable --now fail2ban +sudo fail2ban-client status sshd # بررسی وضعیت و لیست آی‌پی‌های مسدودشده +``` + +تنظیمات اصلی در فایل `/etc/fail2ban/jail.local` (که از روی فایل `jail.conf` کپی می‌شود) انجام می‌شود: تعداد دفعات مجاز خطا (`maxretry`)، زمان مسدود بودن (`bantime`) و زمان بازه بررسی (`findtime`). این ابزار حتی با تنظیمات پیش‌فرض خود بخش بزرگی از حملات ربات‌ها را مهار می‌کند. + +### 30.7. اصل کمترین دسترسی (Least Privilege) + +در کارهای روزمره با کاربر root کار نکنید. یک کاربر عادی با دسترسی `sudo` بسازید و از آن استفاده کنید. + +```bash +sudo adduser alex +sudo usermod -aG sudo alex # عضویت در گروه sudo جهت دسترسی به دستور +sudo visudo # تنها روش درست برای ویرایش فایل تنظیمات sudoers +``` + +ابزار `visudo` خطاها را قبل از ذخیره فایل بررسی می‌کند. بروز خطا در فایل `/etc/sudoers` دسترسی sudo را برای همه کاربران سیستم قطع خواهد کرد. به هر کاربر یا سرویسی دقیقاً همان قدری دسترسی بدهید که برای کارش نیاز دارد، نه بیشتر. + +### 30.8. مجوزهای فایل‌ها و بررسی فایل‌های حساس + +```bash +chmod 600 ~/.ssh/id_ed25519 # کلید خصوصی فقط برای مالک قابل خواندن و نوشتن باشد +chmod 700 ~/.ssh # پوشه کلیدهای SSH فقط برای مالک در دسترس باشد +find / -perm -4000 -type f 2>/dev/null # پیدا کردن تمام فایل‌های دارای مجوز SUID (پتانسیل افزایش دسترسی غیرمجاز) +find / -perm -0002 -type f 2>/dev/null # پیدا کردن فایل‌هایی که برای همه قابل نوشتن هستند (خطرناک) +``` + +هرگز رمزهای عبور، توکن‌ها و کلیدهای خصوصی خود را در کدهای برنامه، تاریخچه دستورات ترمینال یا مخازن عمومی گیت‌هاب ذخیره نکنید. اطلاعات حساس را در متغیرهای محیطی یا فایل‌های امن با مجوز دسترسی `600` نگهداری کنید. + +### 30.9. بررسی پورت‌های باز سیستم + +```bash +sudo ss -tulpn # نمایش تمام پورت‌های باز و سرویس‌های پشت آن‌ها +``` + +لیست پورت‌ها را بررسی کنید و بپرسید: «آیا واقعاً این سرویس باید روی اینترنت باز باشد؟». پایگاه‌های داده، سرویس‌های کش مانند Redis و APIهای داخلی سیستم تقریباً همیشه باید روی آدرس لوکال `127.0.0.1` گوش بدهند نه روی آدرس عمومی `0.0.0.0`. پورت باز اضافی یک در ورودی اضافه برای نفوذ است. + +### 30.10. بررسی لاگ‌های ورود کاربران + +```bash +last # نمایش لیست ورودهای موفق اخیر به سیستم +sudo lastb # نمایش لیست تلاش‌های ناموفق برای ورود به سیستم +journalctl -u ssh | grep -i "failed" # نمایش ورودهای ناموفق از طریق سرویس SSH +sudo grep -i sudo /var/log/auth.log # بررسی کارهایی که کاربران با دستور sudo انجام داده‌اند +who # نمایش کاربران فعال فعلی متصل به سیستم +``` + +بررسی منظم خروجی‌های دستور `lastb` و فایل `auth.log` به شما نشان می‌دهد چه کسانی در حال تست سرور شما هستند. افزایش ناگهانی خطاهای ورود نشان‌دهنده نیاز به بازنگری در تنظیمات fail2ban است. + +### 30.11. رمزنگاری و پشتیبان‌گیری داده‌ها + +تهیه فایل پشتیبان (بکاپ) بخش مهمی از امنیت است: دفاع در برابر باج‌افزارها و خطاهای انسانی خودمان. فایل‌های پشتیبان را **بیرون** از خود سرور نگهداری کنید، فرآیند بازیابی آن‌ها را تست کنید و فایل‌های حساس را رمزنگاری کنید. برای رمزنگاری دیسک‌های حاوی اطلاعات حساس از LUKS (`cryptsetup`) و برای انتقال فایل‌ها از کانال‌های امن استفاده کنید (`scp`/`rsync`/`sftp`). + +### چک‌لیست امنیت سرور جدید + +- [ ] سیستم به‌روزرسانی شده و آپدیت‌های امنیتی خودکار فعال هستند +- [ ] کاربر غیر root با دسترسی sudo ساخته شده است +- [ ] ورود با کلید SSH فعال و ورود با رمز عبور غیرفعال شده است (`PasswordAuthentication no`) +- [ ] ورود مستقیم با کاربر root غیرفعال شده است (`PermitRootLogin no`) +- [ ] فایروال با بستن پیش‌فرض فعال شده و فقط پورت‌های مورد نیاز باز هستند +- [ ] ابزار fail2ban نصب شده و در حال کار است +- [ ] خروجی دستور `ss -tulpn` بررسی شده و پورت اضافی باز نیست +- [ ] مجوز فایل‌های حساس و کلیدها روی `600`/`700` تنظیم شده است +- [ ] پشتیبان‌گیری منظم و خارج از سرور تنظیم شده است + +**تمرین (در ماشین مجازی):** یک سیستم اوبونتو سرور خام نصب کنید و تمام مراحل چک‌لیست را به ترتیب روی آن انجام دهید. سپس از یک کامپیوتر دیگر تلاش کنید با رمز عبور وارد شوید (باید خطا دهد) و سپس با کلید وارد شوید (باید متصل شود). خروجی دستور `sudo lastb` را برای بررسی تلاش‌های مسدودشده رصد کنید. + +--- + +## هک اخلاقی: مباحث کلیدی و نمونه‌های کاربردی 🕵️ + +هک اخلاقی (تست نفوذ) یعنی پیدا کردن آسیب‌پذیری‌های سیستم **با اجازه کتبی مالک آن**، به منظور برطرف کردن آن‌ها قبل از نفوذ مهاجمان واقعی. تنها تفاوت هک اخلاقی با هک مخرب در **داشتن مجوز قانونی** است. استفاده از این ابزارها بدون داشتن اجازه کتبی، جرم است. این بخش به شما کمک می‌کند مانند یک مدافع که روش‌های حمله را می‌شناسد فکر کنید. + +> ⚖️ قانون اصلی: اسکن، تست و نفوذ را **فقط و فقط** روی سیستم‌های خودتان یا سیستم‌هایی انجام دهید که از مالک آن‌ها **اجازه‌نامه کتبی و مشخص (Scope)** دارید. تست نفوذ روی سرورها، سایت‌ها یا حتی وای‌فای همسایه بدون اجازه کتبی، جرم است و پیگرد قانونی دارد. اگر شک دارید که مجوز دارید یا نه، یعنی قطعاً مجوز ندارید. + +### کجا به صورت قانونی تمرین کنیم؟ + +- **آزمایشگاه شخصی خودتان** — استفاده از ماشین‌های مجازی (مانند Kali به همراه Metasploitable یا DVWA) در یک شبکه داخلی ایزوله. +- **سایت‌های TryHackMe ،HackTheBox و PortSwigger Web Security Academy** — پلتفرم‌های تخصصی دارای ماشین‌های آسیب‌پذیر و سناریوهای آموزشی. +- **برنامه‌های باگ بانتی (HackerOne, Bugcrowd)** — یافتن قانونی آسیب‌پذیری‌ها در قبال دریافت پاداش، **دقیقاً در چارچوب قوانین مشخص‌شده (Scope)** هر شرکت. +- **مسابقات CTF (Capture The Flag)** — حل چالش‌های امنیتی در قالب بازی و مسابقه. + +### مراحل تست نفوذ (متدولوژی) + +1. **شناسایی و جمع‌آوری اطلاعات (Reconnaissance)** — جمع‌آوری اطلاعات عمومی درباره هدف (دامنه‌ها، زیردامنه‌ها، فناوری‌ها). این مرحله به دو بخش فعال و غیرفعال تقسیم می‌شود. +2. **اسکن سیستم (Scanning)** — پیدا کردن سیستم‌های روشن، پورت‌های باز و نسخه‌های سرویس‌های در حال کار روی شبکه هدف. +3. **گرفتن دسترسی (Exploitation)** — تست و اکسپلویت کردن آسیب‌پذیری‌های یافت شده (در محیط آزمایشگاه شخصی). +4. **حفظ دسترسی و مراحل پس از نفوذ (Post-Exploitation)** — بررسی کارهایی که مهاجم پس از نفوذ می‌تواند در سیستم انجام دهد (جهت تخمین میزان ریسک خطر). +5. **گزارش‌نویسی (Reporting)** — **مهم‌ترین بخش کار**: ثبت آسیب‌پذیری‌های کشف شده، نحوه بازسازی آن‌ها و روش‌های برطرف کردن و اصلاح سیستم. تست نفوذ بدون ارائه گزارش بی‌فایده است. + +### نمونه‌های کاربردی عملی (فقط در آزمایشگاه شخصی خودتان تست کنید) + +**۱. شناسایی هاست‌ها و پورت‌ها** — چه پورت‌هایی روی سیستم هدف باز هستند: + +```bash +# پیدا کردن سیستم‌های روشن در شبکه آزمایشگاهی مشخص‌شده +nmap -sn 192.168.56.0/24 + +# اسکن تمام پورت‌ها و شناسایی نسخه‌های سرویس‌ها روی سیستم هدف +nmap -sV -p- 192.168.56.101 + +# تشخیص سیستم‌عامل و اجرای اسکریپت‌های شناسایی پایه روی هدف +nmap -A 192.168.56.101 +``` + +**۲. شناسایی فناوری‌های وب‌سایت** — چه ساختارها و مسیرهایی روی وب سرور وجود دارند: + +```bash +# دریافت هدرهای پروتکل HTTP و اطلاعات وب‌سرور هدف +curl -I http://192.168.56.101 + +# جستجوی پوشه‌ها و فایل‌های مخفی و رایج روی وب‌سرور هدف +gobuster dir -u http://192.168.56.101 -w /usr/share/wordlists/dirb/common.txt + +# تشخیص فناوری‌های به کار رفته در وب‌سایت هدف +whatweb http://192.168.56.101 +``` + +**۳. تحلیل آسیب‌پذیری — نگاه مدافع.** به ازای هر نقطه ضعف کشف شده، بلافاصله به **روش اصلاح آن** فکر کنید: پورت باز اضافی کشف شد ← مسدود کردن با فایروال؛ نسخه سرویس قدیمی است ← به‌روزرسانی سرویس؛ پوشه دارای دسترسی لیسانت فایل است ← غیرفعال کردن آپشن لیست دایرکتوری در وب‌سرور؛ رمز عبور پیش‌فرض است ← تغییر رمز عبور. هدف اصلی هک اخلاقی تبدیل نقاط ضعف به کارهای اصلاحی برای امنیت است. + +### کارهایی که یک هکر اخلاقی هرگز انجام نمی‌دهد: + +- بدون داشتن مجوز کتبی هیچ سیستمی را تست نمی‌کند — حتی برای «کنجکاوی ساده». +- از قوانین و چارچوب مشخص‌شده (Scope) خارج نمی‌شود. +- برای اثبات آسیب‌پذیری، داده‌ها را تخریب نکرده و خللی در کار سرویس‌ها ایجاد نمی‌کند. +- اطلاعات کشف شده را در جایی منتشر نکرده و از آن‌ها سوءاستفاده نمی‌کند؛ بلکه آن‌ها را به مالک گزارش داده و از سیستم خود پاک می‌کند. +- قبل از برطرف شدن باگ توسط شرکت، جزئیات آن را عمومی نمی‌کند (Responsible Disclosure). + +### مسیر رشد و یادگیری پیشرفته + +- مدارک معتبر: **CompTIA +Security** (مبانی)، **CEH** و مدرک کاملاً عملی و ارزشمند **OSCP**. +- مباحث کلیدی: امنیت وب (OWASP Top 10)، امنیت شبکه، اکتیو دایرکتوری (Active Directory)، تحلیل بدافزار و فارنزیک (Forensics). +- پیش‌نیازهای اصلی: **لینوکس + مفاهیم شبکه + اسکریپت‌نویسی (پایتون/بش)**؛ بدون این‌ها ابزارهای امنیتی مثل جعبه سیاه خواهند بود. + +**تمرین:** در شبکه آزمایشگاهی ایزوله خود ماشین‌های Kali و Metasploitable 2 را اجرا کنید. مراحل را انجام دهید: `nmap -sn` (یافتن آی‌پی هدف) ← `nmap -sV -p-` (یافتن پورت‌ها و نسخه‌ها) ← ۳ سرویس قدیمی را پیدا کرده و برای هر کدام در یادداشت‌های خود بنویسید که اگر مدیر آن سرور بودید **چگونه امنیت آن را تامین می‌کردید**. نوشتن گزارش بخش الزامی تمرین است. + +--- + +## 31. چک‌لیست دستورات: خود را بسنجید ✅ + +این بخش یک راهنمای دستورات نیست، بلکه ابزاری برای خودارزیابی مهارت‌های شماست. فقط زمانی گزینه‌ها را علامت بزنید که بتوانید کار مربوطه را **از حفظ و بدون نگاه کردن به راهنماها** انجام دهید و علت اجرای آن را کاملاً درک کنید. اگر در مرحله‌ای دچار ابهام شدید، به بخش مربوط به آن در متن آموزش بازگردید. هدف کل این دوره تیک زدن تمام این خانه‌ها است. + +### سطح ۱: بقا در ترمینال + +- [ ] درک موقعیت فعلی و مسیرها در سیستم فایل: `pwd` ،`ls -lah` ،`cd` +- [ ] دریافت راهنما برای دستورات سیستم: `man` ،`--help` ،`type` +- [ ] ساخت، کپی، تغییر نام و حذف فایل‌ها و پوشه‌ها +- [ ] خواندن فایل‌ها و لاگ‌ها: `cat` ،`less` ،`head` ،`tail -f` +- [ ] استفاده از تاریخچه و تکمیل خودکار در ترمینال: `Tab` ،`Ctrl+R` ،`!!` +- [ ] خروج ایمن از ویرایشگر vim بدون سردرگمی (`Esc` ← `:q!`) + +### سطح ۲: کاربر مطمئن و مستقل + +- [ ] تحلیل مجوز دسترسی مانند `-rwxr-xr--` و اصلاح آن با `chmod` +- [ ] تغییر مالک و گروه فایل با دستور `chown` +- [ ] نصب، حذف و جستجوی برنامه‌ها با استفاده از مدیریت بسته سیستم +- [ ] جستجوی فایل‌ها (`find`) و جستجوی متن درون فایل‌ها (`grep -r`) +- [ ] ساخت دستورات ترکیبی با اتصال حداقل ۳ دستور به کمک لوله `|` +- [ ] هدایت خروجی و خطاهای برنامه‌ها به فایل‌ها: `<` ،`<<` ،`2>` ،`2>&1` +- [ ] ساخت نام مستعار (alias) و متغیرهای محیطی دائمی در فایل `~/.bashrc` + +### سطح ۳: مدیر سیستم (Administrator) + +- [ ] پیدا کردن فرآیندها و خاتمه دادن به آن‌ها: `ps` ،`top`/`htop` ،`kill` ،`pkill` +- [ ] مدیریت سرویس‌های سیستم: `systemctl start/stop/restart/enable` +- [ ] خواندن لاگ سرویس‌ها و پیام‌های هسته: `journalctl -u` ،`journalctl -p err` ،`dmesg` +- [ ] عیب‌یابی مشکلات شبکه به صورت روشمند: `ip a` ،`ping` ،`ss -tulpn` ،`dig` +- [ ] بررسی فضای دیسک و وضعیت رم سیستم: `df -h` ،`du -sh` ،`free -h` +- [ ] ساخت و باز کردن فایل‌های فشرده آرشیو: `tar -czf` / `tar -xzf` +- [ ] تنظیم کارهای زمان‌بندی شده در سیستم به کمک `crontab -e` +- [ ] اتصال به سرور از طریق SSH و تنظیم دسترسی با کلیدهای امنیتی + +### سطح ۴: اسکریپت‌نویسی و خودکارسازی + +- [ ] نوشتن اسکریپت بش به همراه shebang، تعریف متغیرها و مدیریت پارامترهای ورودی (`$1`، `$#`) +- [ ] استفاده از ساختارهای شرطی و حلقه‌ها (`if` ،`for` ،`while`) و بررسی‌های فایل و پوشه (`[ -f ]` ،`[ -d ]`) +- [ ] اعمال دستور `set -euo pipefail` در ابتدای اسکریپت‌ها جهت بالا بردن ضریب اطمینان کارکرد +- [ ] ترکیب دستورات `find` به همراه `xargs` برای اعمال دستورات دسته‌جمعی روی فایل‌ها +- [ ] مقایسه مستقیم خروجی دو دستور بدون نیاز به ساخت فایل موقت با ابزار `((...)diff <(...) <` + +### سطح ۵: امنیت و محیط‌های عملیاتی + +- [ ] بالا بردن امنیت سرویس SSH (تنظیم کلیدها، بستن ورود با پسورد و غیرفعال کردن root و تغییر پورت) +- [ ] تنظیم قوانین فایروال با بستن ترافیک‌های پیش‌فرض ورودی (default-deny) +- [ ] نصب و تنظیم ابزار fail2ban و بررسی وضعیت آن +- [ ] بررسی فرآیندهای اشغال‌کننده پورت‌ها یا فایل‌ها با استفاده از `lsof` و `fuser` +- [ ] انجام کامل چک‌لیست امنیتی سرور جدید بر اساس بخش ۳۰ آموزش +- [ ] خراب کردن فایل تنظیمات یک سرویس و حل مشکل بر اساس خواندن لاگ‌ها و عیب‌یابی سیستم + +**تمرین:** این چک‌لیست را ذخیره کرده و به طور هفتگی میزان پیشرفت خود را در آن بررسی کنید. پر کردن خانه‌های این چک‌لیست بدون نگاه کردن به راهنماها، نشان‌دهنده تسلط واقعی شما بر مفاهیم خواهد بود. + +--- + +## 32. برگه تقلب دستورات + +| کار مورد نظر | دستور لینوکس | +|------------------------------|----------------------------------| +| مسیر پوشه فعلی من کجاست | `pwd` | +| نمایش لیست فایل‌ها و پوشه‌ها | `ls -lah` | +| تغییر پوشه فعلی سیستم | `cd path` | +| ساخت پوشه جدید / ساخت فایل خالی | `mkdir` / `touch` | +| کپی کردن فایل / انتقال و تغییر نام | `cp` / `mv` | +| حذف فایل / حذف پوشه به همراه محتویات | `rm` / `rm -r` | +| مشاهده محتویات فایل متنی | `cat` / `less` | +| جستجوی فایل در سیستم | `find / -name filename` | +| جستجوی متن خاص در فایل‌ها | `grep -r text .` | +| تغییر مجوزها / تغییر مالک فایل | `chmod` / `chown` | +| نمایش فرآیندهای فعال سیستم | `ps aux` / `htop` | +| خاتمه دادن به اجرای فرآیند | `kill PID` | +| مدیریت وضعیت سرویس‌های سیستم | `systemctl start/status name` | +| مشاهده لاگ‌های مربوط به یک سرویس | `journalctl -u name` | +| نصب برنامه جدید در سیستم | `sudo apt install name` | +| بررسی فضای مصرفی و آزاد دیسک‌ها | `df -h` | +| نمایش کارت‌های شبکه و آی‌پی‌ها | `ip a` | +| نمایش پورت‌های باز سیستم | `ss -tulpn` | +| اتصال به سرور راه دور با پروتکل امن | `ssh user@host` | +| دریافت دفترچه راهنمای دستورات | `man command` | + +--- + +## 33. واژه‌نامه + +- **هسته (Kernel)** — بخش اصلی سیستم‌عامل که مدیریت سخت‌افزار، حافظه و فرآیندها را بر عهده دارد. +- **توزیع (Distribution / Distro)** — مجموعه‌ای شامل هسته لینوکس و ابزارهای سیستم آماده برای نصب (مانند Ubuntu و Debian). +- **پوسته (Shell)** — برنامه‌ای که دستورات شما را از کیبورد دریافت کرده و آن‌ها را برای اجرا به سیستم می‌فرستد (مانند bash و zsh). +- **ترمینال (Terminal)** — واسط و پنجره گرافیکی که دستورات را در آن تایپ می‌کنید. +- **کاربر root** — کاربر ارشد سیستم با دسترسی‌های نامحدود و مدیریتی کامل. +- **دستور sudo** — اجرای یک دستور خاص با دسترسی‌های موقت کاربر root. +- **سرویس پس‌زمینه (Daemon)** — برنامه‌ای که در پس‌زمینه سیستم اجرا می‌شود و خدماتی را ارائه می‌دهد (مانند sshd و nginx). +- **شناسه فرآیند (PID)** — کد عددی منحصر‌به‌فرد که سیستم به هر فرآیند در حال اجرا اختصاص می‌دهد. +- **سوار کردن (Mounting)** — متصل کردن یک پارتیشن دیسک به پوشه‌ای در درخت یکپارچه سیستم فایل. +- **مخزن (Repository)** — سرورهای آرشیو نرم‌افزارها که پکیج منیجر برنامه‌ها را از آنجا دانلود و نصب می‌کند. +- **لوله (Pipe)** — کاراکتر `|` که برای هدایت خروجی یک دستور به ورودی دستور بعدی استفاده می‌شود. +- **جریان‌های استاندارد (stdin/stdout/stderr)** — مسیرهای ورودی، خروجی معمولی و خطاهای یک برنامه در سیستم. + +--- + +# بخش سوم: مباحث پیشرفته + +این بخش‌ها فراتر از مباحث مدیریت پایه لینوکس هستند. زمانی به سراغ این مباحث بروید که به راحتی در ترمینال کار می‌کنید و قصد دارید در حوزه‌هایی مانند DevOps، مهندسی SRE یا مهندسی سیستم فعالیت کنید. این مباحث را به صورت عملی یاد بگیرید: آن‌ها را در ماشین مجازی نصب کنید، خراب کنید و عیب‌یابی آن‌ها را یاد بگیرید. + +## A1. کانتینری‌سازی: Docker و Podman + +کانتینر (Container) یک فرآیند ایزوله است که از هسته سیستم‌عامل میزبان استفاده می‌کند اما سیستم‌فایل، شبکه و فرآیندهای مجزای خود را دارد. برخلاف ماشین‌های مجازی، کانتینرها هسته سیستم‌عامل مجزا بارگذاری نمی‌کنند؛ به همین دلیل در کسری از ثانیه راه‌اندازی می‌شوند و منابع بسیار کمی مصرف می‌کنند. + +زیر پوسته کانتینرها در لینوکس دو مکانیزم هسته قرار دارد: Namespaces مواردی که فرآیند مجاز به دیدن آن‌ها است را ایزوله می‌کند (مانند پورت‌های شبکه، فرآیندها و مسیرهای سوار شده بر دیسک) و Cgroups میزان مصرف منابع سخت‌افزاری توسط فرآیند را کنترل و محدود می‌کند (مانند میزان CPU، رم و پهنای باند دیسک). درک این دو مکانیزم کلید کار با کانتینرها است. + +یادگیری را با Docker شروع کنید: یاد بگیرید چگونه فایل Dockerfile بنویسید، ایمیج‌ها را با دستور docker build بسازید، کانتینرها را با docker run اجرا کنید، پورت‌ها و دیسک‌ها را به درون کانتینر متصل کنید و سناریوهای چندکانتینری را در فایل docker-compose.yml توصیف و اجرا کنید. در کنار آن، ابزار Podman را نیز بررسی کنید؛ پودمن با دستورات داکر سازگار است اما بدون نیاز به دیمون (daemonless) کار می‌کند و امنیت بالاتری دارد زیرا نیازی به دسترسی root برای کانتینرها ندارد. + +**تمرین:** ایمیج یک برنامه وب ساده بسازید، آن را با تنظیم پورت و دیسک پایدار اجرا کنید، سپس سناریوی اتصال برنامه وب به پایگاه داده را در فایل docker-compose توصیف کرده و کل پروژه را با یک دستور بالا بیاورید. + +## A2. ارکستریشن کانتینرها: مبانی Kubernetes + +وقتی تعداد کانتینرها زیاد می‌شود و روی چندین سرور مختلف توزیع می‌شوند، مدیریت دستی آن‌ها غیرممکن می‌شود؛ شما به ابزاری برای راه‌اندازی خودکار، ری‌استارت کانتینرهای خراب شده، تقسیم بار و آپدیت بدون قطعی نیاز دارید. این وظیفه بر عهده ارکستریتورها است و استاندارد فعلی این حوزه ابزار Kubernetes (یا k8s) است. + +مفاهیم پایه کوبرنتیز: پاد (Pod) کوچک‌ترین واحد اجرایی؛ دیپلویمنت (Deployment) توصیف‌کننده وضعیت مطلوب برنامه (مثلاً تعریف کارکرد هم‌زمان ۳ کپی از برنامه)؛ سرویس (Service) ایجادکننده یک نقطه دسترسی شبکه پایدار به پادها؛ و ابزارهای ConfigMap و Secret برای ذخیره تنظیمات و اطلاعات حساس به صورت مجزا از کانتینرها. ایده اصلی کوبرنتیز توصیف declarative است: شما وضعیت مطلوب خود را در فایل‌های YAML توصیف می‌کنید و کوبرنتیز مدام سیستم را به آن وضعیت می‌رساند. + +برای یادگیری نیازی به سرورهای متعدد ندارید؛ می‌توانید یک کلاستر محلی کوچک با ابزارهایی مانند minikube یا kind روی کامپیوتر خود بسازید و آن را با ابزار خط فرمان kubectl مدیریت کنید. + +**تمرین:** پروژه بخش A1 را در کلاستر محلی minikube دیپلوی کنید: یک فایل Deployment با ۳ کپی بسازید، دسترسی به آن را با ساخت یک Service فراهم کنید، سپس تعداد کپی‌ها را تغییر داده و آپدیت ایمیج را تست کنید و کارکرد کوبرنتیز را در تغییر خودکار وضعیت سیستم ببینید. + +## A3. خودکارسازی و زیرساخت به عنوان کد: Ansible + +پیکربندی دستی تک‌تک سرورها کاری زمان‌بر و مستعد خطا است. رویکرد «زیرساخت به عنوان کد» (Infrastructure as Code) پیشنهاد می‌دهد که وضعیت مطلوب سرورها در قالب کد توصیف شده و در سیستم گیت ذخیره شود تا بتوان بارها آن را روی سرورها اعمال کرد. + +ابزار Ansible بهترین گزینه برای شروع این کار است: انسیبل نیازی به نصب عامل (Agent) روی سرورهای مقصد ندارد و کارهای خود را بر بستر پروتکل استاندارد SSH انجام می‌دهد. کارها در فایل‌های متنی YAML به نام Playbook تعریف می‌شوند، مشخصات سرورها در فایل Inventory گروه‌بندی می‌شوند و وظایف را می‌توان در قالب Roleها بازنویسی کرد. ویژگی مهم یک پلی‌بوک خوب، خاصیت «تکرارپذیری بدون خطا» (Idempotency) است؛ یعنی اجرای مجدد آن روی سروری که قبلاً پیکربندی شده، کار اضافی انجام ندهد و سیستم را خراب نکند. + +**تمرین:** یک Playbook انسیبل بنویسید که روی سرور خام وب‌سرور nginx را نصب کند، فایل تنظیمات شما را در مسیر درست قرار دهد و مطمئن شود سرویس در حال کار و در وضعیت شروع خودکار بوت قرار دارد. پلی‌بوک را دو بار اجرا کنید و مطمئن شوید در اجرای دوم تغییری در سیستم ایجاد نمی‌شود. + +## A4. مانیتورینگ و مشاهده‌پذیری (Observability) + +یک سرور فعال باید کاملاً شفاف باشد؛ شما باید قبل از اینکه کاربران متوجه شوند، از بروز مشکلات سیستم باخبر شوید. مشاهده‌پذیری به سه بخش اصلی تقسیم می‌شود: متریک‌ها (کدهای عددی در بازه زمان)، لاگ‌ها (ثبت وقایع رخ داده) و تریسینگ (ردگیری مسیر حرکت یک درخواست در بخش‌های مختلف سیستم). + +سیستم مانیتورینگ محبوب دنیای متن‌باز ترکیب دو ابزار Prometheus برای جمع‌آوری متریک‌ها و Grafana برای رسم نمودارها است. پرومتئوس متریک‌ها را به روش pull از سرورها جمع‌آوری می‌کند و هشدارهای سیستم با ابزار Alertmanager مدیریت می‌شوند. برای شروع مانیتورینگ، روی معیارهای اصلی سیستم متمرکز شوید: میزان تاخیر (Latency)، ترافیک ورودی، درصد خطاها و میزان اشباع منابع سخت‌افزاری. + +**تمرین:** ابزارهای Prometheus و node_exporter را روی سیستم خود نصب کنید، با متصل کردن آن‌ها به Grafana نمودارهای زنده مصرف CPU و رم را بسازید و یک هشدار برای پر شدن فضا (کمتر از ۱۰ درصد فضای خالی دیسک) تنظیم کنید. + +## A5. کارایی سیستم و تیونینگ (Tuning) + +وقتی سرعت سرور کاهش می‌یابد، دلیل آن را باید با ابزارها پیدا کرد نه با حدس و گمان. با ابزارهای مانیتورینگ پایه شروع کنید: top/htop برای پردازش‌ها، vmstat و free برای حافظه، iostat برای دیسک و دستور ss برای شبکه. برای بررسی‌های عمیق‌تر: دستور strace فراخوانی‌های سیستم را نشان می‌دهد، perf مشخص می‌کند پردازنده در کدام توابع زمان مصرف می‌کند و sysctl برای اعمال تغییرات در پارامترهای هسته در پوشه `/proc/sys` استفاده می‌شود. + +قانون طلایی تیونینگ: همیشه قبل و بعد از تغییر مقادیر، تست کارایی بگیرید و در هر بار تغییر، فقط یک پارامتر را تغییر دهید تا اثر دقیق آن را بفهمید. + +**تمرین:** با ابزار stress-ng روی پردازنده سیستم بار مصنوعی ایجاد کنید، منبع تحت فشار را شناسایی کنید، با ابزار sysctl یکی از پارامترهای هسته را تغییر دهید و اثر آن را ثبت کنید. + +## A6. مفاهیم پیشرفته شبکه و فایروال + +در محیط‌های کاری واقعی، باید دقیقاً مسیر عبور بسته‌های شبکه از لایه‌های سیستم‌عامل را درک کنید. در توزیع‌های مدرن وظیفه فیلتر کردن بسته‌ها بر عهده nftables است (که قبلاً iptables بود) و ابزارهای ufw یا firewalld به عنوان لایه‌های ساده‌تر روی آن کار می‌کنند. مفاهیم مسیریابی شبکه (`ip route`)، تغییر آدرس‌ها (NAT) و ساخت شبکه‌های خصوصی مجازی مانند WireGuard را یاد بگیرید. برای عیب‌یابی پکت‌ها از ابزارهای tcpdump و mtr استفاده کنید. + +**تمرین:** قوانین nftables را طوری تنظیم کنید که فقط ترافیک‌های ورودی SSH و HTTPS مجاز باشند، یک تونل WireGuard بین دو ماشین مجازی بسازید و پکت‌های شبکه را با tcpdump رصد کنید. + +## A7. مدیریت ذخیره‌سازی: LVM و RAID + +ابزار LVM (Logical Volume Manager) یک لایه انتزاعی روی دیسک‌های فیزیکی ایجاد می‌کند: شما می‌توانید پارتیشن‌های فیزیکی مختلف را به یک گروه هارد (Volume Group) متصل کنید و از درون آن پارتیشن‌های مجازی (Logical Volumes) بسازید که بدون نیاز به تغییر پارتیشن‌بندی دیسک، به راحتی قابل توسعه و جابه‌جا شدن باشند. تکنولوژی RAID چند دیسک فیزیکی را برای بالا بردن امنیت داده‌ها یا افزایش سرعت ترکیب می‌کند (مانند RAID1 آیینه، RAID5 با بخش parity). اسنپ‌شات‌های LVM به شما اجازه می‌دهند از اطلاعات دیسک در یک لحظه بکاپ تمیز بگیرید. + +**تمرین:** دو هارد دیسک فیزیکی مجازی به سیستم خود اضافه کرده و آن‌ها را در یک گروه LVM متصل کنید، یک درایو منطقی بسازید، آن را فرمت و سوار کنید، فضا را به صورت پویا افزایش دهید و یک اسنپ‌شات از درایو تهیه کنید. + +## A8. مجازی‌سازی: KVM و QEMU + +تکنولوژی KVM قابلیت مجازی‌سازی سخت‌افزاری را مستقیماً به هسته لینوکس اضافه می‌کند و QEMU شبیه‌سازی سخت‌افزارها را برای سیستم‌عامل‌های مهمان انجام می‌دهد. ترکیب این دو به همراه ابزار مدیریتی libvirt و دستور virsh، یک پلتفرم مجازی‌سازی قدرتمند و بدون هزینه روی سرورها ایجاد می‌کند که پایه اصلی زیرساخت‌های ابری بزرگ دنیا است. + +**تمرین:** با ابزار libvirt یک ماشین مجازی کوچک بدون محیط گرافیکی بسازید، کارت شبکه آن را تنظیم کرده و با دستور virsh ماشین را مدیریت کنید (روشن کردن، خاموش کردن و تهیه اسنپ‌شات). + +--- + +## دستورات کاربردی روزمره و عیب‌یابی حوادث سرور 🚑 + +این بخش گلچینی از تک‌خطی‌های کاربردی است که در وقت شما صرفه‌جویی می‌کنند و راهنمای مدیریت بحران در زمان بروز خرابی روی سرورها هستند. تمام دستورات را در ماشین مجازی تمرین کنید. + +### تک‌خطی‌های پرکاربرد خط فرمان + +```bash +# ده فرآیند اول پرمصرف رم و سی‌پی‌یو +ps aux --sort=-%mem | head -n 11 +ps aux --sort=-%cpu | head -n 11 + +# نمایش حجم پوشه‌های مسیر فعلی به ترتیب نزولی +du -sh ./* 2>/dev/null | sort -rh | head + +# یافتن ۲۰ فایل بسیار بزرگ در کل هارد دیسک +find / -type f -printf '%s %p\n' 2>/dev/null | sort -rn | head -20 + +# تغییر نام دسته‌جمعی فرمت فایل‌ها از txt. به md. +for f in *.txt; do mv -- "$f" "${f%.txt}.md"; done + +# شمارش تعداد فایل‌ها بر اساس پسوندهای آن‌ها در پوشه فعلی +find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn + +# راه‌اندازی سریع وب‌سرور برای اشتراک‌گذاری فایل‌های پوشه فعلی +python3 -m http.server 8000 + +# جایگزینی کلمه قدیمی با کلمه جدید در تمام فایل‌های پوشه به صورت بازگشتی (به همراه بکاپ با پسوند bak) +grep -rl 'old_text' . | xargs sed -i.bak 's/old_text/new_text/g' + +# استخراج ۱۰ آی‌پی برتر و تعداد درخواست‌های آن‌ها از لاگ وب‌سرور +awk '{print $1}' access.log | sort | uniq -c | sort -rn | head +``` + +### کاربرد حرفه‌ای دستور grep + +```bash +grep -rni 'error' /var/log # جستجوی بازگشتی، بدون حساسیت به حروف کوچک و بزرگ به همراه شماره خط +grep -A3 -B2 'panic' system.log # نمایش ۲ خط قبل و ۳ خط بعد از پیدا شدن کلمه panic (جهت بررسی زمینه خطا) +grep -c 'failed' auth.log # شمارش تعداد دفعات تکرار کلمه failed در فایل +grep -vE '^\s*(#|$)' file.conf # نمایش فایل تنظیمات بدون خطوط کامنت شده و خطوط خالی +grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' file # استخراج تمام آی‌پی آدرس‌های موجود در فایل +``` + +> نکته کاربردی: سوییچ `v-` نتایج را معکوس می‌کند (نمایش خطوطی که شامل کلمه نیستند)، سوییچ `E-` قابلیت عبارات باقاعده پیشرفته (Regex) را فعال می‌کند، سوییچ `o-` فقط خود عبارت پیدا شده را چاپ می‌کند نه کل خط را. + +### مدیریت بحران: وقتی «همه‌چیز خراب شده است» چه کنیم؟ + +**پر شدن دیسک سرور (`No space left on device`).** ابتدا با `df -h` درایور پر شده را پیدا کنید. با دستور `head | du -sh /var/* | sort -rh` مسیر پوشه پرحجم را بیابید. معمولاً فایل‌های لاگ پرحجم در مسیر `/var/log` مقصر اصلی هستند. لاگ‌های ژورنال سیستم را با دستور `journalctl --vacuum-size=200M` محدود و پاک‌سازی کنید. توجه کنید: گاهی پس از حذف فایل با `rm` فضا آزاد نمی‌شود زیرا فایل همچنان توسط پردازشی باز نگه داشته شده است؛ این فایل‌ها را با دستور `lsof | grep deleted` بیابید و پردازش مربوطه را ری‌استارت کنید. + +**سیستم بوت نمی‌شود / وارد حالت Emergency می‌شود.** خونسرد باشید: در منوی GRUB نسخه هسته قبلی را برای بوت انتخاب کنید یا پارامتر ورود به محیط نجات را در انتهای خط بوت اضافه کنید. پس از بالا آمدن موقت سیستم، لاگ‌های بوت اخیر را با دستور `journalctl -b -p err` و لیست سرویس‌های خراب را با `systemctl --failed` بررسی کنید. شایع‌ترین دلیل این اتفاق وجود اشتباه در فایل `/etc/fstab` است که سیستم در زمان بوت سعی دارد دیسک ناموجود را سوار کند و قفل می‌کند. به همین دلیل بعد از هر تغییر در fstab، دستور `mount -a` را قبل از ریبوت جهت تست اجرا کنید. + +**سرور کند شده و بار پردازشی بالاست.** دستور `uptime` لود سرور (Load Average) را نشان می‌دهد. htop فرآیند پرمصرف را مشخص می‌کند. دستور `iostat -x 1` گلوگاه دیسک را بررسی می‌کند. رم را با `free -h` چک کنید. اگر لود بالاست اما مصرف CPU پایین است، پردازش‌ها منتظر پاسخ دیسک هستند (وضعیت `D` در top). خروجی دستور `dmesg | grep -i oom` را چک کنید تا مطمئن شوید پروسه‌ای توسط OOM Killer کشته نشده باشد. + +**حذف تصادفی فایل یا خراب شدن فایل تنظیمات.** پیشگیری بهترین درمان است: قبل از تغییر فایل‌ها کپی با پسوند bak تهیه کنید. از ماشین مجازی قبل از کارهای خطرناک اسنپ‌شات بگیرید. ابزار `etckeeper` را روی سرورها نصب کنید تا تمام تغییرات پوشه `/etc` به صورت خودکار در سیستم git محلی ذخیره شوند؛ این‌گونه به راحتی می‌توانید هر تعییری را به عقب بازگردانید. + +**بررسی اتصالات مشکوک.** خروجی دستور `ss -tulpn` تمام پورت‌های در حال گوش دادن و نام پردازش‌های پشت آن‌ها را نشان می‌دهد. با دستور `systemctl list-units --type=service --state=running` سرویس‌های فعال سیستم را ببینید. + +### عادت‌های کاری ایمن برای جلوگیری از فاجعه + +- قبل از اجرای دستور `rm -rf` حتماً دو بار مسیر آن را بررسی کنید؛ برای حذف‌های گروهی ابتدا دستور را با `find` معمولی برای دیدن لیست فایل‌ها اجرا کنید و پس از اطمینان، سوییچ `delete-` را به آن اضافه کنید. +- دستورات خطرناک (مانند `dd` ،`mkfs` یا `rm -rf`) را هرگز کورکورانه از اینترنت کپی نکنید و حتماً تک‌تک سوییچ‌های آن‌ها را بفهمید. +- قبل از هر کار پر ریسک اسنپ‌شات بگیرید، نه بعد از بروز خرابی. +- فایلی که بازیابی آن را تا به حال تست نکرده‌اید، فایل پشتیبان (بکاپ) نیست؛ بلکه فقط یک آرزو است. بازیابی بکاپ‌ها را به طور منظم تست کنید. + +**تمرین:** یک حادثه فرضی ایجاد کنید: با دستور `fallocate -l 5G /tmp/big` یک فایل ۵ گیگابایتی بسازید تا دیسک پر شود، وضعیت را با `df -h` بررسی کنید، فایل حجیم را با `du` پیدا کرده و آن را حذف کنید تا دیسک آزاد شود. یک خط نامعتبر در فایل `/etc/fstab` بنویسید و قبل از ریبوت صحت آن را با `mount -a` بسنجید و سپس آن را اصلاح کنید. + +--- + +## ۳۴. مسیرهای بعدی برای پیشرفت + +- **حوزه DevOps و مدیریت سیستم:** یادگیری ابزارهای Docker و docker-compose، سیستم‌های ارکستریشن (Kubernetes)، خودکارسازی کارها با Ansible، راه‌اندازی مانیتورینگ (Prometheus, Grafana)، کار با nginx به عنوان Reverse Proxy و مفاهیم CI/CD. +- **امنیت سرورها:** مفاهیم عمیق فایروال‌ها، مدیریت دسترسی‌ها (SELinux/AppArmor)، تحلیل لاگ‌ها و راه‌اندازی شبکه‌های خصوصی مجازی (VPN). +- **شبکه پیشرفته:** مفاهیم عمیق مسیریابی شبکه، ساخت پروتکل‌های VPN (مانند WireGuard)، مدیریت سرور DNS محلی و تقسیم بار ترافیکی (Load Balancing). +- **پایگاه‌های داده و وب:** نصب و بهینه‌سازی پایگاه‌های داده PostgreSQL/MySQL، مدیریت فرآیند وب‌سایت‌ها و مدیریت گواهینامه‌های SSL به کمک Let's Encrypt. +- **برنامه‌نویسی سیستمی:** توسعه برنامه‌ها روی توابع سیستمی لینوکس، مدیریت سیگنال‌ها، کار با فراخوانی‌های سیستم و نوشتن سرویس‌های سفارشی برای systemd. + +مدارک بین‌المللی مناسب برای رزومه: مدرک مقدماتی **LFCS** و مدرک معتبر و شرکتی **RHCSA** (مدیریت لینوکس رد هت). + +--- + +## ۳۵. مدیریت پیشرفته لینوکس 🛠 + +وقتی به دستورات خط فرمان مسلط شدید، کارهای اصلی مدیریت سیستم آغاز می‌شود: خودکارسازی کارها، عیب‌یابی سیستم‌ها تحت بارهای سنگین، ایزوله‌سازی سرویس‌ها و مدیریت بهینه منابع سخت‌افزاری. این بخش پلی برای تبدیل شدن به یک مدیر سیستم حرفه‌ای است. در هر بخش دلیل استفاده از ابزار توضیح داده شده است. + +### 35.1. درک عمیق‌تر سیستم مدیریت خدمات systemd + +ابزار `systemd` فقط برای استارت و استاپ سرویس‌ها نیست، بلکه ترتیب راه‌اندازی، محدود کردن منابع و ایزوله‌سازی پردازش‌ها را مدیریت می‌کند. + +```bash +systemctl list-dependencies nginx # نمایش درختی وابستگی‌های سرویس nginx +systemctl cat nginx # نمایش فایل تنظیمات اصلی سرویس به همراه تغییرات سفارشی +systemd-analyze blame # بررسی زمان بوت تک‌تک سرویس‌ها برای یافتن علت کندی بوت +systemd-analyze critical-chain # نمایش زنجیره بحرانی سرویس‌ها در زمان بوت سیستم +systemctl edit nginx # ایجاد تغییرات سفارشی در تنظیمات سرویس بدون تغییر فایل اصلی +``` + +محدود کردن منابع سخت‌افزاری به طور مستقیم در فایل سرویس (با بهره‌گیری از مکانیزم cgroups): + +```ini +[Service] +MemoryMax=512M +CPUQuota=50% +TasksMax=100 +``` + +**اهمیت کار:** بروز خطا یا اورلود در یک سرویس نباید کل سرور را از کار بیندازد. تنظیم گزینه‌های `MemoryMax` و `CPUQuota` یک بیمه امنیتی در سطح هسته سیستم‌عامل است. + +**نکته مهم:** فایل‌های سرویس‌ها را مستقیماً در مسیر `/lib/systemd/system/` ویرایش نکنید؛ زیرا با آپدیت بسته‌ها این تغییرات پاک می‌شوند. همیشه تغییرات را با دستور `systemctl edit` اعمال کنید که تغییرات را در پوشه مخصوص `/etc/systemd/system/.d/` ذخیره می‌کند. + +### 35.2. مشاهده‌پذیری منابع سیستم + +```bash +htop # مانیتورینگ تعاملی (دیدن فرآیندها به صورت درختی با کلید F5) +btop # ابزاری مدرن و زیبا برای رصد سی‌پی‌یو، رم، دیسک و شبکه با نمودارهای متنی +iotop # شناسایی پردازش‌هایی که هارد دیسک را درگیر کرده‌اند (نیازمند دسترسی root) +iftop / nload # مانیتورینگ میزان استفاده پردازش‌ها از پهنای باند کارت شبکه +ss -tulpn # نمایش پورت‌های باز و فرآیندهای متصل به آن‌ها +vmstat 1 # نمایش آمار رم، پردازش‌های صف پردازنده و سوییچ‌ها در هر ثانیه +dstat -tcmnd # خلاصه آماری تمام منابع سیستم به طور هم‌زمان روی صفحه ترمینال +journalctl -fu nginx # رصد زنده لاگ‌های مربوط به وب‌سرور nginx +``` + +**روش «USE»** در عیب‌یابی منابع سیستم: برای هر منبع اصلی (سی‌پی‌یو، رم، دیسک و شبکه) سه معیار را بررسی کنید: میزان استفاده (**U**tilization)، اشباع و صف‌های ایجاد شده (**S**aturation) و خطاهای رخ داده (**E**rrors). این شیوه بسیار علمی‌تر از اجرای پراکنده دستورات است. + +### 35.3. کارایی سیستم و لود پردازشی + +```bash +uptime # نمایش لود میانگین سیستم در بازه‌های ۱، ۵ و ۱۵ دقیقه اخیر +cat /proc/loadavg +sar -u 1 5 # دریافت گزارش‌های کارکرد پردازنده در فواصل مشخص (نیاز به بسته sysstat) +perf top # نمایش توابع سیستمی که پردازنده را به شدت درگیر کرده‌اند +strace -p # مشاهده زنده فراخوانی‌های سیستم یک پردازش در حال کار +ltrace -p # مشاهده زنده فراخوانی‌های توابع کتابخانه‌ای یک پردازش +lsof -p # نمایش تمام فایل‌ها و اتصالات باز توسط یک پردازش خاص +``` + +**نحوه تحلیل Load Average:** عدد لود نباید از تعداد هسته‌های پردازنده شما بیشتر باشد. لود عدد ۸.۰ روی سروری با ۴ هسته پردازنده نشان‌دهنده صف طویلی است که پردازنده قادر به پاسخگویی به آن نیست. تعداد هسته‌های سیستم را با دستور `nproc` به دست آورید. + +### 35.4. ایزوله‌سازی کانتینرها بدون ابزارهای جادویی + +کانتینر یک ماشین مجازی نیست، بلکه پردازشی معمولی است که به کمک مکانیزم‌های namespace و cgroup محدود شده است. + +```bash +unshare --fork --pid --mount-proc bash # ساخت دستی یک namespace مجزا برای فرآیندها +lsns # نمایش تمام namespaceهای فعال سیستم +nsenter -t -n ss -tulpn # ورود به بخش شبکه یک namespace دیگر برای عیب‌یابی پورت‌های آن +systemd-nspawn -D /path/to/rootfs # ساخت کانتینر سبک با استفاده از ابزارهای داخلی systemd +``` + +**کاربرد عملی:** وقتی کانتینری به شبکه متصل نمی‌شود یا فایلی را پیدا نمی‌کند، با دانستن این مفاهیم متوجه می‌شوید که مشکل از تنظیمات namespace یا mountها است و کانتینر یک جعبه جادویی سیاه نیست. + +### 35.5. خودکارسازی و تکرارپذیری بدون خطا (Idempotency) + +تنظیم دستی سرورها در ابعاد بزرگ ناممکن است. قاعده اصلی: **پیکربندی به عنوان کد**. + +```bash +# انسیبل: نصب nginx روی گروه سرورهای وب بدون نیاز به اتصال دستی تک‌تک آن‌ها +ansible web -m apt -a "name=nginx state=present" --become + +# اسکریپت تکرارپذیر بش: بررسی وجود متن قبل از اضافه کردن آن به فایل تنظیمات +grep -qxF 'net.ipv4.ip_forward=1' /etc/sysctl.conf \ + || echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf +``` + +**تکرارپذیری (Idempotency)** مفهوم کلیدی در خودکارسازی است: یعنی اسکریپت را بتوان بارها اجرا کرد بدون اینکه داده‌های تکراری بسازد یا تنظیمات قبلی را خراب کند. استفاده از دستور `<<` بدون بررسی قبلی یک خطای کاری است. + +### 35.6. فایل‌های پشتیبان مطمئن + +```bash +rsync -aAXH --delete /data/ /backup/data/ # کپی کامل داده‌ها با حفظ مجوزها، لینک‌ها و مشخصات فایل +restic backup /data # ساخت نسخه پشتیبان با قابلیت فشرده‌سازی، رمزنگاری و حذف داده‌های تکراری +``` + +**قانون پشتیبان‌گیری ۳-۲-۱:** تهیه ۳ نسخه از داده‌ها، روی ۲ نوع رسانه ذخیره‌سازی متفاوت، که حداقل ۱ نسخه از آن‌ها در خارج از محل فیزیکی سرورها نگهداری شود. به یاد داشته باشید: **بکاپ تست‌نشده بکاپ نیست، بلکه فقط یک امیدواری است.** + +### 35.7. مباحثی برای یادگیری عمیق‌تر + +- **سیستم‌های امنیتی SELinux / AppArmor** — سیستم‌های کنترل دسترسی اجباری در لینوکس؛ دستورات `ausearch` ،`audit2allow` ،`aa-status`. +- **LVM و اسنپ‌شات‌ها** — درایوهای منطقی با قابلیت تغییر حجم و تهیه ایمیج آنی قبل از کارهای ریسک‌دار. +- **ابزارهای tuned / sysctl** — پروفایل‌های آماده برای بهینه‌سازی سیستم جهت کارهای شبکه، پایگاه داده یا مجازی‌سازی. +- **تکنولوژی eBPF (ابزارهای bcc, bpftrace)** — رصد و ردگیری کدهای هسته بدون نیاز به کامپایل مجدد آن؛ آینده دنیای مانیتورینگ. +- **ابزارهای مدیریت زیرساخت** — استفاده از Ansible و Terraform برای پیاده‌سازی زیرساخت‌های بزرگ. + +> اصل اساسی مدیریت پیشرفته سرور: کاری را که دو بار انجام داده‌اید خودکار کنید؛ مواردی که احتمال خرابی دارند را مانیتور کنید؛ و هرگز تغییری روی سرورهای عملیاتی اعمال نکنید مگر اینکه راه برگشت از آن را تمرین کرده باشید. + +**تمرین:** یکی از سرویس‌های فعال ماشین مجازی خود را انتخاب کنید، حافظه مصرفی آن را با دستور `systemctl edit` به مقدار محدودی تنظیم کنید (`MemoryMax=128M`)، سپس روی آن سرویس بار پردازشی مصنوعی ایجاد کنید و در لاگ‌های `journalctl` چگونگی متوقف شدن پردازش توسط هسته به دلیل عبور از محدودیت را بررسی و تحلیل کنید. + +--- + +## 36. کتاب‌های رایگان و مفید 📚 + +کتاب‌ها برخلاف مقالات پراکنده، به دانش شما نظم و سیستم می‌دهند. تمام منابع زیر به صورت قانونی و رایگان در دسترس قرار دارند. + +**پایه و فلسفه سیستم‌های Unix/Linux** + +- **کتاب «The Linux Command Line» نوشته William Shotts** — بهترین کتاب رایگان برای شروع. فایل PDF آن در سایت نویسنده (linuxcommand.org) در دسترس است. این کتاب شما را از دستور اول تا نوشتن اسکریپت‌های پیچیده بش همراهی می‌کند. +- **کتاب «The Art of Unix Programming» نوشته Eric S. Raymond** — تحلیل فلسفه یونیکس: چرا سیستم‌ها از ابزارهای کوچک و جریان‌های متنی ساده تشکیل شده‌اند. متن کامل آن به صورت آنلاین در دسترس است. +- **دفترچه راهنمای رسمی «GNU Bash Reference Manual»** — مرجع رسمی پوسته bash. این سند منبع اصلی برای یافتن پاسخ سوالات درباره الگوها، متغیرها و رفتارهای پوسته است. + +**مدیریت سیستم و شبکه** + +- **کتاب «The Linux System Administrator's Guide» (پروژه TLDP)** — راهنمای کلاسیک مدیریت سیستم. برخی بخش‌های آن قدیمی شده اما مفاهیم پایه آن همچنان معتبر هستند. +- **سند رسمی «Securing Debian Manual»** — دستورالعمل رسمی دبیان برای تامین امنیت سیستم. مکملی عالی برای بخش امنیت سرورها در این دوره. +- **کتاب «Beej's Guide to Network Programming»** — اگر قصد دارید مباحث شبکه را در سطح سوکت‌ها و برنامه‌نویسی عمیقاً یاد بگیرید. فایل آن در سایت نویسنده رایگان است. + +**مباحث تخصصی: هسته و ساختارهای داخلی لینوکس** + +- **مستندات رسمی هسته لینوکس** (kernel.org/doc) — مرجع اصلی برای درک عملکرد هسته، زیرسیستم‌ها و رابط‌های برنامه آن. +- **کتاب دانشگاهی «Operating Systems: Three Easy Pieces» (OSTEP)** — کتاب درسی دانشگاهی رایگان و عالی درباره سیستم‌عامل‌ها (فرآیندها، حافظه و سیستم‌فایل‌ها). ساختاری که لینوکس بر آن بنا شده را توضیح می‌دهد. +- **کتاب «Advanced Programming in the Unix Environment»** — مرجع کدهای سیستم و برنامه‌نویسی سطح پایین یونیکس (بخشی از مطالب آن به صورت آنلاین در دسترس است). + +**منابع تکمیلی برای جستجو** + +- **صفحات man و ابزار `tldr`** — در دسترس‌ترین مستندات روی سیستم شما که متناسب با نسخه برنامه‌های شما به‌روز هستند. +- **پروژه مستندات لینوکس (tldp.org)** — آرشیوی بزرگ از راهنماها و مقالات آموزشی. +- **ویکی توزیع آرچ (Arch Wiki)** — حتی اگر از توزیع Arch استفاده نمی‌کنید، این ویکی یکی از بهترین و دقیق‌ترین مراجع فنی لینوکس در کل دنیا است. + +> توصیه: کتاب‌ها را یک‌باره نخوانید. یک بخش را مطالعه کنید، آن را فوراً در ترمینال تمرین کنید و سپس ادامه دهید. مطالعه بدون تمرین در خط فرمان، به سرعت فراموش می‌شود. + +**تمرین:** کتاب «The Linux Command Line» را دانلود کنید، فصل مربوط به هدایت جریان‌ها (Redirecting Redirection) را بخوانید، مطالب آن را با بخش ۱۳ این دوره مقایسه کرده و تفاوت‌ها را یادداشت کنید. + +--- + +## 37. کانال‌های تلگرامی مفید 🖥 + +کانال‌های تلگرامی برای قرار گرفتن در جریان اخبار، ترفندهای جدید و آموزش‌های کوتاه بسیار مفید هستند. در ادامه چند کانال تلگرامی برای ارتقای دانش لینوکس و امنیت معرفی می‌شود: + +- 🖥 **[Linux Academy](https://t.me/+xrbtU1Vgg245YjY6)** — آموزش مفاهیم لینوکس به کمک اینفوگرافیک‌ها و ویدیوهای کوتاه؛ برای ایجاد نگرش حرفه‌ای مناسب است. +- ⚡️ **[Kali Linux](https://t.me/+jnI7_NwRnd0zY2Yy)** — کانالی برای آموزش هک و امنیت اطلاعات از پایه به همراه تحلیل سناریوهای حملات و روش‌های دفاع. +- 🧠 **[Machine Learning](https://t.me/+IikNImh3FuNmM2Ji)** — اخبار هوش مصنوعی در عمل: چگونگی تولید داده‌ها و نوشتن کدها به کمک ابزارهای هوش مصنوعی. +- 📚 **[Linux Books](https://t.me/linux_read)** — کانالی برای دانلود رایگان کتاب‌های تخصصی حوزه لینوکس و شبکه. +- 🔝 **[مجموعه منابع لینوکس](https://t.me/addlist/w4Doot-XBG4xNzYy)** — پوشه‌ای شامل چند کانال تلگرامی مفید برای ارتقای دانش در حوزه‌های مختلف سیستم‌عامل. + +> نحوه استفاده بهینه: به جای عضویت در تعداد زیادی کانال که باعث ایجاد نویز و سردرگمی می‌شود، فقط در ۲ یا ۳ کانال عضو شوید و مطالب آن‌ها را به طور منظم مطالعه و در ماشین مجازی تمرین کنید. + +**تمرین:** یک ترفند یا دستور جدید را از یکی از کانال‌ها انتخاب کرده، سوییچ‌های آن را با راهنمای man بررسی کنید و آن را روی سیستم تمرین خود تست کنید. + +--- + +## اصل اساسی + +دستورات را حفظ نکنید — بلکه روش جستجو و یافتن آن‌ها را یاد بگیرید. هر دستوری دارای راهنمای داخلی است (`man` ،`help--` یا ابزار `tldr`). یک متخصص با توانایی پیدا کردن سریع پاسخ‌ها و درک مفاهیم سیستم شناخته می‌شود، نه با حفظ کردن کدها. ابزارها را نصب کنید، در ماشین مجازی آن‌ها را خراب کنید و خودتان تعمیر کنید؛ مهارت به مرور زمان به دست خواهد آمد. موفق باشید. diff --git a/README.md b/README.md index c5be5b3..b1c4d00 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Linux Roadmap: подробный практический курс от нуля до уверенного администратора +🌍 Translations: [Persian (فارسی) 🇮🇷](./README-fa.md) Это пошаговый маршрут изучения Linux с упором на практику. Каждый раздел содержит объяснение «почему это устроено именно так», разбор команд и обязательные задания, которые нужно выполнить руками в терминале. Чтение без повторения навыка не даёт — держите терминал открытым рядом с этим текстом.