هندبوک جامع دستورات لینوکس — نسخه ارتقایافته

مرجع کامل، راست‌چین و فارسی برای کار با ترمینال: از مبانی تا ادمینی حرفه‌ای. با فونت وزیرمتن (Vazirmatn)، بیش از 400 دستور در 52 بخش، جدول گزینه‌ها، مثال‌های واقعی ترمینال، مسیر نصب پکیج‌ها، Bash Scripting کامل، شبکه، امنیت، Git، Docker، Kubernetes، OpenSSH کامل و مرجع زیرفرمان‌ها (ip، systemctl، apt، tmux). کاملاً آفلاین — بدون هیچ وابستگی اینترنتی.

فونت: Vazirmatn مونواسپیس: JetBrains Mono جست‌وجوی زنده: کلید / دکمه کپی روی همه کدها تم تاریک / روشن RTL کامل
49
بخش آموزشی
409+
دستور و ابزار
۳۵۰۰+
خط مثال ترمینال
۱۰۰٪
آفلاین و تک‌فایل
📚 فهرست مطالب
🖥️

1. مبانی شل و ترمینال

8 دستور و مبحث

شل چیست؟

Shell یک برنامه است که دستورهای متنی شما را می‌خواند، تفسیر می‌کند و به سیستم‌عامل می‌دهد. وقتی پایه‌ها را بلد باشی، در هر توزیعی — از سرور بدون رابط گرافیکی گرفته تا رزبری‌پای — خانه‌ای.
معروف‌ترین شل‌ها:

این هندبوک همه‌جا روی bash تمرکز دارد، چون روی ۹۹٪ سرورها همین حضور دارد.


ساختار عمومی یک دستور

terminal
command [options] [arguments]

ls -la /etc        # ls=دستور، -la=گزینه‌ها، /etc=آرگومان

انواع گزینه (option)

terminal
ls -l            # گزینه کوتاه (یک خط تیره + یک حرف)
ls --all         # گزینه بلند (دو خط تیره + کلمه)
ls -lah          # ترکیب چند گزینه کوتاه
sort -t: -k3     # گزینه‌ای که خودش مقدار می‌گیرد
dd if=x of=y bs=4M   # گزینه به سبک قدیمی (بدون تیره)

مسیرها: مطلق و نسبی

مسیر مطلق

از ریشه / شروع می‌شود؛ همیشه یکسان است:
/etc/passwd
/home/ali/report.txt

مسیر نسبی

نسبت به پوشه فعلی:
./script.sh همین پوشه
../file.txt یک پوشه بالاتر
~/notes.txt پوشه خانه

مسیرهای خاص

. پوشه فعلی · .. پوشه والد
~ پوشه خانه · ~- پوشه قبلی
~ali خانه کاربر ali

قانون طلایی

قبل از هر rm گروهی، اول با pwd ببین کجایی و با ls ببین چه چیزی قرار است پاک شود.

wildcardها (Glob)

terminal
*.txt            # هر چیزی که به .txt ختم می‌شود
file?.log        # ? = دقیقاً یک کاراکتر دلخواه
[abc]*           # با a یا b یا c شروع می‌شود
[0-9][0-9].png   # دو رقم
{a,b,c}.conf     # آکولاد: a.conf و b.conf و c.conf
file.{jpg,png}   # file.jpg و file.png
~/.config/*      # همه چیز داخل config
**/*.py          # با globstar در bash: همه زیرپوشه‌ها
ℹ️
برای فعال‌کردن ** در bash: shopt -s globstar را در ~/.bashrc بگذار.

نقل‌قول‌ها: تفاوتی که همه‌جا بهش گیر می‌دهند

دونقل‌قولی ""

مقدار متغیرها جایگزین می‌شود:
echo "سلام $USER" → سلام ali

تک‌نقل‌قولی ''

همه چیز لفظ‌به‌لفظ:
echo 'سلام $USER' → سلام $USER
⚠️
قانون: هر وقت متغیری را که حاوی نام فایل یا متن است استفاده می‌کنی، آن را داخل "..." بگذار. rm "$f" امن است، rm $f با فایل‌های دارای فاصله می‌شکند.

here-doc و here-string

terminal
# here-doc: چند خط متن بده به یک دستور
cat << EOF
خط اول
خط دوم با $متغیر
EOF

# here-string: یک رشته به عنوان stdin
bc <<< "2+3*4"
mysql -u root -p db <<< "SELECT 1;"

# here-doc با تک‌نقل‌قول: هیچ جایگزینی انجام نشود
cat << 'EOF' > script.sh
echo "$HOME داخل اسکریپت"
EOF

کلیدهای میان‌بر که سرعتت را ده برابر می‌کنند

حرکت و ویرایش

Ctrl+A ابتدای خط · Ctrl+E انتهای خط
Ctrl+U پاک‌کردن تا ابتدا · Ctrl+K پاک‌کردن تا انتها
Ctrl+W پاک‌کردن کلمه قبل · Alt+B/F کلمه‌به‌کلمه

کنترل اجرا

Ctrl+C قطع دستور · Ctrl+Z توقف و رفتن به پس‌زمینه
Ctrl+D پایان ورودی (EOF) · Ctrl+L پاک‌کردن صفحه
Ctrl+R جست‌وجو در تاریخچه

تاریخچه

/ دستورهای قبلی · Ctrl+R جست‌وجوی بازگشتی
!! دستور قبلی · !$ آخرین آرگومان دستور قبل
Alt+. درج آخرین آرگومان با هر فشار

فایل‌های پیکربندی bash: کجا چه چیزی باشد؟

terminal
/etc/profile          # تنظیمات سراسری برای login shellها
/etc/bash.bashrc      # تنظیمات سراسری برای شل‌های تعاملی
~/.bash_profile       # فقط login (معمولاً ~/.bashrc را صدا می‌زند)
~/.bashrc             # مهم‌ترین فایل: هر شل تعاملی جدید این را می‌خواند
~/.bash_history       # تاریخچه دستورها
~/.bash_aliases       # جایی مناسب برای aliasهای شخصی
💡
بعد از هر تغییر در .bashrc برای اعمالش: source ~/.bashrc. یک alias خوب برای شروع: alias ll='ls -lahF'.

متغیرها در bash

terminal
NAME="ali"           # تعریف (دور از = فاصله نگذار!)
echo "$NAME"         # استفاده با $
echo "${NAME}jan"    # جداکردن مرز نام متغیر
export NAME          # فرستادن به محیط برنامه‌های فرزند
readonly MAX=10      # متغیر تغییرناپذیر
unset NAME           # حذف متغیر
env | less           # دیدن همه متغیرهای محیط
printenv PATH        # فقط یکی

shebang

terminal
#!/usr/bin/env bash
# خط اول اسکریپت: می‌گوید با کدام مفسر اجرا شود
# از env استفاده کن تا در همه سیستم‌ها کار کند

اجرای اسکریپت:

terminal
chmod +x script.sh       # اول قابل‌اجرا کن
./script.sh              # بعد اجرا کن
bash script.sh           # یا بدون chmod، مستقیم با bash
bash -x script.sh        # اجرا همراه با نمایش هر گام (دیباگ)

clearپاک‌کردن صفحه ترمینال

پیش‌فرض سیستم

صفحه ترمینال را پاک می‌کند. تاریخچه scrollback ترمینال واقعی را پاک نمی‌کند؛ فقط دید را تمیز می‌کند.

terminal
clear

# میان‌بر: Ctrl+L
💡
اگر می‌خواهی واقعاً همه scrollback هم پاک شود: clear && printf '\e[3J\e[H\e[2J' یا در ترمینال‌های مدرن Ctrl+Shift+K.

exitبستن نشست شل

پیش‌فرض سیستم

شل فعلی (یا SSH یا تب ترمینال) را می‌بندد. اگر داخل su یا SSH باشی، فقط همان لایه بسته می‌شود و به شل قبلی برمی‌گردی.

terminal
exit            # خروج از شل فعلی
exit 0          # خروج با کد موفقیت (داخل اسکریپت)
exit 1          # خروج با کد خطا
💡
میان‌بر Ctrl+D هم همین کار را می‌کند (وقتی خط خالی باشد).

historyتاریخچه دستورها

پیش‌فرض سیستم

همه دستورهایی که زده‌ای را با شماره نشان می‌دهد. با !شماره همان دستور دوباره اجرا می‌شود.

گزینهکار
-cپاک‌کردن تاریخچه جلسه فعلی
-wنوشتن فوری تاریخچه در فایل
Nفقط N دستور آخر
terminal
history            # کل تاریخچه
history | tail -20 # ۲۰ دستور آخر
history | grep ssh # جست‌وجوی ssh در تاریخچه
!1042              # اجرای دستور شماره 1042
!!                 # اجرای دوباره دستور قبلی (معروف: sudo !!)
!ssh               # آخرین دستوری که با ssh شروع شده
💡
این تنظیم‌ها را در ~/.bashrc بگذار تا تاریخچه‌ات حرفه‌ای شود:
terminal
# تاریخچه بزرگ‌تر و بدون تکرار
HISTSIZE=100000
HISTFILESIZE=200000
HISTCONTROL=ignoredups:erasedups
shopt -s histappend                    # append به‌جای overwrite
export HISTTIMEFORMAT="%F %T  "        # تاریخ و ساعت هر دستور

aliasساخت نام مستعار برای دستورها

پیش‌فرض سیستم

برای دستورهای طولانی و پرتکرار اسم کوتاه می‌سازد. aliasها فقط در شل تعاملی معنی دارند؛ داخل اسکریپت بنویس دستورِ کامل.

گزینهکار
-pلیست همه aliasهای فعلی
terminal
alias                    # دیدن همه aliasها
alias ll='ls -lahF'
alias gs='git status'
alias ..='cd ..'
alias grep='grep --color=auto'
alias ports='ss -tulanp'

# دیدن اینکه یک alias به چه چیزی اشاره می‌کند:
type ll

# حذف یک alias:
unalias ll
# حذف همه:
unalias -a
💡
aliasهای خودت را در ~/.bashrc ذخیره کن تا در هر ترمینال جدید موجود باشند. برای پارامتر داشتن به‌جای alias از تابع استفاده کن: mkcd(){ mkdir -p "$1" && cd "$1"; }

scriptضبط کامل یک نشست ترمینال

پیش‌فرض سیستم

همه چیزِ نمایش‌داده‌شده در ترمینال (ورودی و خروجی) را در یک فایل ضبط می‌کند. برای مستندسازی رفع اشکال و گزارش دادن به تیم عالی است.

terminal
script session.log              # شروع ضبط؛ با exit یا Ctrl+D تمام می‌شود
script -a session.log           # ادامه ضبط روی همان فایل (append)
script -t 2>timing.log session.log   # با زمان‌بندی

# پخش مجدد ضبط به‌صورت زنده:
scriptreplay -t timing.log session.log
⚠️
فایل ضبط شامل کاراکترهای کنترلی ترمینال است؛ با less -r یا cat بخوانش، نه ویرایشگر عادی.

bashاجرای bash و اسکریپت‌ها

پیش‌فرض سیستم

خود شل bash — هم به‌عنوان شل تعاملی، هم برای اجرای اسکریپت. مهم‌ترین گزینه‌هایش ابزار دیباگ اسکریپت هستند.

گزینهکار
-xاجرای trace: هر دستور قبل از اجرا چاپ می‌شود (دیباگ)
-nفقط چک سینتکس، بدون اجرا
-eبا اولین خطا خارج شو
-uمتغیر تعریف‌نشده = خطا
-cاجرای یک رشته به‌جای فایل
terminal
bash                          # یک شل جدید داخل شل فعلی
bash script.sh                # اجرای اسکریپت
bash -n script.sh             # تست سینتکس بدون اجرا
bash -x script.sh             # دیباگ گام‌به‌گام
bash -c "echo سلام از bash"   # اجرای مستقیم یک رشته
bash --version                # نسخه bash
💡
ترکیب set -euo pipefail در ابتدای هر اسکریپت جدی، آن را محکم‌کاری می‌کند — در بخش Bash Scripting کامل توضیح داده‌ام.

tmuxچندگانه‌کننده ترمینال (جان‌بخشی به جلسات)

نیاز به نصب
📦 نصب:sudo apt install tmux # dnf: sudo dnf install tmux · pacman: sudo pacman -S tmux

از یک ترمینال، چند پنجره و پنل می‌سازد. مهم‌ترین ویژگی: جلسه‌ها با قطع‌شدن SSH زنده می‌مانند و بعداً وصل می‌شوی و همه‌چیز سرجایش است — ابزار شماره یک کار روی سرور.

گزینهکار
new -s nameساخت جلسه جدید با نام
lsلیست جلسه‌ها
attach -t nameاتصال به جلسه
kill-session -t nameبستن جلسه
terminal
tmux new -s work        # ساخت جلسه‌ای به نام work
# داخل tmux همه کلیدها با پیشوند Ctrl+b شروع می‌شوند:
#   Ctrl+b  d        جدا شدن از جلسه (جلسه زنده می‌ماند)
#   Ctrl+b  c        پنجره جدید
#   Ctrl+b  %        تقسیم عمودی    Ctrl+b  "  تقسیم افقی
#   Ctrl+b  جهت‌نما   جابه‌جایی بین پنل‌ها
#   Ctrl+b  [        حالت اسکرول/کپی (با q خارج شو)

tmux ls                 # لیست جلسه‌ها
tmux attach -t work     # وصل‌شدن دوباره (حتی بعد از قطع SSH)
tmux kill-session -t work
💡
روی سرور، قبل از هر کار طولانی (کامپایل، مهاجرت دیتابیس، آپدیت بزرگ) اول tmux new -s job بزن. اگر اینترنت قطع شد، بعد از وصل‌شدن فقط tmux attach لازم است.

screenجایگزین کلاسیک tmux

نیاز به نصب
📦 نصب:sudo apt install screen

ابزار قدیمی‌تر و تقریباً همه‌جاحاضر برای نگه‌داشتن جلسات ترمینال. اگر tmux نصب نبود، screen تقریباً همان کار را می‌کند.

terminal
screen -S job           # ساخت جلسه
#   Ctrl+a  d    جدا شدن
#   Ctrl+a  c    پنجره جدید
screen -ls              # لیست جلسه‌ها
screen -r job           # برگشتن به جلسه
screen -X -S job quit   # بستن جلسه

2. کمک گرفتن و فهمیدن هر دستور

11 دستور و مبحث

manصفحات راهنمای رسمی

پیش‌فرض سیستم

مستند استاندارد یونیکس برای تقریباً هر دستور. یادگیری قدم‌زدن داخل man page مهارتی است که برای همیشه کارت را راه می‌اندازد.

گزینهکار
Nبخش خاصِ راهنما: ۱ برنامه‌ها، ۵ فرمت فایل‌ها، ۸ مدیریتی
-k کلمهجست‌وجو در توضیحات (همان کار apropos)
-f نامتوضیح یک‌خطی (همان whatis)
-aنمایش همه صفحات با همین نام در همه بخش‌ها
terminal
man ls              # راهنمای ls
man 5 crontab       # فرمت فایل crontab (نه خود دستور)
man 8 mount         # دستور مدیریتی mount
man -k network      # همه دستورهای مرتبط با network
man bash | less     # راهنمای مفصل خود bash
💡
داخل man با q خارج شو، با /کلمه جست‌وجو کن (n = مورد بعدی)، با g برو اول و G آخر. صفحات فارسی نیستند ولی مثال‌های انتهای هر صفحه (بخش EXAMPLES) طلا هستند.

tldrمثال‌های کاربردی و ساده

نیاز به نصب
📦 نصب:sudo apt install tldr # یا: npm install -g tldr

man pageها کامل‌اند ولی طولانی؛ tldr برای هر دستور چند مثال پرکاربردِ آماده می‌دهد. وقتی فقط یادت رفته سینتکس چی بود، سریع‌ترین راه است.

terminal
tldr tar
tldr find
tldr --update       # به‌روزرسانی مخزن مثال‌ها
💡
بدون نصب هم می‌توانی همین را از اینترنت بگیری: curl cheat.sh/tar (در بخش شبکه معرفی شده).

helpراهنمای دستورهای داخلی شل

پیش‌فرض سیستم

برای built-inهای bash مثل cd و test که فایل اجرایی ندارند و man page مستقیم ندارند.

terminal
help cd
help test          # شرط‌های [ ] را کامل توضیح می‌دهد
help -s cd         # فقط سینتکس کوتاه
help -d alias      # فقط توضیح کوتاه

--helpراهنمای سریع هر برنامه

پیش‌فرض سیستم

تقریباً هر برنامه مدرن با این گزینه یک خلاصه راهنما در خود ترمینال چاپ می‌کند — بدون رفتن به صفحه‌ای دیگر.

terminal
ls --help
curl --help | less     # معمولاً خروجی طولانی است؛ با less بخوان
tar --help | head -40
df --help

whichپیدا کردن مسیر فایل اجرایی

پیش‌فرض سیستم

می‌گوید وقتی نام یک برنامه را می‌زنی، دقیقاً کدام فایل از کدام پوشه در PATH اجرا می‌شود.

terminal
which python3        # /usr/bin/python3
which -a node        # همه نسخه‌های موجود به ترتیب اولویت PATH
which gcc make git
💡
داخل اسکریپت، به‌جای which از command -v استفاده کن که portableتر است و روی alias هم خطا نمی‌دهد.

whereisمسیر برنامه + مستنداتش

پیش‌فرض سیستم

علاوه بر فایل اجرایی، فایل‌های منبع و man page آن را هم پیدا می‌کند.

terminal
whereis bash
whereis -b tar       # فقط باینری
whereis -m bash      # فقط man page

typeشناخت ماهیت یک نام

پیش‌فرض سیستم

می‌گوید نامی که می‌زنی built-in است، alias است، تابع است یا فایل اجرایی. برای دیباگِ «چرا ls من رنگی است؟» عالی است.

terminal
type cd              # cd is a shell builtin
type ls              # alias ll='ls -lahF' یا مسیر باینری
type -a ls           # همه معانی ممکن ls به ترتیب
type -t ls           # فقط نوع: alias / builtin / file / function

commandاجرای مستقیم، دور زدن aliasها

پیش‌فرض سیستم

دو کاربرد مهم: command -v نام چک می‌کند آیا دستوری وجود دارد (استانداردترین روش در اسکریپت‌ها)، و command نام همان دستور را بدون alias و تابع اجرا می‌کند.

terminal
command -v git && echo "گیت نصب است" || echo "گیت نصب نیست"
command -v docker >/dev/null 2>&1 || { echo "داکر نصب نیست"; exit 1; }
command ls           # ls واقعی، بدون alias رنگی

aproposجست‌وجو در توضیحات man pageها

پیش‌فرض سیستم

نمی‌دانی نام دستور را ولی موضوعش را می‌دانی؟ apropos در توضیح یک‌خطی همه man pageها جست‌وجو می‌کند.

terminal
apropos password
apropos -a copy directory   # هر دو کلمه باید باشند
apropos archive | sort

whatisتوضیح یک‌خطی هر دستور

پیش‌فرض سیستم

برعکس apropos: نام دستور را داری و فقط یک جمله توضیح می‌خواهی.

terminal
whatis tar
whatis ping ssh curl

infoراهنمای GNU به سبک هایپرلینک

پیش‌فرض سیستم

مستندات رسمی پروژه‌های GNU (مثل coreutils و emacs) گاهی در فرمت info کامل‌تر از man هستند؛ با گره‌های لینک‌شده.

terminal
info coreutils
info tar
# کلیدهای اصلی: n بعدی، p قبلی، u بالا، q خروج
📁

3. کار با فایل و پوشه

18 دستور و مبحث

نقشه مسیرهای مهم سیستم

/etc

فایل‌های پیکربندی کل سیستم (passwd، fstab، ssh…)

/var/log

لاگ‌ها: syslog، auth.log، kern.log

/home و /root

پوشه خانه کاربران عادی و روت

/tmp

فایل‌های موقت — بعد از ریبوت معمولاً پاک می‌شود

/proc و /sys

پنجره‌ای به هسته: اطلاعات پروسه‌ها و سخت‌افزار

/dev

فایل‌های دستگاه: /dev/sda، /dev/null

/usr/bin و /usr/local/bin

برنامه‌های نصب‌شده و برنامه‌های دستیِ خودت

/opt

نرم‌افزارهای نصب‌شده به‌صورت مستقل (مثل google-chrome)

سلسله‌مراتب تصمیم: کدام دستور برای چه کاری؟

terminal
کپی کردن؟        →  cp        |  کپی امن با پیشرفت:  rsync -ah --progress
جابه‌جایی/تغییرنام؟ →  mv        |  تغییرنام گروهی:  rename 's/درست/درست‌تر/' *
حذف؟             →  rm -r     |  حذف پوشه خالی:  rmdir
ساخت فایل خالی؟   →  touch     |  ساخت با محتوا:  echo > file یا tee
دیدن اندازه؟      →  du -sh    |  فضای دیسک:  df -h
شناسایی نوع فایل؟ →  file      |  جزئیات کامل:  stat

pwdنمایش مسیر فعلی

پیش‌فرض سیستم

مسیر کامل دایرکتوری‌ای که الان داخلش هستی را چاپ می‌کند. اولین کاری که قبل از هر عملیات خطرناک باید بکنی.

گزینهکار
-Pمسیر فیزیکی واقعی، بدون دنبال‌کردن symlink
-Lمسیر منطقی (پیش‌فرض؛ با symlinkها)
terminal
pwd                    # مثلاً: /home/ali/projects
cd /tmp && pwd         # /tmp
pwd -P                 # اگر داخل symlink باشی، مسیر واقعی را می‌دهد

lsلیست فایل‌ها و پوشه‌ها

پیش‌فرض سیستم

پرکاربردترین دستور لینوکس. محتوای پوشه‌ها را لیست می‌کند و با گزینه‌هایش تقریباً هر اطلاعاتی (اندازه، مجوز، زمان، مالک) قابل دیدن است.

گزینهکار
-lنمایش جزئیات: مجوز، مالک، اندازه، تاریخ
-aنمایش فایل‌های مخفی (شروع با نقطه)
-hاندازه‌های خوانا: KB / MB / GB
-tمرتب‌سازی بر اساس زمان جدیدترین اول
-Sمرتب‌سازی بر اساس اندازه بزرگ‌ترین اول
-rبرعکس‌کردن ترتیب
-Rبازگشتی: کل زیرپوشه‌ها
--colorرنگی‌کردن خروجی (در اکثر توزیع‌ها پیش‌فرض)
-dخودِ پوشه، نه محتوایش
-iشماره inode هر فایل
terminal
ls                  # لیست ساده
ls -l               # با جزئیات
ls -lah             # جزئیات + مخفی‌ها + اندازه خوانا  ← ترکیب طلایی
ls -lht             # تازه‌ترین فایل‌ها اول
ls -lhS             # بزرگ‌ترین فایل‌ها اول
ls -ld /etc         # فقط مشخصات خود پوشه
ls /etc | wc -l     # چند فایل در /etc هست؟
ls -l | sort -k5 -n # مرتب‌سازی دستی بر اساس ستون اندازه
💡
در خروجی ls -l اولین کاراکترِ هر خط نوع آیتم است: - فایل، d پوشه، l لینک. در بخش مجوزها کامل توضیح داده‌ام.

cdجابه‌جایی بین پوشه‌ها

پیش‌فرض سیستم

دایرکتوری فعلی را عوض می‌کند. built-in شل است، نه برنامه جدا.

گزینهکار
-برگشتن به پوشه قبلی (مثل undo)
..یک سطح بالاتر
~ یا خالیپوشه خانه
terminal
cd /var/log        # رفتن با مسیر مطلق
cd projects        # رفتن به زیرپوشه با مسیر نسبی
cd ..              # یک پوشه بالا
cd ../..           # دو پوشه بالا
cd                 # برگشتن به خانه
cd -               # جابه‌جایی بین دو پوشه‌ای که بین‌شان در رفت‌وآمدی
💡
میان‌بر حرفه‌ای: pushd /var/log پوشه را روی پشته نگه می‌دارد و popd برمی‌گرداند. همچنین در bash دکمه Tab نام فایل‌ها را کامل می‌کند — عادت کن همیشه Tab بزنی تا هم سریع‌تر باشی هم اشتباه نکنی.

mkdirساخت پوشه

پیش‌فرض سیستم

پوشه جدید می‌سازد.

گزینهکار
-pکل زنجیره مسیر را بساز؛ اگر وجود داشت خطا نده
-m 755ساخت همراه با تعیین مجوز
-vنمایش پوشه‌های ساخته‌شده
terminal
mkdir backup
mkdir -p projects/web/src/components    # کل زنجیره یک‌جا
mkdir -v new-folder
mkdir -m 700 secret                     # فقط خودت دسترسی داری
mkdir {2024,2025}/{jan,feb,mar} -p      # ساخت گروهی با آکولاد

rmdirحذف پوشه خالی

پیش‌فرض سیستم

فقط پوشه‌های خالی را حذف می‌کند — به همین دلیل امن است و برای پاک‌کردن زنجیره پوشه‌های خالی عالی.

terminal
rmdir old-folder
rmdir -p a/b/c         # کل زنجیره خالی را یک‌جا پاک کن
# برای پوشه غیرخالی از rm -r استفاده کن

cpکپی کردن فایل و پوشه

پیش‌فرض سیستم

فایل‌ها و پوشه‌ها را کپی می‌کند. برای کپی حجیم با نمایش پیشرفت، rsync بهتر است.

گزینهکار
-rکپی بازگشتی برای پوشه‌ها (اجباری)
-iقبل از بازنویسی سؤال بپرس
-nهرگز بازنویسی نکن
-uفقط اگر فایل مقصد قدیمی‌تر یا غایب بود کپی کن
-pحفظ مجوز، مالکیت و زمان فایل
-aحالت آرشیو = حفظ همه‌چیز؛ برای بکاپ بهترین است
-vنمایش فایل‌های در حال کپی
--preserve=timestampsفقط زمان را حفظ کن
terminal
cp file.txt copy.txt
cp file.txt /tmp/                  # کپی به پوشه دیگر
cp -i file.txt /tmp/               # اگر موجود بود بپرس
cp -r myproject /backup/           # کپی کامل پوشه
cp -a /etc/nginx /backup/nginx-conf    # بکاپ دقیق با همه مجوزها
cp -u -v src/*.jpg /photos/        # فقط جدیدترها
cp file{,.bak}                     # ترفند: ساخت فایل پشتیبان فوری
ls -lh file.txt file.txt.bak
⚠️
cp بدون سؤال روی فایل مقصد بازنویسی می‌کند. برای فایل‌های مهم عادت کن cp -i بزنی یا با alias alias cp='cp -i' محافظت کنی.

mvجابه‌جایی یا تغییر نام

پیش‌فرض سیستم

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

گزینهکار
-iقبل از بازنویسی بپرس
-nبازنویسی نکن
-vنمایش عملیات
-bاز فایل مقصد پشتیبان بگیر (~file)
terminal
mv old.txt new.txt          # تغییر نام
mv report.txt /tmp/          # انتقال
mv file1 file2 file3 docs/   # انتقال گروهی
mv -i notes.txt /tmp/        # اگر مقصد بود بپرس
mv old-folder new-folder     # تغییرنام پوشه
mv *.png images/             # همه pngها به پوشه تصاویر
# تغییرنام گروهی (نیاز به پکیج rename در Debian):
rename 's/ /-/g' *.jpg       # همه فاصله‌ها به خط تیره
rename 's/[.]jpeg$/.jpg/' *.jpeg

rmحذف فایل و پوشه

پیش‌فرض سیستم

فایل‌ها را برای همیشه حذف می‌کند — زباله‌دان وجود ندارد! بزرگ‌ترین دلیلی که rm باید با احتیاط کامل زده شود همین است.

گزینهکار
-rحذف بازگشتی پوشه و محتوا
-fبدون سؤال و بدون خطای فایل ناموجود
-iتأیید برای هر فایل
-Iتأیید فقط وقتی بیش از ۳ فایل است (تعادل خوب)
-vنمایش آنچه حذف می‌شود
--جداساز؛ برای فایل‌هایی که با - شروع می‌شوند
terminal
rm file.txt
rm -i important.txt        # بپرس و بعد پاک کن
rm -r old-project/         # پاک‌کردن کل پوشه
rm -rf build/              # بدون سؤال (مواظب باش!)
rm -I *.log                # با بیش از ۳ فایل یک بار تأیید بگیر
rm -- -weird-file.txt      # فایلی که با - شروع می‌شود
find . -name "*.tmp" -type f -delete   # روش امن‌تر: اول find بعد delete
⚠️
هیچ‌وقت این‌ها را نزن: rm -rf /، rm -rf /*، rm -rf $VARIABLE (اگر متغیر خالی باشد، ریشه پاک می‌شود!) و هر rm با wildcard وقتی از نتیجه ls مطمئن نیستی. قانون حرفه‌ای: اول ls *.log ببین چه چیزی انتخاب می‌شود، بعد همان الگو را با rm بزن.

touchساخت فایل خالی یا به‌روزرسانی زمان

پیش‌فرض سیستم

اگر فایل نباشد می‌سازد؛ اگر باشد فقط زمان دسترسی/تغییرش را به الان می‌آورد (کاربرد اصلی در make و بکاپ‌گیری افزایشی).

terminal
touch newfile.txt
touch a.txt b.txt c.txt
touch -t 202501011200 file.txt     # تنظیم دستی زمان: YYYYMMDDhhmm
touch -r ref.txt target.txt        # هم‌زمان‌کردن با فایل مرجع

fileشناسایی نوع واقعی فایل

پیش‌فرض سیستم

با بررسی امضای بایت‌های ابتدای فایل می‌گوید واقعاً چه نوع فایلی است — نه به پسوند اعتماد دارد نه به نام.

terminal
file photo.jpg
file /usr/bin/python3        # ELF 64-bit executable
file archive.zip
file -i document.pdf         # با MIME type: application/pdf
file *                       # نوع همه فایل‌های پوشه
💡
وقتی فایلی باز نمی‌شود، اول file بزن — خیلی وقت‌ها می‌بینی فایل html است نه excel، یا متن است با پسوند عجیب.

statمشخصات کامل یک فایل

پیش‌فرض سیستم

هر متادیتایی که فایل‌سیستم از فایل می‌داند: اندازه دقیق بایتی، زمان‌ها، inode، مجوزها به دو صورت عددی و حرفی.

terminal
stat file.txt
stat -c '%n → %s bytes, %y' *       # فرمت دلخواه: نام، اندازه، تاریخ تغییر
stat -f /                           # وضعیت فایل‌سیستم ریشه
stat /etc/passwd | grep Access
💡
سه زمان مهم: atime آخرین خواندن، mtime آخرین تغییر محتوا، ctime آخرین تغییر متادیتا (مجوز/نام).

treeنمای درختی پوشه‌ها

نیاز به نصب
📦 نصب:sudo apt install tree # dnf: sudo dnf install tree · pacman: sudo pacman -S tree

کل ساختار پوشه را مثل درخت نشان می‌دهد — برای مستندسازی پروژه و فهمیدن سریع ساختار بی‌نظیر است.

گزینهکار
-L nفقط n سطح عمق
-aبا فایل‌های مخفی
-dفقط پوشه‌ها
-hاندازه خوانا
-I الگوحذف الگو (مثل node_modules)
--dirsfirstاول پوشه‌ها
terminal
tree                      # درخت پوشه فعلی
tree -L 2                 # فقط دو سطح
tree -d                   # فقط ساختار پوشه‌ها
tree -a -I 'node_modules|.git'   # پروژه بدون شلوغی
tree -h --dirsfirst
tree /etc/systemd -L 1

basenameنام فایل بدون مسیر

پیش‌فرض سیستم

از یک مسیر، فقط آخرین جزء (نام فایل) را می‌دهد؛ در اسکریپت‌ها برای کار با نام فایل‌ها لازم می‌شود.

terminal
basename /var/log/syslog          # syslog
basename /home/ali/report.pdf     # report.pdf
basename photo.jpg .jpg           # photo  (حذف پسوند)
# در اسکریپت:
echo "در حال پردازش: $(basename "$1")"

dirnameمسیر والد یک فایل

پیش‌فرض سیستم

برعکس basename: از مسیر، فقط بخش پوشه را نگه می‌دارد.

terminal
dirname /var/log/syslog           # /var/log
dirname ~/projects/web/index.html # /home/ali/projects/web
# ترفند کاربردی در اسکریپت:
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"   # پوشه خود اسکریپت

mktempساخت فایل/پوشه موقت امن

پیش‌فرض سیستم

در /tmp با نام یکتا و مجوز امن (فقط مالک) فایل موقت می‌سازد و مسیرش را چاپ می‌کند. روش صحیح ساخت فایل موقت در اسکریپت‌ها.

terminal
tmpf=$(mktemp)                    # فایل موقت
tmpd=$(mktemp -d)                 # پوشه موقت
mktemp /tmp/report.XXXXXX         # الگوی دلخواه؛ Xها تصادفی می‌شوند

# الگوی استاندارد اسکریپت با پاک‌سازی خودکار:
tmpf=$(mktemp)
trap 'rm -f "$tmpf"' EXIT
echo "داده موقت" > "$tmpf"
cat "$tmpf"
⚠️
هرگز در اسکریپت از /tmp/myfile با نام ثابت استفاده نکن؛ هم ریسک تداخل دارد هم ریسک امنیتی ( حمله symlink). همیشه mktemp.

shredپاک‌سازی امن و غیرقابل‌بازیافت

پیش‌فرض سیستم

قبل از حذف، محتوای فایل را چند بار با داده تصادفی بازنویسی می‌کند تا بازیابی عملاً غیرممکن شود. برای فایل‌های حساس (کلیدها، اسناد) روی دیسک‌های مکانیکی.

گزینهکار
-n Nتعداد دور بازنویسی (پیش‌فرض ۳)
-zیک دور نهایی با صفر برای پنهان‌کردن اثر shred
-uبعد از بازنویسی، فایل را حذف کن
-vنمایش پیشرفت
terminal
shred -u secret.txt                 # بازنویسی + حذف
shred -v -n 5 -z -u keys.pem        # محکم‌تر و با نمایش پیشرفت
# پاک‌سازی کل پارتیشن (غیرقابل بازگشت!):
sudo shred -v -n 1 /dev/sdX
⚠️
روی SSDهای مدرن و فایل‌سیستم‌های CoW (مثل btrfs) اثر shred محدود است چون کنترلر آدرس‌ها را جابه‌جا می‌کند. برای SSD از دستور secure erase خود دستگاه یا blkdiscard استفاده کن.

installکپی با تعیین مجوز و مالکیت (ابزار سیستم)

پیش‌فرض سیستم

با وجود اسمش، کپی‌کننده است: فایل را با مجوز و مالکیت مشخص کپی می‌کند — روش استاندارد Makefileها برای گذاشتن برنامه در مسیر سیستم.

terminal
sudo install -m 755 myapp /usr/local/bin/myapp
sudo install -D -m 644 app.conf /etc/myapp/app.conf   # -D پوشه والد را هم می‌سازد
install -d /opt/myapp/bin                            # فقط ساخت پوشه با مجوز
📖

4. نمایش و خواندن محتوا

20 دستور و مبحث

راهنمای انتخاب ابزار خواندن

فایل کوچک، همه محتوا

cat file — سریع و ساده

فایل بزرگ یا لاگ

less file — صفحه‌به‌صفحه، جست‌وجودارد

فقط شروع/انتها

head / tail — مثل خط آخر لاگ

پایش زنده

tail -f — لاگ لحظه‌ای

فایل باینری

od / strings — دیدن بایت‌ها و متن‌های داخل باینری

مقایسه/شمارش

diff، wc، nl

catچاپ کل محتوای فایل

پیش‌فرض سیستم

محتوای یک یا چند فایل را روی خروجی می‌ریزد؛ برای فایل‌های کوچک، ساخت فایل سریع و الحاق فایل‌ها.

گزینهکار
-nشماره‌گذاری همه خط‌ها
-bشماره‌گذاری فقط خط‌های غیرخالی
-Aنمایش کاراکترهای کنترلی و پنهان
-sفشرده‌کردن خط‌های خالی پشت‌سرهم
terminal
cat file.txt
cat part1.txt part2.txt > full.txt    # الحاق دو فایل
cat -n script.py                      # با شماره خط
cat -A data.tsv                       # دیدن tabها (^I) و انتهای خطوط ($)

# ساخت فایل سریع از ترمینال (خروج با Ctrl+D):
cat > note.txt
این یک یادداشت است

# ساخت با here-doc (روش بهتر):
cat > config.env << 'EOF'
DB_HOST=localhost
DB_PORT=5432
EOF
⚠️
برای فایل بزرگ cat را نزن — ترمینال را پر از متن می‌کند. less ابزار درست است. همچنین الگوی بی‌فایده cat file | grep x را کنار بگذار؛ مستقیم بنویس grep x file.

tacچاپ برعکس: از آخر به اول

پیش‌فرض سیستم

همان cat ولی خط‌ها را از آخر به اول چاپ می‌کند — برای دیدن آخرین رخدادهای یک لاگ قدیمیِ مرتب‌شده.

terminal
tac logfile.log | head -20     # ۲۰ رخداد آخر لاگ

lessمرورگر صفحه‌به‌صفحه متن

پیش‌فرض سیستم

فایل یا خروجی طولانی را صفحه‌به‌صفحه و بدون بارگذاری کامل نشان می‌دهد؛ می‌توانی وسط فایل چندگیگابایتی هم فوری بپری. man pageها هم با less نمایش داده می‌شوند.

گزینهکار
+Fحالت دنبال‌کردن زنده (مثل tail -f؛ با Ctrl+C قطع)
-Nنمایش شماره خط‌ها
-Sقطع خط‌های بلند به‌جای شکستن
-iجست‌وجوی بدون حساسیت به بزرگ/کوچکی
-Rنمایش رنگ‌های ANSI خروجی برنامه‌ها
terminal
less bigfile.log
less +F /var/log/syslog        # دنبال‌کردن زنده
grep error app.log | less -R   # خروجی رنگی grep داخل less
git diff | less                # مرور خروجی هر دستور
💡
کلیدهای ضروری داخل less: Space/b صفحه بعد/قبل، ↑↓ خطی، g/G اول/آخر فایل، /کلمه جست‌وجو (n/N بعدی/قبلی)، v بازکردن در ویرایشگر، q خروج. با 50g مستقیم به خط ۵۰ برو.

moreمرورگر ساده قدیمی

پیش‌فرض سیستم

نسخه محدودتر less؛ فقط رو به جلو می‌رود. روی سیستم‌های مینیمال ممکن است فقط همین موجود باشد.

terminal
more longfile.txt

headچاپ ابتدای فایل

پیش‌فرض سیستم

خط‌های اول فایل یا ورودی را نشان می‌دهد؛ پیش‌فرض ۱۰ خط.

گزینهکار
-n NN خط اول
-c NN بایت اول
-n -Nهمه جز N خط آخر
terminal
head file.txt
head -n 5 file.txt           # ۵ خط اول
head -5 /var/log/syslog      # شکل کوتاه همان
head -c 100 binary.bin       # ۱۰۰ بایت اول فایل باینری
head -n -3 file.txt          # همه به‌جز ۳ خط آخر
# ترفند: خط وسط فایل
sed -n '100p' file.txt       # دقیقاً خط ۱۰۰

tailچاپ انتهای فایل + پایش زنده

پیش‌فرض سیستم

خط‌های آخر فایل را می‌دهد و با -f رشد فایل را زنده دنبال می‌کند — پرکاربردترین ابزار دیدن لاگ در لحظه.

گزینهکار
-n NN خط آخر
-fدنبال‌کردن زنده رشد فایل
-Fمثل -f ولی با چرخش فایل (لاگ‌روتیت) هم سازگار
--pid=PIDخودکار قطع‌شدن وقتی پروسه‌ای تمام شد
terminal
tail file.txt
tail -n 20 error.log            # ۲۰ خط آخر
tail -f /var/log/nginx/access.log   # پایش زنده لاگ nginx
tail -F app.log                 # امن برای logrotate
tail -n 50 syslog | grep -i error
# چند فایل با هم؛ هدر نام فایل نشان داده می‌شود:
tail -n 3 app1.log app2.log
# دنبال‌کردن تا وقتی یک پروسه زنده است:
tail -f --pid=$(pgrep -f myjob) job.log
💡
ترکیب طلایی دیباگ سرور: tail -f access.log | grep --line-buffered 500 — فقط خطاهای ۵۰۰ را زنده ببین. (--line-buffered لازم است تا grep بافر نکند و زنده بماند.)

wcشمارش خط، کلمه و بایت

پیش‌فرض سیستم

تعداد خط، کلمه و بایت ورودی را می‌شمارد؛ ابزار پایه آمارگیری متن.

گزینهکار
-lفقط تعداد خط
-wفقط تعداد کلمه
-cفقط بایت
-mتعداد کاراکتر (با یونیکد درست)
-Lطول بلندترین خط
terminal
wc file.txt                # خط  کلمه  بایت  نام‌فایل
wc -l access.log           # چند درخواست ثبت شده؟
ls | wc -l                 # چند فایل در این پوشه است؟
grep -c ERROR app.log      # (جایگزین دقیق‌تر) تعداد خط‌های خطادار
wc -m essay.txt            # تعداد کاراکتر متن فارسی

nlشماره‌گذاری خط‌ها

پیش‌فرض سیستم

مثل cat -n ولی با کنترل کامل بر شماره‌گذاری (فقط خط‌های غیرخالی، فرمت شماره و…).

terminal
nl file.txt
nl -ba script.sh                 # شماره برای همه خط‌ها
nl -i -w3 -s'. ' notes.txt       # شماره‌ها با گام ۳ و جداکننده دلخواه

columnستون‌بندی متن و جدول‌سازی

پیش‌فرض سیستم

ورودی متنی را به جدول مرتب ستون‌بندی می‌کند؛ با -t -s می‌توانی فایل csv/tsv را جدول واقعی کنی.

گزینهکار
-tجدول‌سازی با تشخیص ستون
-s Xکاراکتر جداکننده ورودی
-o Xجداکننده خروجی
terminal
column -t -s',' data.csv          # نمایش قشنگ csv
grep ^ali /etc/passwd | column -t -s:
mount | column -t | less          # مرتب‌کردن خروجی‌های پراکنده

odنمایش بایت‌های فایل (hex dump)

پیش‌فرض سیستم

محتوای هر فایلی — حتی باینری — را به‌صورت اعداد (اکتال/هگز/کاراکتر) نشان می‌دهد. برای بررسی دقیق فایل و دیباگ انکودینگ.

گزینهکار
-cکاراکترهای قابل‌چاپ + کد کنترلی‌ها
-xهگز ۲بایتی
-A x -t x1zفرمت hex+ascii خوانا مثل hexdump
terminal
od -c textfile.txt          # کاراکتر به کاراکتر
od -A x -t x1z binary.bin   # نمای hexdump کلاسیک
echo -n "س" | od -An -tx1   # بایت‌های UTF-8 حرف س: d8 b3
printf '\xff\xd8' | od -An -tx1

stringsاستخراج متن از فایل باینری

پیش‌فرض سیستم

دنباله‌های کاراکتر قابل‌چاپ داخل فایل باینری را بیرون می‌کشد — برای پیدا کردن پیام‌های خطا، نسخه، URL و رشته‌های پیکربندی داخل اجرایی‌ها.

گزینهکار
-n Nحداقل طول رشته (پیش‌فرض ۴)
-aاسکن کل فایل نه فقط بخش داده
terminal
strings /usr/bin/ls | grep -i version
strings malware.bin | grep http     # یافتن URLهای داخل باینری
strings -n 8 dump.dmp | sort -u | less

diffمقایسه دو فایل خط‌به‌خط

پیش‌فرض سیستم

تفاوت دو فایل (یا دو پوشه) را نشان می‌دهد؛ خروجی‌اش مبنای patch است. هر git diff دنیا از همین منطق می‌آید.

گزینهکار
-uخروجی unified خوانا (استاندارد patch)
-rمقایسه بازگشتی پوشه‌ها
-qفقط بگو فرق دارند یا نه
-yنمایش دو ستونه کنار هم
-iبی‌تفاوت به بزرگ/کوچکی حروف
-wبی‌تفاوت به فاصله‌ها
terminal
diff old.conf new.conf
diff -u v1.py v2.py > changes.patch    # ساخت فایل پچ
patch original.py < changes.patch      # اعمال پچ
diff -qr dir1 dir2                     # کدام فایل‌ها فرق دارند؟
diff -y -W 120 file1 file2             # کنار هم برای مقایسه چشمی
diff <(sort a.txt) <(sort b.txt)       # مقایسه بعد از مرتب‌سازی

cmpمقایسه بایت‌به‌بایت

پیش‌فرض سیستم

دو فایل را بایت‌به‌بایت مقایسه می‌کند و اولین تفاوت را اعلام می‌کند؛ برای چک‌کردن سلامت کپی‌ها از هر نوع فایلی.

terminal
cmp original.iso copy.iso
cmp -s a.bin b.bin && echo "یکسان" || echo "متفاوت"   # مناسب اسکریپت

commمقایسه دو فایل مرتب‌شده

پیش‌فرض سیستم

سه ستون می‌دهد: فقط در فایل ۱، فقط در فایل ۲، مشترک. ابزار مجموعه‌سازی روی خطوط — به شرط مرتب‌بودن ورودی.

گزینهکار
-1حذف ستون فقط-فایل۱
-2حذف ستون فقط-فایل۲
-3حذف ستون مشترک
terminal
sort a.txt > a.sorted; sort b.txt > b.sorted
comm a.sorted b.sorted             # سه ستون کامل
comm -12 a.sorted b.sorted         # فقط خطوط مشترک (اشتراک)
comm -23 a.sorted b.sorted         # فقط در a هست، در b نه
comm -13 a.sorted b.sorted         # فقط در b هست

iconvتبدیل انکودینگ متن

پیش‌فرض سیستم

انکودینگ فایل را تبدیل می‌کند — درمان اصلی فایل‌های به‌هم‌ریخته‌ای که از ویندوز فارسی آمده‌اند (windows-1256) یا فایل‌های قدیمی latin1.

terminal
iconv -f windows-1256 -t utf-8 old.txt > fixed.txt
iconv -f utf-8 -t ascii//TRANSLIT name.txt   # حروف غیرانگلیسی را نزدیک‌ترین معادل
iconv -l                                  # لیست همه انکودینگ‌ها
file -i data.csv                          # اول انکودینگ فعلی را تشخیص بده

revبرعکس‌کردن کاراکترهای هر خط

پیش‌فرض سیستم

هر خط را آینه‌ای می‌کند؛ برای فارسی در ترمینال‌های LTR گاهی ناجی است و در پازل‌های متنی کاربرد دارد.

terminal
echo "سلام" | rev
rev file.txt

foldشکستن خط‌های بلند به عرض مشخص

پیش‌فرض سیستم

خط‌های طولانی را به قطع‌های کوتاه با عرض دلخواه می‌شکند؛ مثلاً چاپ متن در عرض ثابت.

terminal
fold -w 40 longline.txt
fold -w 76 -s article.txt        # -s: فقط بین کلمه‌ها بشکند

batcat مدرن با هایلایت و شماره خط

نیاز به نصب
📦 نصب:sudo apt install bat batcat # dnf: sudo dnf install bat · pacman: sudo pacman -S bat

جایگزین مدرن cat: رنگ‌آمیزی سینتکس، شماره خط، هدر فایل و ادغام با git. در Debian دستورش batcat است مگر alias کنی.

terminal
bat script.py                    # با سینتکس رنگی
bat -l yaml config               # تعیین اجباری زبان
bat --diff-only file             # فقط بخش‌های تغییرکرده نسبت به git
bat src/*.rs                     # چند فایل با هدر
alias cat='bat --paging=never'   # جایگزینی کامل (اختیاری!)

zcatخواندن فایل‌های فشرده بدون استخراج

پیش‌فرض سیستم

محتوای فایل gzip را باز فشرده و مستقیم چاپ می‌کند؛ برای لاگ‌های چرخشیِ فشرده (syslog.2.gz) عالی است.

terminal
zcat syslog.2.gz | grep error
zcat access.log.*.gz | awk '{print $1}' | sort | uniq -c | sort -rn | head
# متناظرها: zless، zgrep، zdiff — همه روی gzip کار می‌کنند
zgrep -i timeout app.log.*.gz

detoxپاک‌سازی نام فایل‌ها از کاراکترهای مشکل‌ساز

نیاز به نصب
📦 نصب:sudo apt install detox

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

terminal
detox -n *.mp3            # اول پیش‌نمایش (-n = فقط نشان بده)
detox *.mp3               # بعد اجرای واقعی
🔎

5. جست‌وجو و فیلتر متن

9 دستور و مبحث

خط لوله فکر کن، تک‌دستور نه

قدرت واقعی لینوکس در ترکیب ابزارهای کوچک است: هر دستور یک کار را خوب انجام می‌دهد و خروجی‌اش را به دستور بعدی می‌دهد. سه چیز که این ترکیب را ممکن می‌کند:

terminal
grep ERROR app.log | sort | uniq -c | sort -rn | head -5
#    ① فیلتر      ② مرتب   ③ شمارش   ④ بر اساس تعداد  ⑤ پنج تای اول

ps aux | grep nginx        # پیدا کردن پروسه nginx
cat access.log | awk '{print $1}' | sort -u   # آی‌پی‌های یکتا

grepجست‌وجوی الگو در متن

پیش‌فرض سیستم

دروازه‌بان متن: خط‌هایی را نگه می‌دارد که با الگوی شما جور می‌شوند. اگر فقط یک دستور این هندبوک را عمیق یاد بگیری، همین باشد — در لاگ، کد، خروجی هر برنامه و فایل‌های سیستم کاربرد دارد.

گزینهکار
-iبی‌تفاوت به بزرگ/کوچکی حروف
-vبرعکس: خط‌هایی که مطابقت ندارند
-nنمایش شماره خط
-rجست‌وجوی بازگشتی در پوشه‌ها
-lفقط نام فایل‌های حاوی الگو
-cتعداد خط‌های منطبق
-wمطابقت کلمه کامل
-Eregex توسعه‌یافته (معادل egrep): + ? | {n,m}
-Fجست‌وجوی ساده بدون regex (سریع‌تر)
-Pregex پرل با look-ahead (PCRE)
-oفقط بخش منطبق را چاپ کن
-A n / -B n / -C nn خط بعد/قبل/اطرافِ هر مطابقت
--include=*.pyفقط فایل‌های منطبق با الگو
--exclude-dir=node_modulesجهش از پوشه‌های مزاحم
-e Pچند الگو با چند -e (یا منطقی)
terminal
grep error app.log                    # ساده (حساس به حروف)
grep -i error app.log                 # بدون حساسیت
grep -rn "TODO" ~/projects/           # بازگشتی + شماره خط
grep -rn "def main" --include="*.py" .
grep -v "^#" /etc/ssh/sshd_config     # همه به‌جز کامنت‌ها
grep -v "^$" file.txt                 # حذف خط‌های خالی
grep -c 500 access.log                # چند خطای 500 ثبت شده؟
grep -A 3 -B 1 "Exception" app.log    # با ۳ خط بعد و ۱ خط قبل
grep -l "Listen" /etc/nginx/*.conf    # کدام فایل‌ها؟
grep -w "root" /etc/passwd            # کلمه کامل root، نه password
grep -E "error|fail|panic" app.log    # چند الگو (یا)
grep -E -o "[0-9]{1,3}(\.[0-9]{1,3}){3}" access.log | sort -u   # استخراج IP
grep -F "10.0.0.1" hosts.txt          # جست‌وجوی ساده سریع
grep -P "(?<=user=)\w+" access.log    # look-behind پرلی
ps aux | grep -v grep | grep nginx    # الگوی کلاسیک پیدا کردن پروسه
dmesg | grep -i -E "usb|disk"         # فیلتر خروجی هر دستور
💡
همیشه رنگ فعال کن: alias grep='grep --color=auto' در .bashrc. برای جست‌وجوی توزیع‌شده روی چند فایل، الگوی grep -rn الگو . با Tab جایگزین کامل IDE در سرورهاست. برای شمارش دقیق رخدادها (نه خط‌ها) از grep -o الگو | wc -l استفاده کن.

sortمرتب‌سازی خط‌ها

پیش‌فرض سیستم

خطوط ورودی را مرتب می‌کند؛ با گزینه‌هایش می‌توانی عددی، بر اساس ستون، بر اساس اندازه انسانی یا ماه‌ها مرتب کنی.

گزینهکار
-rنزولی (برعکس)
-nعددی نه الفبایی (وگرنه 10 قبل از 9 می‌آید!)
-hاعداد انسانی: 2K < 1M < 3G
-uحذف تکراری‌ها (uniq داخلی)
-k nمرتب‌سازی بر اساس ستون n
-t Xجداکننده ستون (مثل : یا ,)
-fبی‌تفاوت به بزرگ/کوچکی
-bنادیده‌گرفتن فاصله ابتدای خط
-Mمرتب‌سازی نام ماه‌ها: JAN، FEB…
-o fileنوشتن خروجی در فایل (حتی خود فایل ورودی)
terminal
sort names.txt
sort -r names.txt                     # نزولی
sort -n numbers.txt                   # مرتب‌سازی عددی درست
du -sh * | sort -rh                   # پوشه‌ها از بزرگ به کوچک  ★
sort -t: -k3 -n /etc/passwd           # بر اساس UID عددی
sort -t, -k2,2 -k1,1 data.csv         # ستون ۲ بعد ستون ۱
sort -u emails.txt                    # یکتاسازی هم‌زمان
sort -M months.txt                    # JAN FEB MAR...
sort -o file.txt file.txt             # مرتب‌سازی درجا
ps aux | sort -k3 -rn | head          # پروسه‌های پر‌مصرف CPU

uniqحذف یا شمارش خط‌های تکراری مجاور

پیش‌فرض سیستم

خط‌های تکراری مجاور را حذف یا می‌شمارد — پس تقریباً همیشه قبلش باید sort کنی. ترکیب sort | uniq -c | sort -rn محبوب‌ترین الگوی آماری ترمینال است.

گزینهکار
-cشمارش تکرار هر خط
-dفقط خط‌هایی که تکرار شده‌اند
-uفقط خط‌های یکتا
-iبی‌تفاوت به بزرگ/کوچکی
-s Nنادیده‌گرفتن N کاراکتر اول
-w Nفقط N کاراکتر اول ملاک است
terminal
sort names.txt | uniq
sort -u names.txt                     # معادل کوتاه‌تر
sort access.log | uniq -c | sort -rn | head    # پرتکرارترین‌ها ★
uniq -d words.txt                     # فقط تکراری‌ها
uniq -u words.txt                     # فقط یکتاها
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head   # IPهای بیشترین درخواست

cutبریدن ستون‌ها و بازه کاراکترها

پیش‌فرض سیستم

از هر خط، بخش مشخصی (فیلد با جداکننده یا بازه کاراکتر) را برمی‌دارد. ساده و سریع برای داده جدولی مثل passwd و csv.

گزینهکار
-d Xجداکننده فیلد (پیش‌فرض Tab)
-f nفیلد n (با کاما و بازه: 1,3 یا 2-5)
-c nبازه کاراکتر: 1-10
--complementبرعکس: همه به‌جز انتخاب‌شده‌ها
terminal
cut -d: -f1 /etc/passwd               # فقط نام کاربرها ★
cut -d: -f1,7 /etc/passwd             # نام کاربر + شل
cut -d, -f2 data.csv                  # ستون دوم csv
cut -c1-10 file.txt                   # ۱۰ کاراکتر اول هر خط
cut -c1-4,20- log.txt
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -10
who | cut -d' ' -f1 | sort -u         # چه کسانی لاگین‌اند؟

pasteچسباندن خط‌های دو فایل کنار هم

پیش‌فرض سیستم

خط nام فایل اول را کنار خط nام فایل دوم می‌چسباند؛ برای ساختن csv از دو ستون جدا و ترکیب خطوط.

گزینهکار
-d Xجداکننده بین ستون‌ها
-sافقی: همه خط‌های یک فایل را در یک خط
terminal
paste names.txt phones.txt            # دو ستون با Tab
paste -d, names.txt phones.txt        # خروجی csv
paste -sd, emails.txt                 # همه ایمیل‌ها در یک خط با کاما
seq 1 5 | paste -sd+ - | bc           # جمع 1 تا 5 = 15

trترجمه و تبدیل کاراکترها

پیش‌فرض سیستم

کاراکتر به کاراکتر تبدیل، حذف یا فشرده می‌کند. فقط از stdin می‌خواند — پس معمولاً داخل پایپ است.

گزینهکار
-d مجموعهحذف کاراکترهای مجموعه
-sفشرده‌کردن تکرارهای مجاور به یکی
-cمکمل مجموعه (هرچه جزو آن نیست)
terminal
echo "Hello" | tr a-z A-Z             # HELLO
tr ':' '\t' < /etc/passwd             # دونقطه به Tab
tr -d '\r' < winfile.txt > unixfile.txt   # پاک‌کردن CR ویندوز ★
tr -s ' '                             # فشرده‌کردن فاصله‌های پشت‌سرهم
tr -cd '0-9' < input.txt              # فقط رقم‌ها بمانند
echo "salâm" | tr -cd 'a-z'           # salm

ripgrepجست‌وجوی فوق‌سریع متن در پروژه‌ها

نیاز به نصب
📦 نصب:sudo apt install ripgrep # dnf: sudo dnf install ripgrep · pacman: sudo pacman -S ripgrep

جانشین مدرن grep: ده‌ها برابر سریع‌تر، پیش‌فرض بازگشتی، خودکار از .gitignore پیروی می‌کند و خروجی رنگی تمیز دارد. برای گشتن در سورس‌کد بهترین انتخاب است.

گزینهکار
-iبی‌تفاوت به حروف
-t pyفقط فایل‌های پایتون (نوع خودکار)
-T jsاستثناکردن نوع js
-g '*.yaml'فیلتر glob دستی
-l / -cفقط نام فایل / فقط شمارش
-C 2۲ خط اطراف مطابقت
-A / -Bبعد/قبل مطابقت
--hiddenجست‌وجو در پوشه‌های نقطه‌دار
terminal
rg "function" src/
rg -i "error" --type py
rg -l "TODO"                          # کدام فایل‌ها TODO دارند
rg -n "import numpy" -g "*.py" ~/projects
rg "panic|fatal" logs/ -C 2
rg -u "hidden_secret"                 # -u: بی‌خیال gitignore و مخفی‌ها
rg --files | rg test                  # فایل‌هایی که اسمشان test دارد

lookجست‌وجوی پیشوندی در واژه‌نامه

پیش‌فرض سیستم

خط‌هایی که با کلمه داده‌شده شروع می‌شوند را از /usr/share/dict/words می‌یابد؛ برای تکمیل کلمه و بازی‌های کلامی.

terminal
look aut
look auto /usr/share/dict/words

nl(یادآوری) شماره خط هنگام نمایش

پیش‌فرض سیستم

در جریان پایپ هم می‌تواند شماره خط اضافه کند: grep error app.log | nl

terminal
grep -i fail deploy.log | nl | tail -20
⚙️

6. sed و awk — دو غول پردازش متن

2 دستور و مبحث

sed: ویرایشگر جریانی

sed متن را خط‌به‌خط از جریان رد می‌کند و با دستورهایش ویرایش می‌کند. رایج‌ترین کار: جایگزینی با s/قدیم/جدید/.

terminal
sed 's/sabz/sefid/' file.txt        # چاپ فقط؛ فایل عوض نمی‌شود
sed -i 's/sabz/sefid/' file.txt     # درجا ویرایش کن (in-place)
sed -i.bak 's/sabz/sefid/' f.conf   # درجا + نسخه پشتیبان .bak ★
sed 's/\//U/' file.txt              # جداکننده می‌تواند هر کاراکتری باشد
sed 's/قدیم/جدید/g; s/x/y/g' f      # چند دستور با ؛
ℹ️
در regexهای sed: . هر کاراکتر، * صفر یا بیشتر، ^$ ابتدا/انتها، \+ یک یا بیشتر (در حالت -E: +\( \) گروه (در -E: پرانتز ساده)، & خودِ متن منطبق.

sedویرایشگر جریانی (جایگزینی، حذف، درج)

پیش‌فرض سیستم

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

گزینهکار
-i[پسوند]ویرایش درجا؛ با پسوند مثل -i.bak پشتیبان بگیر
-nچاپ نکن مگر با دستور p
-Eregex توسعه‌یافته (بدون بک‌اسلش‌های اضافه)
-e exprچند دستور پشت‌سرهم
-f scriptخواندن دستورها از فایل
terminal
# --- جایگزینی ---
sed 's/localhost/10.0.0.5/' app.conf           # پیش‌نمایش
sed -i.bak 's/localhost/10.0.0.5/' app.conf    # اعمال + بکاپ ★
sed -i 's/\bhttp\b/https/g' urls.txt          # فقط کلمه کامل، همه تکرارها
sed 's#http://old.example.com#https://new.example.com#g' f   # # به‌جای /
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' dates.txt  # جابه‌جایی اجزای تاریخ با گروه‌ها

# --- حذف ---
sed '/^#/d' f.conf                # حذف کامنت‌ها
sed '/^$/d' f.txt                 # حذف خط‌های خالی
sed '1d' f.csv                    # حذف خط اول
sed '2,5d' f.txt                  # حذف خط ۲ تا ۵
sed '/کلمه/,+2d' f.txt            # خطِ مطابق + دو خط بعدش

# --- نمایش و درج ---
sed -n '10,20p' f.txt             # فقط خط ۱۰ تا ۲۰ (مثل head+tail)
sed -n '/ERROR/p' app.log         # مثل grep
sed -i '2i خط تازه از سمت بالا' f.txt   # درج قبل از خط ۲
sed -i '$a خط آخر' f.txt                # افزودن به انتهای فایل
sed -n 's/.*href="\([^"]*\)".*/\1/p' page.html   # استخراج لینک‌ها
⚠️
هرگز sed -i را اول روی فایل واقعی تست نکن؛ اول بدون -i خروجی را ببین، بعد با -i.bak اعمال کن. دستور sed -i 's/…/…/' * روی فایل‌های باینری خرابکاری می‌کند — با --include یا پسوند محدود کن.

awkپردازشگر ستونی و زبان گزارش‌گیری

پیش‌فرض سیستم

وقتی داده جدولی است — لاگ، csv، خروجی ps — awk انتخاب حرفه‌ای است: فیلتر، جمع، میانگین، گروه‌بندی و قالب‌بندی، همه در یک خط بدون python.

گزینهکار
-F Xجداکننده فیلد (FS)
-v var=valفرستادن متغیر به awk
-f fileبرنامه awk از فایل
BEGIN/ENDبلوک‌های شروع و پایان
terminal
# --- استخراج و فیلتر ---
awk -F: '{print $1}' /etc/passwd
awk -F, '$2 > 1000 {print $1, $2}' sales.csv
awk '$0 !~ /^#/ && NF' conf.txt             # بدون کامنت و خط خالی

# --- محاسبات (BEGIN/END) ---
awk '{s+=$2} END {print "مجموع:", s}' data.txt
awk 'END {print NR, "خط"}' file.txt          # شماره خط آخر = تعداد خط
awk '/ERROR/ {n++} END {print n+0}' app.log  # شمارش مطابقت
awk '{s+=$1; n++} END {print s/n}' nums.txt  # میانگین

# --- گروه‌بندی (آرایه انجمنی) ★ ---
awk -F, '{sum[$1]+=$2} END {for(k in sum) print k, sum[k]}' sales.csv
awk '{ip[$1]++} END {for(i in ip) print ip[i], i}' access.log | sort -rn | head

# --- قالب‌بندی ---
awk -F: '{printf "%-12s %s\n", $1, $7}' /etc/passwd
awk 'BEGIN{print "گزارش ماه"} {print NR, $0} END{print "پایان"}' f.txt

# --- کاربردی: بزرگ‌ترین فایل‌ها ---
ls -la | awk '$5>1048576 {printf "%.1fMB  %s\n", $5/1048576, $9}'

الگوهای پیشرفته sed

terminal
# با نگه‌داشتن گروه‌ها (backreference) — بازآرایی نام
echo "Ali Rezaei" | sed -E 's/(\w+) (\w+)/\2، \1/'
# ← Rezaei، Ali

# فقط روی خط‌های خاصی اعمال کن
sed '/\[error\]/s/old/new/g' app.log     # فقط خط‌های حاوی [error]

# بازه‌ای بین دو الگو
sed -n '/BEGIN/,/END/p' file.txt          # از BEGIN تا END چاپ کن

# حذف HTML ساده (برای متن‌های تمیز؛ نه xml تودرتو)
sed -e 's/<[^>]*>//g' page.html

# تبدیل بزرگ‌به‌کوچک با \U \L (GNU sed)
echo "hello world" | sed -E 's/(\w+)/\u\1/g'   # Hello World

# ویرایش چند فایل با هم
sed -i 's/localhost/production.example.com/' /etc/nginx/sites-enabled/*

# خط‌های nام و هر n خط (step)
seq 1 10 | sed -n '2~3p'                  # 2 5 8

الگوهای پیشرفته awk

terminal
# گزارش با هدر و پاورقی
awk -F, 'BEGIN{print "نام\tفروش"} {printf "%s\t%d\n",$1,$2}
         END{printf "-----\nجمع\t%d\n",s} {s+=$2}' sales.csv

# حداکثر/حداقل با ردیابی خط
awk 'max=="" || $2>max {max=$2; line=$0} END {print line}' data.txt

# join ساده دو فایل بر اساس کلید (فایل‌ها مرتب بر کلید)
awk 'NR==FNR {m[$1]=$2; next} {print $0, m[$1]}' names.txt scores.txt

# خروجی csv امن: قرار دادن فیلدها در نقل‌قول
awk -v q='"' 'BEGIN{OFS=","}{print q$1q,q$2q}' data.txt

# شبیه‌سازی xargs با awk برای فایل‌های دارای فاصله
find . -name "*.log" -print0 | xargs -0 awk '{n+=1} END {print n}'
⚠️
awk و sed برای متن خطی عالی‌اند؛ برای XML/JSON تو در تو از jq و xmllint استفاده کن — regex روی ساختار تودرتو همیشه یک جایی می‌شکند.
🅰️

7. یونیکد، انکودینگ و متن فارسی

3 دستور و مبحث

یونیکد و متن فارسی در ترمینال

متن فارسی دو چالش دارد: انکودینگ (UTF-8 استاندارد است) و جهت نمایش RTL. چند واقعیت کاربردی:

terminal
file -i report.txt                      # charset=utf-8؟
iconv -f windows-1256 -t utf-8 old.txt > new.txt
grep -P '\x{200C}' notes.txt | head     # خط‌های دارای نیم‌فاصله
sed 's/ي/ی/g; s/ك/ک/g' data.txt > fixed.txt   # عربی به فارسی ★

# دیدن دقیق بایت‌های UTF-8 یک رشته:
echo -n "سلام" | od -An -tx1            # d8 b3 d9 84 d8 a7 d9 85

# شمارش صحیح کاراکتر فارسی (نه بایت):
wc -m persian.txt                       # -m کاراکتر، -c بایت
⚠️
در پایپ‌ها ترتیب بصری حروف فارسی ممکن است جابه‌جا دیده شود — اشکال از داده نیست؛ نمایش ترمینال است. اگر خروجی برای انسان است، به فایل بریز و در ویرایشگر ببین.

localeتنظیمات زبان و منطقه‌ای سیستم

پیش‌فرض سیستم

نشان می‌دهد سیستم با چه انکودینگ و قالبی کار می‌کند. مشکل نمایش فارسی معمولاً از اینجا شروع می‌شود.

terminal
locale                        # وضعیت فعلی
locale -a | grep -i fa        # زبان‌های نصب‌شده
# تنظیم UTF-8 (اگر C بود، مشکل حروف فارسی همین‌جاست):
sudo localectl set-locale LANG=en_US.UTF-8
# و یا در ~/.bashrc:
export LC_ALL=en_US.UTF-8

hexylنمای رنگی و مدرن hex dump

نیاز به نصب
📦 نصب:sudo apt install hexyl # pacman: sudo pacman -S hexyl

مثل od بایت‌های فایل را نشان می‌دهد ولی با رنگ‌بندی دسته‌بندی‌شده — خواندن ساختار فایل باینری را ساده می‌کند.

terminal
hexyl image.png | head
hexyl -n 64 file.bin          # فقط ۶۴ بایت اول

uconvنرمال‌سازی و تبدیل یونیکد

نیاز به نصب
📦 نصب:sudo apt install icu-devtools

تبدیل و نرمال‌سازی حرفه‌ای یونیکد — برای یکسان‌سازی حروف عربی/فارسی و حذف اختلاف‌های نامرئی بین متن‌ها.

terminal
uconv -x Any-Lower persian.txt
uconv -f utf-8 -t utf-8 -x NFC file.txt   # فرم نرمال ترکیبی
🧾

8. ابزارهای داده و سند (JSON، PDF، مدیا)

8 دستور و مبحث

jqپردازشگر JSON خط فرمان

نیاز به نصب
📦 نصب:sudo apt install jq # dnf: sudo dnf install jq · pacman: sudo pacman -S jq

JSON را مثل awk پردازش می‌کند: استخراج فیلد، فیلتر، شمارش، بازسازی. خروجی هر API مدرنی را مهار می‌کند.

گزینهکار
-rخروجی خام رشته (بدون نقل‌قول)
-cفشرده در یک خط
-sکل ورودی را یک آرایه کن
--arg n vارسال متغیر به برنامه jq
terminal
echo '{"name":"Ali","age":30}' | jq '.name'
curl -s https://api.github.com/users/torvalds | jq '.name, .followers'
jq '.users[].email' data.json               # همه ایمیل‌های آرایه users
jq '.items[] | select(.price > 100)' db.json # فیلتر شرطی
jq 'length' data.json                        # تعداد عنصرها
jq 'keys' config.json                        # نام کلیدها
jq -r '.[] | "\(.name) — \(.price)"' products.json   # قالب‌بندی
jq '[.items[].price] | add' db.json          # جمع قیمت‌ها
jq -s 'sort_by(.age) | .[0]' people.json     # جوان‌ترین نفر
jq --arg env prod '.environments[$env]' config.json
# زیباسازی json به‌هم‌ریخته:
jq . messy.json > pretty.json
💡
الگوی رایج دیباگ API: curl -s URL | jq . اول ساختار را ببین، بعد فیلتر بنویس.

yqپردازشگر YAML (و XML و TOML)

نیاز به نصب
📦 نصب:sudo snap install yq # یا باینری از GitHub mikefarah/yq

همان قدرت jq اما برای YAML — فایل‌های Kubernetes و CI را پردازش و ویرایش می‌کند.

terminal
yq '.services.web.image' docker-compose.yml
yq '.spec.replicas = 5' deployment.yaml          # ویرایش
yq -o=json '.config' settings.yaml               # تبدیل yaml به json
yq '.[] | select(.enabled == true)' items.yaml

pandocدستگاه تبدیل فرمت‌های سند

نیاز به نصب
📦 نصب:sudo apt install pandoc

تبدیل بین ده‌ها فرمت سند: markdown به docx/pdf/html و برعکس.

گزینهکار
-f/-tفرمت ورودی/خروجی
-o fileفایل خروجی
--tocافزودن فهرست مطالب
-sسند مستقل کامل
terminal
pandoc report.md -o report.docx            # markdown → Word ★
pandoc report.md -o report.pdf --pdf-engine=xelatex
pandoc page.html -t markdown -o page.md    # html → markdown
pandoc README.md -s --toc -o README.html

pdftotextاستخراج متن از PDF

نیاز به نصب
📦 نصب:sudo apt install poppler-utils # شامل pdfinfo و pdftoppm هم هست

متن داخل PDF را بیرون می‌کشد تا با grep و awk قابل پردازش شود.

گزینهکار
-layoutحفظ چیدمان ستون‌ها
-f n -l mصفحه n تا m
-rawترتیب جریان متن
terminal
pdftotext report.pdf report.txt
pdftotext -layout table.pdf - | less     # حفظ جدول‌ها
pdfinfo report.pdf                       # تعداد صفحه، نویسنده،…
pdftotext book.pdf - | grep -n "فصل"     # جست‌وجو در کل کتاب
pdftoppm -png -r 100 slides.pdf page     # هر صفحه یک png

ffmpegچاقوی سوئیسی رسانه: صوت و تصویر

نیاز به نصب
📦 نصب:sudo apt install ffmpeg

تبدیل، برش، فشرده‌سازی و استخراج هر رسانه‌ای — بدون رابط گرافیکی.

گزینهکار
-i fileورودی
-vn / -anبدون ویدیو / بدون صدا
-ss 00:01:23نقطه شروع
-t 30مدت
-crf 28کیفیت فشرده‌سازی ویدیو
terminal
ffmpeg -i in.mov out.mp4                     # تبدیل فرمت
ffmpeg -i video.mp4 -vn -q:a 2 audio.mp3     # استخراج صدا
ffmpeg -ss 00:05:00 -t 30 -i in.mp4 clip.mp4 # برش ۳۰ ثانیه
ffmpeg -i in.mp4 -vcodec libx264 -crf 28 small.mp4   # فشرده‌سازی
ffmpeg -i in.mp4 -vf scale=1280:-1 hd.mp4    # تغییر رزولوشن

magickپردازش تصویر (ImageMagick)

نیاز به نصب
📦 نصب:sudo apt install imagemagick # دستور قدیمی: convert

تغییر اندازه، فرمت، فشرده‌سازی و ترکیب تصاویر به‌صورت گروهی.

گزینهکار
-resizeتغییر اندازه
-qualityکیفیت jpg
-rotateچرخش
-stripحذف متادیتا (حریم خصوصی!)
terminal
magick input.png output.jpg                  # تبدیل فرمت
magick photo.jpg -resize 800x600 out.jpg     # تغییر اندازه
magick photo.jpg -resize 50% half.png
magick img.jpg -quality 85 -strip web.jpg    # فشرده + حذف EXIF
mogrify -resize 1024x -format webp *.png     # گروهی: همه png به webp
magick a.jpg b.jpg +append side.jpg          # چسباندن کنار هم

xmllintاعتبارسنجی و پرس‌وجوی XML

نیاز به نصب
📦 نصب:sudo apt install libxml2-utils

چک صحت XML و استخراج با XPath — برای sitemapها و فایل‌های پیکربندی XML.

terminal
xmllint --noout file.xml                 # فقط اعتبارسنجی
xmllint --xpath '//item/title/text()' feed.xml
xmllint --format ugly.xml > pretty.xml   # زیباسازی

sqlite3پایگاه‌داده SQLite در یک فایل

نیاز به نصب
📦 نصب:sudo apt install sqlite3

اکثر اپلیکیشن‌ها داده‌هایشان را در فایل‌های sqlite نگه می‌دارند؛ با این دستور مستقیم SQL اجرا می‌کنی.

گزینهکار
.tablesلیست جدول‌ها
.schema tساختار جدول
.mode csv / jsonقالب خروجی
-header -columnخروجی جدولی خوانا
terminal
sqlite3 app.db                            # ورود تعاملی
sqlite3 app.db ".tables"
sqlite3 app.db "SELECT * FROM users LIMIT 5;"
sqlite3 -header -column app.db "SELECT id,name FROM users;"
sqlite3 :memory: "SELECT 2+2;"            # محاسبه سریع
sqlite3 -json app.db "SELECT * FROM logs" | jq '.[0]'
🗂️

9. جست‌وجوی فایل‌ها

7 دستور و مبحث

سه راه پیدا کردن فایل

find

جست‌وجوی زنده و دقیق روی دیسک — همیشه موجود، همه شرط‌ها

locate

جست‌وجو در دیتابیس آماده — فوق‌سریع ولی تا «به‌روزرسانی بعدی»

fd

جانشین مدرن find — سینتکس ساده و سریع (نیاز به نصب)
ℹ️
قانون طلایی find: هر شرط را قبل از اعمال مخرب (delete/exec)، اول با ls یا print تست کن.

findجست‌وجوی قدرتمند و بازگشتی

پیش‌فرض سیستم

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

گزینهکار
-name الگوبر اساس نام (case-sensitive)؛ -iname بی‌تفاوت
-type f/d/lفایل / پوشه / لینک
-size +100Mاندازه: +بزرگ‌تر -کوچک‌تر (c=بایت k M G)
-mtime n / -mmin nتغییر n روز / n دقیقه پیش (+n قدیمی‌تر)
-user / -groupبر اساس مالک/گروه
-perm 644بر اساس مجوز دقیق (-mode حداقل)
-maxdepth nحداکثر عمق جست‌وجو
-exec cmd {} ;اجرای دستور روی هر نتیجه ({ } = مسیر فایل)
-deleteحذف نتایج (بعد از تست!)
-print0خروجی جداشده با NUL — برای فایل‌های دارای فاصله
terminal
# --- بر اساس نام ---
find . -name "*.log"                     # همه لاگ‌ها از اینجا به پایین
find . -iname "readme*"                  # بدون حساسیت به حروف
find /etc -name "*.conf" -maxdepth 2

# --- بر اساس اندازه ---
find / -size +100M 2>/dev/null           # فایل‌های بالای ۱۰۰ مگ
find . -size +50M -size -200M -type f    # بین ۵۰ تا ۲۰۰ مگ
find ~/Downloads -type f -size +500M -exec ls -lh {} \;

# --- بر اساس زمان ---
find . -mtime -1 -type f                 # ۲۴ ساعت اخیر تغییر کرده
find . -mmin -30 -type f                 # ۳۰ دقیقه اخیر
find /var/log -mtime +30 -name "*.gz"    # قدیمی‌تر از یک ماه
find . -newer reference.txt              # جدیدتر از یک فایل مرجع

# --- بر اساس مجوز و مالک ---
find /home -user ali -type f
find . -perm 777 -type f                 # فایل‌های بازِ خطرناک
find / -nouser -o -nogroup 2>/dev/null   # یتیم‌ها (امنیت!)

# --- اجرای عملیات ---
find . -name "*.tmp" -type f -delete
find . -name "*.png" -exec cp {} ~/pics/ \;
find . -name "*.sh" -exec chmod +x {} +
find . -name "*.bak" -ok rm {} \;        # -ok: برای هر فایل بپرس
find . -type f -name "*.txt" -print0 | xargs -0 grep -l "کلمه"
⚠️
ترتیب در find مهم است: شرط‌ها AND منطقی‌اند. قبل از -delete حتماً همان فیلتر را با find … -print مرور کن؛ -delete وسط مسیر با یک اشتباه کوچک قابل برگشت نیست.

locateجست‌وجوی برق‌آسا در دیتابیس نام‌ها

نیاز به نصب
📦 نصب:sudo apt install plocate # (نسخه‌های قدیمی‌تر: mlocate)

به‌جای گشتن زنده روی دیسک، در ایندکس آماده جست‌وجو می‌کند — هزاران برابر سریع‌تر از find. ایندکس خودکار به‌روز می‌شود؛ دستی با updatedb.

گزینهکار
-iبی‌تفاوت به بزرگ/کوچکی
-n Nفقط N نتیجه اول
-cفقط شمارش نتایج
-eفقط فایل‌های موجود الان
terminal
locate nginx.conf
locate -i readme | head
locate -c "*.pdf"               # چند pdf در ایندکس هست؟
sudo updatedb                   # به‌روزرسانی دستی ایندکس
locate -n 5 -i bashrc

fdfind مدرن و خوش‌دست

نیاز به نصب
📦 نصب:sudo apt install fd-find # دستور: fdfind · pacman: sudo pacman -S fd

جست‌وجوی فایل با سینتکس ساده و رنگی و سریع‌تر از find. در Debian دستورش fdfind است (alias کنید).

گزینهکار
-e extفیلتر پسوند
-Hشامل فایل‌های مخفی
-Iبی‌خیال gitignore
-d nحداکثر عمق
-x cmdاجرا روی هر نتیجه (مثل find -exec)
terminal
fd report                        # جست‌وجوی ساده نام
fd -e py main                    # فایل‌های py با نام main
fd -H -I .git                    # حتی داخل مخفی‌ها
fd -e log -x wc -l               # شمارش خط هر لاگ
alias fd=fdfind                  # در ~/.bashrc برای Debian/Ubuntu

xargsتبدیل خروجی به آرگومان

پیش‌فرض سیستم

خروجی یک دستور را به آرگومان دستور دیگر تبدیل می‌کند — حلقه حلقه‌زدن دستی را حذف می‌کند و ستون فقرات پایپ‌های حرفه‌ای است.

گزینهکار
-n nحداکثر n آرگومان برای هر اجرا
-I{}جای‌گذاری در محل دلخواه
-0ورودی جداشده با NUL (جفت find -print0)
-P nاجرای موازی با n پروسه ★
-rاگر ورودی خالی بود اجرا نکن (GNU)
terminal
find . -name "*.log" -print0 | xargs -0 rm          # حذف امن با فاصله‌ها
cat urls.txt | xargs -n1 curl -sO                    # دانلود لیستی
find . -name "*.jpg" | xargs -P4 -n1 magick {} {}.webp   # ۴ پردازش موازی
ls *.txt | xargs wc -l                               # شمارش خط همه
echo -e "a\nb\nc" | xargs -I{} echo "پردازش {}"
grep -rl "OLD" . | xargs sed -i 's/OLD/NEW/g'        # جایگزینی گروهی ★
xargs -a ports.txt -n1 -P8 nc -zv                    # ۸ اتصال موازی

parallelاجرای موازی حرفه‌ای (GNU Parallel)

نیاز به نصب
📦 نصب:sudo apt install parallel

مثل xargs ولی هوشمندتر: حفظ ترتیب خروجی، نمایش پیشرفت، توزیع روی چند هسته/سرور.

terminal
parallel -j4 convert {}.png {}.jpg ::: img1 img2 img3
parallel -a hosts.txt ping -c1 {}
seq 1 10 | parallel -k echo          # -k حفظ ترتیب خروجی
parallel --bar gzip ::: *.log        # با نوار پیشرفت

mkfifoساخت لوله نام‌دار

پیش‌فرض سیستم

یک «فایل» می‌سازد که پایپ است: هرچه در یک طرف بنویسی از طرف دیگر خوانده می‌شود — ارتباط زنده بین دو ترمینال یا پروسه.

terminal
mkfifo /tmp/mypipe
# ترمینال ۱:
tail -f /tmp/mypipe
# ترمینال ۲:
echo "سلام از آن‌طرف پایپ" > /tmp/mypipe
rm /tmp/mypipe                       # بعد از کار پاکش کن

pvنمایش سرعت و پیشرفت پایپ

نیاز به نصب
📦 نصب:sudo apt install pv

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

terminal
dd if=/dev/sda bs=4M | pv | dd of=/backup/disk.img
pv bigfile.sql | mysql -u root dbname
tar -czf - myfolder | pv > backup.tar.gz
du -sh * | pv -l -F 'اسکن شد: %r'
🔀

11. Pipe و Redirection حرفه‌ای

5 دستور و مبحث

سه جریان هر برنامه

هر پروسه سه جریان دارد: stdin (ورودی، 0)، stdout (خروجی، 1) و stderr (خطا، 2). مهارت ریدایرکت یعنی هدایت هر سه به هر جای دلخواه:

terminal
command > file.txt         # خروجی → فایل (بازنویسی)
command >> file.txt        # خروجی → فایل (افزودن به آخر)
command 2> err.log         # فقط خطاها → فایل
command > out.log 2>&1     # خروجی و خطا هر دو → فایل (ترتیب مهم!)
command &> all.log         # شکل کوتاه مدرن
command < input.txt        # فایل → ورودی
command 2>/dev/null        # خطاها را دور بریز
command >/dev/null 2>&1    # سکوت کامل (فقط کد خروج مهم است)
cmd1 | cmd2                # خروجی 1 → ورودی 2
cmd1 |& cmd2               # خروجی+خطا → ورودی 2
# جدا کردن خطا از خروجی در دو فایل:
make > build.log 2> build.err
# و توپ نهایی: swap کردن جریان‌ها!
cmd 3>&1 1>&2 2>&3
ℹ️
ترتیب ریدایرکت‌ها از چپ به راست است: > f 2>&1 یعنی اول stdout به f برود، بعد stderr هم به مقصدِ فعلی stdout (یعنی f). برعکسش یعنی 2>&1 > f خطاها را به ترمینال می‌فرستد — ترفندی که عمداً کاربرد دارد.

teeدیدن و ذخیره هم‌زمان خروجی

پیش‌فرض سیستم

خروجی را هم روی صفحه نشان می‌دهد هم در فایل می‌نویسد — مثل لوله T. برای ثبت لاگ عملیاتی که می‌خواهی زنده هم ببینی.

گزینهکار
-aافزودن به فایل به‌جای بازنویسی
-iنادیده‌گرفتن وقفه‌ها
terminal
ping 8.8.8.8 | tee ping.log           # ببین و ذخیره کن
make 2>&1 | tee build.log | tail -5   # لاگ کامل + فقط انتهای صفحه
echo "خط" | sudo tee -a /etc/hosts    # نوشتن در فایل root با echo ★
ps aux | tee ps-snap1.txt | grep nginx

stdbufکنترل بافر جریان‌ها

پیش‌فرض سیستم

وقتی خروجی پایپ «زنده» نیست، مشکل بافر شدن است. stdbuf بافر را خاموش می‌کند تا هر خط فوراً برسد.

terminal
tail -f app.log | stdbuf -o0 grep --line-buffered ERROR
stdbuf -oL -eL python unbuffered.py | tee run.log
# معادل در خود برنامه‌ها: grep --line-buffered، sed -u، awk با fflush()

timeoutسقف زمانی برای هر دستور

پیش‌فرض سیستم

دستور را با مهلت اجرا می‌کند؛ اگر طول کشید، خودش قطعش می‌کند — نجات‌دهنده در اسکریپت‌ها و شبکه.

گزینهکار
10s/5mفرمت مدت
-k 5اگر بعد از مهلت نُرم نکرد، با SIGKILL
--signal=INTسیگنال دلخواه
--preserve-statusحفظ کد خروج
terminal
timeout 10 ping example.com          # حداکثر ۱۰ ثانیه پینگ
timeout 5 curl -s http://slow-api    # API بی‌جواب = قطع خودکار
timeout -k 2 30 backup.sh            # بعد از ۳۰ ثانیه، ۲ ثانیه فرصت نرم
timeout --signal=KILL 5 stuck-proc

scriptreplayپخش مجدد ضبط ترمینال

پیش‌فرض سیستم

جفت script -t: ضبط نشست را با زمان‌بندی اصلی دوباره پخش می‌کند — آموزش و بازبینی عملیات.

terminal
script -t 2>timing.log session.log   # ضبط
scriptreplay -t timing.log session.log   # پخش

watchاجرای دوره‌ای و پایش خروجی

پیش‌فرض سیستم

یک دستور را هر n ثانیه اجرا و خروجیاش را تمام‌صفحه نشان می‌دهد — مانیتور زنده‌ی سبک بدون نصب هیچ چیز.

گزینهکار
-n secفاصله (پیش‌فرض ۲ ثانیه)
-dهایلایت تغییرها ★
-gوقتی خروجی تغییر کرد خارج شو
--no-titleبدون هدر
terminal
watch -n 1 -d ls -lh bigfile.bin      # رشد فایل را زنده ببین
watch -d free -h                      # مصرف RAM لحظه‌ای
watch -n5 'ps aux | sort -k3 -rn | head -6'   # پر‌مصرف‌های CPU
watch -d df -h                        # فضای دیسک
watch -g date +%H:%M                  # خروج وقتی دقیقه عوض شد
🧠

12. فرآیندها و Job Control

18 دستور و مبحث

آناتومی یک پروسه

هر برنامه در حال اجرا یک PID (شناسه پروسه)، یک کاربر مالک، مصرف CPU/RAM و یک درخت والد دارد. همه این‌ها از /proc/PID قابل خواندن است.

دیدن پروسه‌ها

ps aux عکس لحظه‌ای · top زنده · htop زنده رنگی

پیدا کردن PID

pgrep -f نام · pidof برنامه · lsof -i:80

خاتمه دادن

kill PID نرم · kill -9 PID قهری · pkill نام

اولویت

nice -n 10 cmd کم‌اهمیت اجرا کن · renice تغییر زنده

پس‌زمینه

cmd & · Ctrl+Z سپس bg · nohup برای ماندگاری

psعکس لحظه‌ای از پروسه‌ها

پیش‌فرض سیستم

لیست پروسه‌ها — برخلاف top، یک عکس فوری می‌گیرد. سبک‌های خروجی مختلف دارد؛ ps aux و ps -ef پرکاربردترین‌ها هستند.

گزینهکار
auxسبک BSD: همه پروسه‌ها + CPU/MEM + شروع
-efسبک System V: کامل + PPID
-u userفقط پروسه‌های یک کاربر
-p PIDپروسه مشخص
--forestنمایش درختی والد/فرزند
-eLfهمه threadها
-oانتخاب ستون‌های دلخواه
terminal
ps aux                        # همه پروسه‌ها
ps aux | grep -v grep | grep nginx    # پروسه nginx
ps aux --sort=-%mem | head    # پر‌مصرف‌ترین RAM
ps aux --sort=-%cpu | head    # پر‌مصرف‌ترین CPU
ps -u ali                     # پروسه‌های کاربر ali
ps -ef --forest | less        # درخت پروسه‌ها
ps -o pid,ppid,cmd,%mem,%cpu -p 1234   # جزئیات یک PID
ps -ef | grep -c bash         # چند شل باز است؟
ps auxf | less -S             # نمای درختی BSD

pgrepپیدا کردن PID بر اساس نام

پیش‌فرض سیستم

به‌جای ps aux | grep، مستقیم PIDها را می‌دهد — مناسب اسکریپت‌ها.

گزینهکار
-fمطابقت با کل خط دستور نه فقط نام
-u userفقط کاربر مشخص
-lنمایش نام کنار PID
-nفقط جدیدترین
-cفقط تعداد
terminal
pgrep nginx                 # PIDهای nginx
pgrep -f "python manage.py" # با کل خط فرمان
pgrep -l -u ali ssh         # sshهای کاربر ali
pgrep -c bash               # چند bash زنده است؟
kill $(pgrep -f myjob)      # ترکیب کلاسیک

pidofPID یک برنامه مشخص

پیش‌فرض سیستم

ساده‌تر از pgrep برای برنامه‌های دقیق؛ چند PID پشت‌سرهم می‌دهد.

terminal
pidof sshd
pidof chrome | tr ' ' '\n' | wc -l

topمانیتور زنده پروسه‌ها

پیش‌فرض سیستم

نمای زنده و مرتب‌شونده منابع — همیشه روی هر سروری حاضر است. کلیدهای داخلش را یاد بگیری؛ بدون نصب هیچ‌چیز قدرتمندترین مانیتورت است.

terminal
top
#   کلیدهای داخل top:
#   P مرتب‌سازی CPU   M مرتب‌سازی RAM   k کشتن پروسه (بعدش PID)
#   u فیلتر کاربر    1 نمایش تک‌تک هسته‌ها    h راهنما   q خروج
#   Shift+i وارون‌کردن مرتب‌سازی   z رنگی   W ذخیره تنظیمات

top -b -n1 > snapshot.txt        # خروجی batch برای لاگ
top -b -n1 | grep "Cpu(s)"       # درصد CPU در اسکریپت
top -p 1234                      # فقط یک پروسه

htopمانیتور زنده رنگی و تعاملی

نیاز به نصب
📦 نصب:sudo apt install htop # dnf: sudo dnf install htop · pacman: sudo pacman -S htop

نسخه مدرن top: نوارهای رنگی هر هسته، RAM/swap، جست‌وجو، اسکرول افقی خط فرمان و کشتن با F9 — ابزار روزمره ادمین‌ها.

terminal
htop
#   F6 مرتب‌سازی   F9 کشتن   F5 درخت   F4 فیلتر   F3 جست‌وجو   / جست‌وجو
#   Mouse هم کار می‌کند!
htop -u ali          # فقط کاربر ali
htop -p 1234,1235    # پروسه‌های خاص
htop -t              # حالت درختی از ابتدا

btopمانیتور نسل جدید با رابط زیبا

نیاز به نصب
📦 نصب:sudo apt install btop # dnf/pacman: btop

مانیتور تمام‌عیار: CPU، RAM، دیسک، شبکه، دمای سخت‌افزار و نمودارها در یک نمای خیره‌کننده — برای دسکتاپ و سرور.

terminal
btop
# منوها با ماوس قابل استفاده‌اند؛ Esc منو، q خروج
btop --force-utf

killارسال سیگنال به پروسه

پیش‌فرض سیستم

با وجود اسمش، «کشتن» نیست؛ «ارسال سیگنال» است. سیگنال پیش‌فرض TERM (پایان نرم) است — برنامه فرصت ذخیره و تمیزکاری دارد.

گزینهکار
-15 / پیش‌فرضSIGTERM: پایان نرم و مؤدبانه
-9SIGKILL: قتل فوری بدون فرصت (آخرین راه)
-1SIGHUP: معمولاً reload تنظیمات
-HUPهمان HUP؛ نام‌دار
-lلیست همه سیگنال‌ها
terminal
kill 1234                 # پایان نرم
kill -9 1234              # زور (فقط اگر TERM جواب نداد) ★
kill -HUP $(pidof nginx)  # reload تنظیمات nginx (قدیمی)
kill -l                   # لیست سیگنال‌ها
kill -0 1234 2>/dev/null && echo "زنده است" || echo "مرده"
kill -- -$(ps -o pgid= -p 1234 | tr -d ' ')   # کشتن کل گروه پروسه
⚠️
ترتیب حرفه‌ای پایان دادن: اول kill -15، چند ثانیه صبر، بعد اگر زنده بود kill -9. با SIGKILL برنامه هیچ فرصتی برای ذخیره داده و بستن فایل‌ها ندارد.

pkillکشتن بر اساس نام یا الگو

پیش‌فرض سیستم

مثل pgrep ولی به‌جای PID چاپ‌کردن، سیگنال می‌فرستد.

گزینهکار
-fمطابقت کل خط دستور
-u userفقط کاربر مشخص
-signalسیگنال دلخواه مثل -HUP
terminal
pkill firefox             # پایان همه firefoxها
pkill -f "python worker.py"
pkill -HUP syslogd        # reload
pkill -u ali bash         # (با احتیاط!) بستن شل‌های ali
pkill -9 -f stuck-job     # قهری

killallکشتن همه نمونه‌های یک برنامه

پیش‌فرض سیستم

مثل pkill ولی با نام دقیق برنامه (نه الگو) — خواناتر و کم‌خطرتر در اسکریپت.

terminal
killall chrome
killall -i bash           # بپرس قبل از هرکدام
killall -w rsync          # صبر کن تا واقعاً تمام شود

niceاجرا با اولویت پایین

پیش‌فرض سیستم

اولویت زمان‌بندی CPU را تعیین می‌کند: عدد بالاتر = مؤدب‌تر (nice‌تر) = اولویت کمتر. برای کارهای سنگین پس‌زمینه مثل کامپایل.

terminal
nice -n 19 ffmpeg -i in.mp4 out.mp4     # کمترین اولویت
nice -n 10 make -j4
sudo nice -n -5 critical-job            # اولویت بالا (نیاز sudo)

reniceتغییر اولویت پروسه زنده

پیش‌فرض سیستم

اولویت پروسه در حال اجرا را عوض می‌کند (افزایش اولویت نیاز به sudo دارد).

terminal
renice +10 -p 1234
sudo renice -5 -p 1234
renice +5 -u ali        # همه پروسه‌های یک کاربر

nohupاجرای مقاوم در برابر قطع اتصال

پیش‌فرض سیستم

برنامه را از نشست جدا می‌کند تا با بستن ترمینال/قطع SSH نمیرد؛ خروجی در nohup.out ذخیره می‌شود. برای SSH بدون tmux.

terminal
nohup long-task.sh &
nohup python worker.py > worker.log 2>&1 &
# بررسی بعداً:
tail -f worker.log
jobs -l; pgrep -f worker.py
💡
امروزه توصیه استاندارد: کارهای جدی را در tmux یا به‌صورت سرویس systemd اجرا کن؛ nohup برای کارهای یک‌باره سبک است.

timeزمان‌سنجی اجرا

پیش‌فرض سیستم

مدت اجرا و مصرف CPU یک دستور را اندازه می‌گیرد — اولین ابزار سنجش کارایی.

گزینهکار
-vگزارش مفصل: بیشترین RAM، سوییچ‌های کانتکست و…
terminal
time find / -name "*.conf" 2>/dev/null
time sleep 2
time -v python heavy.py | grep Maximum    # حداکثر مصرف حافظه
# تفاوت real (زمان دیواری) و user+sys (زمان CPU) یعنی منتظر I/O بودی

lsofلیست فایل‌های باز و اتصال‌ها

پیش‌فرض سیستم

در لینوکس همه‌چیز فایل است؛ lsof نشان می‌دهد هر پروسه چه فایل‌هایی باز دارد — شامل سوکت‌های شبکه. ابزار شماره یک یافتن «پورت اشغال توسط چه چیزی؟»

گزینهکار
-i :پورتچه پروسه‌ای پورت را گرفته؟
-i tcpهمه اتصال‌های TCP
-u userفایل‌های باز یک کاربر
-p PIDفایل‌های باز یک پروسه
+D dirچه پروسه‌هایی این پوشه را باز دارند؟ (قبل از unmount!)
terminal
sudo lsof -i :80            # چه چیزی پورت ۸۰ را گرفته؟ ★
sudo lsof -i -P -n | grep LISTEN   # همه پورت‌های گوش‌دهنده
lsof -u ali                 # فایل‌های باز کاربر ali
lsof -p 1234 | less         # جزئیات یک پروسه
sudo lsof +D /var/log       # چه کسی لاگ را باز نگه داشته؟
sudo lsof /deleted          # فایل‌های حذف‌شده که هنوز فضای دیسک می‌گیرند!

straceردیابی system callها

نیاز به نصب
📦 نصب:sudo apt install strace

هر تماس برنامه به کرنل را زنده نشان می‌دهد: بازشدن کدام فایل، اتصال به کدام IP، خواندن از کجا. دیباگ اسرارآمیزترین خطاها با آن ممکن می‌شود.

گزینهکار
-fردیابی فرزندان هم
-e trace=fileفقط تماس‌های فایلی
-e trace=networkفقط شبکه
-p PIDاتصال به پروسه زنده
-cخلاصه آماری
terminal
strace -f -e trace=open,openat ls            # کدام فایل‌ها باز شدند؟
strace -e trace=network curl example.com     # اتصال‌های شبکه
strace -p 1234                               # چسبیدن به پروسه زنده
strace -c ls                                  # آمار کلی تماس‌ها
strace -f -e trace=access app 2>&1 | grep -i denied   # کجای مجوز می‌لنگد؟

ltraceردیابی فراخوانی کتابخانه‌ای

نیاز به نصب
📦 نصب:sudo apt install ltrace

مثل strace ولی در سطح کتابخانه‌ها (malloc، fopen و…). برای دیباگ سطوح بالاتر.

terminal
ltrace -f ./app
ltrace -e malloc+free ./leaky

waitانتظار برای پایان کارهای پس‌زمینه

پیش‌فرض سیستم

در اسکریپت، تا تمام‌شدن jobهای پس‌زمینه صبر می‌کند و کد خروج‌شان را می‌دهد.

terminal
sleep 3 &
pid=$!
wait $pid && echo "تمام شد موفق"
wait            # منتظر همه jobها

jobsلیست کارهای پس‌زمینه شل

پیش‌فرض سیستم

کارهایی که با & یا Ctrl+Z به پس‌زمینه رفته‌اند را لیست می‌کند.

terminal
jobs -l
#   چرخه کامل:
#   Ctrl+Z        توقف پروسه فعلی
#   bg %1         ادامه در پس‌زمینه
#   fg %1         بازگرداندن به پیش‌زمینه
sleep 100 &
fg %1           # آوردن job 1 به جلو
kill %2         # سیگنال به job دوم
🎬

13. ترفندهای اجرای پس‌زمینه

5 دستور و مبحث

جعبه‌ابزار پس‌زمینه: کدام تکنیک برای کجا؟

cmd &

ساده‌ترین؛ ولی با بستن ترمینال ممکن است بمیرد (SIGHUP)

nohup cmd &

مقاوم به قطع ترمینال؛ خروجی در nohup.out

Ctrl+Zbg

پروسه وسط کار را به پس‌زمینه بفرست

tmux/screen

بهترین برای SSH: کل نشست زنده می‌ماند

disown -h %1

جوب را از شل جدا کن تا SIGHUP نگیرد

systemd service

راه رسمی و پایدار برای همیشه‌کارها
terminal
# الگوی کامل اجرای پس‌زمینه امن:
nohup ./worker > worker.log 2>&1 &
disown
# الگوی نگه‌داشتن زنده همیشگی (auto-restart) با while:
while true; do ./worker >> worker.log 2>&1; sleep 2; done &
# برای محیط عملیاتی واقعی: سرویس systemd با Restart=always

disownجدا کردن job از شل

پیش‌فرض سیستم

job را از لیست jobs و از ارث‌بری SIGHUP خارج می‌کند؛ جفت امن cmd &.

terminal
./server &
disown %1
disown -h %2     # فقط در برابر HUP محافظت

setsidاجرا در نشست کاملاً جدید

پیش‌فرض سیستم

پروسه را در session جدید اجرا می‌کند — از ابتدا هیچ پیوندی با ترمینال ندارد.

terminal
setsid ./daemon &
setsid -w ping -c2 8.8.8.8    # -w: صبر برای پایان

flockقفل فایلی برای جلوگیری از اجرای هم‌زمان

پیش‌فرض سیستم

اسکریپت را با قفل فایل اجرا می‌کند؛ درمان اصلی «cron دوبار اجرا شد / هنوز قبلی تمام نشده».

terminal
flock -n /tmp/backup.lock /opt/backup.sh   # اگر قفل آزاد بود اجرا کن
flock -w 30 /tmp/sync.lock rsync -a src/ dst/   # حداکثر ۳۰ ثانیه منتظر قفل

tasksetمحدودکردن پروسه به هسته‌های خاص

پیش‌فرض سیستم

پروسه را به CPUهای مشخص می‌چسباند — برای ایزوله‌کردن بار سنگین از هسته‌های سیستم.

terminal
taskset -c 0,1 ./heavy          # فقط هسته ۰ و ۱
taskset -pc 1234                # دیدن affinity فعلی
sudo taskset -pc 2-3 1234       # تغییر زنده

ioniceاولویت دیسکی پروسه

پیش‌فرض سیستم

مثل nice ولی برای I/O دیسک — بکاپ سنگین را بی‌آزار کن.

terminal
sudo ionice -c3 tar -czf backup.tar.gz /home   # idle: فقط وقتی دیسک بیکار است
ionice -c2 -n7 rsync -a src/ dst/               # کمترین اولویت کلاس best-effort
📢

14. پیام‌ها و ابزارهای ترمینال

10 دستور و مبحث

echoچاپ متن و متغیر

پیش‌فرض سیستم

ساده‌ترین خروجی‌دهنده؛ در اسکریپت‌ها، ساخت فایل و ارسال به پایپ همه‌جاحاضر است.

گزینهکار
-nبدون خط جدید
-eتفسیر \n \t و رنگ‌های ANSI
terminal
echo "سلام $USER"
echo "خانه تو: $HOME"
echo -n "بدون نویلاین"; echo "ادامه"
echo -e "ستون۱\tستون۲\nخط بعدی"
echo "خط جدید" >> file.txt            # افزودن به فایل
echo -e "\e[32mسبز\e[0m و \e[1m\e[34mآبی پررنگ\e[0m"
echo "متن" > /dev/null                # دور انداختن
echo ${PATH} | tr ':' '\n'            # هر مسیر یک خط

printfخروجی فرمت‌شده مطمئن

پیش‌فرض سیستم

نسخه مطمئن‌تر echo: بدون دردسر کاراکترهای خاص و با قالب‌بندی C مانند. انتخاب درست اسکریپت‌های جدی.

گزینهکار
%s %d %fرشته، عدد صحیح، اعشار
%-10sچپ‌چین با عرض ۱۰
\n \tنویلاین و تب
terminal
printf "نام: %s — سن: %d\n" "علی" 30
printf "%-15s %8.2f\n" "ملی" 123.456 "کریم" 7.5
printf "%s\n" خط1 خط2 خط3           # هر آرگومان یک خط
printf "%05d\n" 42                   # 00042

seqساخت دنباله اعداد

پیش‌فرض سیستم

دنباله اعداد می‌سازد؛ سوخت‌رسان حلقه‌های for و ساخت داده آزمایشی.

terminal
seq 5                      # 1..5
seq 2 2 10                 # 2 4 6 8 10
seq 5 -1 1                 # معکوس
seq -w 1 10                # با صفر پیشرو: 01 02 …
seq -f "%04.0f" 1 100      # فرمت دلخواه
for i in $(seq 1 5); do echo "گام $i"; done
seq 3 | xargs -I{} mkdir dir-{}

yesتولید بی‌پایان بله

پیش‌فرض سیستم

تا بی‌نهایت یک رشته (پیش‌فرض y) چاپ می‌کند — برای تأیید خودکار برنامه‌های سؤال‌پرس.

terminal
yes | sudo apt upgrade -y      # جواب همه سؤال‌ها: y
yes n | some-installer         # جواب همه: n
yes "تأیید" | head -3          # سه بار تأیید

figletمتن هنری با حروف بزرگ

نیاز به نصب
📦 نصب:sudo apt install figlet # pacman: sudo pacman -S figlet

متن را با حروف ASCII بزرگ رسم می‌کند — برای بنر موتد و متمایز کردن سرورهای مختلف.

terminal
figlet "PRODUCTION"
figlet -f slant "Dev"
figlet -c "Centered"

wallپیام به همه کاربران وارد‌شده

پیش‌فرض سیستم

پیامی برای همه ترمینال‌های فعال می‌فرستد — اخلاقی‌ترین راه اطلاع‌دادن ریبوت پیش‌رونده.

terminal
sudo wall "سرور در ساعت ۲ بامداد ریبوت می‌شود"
echo "پیام" | wall

writeپیام خصوصی به یک کاربر

پیش‌فرض سیستم

چت متنی دو نفره داخل ترمینال — قدیمی ولی برای سرورهای اشتراکی هنوز کاربرد دارد.

terminal
write ali pts/1
سلام، دو دقیقه دیگری سرور ریبوت می‌شود
# پایان پیام: Ctrl+D

mesgاجازه/منع دریافت پیام

پیش‌فرض سیستم

کنترل اینکه دیگران بتوانند با write به تو پیام بدهند.

terminal
mesg          # وضعیت فعلی
mesg n        # پیام خصوصی بسته

notify-sendنوتیفیکیشن دسکتاپ

نیاز به نصب
📦 نصب:sudo apt install libnotify-bin

اعلان بومی دسکتاپ می‌فرستد — پایان کارهای طولانی را با آن خبر بده.

terminal
notify-send "تمام شد" "بکاپ با موفقیت ساخته شد"
long-job; notify-send -u critical "پایان کار" "long-job تمام شد"
notify-send -i dialog-information "عنوان" "متن" -t 5000

cowsayگاو سخنگوی ترمینال (سرگرمی)

نیاز به نصب
📦 نصب:sudo apt install cowsay

پیام را داخل دهان یک گاو (یا شخصیت‌های دیگر) نشان می‌دهد؛ در motdها و آموزش‌ها محبوب.

terminal
cowsay "لینوکس عالیه"
cowsay -f tux "من تاکسم!"
fortune | cowsay
📊

15. اطلاعات سیستم و منابع

18 دستور و مبحث

چه چیزی داخل جعبه است؟

پردازنده

lscpu — مدل، هسته‌ها، معماری

حافظه

free -h زنده · dmidecode -t memory سخت‌افزاری

دیسک‌ها

lsblk ساختار · fdisk -l جدول پارتیشن‌ها

PCI / USB

lspci کارت شبکه/گرافیک · lsusb دستگاه‌های USB

همه‌چیز

lshw (sudo) — گزارش کامل سخت‌افزار

نسخه سیستم

uname -a کرنل · cat /etc/os-release توزیع

uptimeکارکرد و میانگین بار سیستم

پیش‌فرض سیستم

چه مدت سیستم روشن است، چند کاربر دارد و مهم‌تر از همه: میانگین بار (load average) در ۱، ۵ و ۱۵ دقیقه اخیر. عدد بار را با تعداد هسته‌ها مقایسه کن.

terminal
uptime
# load average: 0.52, 0.58, 0.59
uptime -p             # قشنگ: up 3 days, 4 hours
uptime -s             # دقیقاً کی بوت شده
nproc                 # تعداد هسته‌ها؛ بارِ نزدیک nproc = اشباع
💡
قانون سرانگشتی: بار زیر تعداد هسته‌ها سالم است. بار ۴ روی سیستم ۴ هسته‌ای = تمام ظرفیت؛ بار ۴ روی سیستم تک‌هسته‌ای = صف بلند.

wچه کسانی آنلاین‌اند و چه می‌کنند

پیش‌فرض سیستم

ترکیب uptime + لیست کاربران لاگین‌شده و دستور فعلی هرکدام — روی سرورهای اشتراکی اولین چیز برای نگاه کردن.

terminal
w
who                   # ساده‌تر
who -b                # آخرین بوت
last -20              # ۲۰ لاگین آخر (از /var/log/wtmp)
last -x reboot        # تاریخچه ریبوت‌ها
lastlog               # آخرین ورود همه کاربران

freeمصرف حافظه و swap

پیش‌فرض سیستم

وضعیت RAM و swap را نشان می‌دهد. مهم‌ترین ستون «available» است — مقدار واقعی قابل استفاده، نه free.

گزینهکار
-hخوانا: Mi/Gi
-s Nهر N ثانیه تکرار
-wجداسازی buffers/cache
terminal
free -h
#              total   used   free   available
# Mem:          7.7Gi  3.1Gi  1.2Gi       4.1Gi
# Swap:        2.0Gi      0B  2.0Gi

watch -n2 free -h                 # پایش زنده
free -h -s 5                      # هر ۵ ثانیه
free -h | awk '/Mem/{print $7}'   # فقط available
💡
نگران کم بودن «free» نباش! لینوکس RAM آزاد را برای cache استفاده می‌کند و موقع نیاز پس می‌دهد. اگر available خیلی کم شد و swap پر شد، آن‌وقت مشکل جدی است.

vmstatآمار مجازی‌حافظه، CPU و I/O

پیش‌فرض سیستم

نمای کلی سلامت سیستم: صف پروسه‌ها، swap in/out، ورودی/خروجی دیسک، CPU. برای تشخیص گلوگاه (CPU؟ دیسک؟ حافظه؟).

گزینهکار
1هر ثانیه یک گزارش زنده
-S Mواحد مگابایت
-dآمار تفکیکی دیسک‌ها
terminal
vmstat 1 5            # پنج گزارش با فاصله ۱ ثانیه
#  r  = صف پروسه‌های قابل اجرا (اگر زیاد = CPU کم می‌آورد)
#  si/so = جابه‌جایی swap (غیر صفر پایدار = کمبود RAM)
#  wa  = CPU منتظر دیسک (بالا = گلوگاه دیسک)
vmstat -d             # آمار هر دیسک
vmstat -s             # جدول آمار کامل

iostatآمار ورودی/خروجی دیسک و CPU

نیاز به نصب
📦 نصب:sudo apt install sysstat # سرویس sysstat هم برای تاریخچه فعال شود

سرعت خواندن/نوشتن هر دیسک، IOPS و زمان انتظار — ابزار اصلی قضاوت درباره سلامت دیسک.

گزینهکار
-x 1گزارش تفصیلی هر ثانیه
-hخوانا
-p ALLهمه پارتیشن‌ها
terminal
iostat -x 1
#   %util نزدیک ۱۰۰ = دیسک اشباع
#   await بالا = درخواست‌ها معطل‌اند (دیسی کند یا پرکار)
iostat -h -p ALL 2

lscpuاطلاعات پردازنده

پیش‌فرض سیستم

همه جزئیات CPU: مدل، تعداد هسته/ترد، فرکانس، معماری، پشتیبانی مجازی‌سازی.

terminal
lscpu
lscpu | grep -E "^CPU\(s\)|Model name|MHz"
lscpu -e              # نمای هر ترد/هسته

lsusbدستگاه‌های USB متصل

پیش‌فرض سیستم

لیست USBهای وصل‌شده — برای دیباگ فلش، ماوس و پریزهای مرده.

terminal
lsusb
lsusb -t              # نمای درختی با سرعت‌ها
lsusb -v -d 1234:5678 | less   # جزئیات کامل یک دستگاه

lspciدستگاه‌های PCI (شبکه، گرافیک،…)

پیش‌فرض سیستم

کارت‌های PCI مثل GPU و کارت شبکه را با درایورشان نشان می‌دهد — اولین قدم در نصب درایور.

terminal
lspci
lspci | grep -i -E "vga|3d|display"   # گرافیک چیست؟
lspci -k | grep -A3 -i net            # کارت شبکه + درایورش
lspci -vv -s 01:00.0 | less           # جزئیات عمیق یک اسلات

lshwگزارش کامل سخت‌افزار

پیش‌فرض سیستم

با sudo تمام سخت‌افزار را با جزئیات لیست می‌کند؛ خروجی html/json هم می‌دهد — برای انبار موجودی سرورها.

terminal
sudo lshw -short              # نمای جدولی خلاصه ★
sudo lshw -C memory           # فقط RAM (اسلات‌ها و کدهای ماژول)
sudo lshw -C disk             # دیسک‌ها
sudo lshw -html > hw.html     # گزارش وب
sudo lshw -json > hw.json

dmidecodeداده‌های BIOS/مادربورد

پیش‌فرض سیستم

داده‌های جدول DMI/SMBIOS را می‌خواند: شماره سریال، مدل سیستم، اسلات‌های RAM و ظرفیت پشتیبانی‌شده — قبل از ارتقای رم سرور فیزیکی واجب.

terminal
sudo dmidecode -t system        # مدل و سریال دستگاه
sudo dmidecode -t memory | grep -E "Size|Type:"   # رم‌ها و اسلات‌ها
sudo dmidecode -t bios          # نسخه BIOS

unameاطلاعات کرنل و معماری

پیش‌فرض سیستم

نسخه کرنل، نام هاست، معماری و…

گزینهکار
-aهمه‌چیز
-rنسخه کرنل
-mمعماری (x86_64, aarch64)
terminal
uname -a
uname -r                 # 6.8.0-40-generic
uname -m                 # معماری؛ برای دانلود باینری‌ها

lsb_releaseنسخه دقیق توزیع

پیش‌فرض سیستم

نام و نسخه توزیع — قبل از جست‌وجوی آموزش‌ها و دانلود پکیج‌ها لازم است.

terminal
lsb_release -a
cat /etc/os-release          # روش استانداردتر و همیشه‌حاضر
hostnamectl                  # نسخه + کرنل + مجازی‌سازی یک‌جا

hostnamectlمدیریت نام هاست و شناسنامه سیستم

پیش‌فرض سیستم

نمایش/تغییر نام سیستم و دیدن نوع مجازی‌سازی (KVM، Docker، bare-metal).

terminal
hostnamectl
sudo hostnamectl set-hostname web-prod-01    # تغییر دائمی نام
hostnamectl | grep -i virtualization         # روی VM هستیم یا فیزیکی؟

inxiخلاصه شیک و کامل سیستم

نیاز به نصب
📦 نصب:sudo apt install inxi

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

terminal
inxi -Fxz          # گزارش کامل
inxi -D            # فقط دیسک‌ها
inxi -t cm         # ۵ پروسه پر‌مصرف CPU و RAM

sensorsدما و ولتاژ سخت‌افزار

نیاز به نصب
📦 نصب:sudo apt install lm-sensors && sudo sensors-detect

دمای CPU، سرعت فن‌ها و ولتاژها — پایش حرارتی سرور/لپ‌تاپ.

terminal
sensors
watch -n2 sensors                # پایش زنده دما
sensors | grep -i 'core 0'

sar / dstatآمار تاریخی و زنده منابع

نیاز به نصب
📦 نصب:sudo apt install sysstat dstat

برخلاف top/vmstat که فقط لحظه حال را نشان می‌دهند، sar از بسته sysstat تاریخچه ساعت‌به‌ساعت CPU/RAM/دیسک را نگه می‌دارد — عالی برای «دیشب ساعت ۳ چرا سرور کند شد؟». dstat نسخه زنده و رنگی‌تر با همه معیارها در یک صفحه است.

terminal
sar -u 2 5              # مصرف CPU، هر ۲ ثانیه، ۵ بار
sar -r 1 3               # مصرف RAM زنده
sar -u -f /var/log/sysstat/sa15   # گزارش تاریخی روز پانزدهم ★

dstat -cdngy             # CPU + دیسک + شبکه + صفحه‌بندی + سیستم، یک‌جا
dstat --top-cpu --top-io  # پرمصرف‌ترین پروسه CPU و IO
💡
برای اینکه sar تاریخچه داشته باشد، باید سرویس جمع‌آوری‌اش (sysstat) از قبل فعال بوده باشد؛ sudo systemctl enable --now sysstat را همین امروز روی سرورهایت بزن.

who / last / lastlogچه کسی و کِی وارد سیستم شده؟

پیش‌فرض سیستم

سه ابزار مکمل برای ردیابی نشست‌ها: who کاربران الان وصل را نشان می‌دهد، last تاریخچه ورود/خروج‌های گذشته را از /var/log/wtmp می‌خواند، و lastlog آخرین ورود هر کاربر تعریف‌شده در سیستم را (حتی اگر هیچ‌وقت وارد نشده) لیست می‌کند.

terminal
who                      # کاربران وصل الان + ترمینال + زمان ورود
who -a                    # با جزئیات بیشتر

last                       # تاریخچه ورودها، جدیدترین اول
last -5 ali                 # پنج ورود آخر یک کاربر خاص
last reboot                  # تاریخچه ری‌استارت‌های سرور ★

lastlog                       # آخرین ورود همه کاربران سیستم
lastlog -u ali                 # فقط یک کاربر

date / calتاریخ، ساعت و تقویم

پیش‌فرض سیستم

date تاریخ/ساعت سیستم را چاپ یا فرمت می‌کند و در اسکریپت‌ها برای ساخت timestamp پرکاربرد است؛ cal یک تقویم ساده متنی نشان می‌دهد.

terminal
date                          # تاریخ و ساعت فعلی
date +"%Y-%m-%d_%H-%M-%S"      # قالب دلخواه؛ عالی برای نام فایل بکاپ ★
date -d "3 days ago"            # محاسبه تاریخ نسبی
date -u                          # به وقت UTC

cal                                # تقویم ماه جاری
cal 2027                           # کل سال
cal -3                              # ماه قبل، این ماه، ماه بعد
💡
ترکیب کلاسیک بکاپ: tar -czf backup-$(date +%F).tar.gz folder/ — نام فایل همیشه با تاریخ درست می‌شود.
💾

16. دیسک، پارتیشن و فایل‌سیستم

18 دستور و مبحث

جعبه‌ابزار عیب‌یابی دیسک

فضا کجاست؟

df -h سطح پارتیشن · du -sh * سطح پوشه · ncdu تعاملی

چه فایل‌هایی بزرگ‌اند؟

du -ahx . | sort -rh | head -20

دیسک پر ولی du چیز زیادی نمی‌بیند؟

فایل حذف‌شده‌ای که پروسه‌ای باز نگهش داشته: sudo lsof +L1

پارتیشن/فرمت

lsblkfdisk/partedmkfs.ext4mount

سلامت فیزیکی

smartctl -a /dev/sda از SMART

dfفضای آزاد پارتیشن‌ها

پیش‌فرض سیستم

فضای کل/استفاده‌شده/آزاد هر فایل‌سیستم. «Use% ۱۰۰» روی سرور یعنی زنگ خطر فوری.

گزینهکار
-hخوانا
-Tنوع فایل‌سیستم
-iایندودها (inode) — پرشدن inode بدون پرشدن فضا ممکن است!
-x tmpfsفیلتر نوع‌های مزاحم
terminal
df -h
df -h /                    # فقط ریشه
df -hT -x tmpfs -x devtmpfs   # تمیز و واقعی
df -i                      # چک inode
df -h /var                 # پوشه پر‌حجم لاگ‌ها
💡
اگر df -h می‌گوید پر است ولی du کم نشان می‌دهد، فایلی حذف شده که پروسه‌ای هنوز بازش دارد: sudo lsof +L1 | grep deleted — پروسه را ری‌استارت کن تا فضا آزاد شود.

duمصرف فضای پوشه‌ها

پیش‌فرض سیستم

اندازه هر پوشه را حساب می‌کند؛ با sort و head تبدیل به رادار یافتن فایل‌های حجیم می‌شود.

گزینهکار
-sفقط جمع کل
-hخوانا
-xاز مرز فایل‌سیستم عبور نکن (مهم!)
-aهمه فایل‌ها هم
--max-depth=1یک سطح از زیرپوشه‌ها
--exclude=*.logصرف‌نظر از الگو
terminal
du -sh /home/ali                    # جمع کل یک پوشه ★
du -sh * | sort -rh                 # پوشه‌ها از بزرگ به کوچک
du -h --max-depth=1 /var | sort -rh # کدام بخش /var سنگین است
du -ahx / 2>/dev/null | sort -rh | head -20   # ۲۰ آیتم بزرگ‌تر کل سیستم
du -sh --exclude="node_modules" .
⚠️
du -sh / می‌تواند دقیقه‌ها طول بکشد و دیسک را زیر بار ببرد. روی سرور عملیاتی، اول --max-depth=1 روی پوشه مشکوک بزن.

ncduتحلیل تعاملی فضای دیسک

نیاز به نصب
📦 نصب:sudo apt install ncdu

du با رابط تعاملی: پوشه‌ها را می‌پیمایی، بزرگ‌ها را می‌بینی و از همان‌جا حذف می‌کنی — پاکسازی دیسک سرور بدون ریسک rm های کور.

terminal
ncdu /                 # کل سیستم (کمی صبر)
ncdu -x /var           # فقط این فایل‌سیستم
#  کلیدها: ↑↓ حرکت، Enter ورود، d حذف، n مرتب‌سازی نام، s اندازه، ? راهنما

dufdf مدرن و رنگی

نیاز به نصب
📦 نصب:sudo apt install duf # یا باینری از GitHub muesli/duf

نمای جدولی خوش‌ساخت و رنگی فایل‌سیستم‌ها با فیلترهای ساده.

terminal
duf
duf --only local
duf /home /var

lsblkنمای درختی دیسک‌ها و پارتیشن‌ها

پیش‌فرض سیستم

دیسک‌ها، پارتیشن‌ها، swap و نقطه‌های mount را درختی نشان می‌دهد — اولین دستور قبل از هر کار پارتیشن‌بندی.

گزینهکار
-fبا نوع فایل‌سیستم، UUID و label
-oستون‌های دلخواه
-aهمه دستگاه‌ها حتی خالی
terminal
lsblk
lsblk -f                   # با UUID و نوع fs ★
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
lsblk /dev/sda             # فقط یک دیسک

fdiskمدیریت پارتیشن (MBR/GPT)

پیش‌فرض سیستم

ساخت/حذف/مشاهده پارتیشن‌ها. برای دیسک‌های جدید و GPT مدرن، parted هم گزینه است. با احتیاط مطلق!

گزینهکار
-lفقط لیست — بی‌خطر ★
n/p/dداخل محیط تعاملی: پارتیشن جدید/اصلی/حذف
tتغییر نوع پارتیشن
terminal
sudo fdisk -l                      # دیدن همه دیسک‌ها و پارتیشن‌ها
sudo fdisk -l /dev/sdb
sudo fdisk /dev/sdb                # ورود تعاملی (m راهنما)
#  مسیر امن دیسک نو:
#  fdisk: n → p → 1 → Enter → Enter → w
sudo parted -l                     # جایگزین parted با لیست
lsblk -f                           # بعدش نتیجه را ببین
⚠️
دستور fdisk روی دیسک اشتباه = نابودی داده. دو بار نام دستگاه را چک کن (lsblk قبل و حین کار). برای حذف امن پارتیشن: wipefs -a /dev/sdX فقط بعد از قطع‌امید کامل.

partedپارتیشن‌بندی پیشرفته با GPT

پیش‌فرض سیستم

پشتیبانی کامل GPT، دیسک‌های بزرگ‌تر از ۲TB و تغییر اندازه زنده — ابزار استاندارد سرورهای مدرن.

terminal
sudo parted /dev/sdb print
sudo parted /dev/sdb mklabel gpt
sudo parted -a optimal /dev/sdb mkpart primary ext4 0% 100%
sudo parted /dev/sdb print free
lsblk

mkfsساخت فایل‌سیستم (فرمت)

پیش‌فرض سیستم

روی پارتیشن، فایل‌سیستم می‌سازد: ext4 استاندارد همه‌کاره، xfs محبوب سرور/فایل‌های بزرگ، btrfs مدرن با snapshot.

terminal
sudo mkfs.ext4 /dev/sdb1          # فرمت ext4
sudo mkfs.xfs /dev/sdc1           # xfs
sudo mkfs.vfat -F 32 /dev/sdd1    # فلش سازگار با ویندوز
sudo mkfs.ext4 -L data /dev/sdb1  # با برچسب
lsblk -f                          # تأیید
⚠️
فرمت یعنی پاک‌شدن همه داده آن پارتیشن. آخرین بار نام دستگاه را با lsblk چک کن.

blkidUUID و برچسب پارتیشن‌ها

پیش‌فرض سیستم

شناسه یکتا (UUID) هر پارتیشن — چیزی که در fstab استفاده می‌شود نه نام‌های متغیر sda/sdb.

terminal
sudo blkid
blkid /dev/sdb1
lsblk -f                          # نمای ساده‌تر همان داده

mountاتصال فایل‌سیستم به درخت مسیرها

پیش‌فرض سیستم

پارتیشن، ISO یا شبکه (NFS/SMB) را به یک پوشه وصل می‌کند؛ بدون mount، محتوای پارتیشن دیده نمی‌شود.

گزینهکار
-aهمه موارد fstab
-t typeنوع fs: ext4، ntfs، nfs، cifs، iso9660
-o optionsro، rw، uid، noexec،…
terminal
sudo mount /dev/sdb1 /mnt/data          # ساده
sudo mount -o ro /dev/sdb1 /mnt/data    # فقط‌خواندنی (امن برای بازیابی)
sudo mount -t ntfs-3g /dev/sdc1 /mnt/win   # پارتیشن ویندوز
sudo mount -o loop ubuntu.iso /mnt/iso  # سوار کردن ISO
sudo mount -t cifs //192.168.1.5/share /mnt/smb -o username=ali
mount | column -t | less                # لیست همه موارد سوارشده
sudo findmnt --target /mnt/data         # چه چیزی و چطور سوار است؟
sudo umount /mnt/data                   # جدا کردن

umountجدا کردن ایمن فایل‌سیستم

پیش‌فرض سیستم

پارتیشن/دستگاه را جدا می‌کند؛ «target is busy» یعنی پروسه‌ای داخلش کار می‌کند.

گزینهکار
-llazy: بعداً جدا می‌شود (وقتی بازها بسته شدند)
-fاجبار (برای NFS گیرکرده)
terminal
sudo umount /mnt/data
sudo lsof +f -- /mnt/data        # چه کسی مشغول است؟
sudo umount -l /mnt/data         # راه خلاصی lazy
sudo umount -f -t nfs /mnt/nfs

fstabMount خودکار در بوت (فایل /etc/fstab)

پیش‌فرض سیستم

فایل پیکربندی mountهای دائمی. سینتکس: دستگاه، نقطه mount، نوع، گزینه‌ها، dump، pass.

terminal
# دیدن فایل و فرمتش:
cat /etc/fstab
#  UUID=xxxx  /mnt/data  ext4  defaults,nofail  0  2
#  //srv/share /mnt/smb cifs credentials=/root/.smbcred,uid=1000 0 0

# قبل از ریبوت همیشه تست کن (مرگ‌بارترین خطای fstab = سرور بالا نمی‌آید):
sudo mount -a -v
sudo findmnt --verify            # اعتبارسنجی کامل ★
# نکته: گزینه nofail یعنی اگر دیسک نبود، بوت متوقف نشود
⚠️
یک خطای تایپی در fstab می‌تواند سرور را از بوت باز دارد. همیشه بعد از تغییر: sudo mount -a را اجرا کن و خطا را بگیر، و گزینه nofail را برای دیسک‌های جانبی فراموش نکن.

fsckبررسی و تعمیر فایل‌سیستم

پیش‌فرض سیستم

فایل‌سیستم را برای خطاهای ساختاری چک و ترمیم می‌کند — روی پارتیشن سوارشده اجرا نکن!

گزینهکار
-nفقط بررسی، بدون تغییر ★
-yبه همه پیشنهادهای تعمیر بله بگو
-fبررسی کامل اجباری
terminal
sudo fsck -n /dev/sdb1        # اول فقط نگاه کن
sudo fsck -f -y /dev/sdb1     # تعمیر (وقتی مطمئنی)
# پارتیشن ریشه: با درایو زنده یا systemctl reboot به Recovery برو
sudo tune2fs -l /dev/sda1 | grep -i "last checked"
⚠️
fsck روی فایل‌سیستم سوارشده می‌تواند داده را خراب کند. اول umount، بعد fsck.

smartctlسلامت فیزیکی دیسک (SMART)

نیاز به نصب
📦 نصب:sudo apt install smartmontools

از سنسورهای SMART دیسک گزارش می‌گیرد: سکتورهای خراب، ساعت کارکرد، دما و نشانه‌های نزدیک‌بودن مرگ دیسک.

گزینهکار
-aگزارش کامل
-Hفقط جمع‌بندی سلامت
-t short/longشروع تست خودآزمایی
terminal
sudo smartctl -H /dev/sda          # PASSED/FAILED
sudo smartctl -a /dev/sda | grep -E "Reallocated|Pending|Power_On"
sudo smartctl -t long /dev/sda     # تست کامل (ساعت‌ها طول می‌کشد)
sudo smartctl -l selftest /dev/sda # نتیجه تست‌ها
💡
برای مانیتورینگ پیوسته، سرویس smartd (همراه همین پکیج) را فعال کن تا در صورت خرابی پیش‌رونده ایمیل/لاگ بدهد: systemctl enable --now smartd.

ddکپی سطح بایت (دیسک به دیسک)

پیش‌فرض سیستم

کپی خام بایت‌به‌بایت: ساخت ISO بوت روی فلش، کلون کامل دیسک، فایل‌های تهی برای تست. قدیمی‌ترین و خطرناک‌ترین چاقوی جعبه‌ابزار.

گزینهکار
if= of=ورودی/خروجی
bs=4Mاندازه بلوک (سرعت را تعیین می‌کند)
status=progressنمایش پیشرفت ★
conv=fsyncاطمینان از flush نهایی
terminal
# فلش بوت از ISO (مطمئن شو of= فلش است نه دیسک!):
sudo dd if=ubuntu-24.04.iso of=/dev/sdX bs=4M status=progress conv=fsync

# کلون کامل دیسک به دیسک دوم:
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress

# ساخت ایمیج پشتیبان از دیسک:
sudo dd if=/dev/sda of=/backup/disk.img bs=4M status=progress

# تست سرعت نوشتن (روی فایل موقت!):
dd if=/dev/zero of=/tmp/test.bin bs=1M count=1024 oflag=direct status=progress
rm /tmp/test.bin
⚠️
dd هیچ سؤالی نمی‌پرسد. اشتباه در of= یعنی از بین بردن یک دیسک کامل در چند دقیقه. قبل از Enter: نام دستگاه مقصد را سه بار با lsblk چک کن.

wipefsپاک‌کردن امضای فایل‌سیستم‌ها

پیش‌فرض سیستم

امضاهای فایل‌سیستم/پارتیشن را می‌تراشد تا دیسک «تازه» شود — سریع‌تر و هدفمندتر از dd برای آماده‌سازی.

terminal
sudo wipefs /dev/sdb            # چه امضایی هست؟
sudo wipefs -a /dev/sdb         # پاک‌کردن همه امضاها

syncفلش بافرها به دیسک

پیش‌فرض سیستم

دستور می‌دهد همه داده‌های در حافظه‌ی موقت به دیسک نوشته شوند — قبل از جداکردن فلش یا قطع برق سرور.

terminal
sync                # همه چیز
sync /dev/sdb1      # فقط یک فایل‌سیستم

lvmمدیریت حجم منطقی (LVM)

نیاز به نصب

LVM یک لایه انتزاعی بین دیسک فیزیکی و فایل‌سیستم می‌سازد: چند دیسک را در یک استخر مشترک می‌ریزی و بعد فضا را هر وقت خواستی، بدون قطع سرویس، بزرگ یا جابه‌جا می‌کنی. سه لایه‌اش را باید بشناسی: PV (دیسک خام) → VG (استخر مشترک) → LV (پارتیشن مجازی قابل mount).

دستورکار
pvcreateعلامت‌گذاری یک دیسک/پارتیشن به‌عنوان Physical Volume
vgcreateساخت Volume Group از چند PV
lvcreateساخت Logical Volume با اندازه دلخواه از یک VG
pvs / vgs / lvsنمایش خلاصه وضعیت هر لایه
lvextendبزرگ‌کردن یک LV در حال استفاده
terminal
sudo pvcreate /dev/sdb /dev/sdc         # دو دیسک را PV کن
sudo vgcreate data_vg /dev/sdb /dev/sdc # یک استخر مشترک بساز
sudo lvcreate -L 50G -n app_lv data_vg  # یک LV پنجاه‌گیگی بساز
sudo mkfs.ext4 /dev/data_vg/app_lv      # فرمت مثل هر پارتیشن معمولی
pvs && vgs && lvs                       # وضعیت هر سه لایه ★
sudo lvextend -L +20G /dev/data_vg/app_lv       # بیست گیگ اضافه کن
sudo resize2fs /dev/data_vg/app_lv              # فایل‌سیستم را هم بزرگ کن
💡
بزرگ‌کردنِ LV در حال کار امن است؛ کوچک‌کردنش (lvreduce) پرریسک‌تر است و باید همیشه اول فایل‌سیستم را کوچک کنی، بعد LV را.
🛠️

17. systemd، سرویس‌ها و لاگ‌ها

7 دستور و مبحث

مدل ذهنی systemd

در اکثر توزیع‌های مدرن، systemd پروسه شماره ۱ است: همه سرویس‌ها (وب‌سرور، دیتابیس، ssh) فرزند آن‌اند.

واحدها

سرویس‌ها .service · تایمرها .timer · مونت‌ها .mount

کجا تعریف می‌شوند؟

/etc/systemd/system/ (خودت) · /usr/lib/systemd/system/ (پکیج‌ها)

لاگ‌ها

journalctl — دفتر مرکزی همه لاگ‌ها با متادیتا

فعال/خودکار

فعال یعنی «الان روشن»؛ enable یعنی «بعد از بوت هم روشن» — دو چیز مستقل!

systemctlکنترل همه سرویس‌ها

پیش‌فرض سیستم

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

گزینهکار
start/stop/restartکنترل وضعیت سرویس
statusوضعیت + چند خط آخر لاگ + PID
enable/disableاجرای خودکار هنگام بوت / غیرفعال
enable --nowفعال‌سازی و استارت هم‌زمان ★
list-units --type=serviceلیست سرویس‌ها
list-unit-filesهمه فایل‌های واحد نصب‌شده
daemon-reloadبعد از هر تغییر فایل .service لازم است
cat/​editدیدن/ویرایش فایل واحد
terminal
sudo systemctl status nginx          # وضعیت کامل سرویس ★
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx         # توقف + استارت
sudo systemctl reload nginx          # بارگذاری config بدون قطع سرویس
sudo systemctl enable nginx          # اجرای خودکار در بوت
sudo systemctl enable --now docker   # فعال + استارت یک‌جا ★
sudo systemctl disable --now app     # خاموش + حذف از بوت

systemctl list-units --type=service --state=running   # چه چیزهایی روشن است
systemctl list-units --failed                        # سرویس‌های مرده ★
systemctl cat nginx                                  # فایل واحد nginx
systemctl is-active nginx && echo up || echo down

# ساخت سرویس خودت (نگه‌دارنده برنامه):
sudo tee /etc/systemd/system/myapp.service << 'EOF'
[Unit]
Description=My App
After=network.target

[Service]
ExecStart=/opt/myapp/worker
Restart=always
User=appuser
WorkingDirectory=/opt/myapp

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
💡
تفاوت restart و reload: restart پروسه را از نو می‌سازد (اتصال‌ها قطع می‌شود)؛ reload فقط تنظیمات را دوباره می‌خواند. nginx و php-fpm از reload پشتیبانی می‌کنند.

journalctlدفتر لاگ‌های متمرکز سیستم

پیش‌فرض سیستم

همه لاگ‌های systemd (و هر سرویسی که از آن خروجی می‌دهد) با فیلتر زمانی/سرویسی/اولویتی. جایگزین مدرن تورفتن در /var/log.

گزینهکار
-u سرویسفقط لاگ یک سرویس
-fدنبال‌کردن زنده
--since / --untilبازه زمانی: yesterday، 10 min ago، تاریخ
-p errفقط خطاها و بالاتر
-bاز آخرین بوت
-b -1بوت قبلی — عیب‌یابی کرش ★
-kفقط پیام‌های کرنل
--disk-usage / --vacuum-sizeمدیریت اندازه journal
terminal
journalctl -u nginx                      # لاگ nginx
journalctl -u nginx -f                   # زنده ★
journalctl -u app --since "10 min ago"
journalctl --since today -p err          # خطاهای امروز
journalctl -b -1                         # لاگ بوت قبلی (بعد از کرش!)
journalctl -b -u ssh --since "2025-09-01" --until "2025-09-02"
journalctl -k | grep -i usb              # لاگ کرنل
journalctl -u cron | grep -i error
sudo journalctl --disk-usage
sudo journalctl --vacuum-size=200M       # کوچک‌سازی journal به ۲۰۰MB
sudo journalctl --vacuum-time=7d         # فقط ۷ روز اخیر بماند

dmesgپیام‌های هسته: سخت‌افزار و درایورها

پیش‌فرض سیستم

لاگ زنده کرنل: شناسایی USB جدید، خطاهای دیسک، OOM killer و درایورها. وقتی سخت‌افزار عجیب رفتار می‌کند، اولین جا برای نگاه.

گزینهکار
-wدنبال‌کردن زنده
-Tزمان انسانی به‌جای ثانیه از بوت
--level=errفقط خطاها
terminal
sudo dmesg -T | tail -30
sudo dmesg -Tw                 # زنده؛ فلش جدید را وصل کن و ببین
sudo dmesg -T | grep -i -E "error|fail|oom"
sudo dmesg | grep -i sda       # رخدادهای دیسک
# اگر «kill process» دیدی: OOM Killer به‌خاطر کمبود رم فعال شده
💡
پیام Killed process در dmesg یعنی OOM Killer به‌خاطر تمام‌شدن RAM پروسه‌ای را کشته — نشانه کمبود حافظه، نه باگ برنامه.

loggerنوشتن دستی در لاگ سیستم

پیش‌فرض سیستم

از داخل اسکریپت‌ها پیام به syslog/journal می‌فرستد — لاگ‌های اسکریپت‌های cron را در جای استاندارد جمع می‌کند.

terminal
logger -t backup "بکاپ شروع شد"
logger -p user.err -t myscript "خطای جدی رخ داد"
journalctl -t backup -n 5      # دیدن پیام‌های خودت

timedatectlساعت و منطقه زمانی سیستم

پیش‌فرض سیستم

نمایش/تنظیم زمان، منطقه زمانی و NTP — در سرورها درستیِ ساعت شرط لاگ‌های قابل‌اعتماد و TLS است.

terminal
timedatectl
timedatectl list-timezones | grep Tehran
sudo timedatectl set-timezone Asia/Tehran
sudo timedatectl set-ntp true      # همگام‌سازی خودکار با NTP
timedatectl show

loginctlنشست‌های کاربران

پیش‌فرض سیستم

مدیریت نشست‌های لاگین از دید systemd: چه کسی کجا لاگین است، قفل/بستن نشست.

terminal
loginctl list-sessions
loginctl show-user ali
sudo loginctl terminate-session 3

rsyslog / logrotateلاگ سیستمی کلاسیک و چرخش فایل‌های لاگ

پیش‌فرض سیستم

قبل و در کنار journald (که journalctl می‌خواندش)، خیلی از سرویس‌ها هنوز لاگ‌های متنی ساده در /var/log می‌نویسند — rsyslog این جریان را مسیریابی می‌کند. logrotate جلوی پر شدن دیسک را می‌گیرد: فایل‌های لاگ را دوره‌ای فشرده، آرشیو و قدیمی‌ها را حذف می‌کند.

مسیر/دستورکار
/etc/rsyslog.confتنظیم اینکه کدام لاگ کجا نوشته شود
/etc/logrotate.d/قوانین چرخش هر سرویس (nginx، apt، …)
logrotate -dحالت آزمایشی (dry-run) بدون تغییر واقعی
logrotate -fاجرای فوری و اجباری چرخش
terminal
sudo systemctl status rsyslog          # آیا فعال است؟
tail -f /var/log/syslog                  # لاگ زنده کلاسیک (دبیان/اوبونتو)

cat /etc/logrotate.d/nginx                # نمونه یک قانون چرخش
sudo logrotate -d /etc/logrotate.conf        # تست بدون اجرای واقعی ★
sudo logrotate -f /etc/logrotate.conf          # اجرای دستی همین الان
💡
دیسک سرور پر شده و مقصر یک لاگ بی‌رویه‌ست؟ اول با du -sh /var/log/* مقصر را پیدا کن، بعد یک قانون logrotate برایش بنویس تا دیگر تکرار نشود.
🗜️

18. آرشیو و فشرده‌سازی

10 دستور و مبحث

چه فرمتی برای چه کاری؟

بکاپ پروژه/سرور

tar -czf — استاندارد جهان لینوکس

تبادل با ویندوز

zip — سازگار همه‌جا

بیشترین فشرده‌سازی

7z یا zstd -19 / xz -9

سرعت + فشرده‌سازی خوب

zstd — مدرن و سریع

یک فایل منفرد

gzip file جایگزین خود فایل می‌شود
ℹ️
آرشیو ≠ فشرده‌سازی: tar فقط بسته‌بندی است (چند فایل → یک فایل)؛ gzip/xz/zstd فقط فشرده‌سازی یک جریان‌اند. پس tar.gz یعنی «بسته‌بندی + فشرده‌سازی».

tarپادشاه آرشیو لینوکس

پیش‌فرض سیستم

بسته‌بندی فایل‌ها و پوشه‌ها به یک آرشیو (با حفظ مجوزها و لینک‌ها) و به‌همراه فشرده‌سازی. الگوی حفظ‌کردنی: eXtract Zee Files.

گزینهکار
-cساخت آرشیو (create)
-xاستخراج (extract)
-tلیست محتوا بدون استخراج — همیشه اول این!
-z / -j / -Jفشرده‌سازی gzip / bzip2 / xz
--zstdفشرده‌سازی zstd مدرن
-f fileنام فایل آرشیو (همیشه آخرین قبل از مسیرها)
-vپیشرفت را نشان بده
-C dirتغییر پوشه مقصد/مبدأ
--exclude=الگودور زدن موارد
-pحفظ مجوزها هنگام استخراج
terminal
# --- ساخت ---
tar -czf backup.tar.gz myproject/               # استاندارد ★
tar -czf site-$(date +%F).tar.gz /var/www       # با تاریخ در نام
tar -cf - myfolder | gzip -9 > out.tar.gz       # روش پایپ
tar -czf logs.tar.gz --exclude='*.log' myproject/
tar --exclude='node_modules' --exclude='.git' -czf proj.tar.gz proj/

# --- دیدن محتوا (قبل از استخراج هر آرشیو ناشناس!) ---
tar -tzf backup.tar.gz | head -20
tar -tzf backup.tar.gz | wc -l

# --- استخراج ---
tar -xzf backup.tar.gz                          # در پوشه فعلی
tar -xzf backup.tar.gz -C /opt/app              # در مسیر مشخص
tar -xzf backup.tar.gz proj/src/main.py         # فقط یک فایل
tar -xf archive.tar.zst --zstd                  # zstd

# --- افزودن به آرشیو بدون فشرده‌سازی ---
tar -rf archive.tar newfile.txt

# --- بکاپ کامل و بازگردانی ---
sudo tar -czpf root-backup.tar.gz --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/backup /
# بازگردانی: tar -xzpf root-backup.tar.gz -C /mnt
⚠️
هرگز آرشیو ناشناس را بدون tar -t مستقیم استخراج نکن — ممکن است فایل‌ها را در مسیر مطلق بازنویسی کند. استخراج آرشیوهای درختی را ترجیحاً در یک پوشه تازه انجام بده.

gzipفشرده‌سازی استاندارد تک‌فایل

پیش‌فرض سیستم

فایل را فشرده می‌کند و جایگزینش می‌کند (فایل .gz می‌ماند). برای فشرده‌سازی بدون جایگزینی از پایپ استفاده کن.

گزینهکار
-kفایل اصلی را نگه دار ★
-1 … -9سطح فشرده‌سازی (پیش‌فرض ۶)
-dخارج‌کردن (معادل gunzip)
-vنمایش نسبت فشرده‌سازی
terminal
gzip big.log                 # big.log.gz شد؛ اصلی پاک شد
gzip -k big.log              # هر دو باقی می‌مانند
gzip -9 -k data.csv          # بیشترین فشرده‌سازی
gzip -d big.log.gz           # برگشت (معادل gunzip)
zcat big.log.gz | head       # خواندن بدون استخراج
# فشرده‌سازی بدون جایگزینی با پایپ:
cat file | gzip > file.gz
gzip -tv file.gz             # تست سلامت

gunzipخارج‌سازی gzip

پیش‌فرض سیستم

برگرداندن فایل .gz به حالت عادی.

terminal
gunzip file.gz
gunzip -k file.gz            # .gz هم بماند
gunzip -l file.gz            # نسبت فشرده‌سازی

bzip2فشرده‌سازی قوی‌تر از gzip

پیش‌فرض سیستم

فشرده‌سازی قوی‌تر ولی کندتر از gzip؛ فرمت .bz2.

terminal
bzip2 -k bigfile             # .bz2
bzip2 -d bigfile.bz2         # یا bunzip2
bzcat bigfile.bz2 | head

xzفشرده‌سازی بسیار قوی

پیش‌فرض سیستم

نسبت فشرده‌سازی عالی (معمولاً بهترین بین gzip/xz/zstd در سطح ۹)؛ کندتر ولی برای آرشیوهای دیرمصرف عالی. فرمت .xz.

گزینهکار
-kاصلی بماند
-9بیشترین فشرده‌سازی
-dخارج‌سازی (یا unxz)
-T0استفاده از همه هسته‌ها ★
terminal
xz -k -9 -T0 bigdata.sql     # data.sql.xz
xz -d bigdata.sql.xz
xz -l bigdata.sql.xz         # اطلاعات
xzcat file.xz | less

zstdفشرده‌سازی نسل جدید: سریع و قوی

نیاز به نصب
📦 نصب:sudo apt install zstd

تعادل بی‌نظیر سرعت/نسبت: چندین برابر gzip سریع‌تر با فشرده‌سازی بهتر. انتخاب مدرن برای لاگ‌ها و بکاپ‌ها. فرمت .zst.

گزینهکار
-kاصلی بماند
-rبازگشتی روی پوشه
-19سطح بالا (1..19)
--longپشتیبانی از فایل‌های عظیم
terminal
zstd -k logfile              # logfile.zst
zstd -19 -k -T0 huge.bin     # بیشترین فشرده + موازی
zstd -d file.zst             # برگشت (یا unzstd)
zstdcat file.zst | grep err
tar --zstd -cf backup.tar.zst folder/   # با tar ★

zipآرشیو سازگار با همه سیستم‌عامل‌ها

پیش‌فرض سیستم

فرمت همه‌جا-شناخت. برای فرستادن فایل به ویندوز یا هرجای دیگر، انتخاب اول است.

گزینهکار
-rبازگشتی برای پوشه‌ها
-eبا رمز عبور
-9بیشترین فشرده‌سازی
-xاستثنا
terminal
zip -r project.zip project/
zip -r -9 out.zip folder/ -x "*.tmp"
zip -e secret.zip file.txt          # با رمز
zip -sf project.zip                 # لیست محتوا
unzip project.zip -d /tmp/out       # استخراج به پوشه
unzip -l project.zip                # فقط لیست
unzip -o project.zip                # بازنویسی بدون سؤال
# رمز فایل zip رمز واقعی نیست؛ برای محرمانگی جدی از gpg استفاده کن

7zفشرده‌سازی رکورددار (7-Zip)

نیاز به نصب
📦 نصب:sudo apt install p7zip-full

نسبت فشرده‌سازی عالی، پشتیبانی از ده‌ها فرمت و رمزگذاری واقعی AES-256 روی نام فایل‌ها و محتوا.

گزینهکار
aافزودن به آرشیو
xاستخراج با ساختار کامل
lلیست محتوا
tتست سلامت
-pرمز
terminal
7z a -p backup.7z folder/          # آرشیو رمزدار ★
7z x backup.7z -o/tmp/out
7z l backup.7z
7z a -mx=9 ultra.7z data/          # بیشترین فشرده
7z t backup.7z                     # تست سلامت

rsyncهمگام‌سازی هوشمند فایل‌ها (ستاره بکاپ)

پیش‌فرض سیستم

فقط تفاوت‌ها را منتقل می‌کند (دیلتا)، مقصد را دقیقاً هم‌سان می‌کند، روی شبکه با ssh کار می‌کند و قابل ازسرگیری است. ابزار شماره یک بکاپ و کپی حجیم.

گزینهکار
-aآرشیو: بازگشتی + مجوز + زمان + لینک‌ها ★
-v / -hخوانا و پرجزئیات
--progressنمایش پیشرفت هر فایل
--deleteحذف موارد اضافی مقصد (آینه کامل!)
-zفشرده‌سازی حین انتقال
-P= --progress --partial؛ قابل ازسرگیری
--excludeصرف‌نظر از الگو
-n / --dry-runشبیه‌سازی بدون اجرا ★
terminal
rsync -avh --progress myfolder/ /backup/myfolder/     # محلی
rsync -avz --progress project/ user@server:/srv/app/  # به سرور ★
rsync -avz user@server:/var/log/app/ ./logs/          # از سرور
rsync -avh --delete src/ dst/          # آینه دقیق (مواظب باش)
rsync -avn --delete src/ dst/          # اول شبیه‌سازی! ★
rsync -a --exclude='node_modules' --exclude='.git' src/ dst/
rsync -P big.iso user@host:/backups/   # قطع شد؟ دوباره بزن، ادامه می‌دهد
rsync -a --link-dest=/backup/2025-09-01 /data/ /backup/2025-09-02/  # بکاپ افزایشی
⚠️
تفاوت اسلش انتها حیاتی است: src/ یعنی «محتوای src» و src یعنی «خود پوشه src». قبل از استفاده از --delete حتماً یک بار با -n خروجی را ببین.

unzipاستخراج zip

پیش‌فرض سیستم

بازکردن آرشیوهای zip با کنترل کامل.

terminal
unzip file.zip -d outdir/
unzip -l file.zip            # لیست
unzip -t file.zip            # تست سلامت
unzip -o file.zip            # بازنویسی
unzip -P pass file.zip       # با رمز
🌐

19. شبکه و اتصالات

14 دستور و مبحث

دو نسخه ابزار: قدیمی و مدرن

آدرس IP

قدیمی: ifconfig (نصب‌طلبد) · مدرن: ip a

پورت‌ها

قدیمی: netstat -tulpn · مدرن: ss -tulpn

روت

قدیمی: route -n · مدرن: ip r

ARP

قدیمی: arp -a · مدرن: ip neigh

خانواده iproute2 (دستور ip و ss) استاندارد امروز است؛ ابزارهای قدیمی روی توزیع‌های مینیمال نصب نیستند.

pingتست زنده‌بودن و تأخیر

پیش‌فرض سیستم

بسته ICMP به مقصد می‌فرستد و تأخیر/اتلاف را می‌سنجد. اولین تست هر مشکل شبکه.

گزینهکار
-c nفقط n بسته
-i 0.5فاصله ارسال (ثانیه)
-W 2مهلت پاسخ
-s 1400اندازه بسته برای تست MTU
terminal
ping -c 4 8.8.8.8            # اینترنت کار می‌کند؟
ping -c 4 google.com         # DNS هم درست است؟
ping -c 3 192.168.1.1        # روتر داخلی
ping -i 0.2 -c 10 server     # سریع‌تر برای لاگ
ping -s 1472 -M do example.com   # تست MTU مسیر
ping -a host                 # با بوق (زنده ماندن)
💡
منطق عیب‌یابی: پینگ به IP جواب می‌دهد ولی به نام دامنه نه → مشکل DNS است. به هر دو جواب نمی‌دهد → مشکل مسیر/فایروال است. به داخلی می‌رسد به بیرون نه → مشکل اینترنت/گیت‌وی.

ipمدیر کامل شبکه (آدرس، روت، لینک)

پیش‌فرض سیستم

جایگزین واحد ifconfig/route/arp: دیدن و تنظیم آدرس‌ها، مسیرها، لینک‌ها و بیشتر.

گزینهکار
a / addrآدرس‌های IP همه کارت‌ها
r / routeجدول مسیریابی
l / linkوضعیت کارت‌ها
n / neighجدول ARP
terminal
ip a                          # آدرس‌ها ★
ip a show eth0                # فقط یک کارت
ip -4 a | grep inet           # فقط IPv4
ip r                          # مسیرها؛ خط default یعنی گیت‌وی
ip r get 8.8.8.8              # از کدام مسیر/کارت می‌رود؟ ★
ip l                          # کارت‌ها UP/DOWN
sudo ip l set eth0 up         # روشن‌کردن کارت
sudo ip a add 192.168.1.50/24 dev eth0    # آدرس موقت
sudo ip a del 192.168.1.50/24 dev eth0
ip n                          # دستگاه‌های شناخته‌شده در LAN

ssپورت‌ها و اتصال‌های سوکت

پیش‌فرض سیستم

لیست سوکت‌های باز: چه برنامه‌ای روی چه پورتی گوش می‌دهد، چه اتصال‌هایی برقرار است — بازرسی امنیتی و عیب‌یابی «پورت اشغال».

گزینهکار
-tTCP
-uUDP
-lفقط گوش‌دهنده‌ها (listening)
-nاعداد به‌جای نام سرویس
-pنام پروسه (با sudo)
-sخلاصه آماری
terminal
sudo ss -tulpn                # همه پورت‌های باز + برنامه‌ها ★
ss -tuln                      # بدون نام پروسه
ss -tulpn | grep :80          # چه کسی پورت ۸۰ را دارد؟
ss -tn state established      # اتصال‌های زنده فعلی
ss -s                         # خلاصه: چند سوکت در هر حالت
ss -tnp dst 10.0.0.5          # اتصال‌ها به یک IP خاص

tracerouteرد مسیر بسته‌ها تا مقصد

نیاز به نصب
📦 نصب:sudo apt install traceroute

نشان می‌دهد بسته‌ها از کدام روترها رد می‌شوند و در کدام هاپ گیر/کند می‌شوند — ردیابی کندی اینترنت و دیوارهای آتش.

terminal
traceroute example.com
traceroute -n 8.8.8.8          # بدون DNS، سریع‌تر
traceroute -I example.com      # با ICMP (سد فایروال‌ها کمتر)
tracepath example.com          # جایگزین بدون نیاز نصب

mtrtraceroute زنده با آمار

نیاز به نصب
📦 نصب:sudo apt install mtr-tiny # نسخه ترمینالی

ترکیب traceroute + ping: هر هاپ را زنده با درصد اتلاف بسته و جیتر می‌سنجد — سند محکم برای شکایت از ISP.

terminal
sudo mtr example.com           # زنده، تعاملی
mtr -rwzc 100 example.com      # گزارش متنی بعد از ۱۰۰ دور
mtr -n -c 50 8.8.8.8

digپرس‌وجوی حرفه‌ای DNS

نیاز به نصب
📦 نصب:sudo apt install dnsutils # همراه nslookup می‌آید

استاندارد پرس‌وجوی DNS: رکوردهای A، MX، TXT، CNAME و ردیابی زنجیره resolution — ابزار دقیق عیب‌یابی دامنه.

گزینهکار
+shortفقط جواب کوتاه ★
MX/TXT/NSنوع رکورد
@8.8.8.8پرس‌وجو از سرور مشخص
+traceردیابی کامل زنجیره DNS
+noall +answerفقط بخش جواب
terminal
dig example.com
dig +short example.com                 # IP نهایی
dig +short MX gmail.com                # سرورهای ایمیل
dig TXT example.com                    # رکوردهای SPF و…
dig @8.8.8.8 example.com               # از DNS گوگل بپرس
dig +trace example.com | tail -20      # کل مسیر resolution
dig -x 1.2.3.4 +short                  # reverse lookup (IP → نام)
dig +noall +answer example.com www
💡
اگر سایت برای تو باز نمی‌شود: dig +short site.com @1.1.1.1 را با dig +short site.com مقایسه کن — اختلاف یعنی DNS محلی/ISP مشکل دارد. کش محلی را با sudo resolvectl flush-caches خالی کن.

hostDNS ساده و سریع

نیاز به نصب
📦 نصب:sudo apt install bind9-host # یا dnsutils

نسخه ساده dig برای پرس‌وجوهای سریع.

terminal
host example.com
host -t mx gmail.com
host 8.8.8.8               # reverse

whoisاطلاعات ثبت دامنه و IP

نیاز به نصب
📦 نصب:sudo apt install whois

مالک دامنه، تاریخ ثبت/انقضا و مسؤول IPها را نشان می‌دهد — برای ارتباط با مسؤول سرور متخلف یا چک انقضای دامنه.

terminal
whois example.com | grep -iE "expiry|registrar|creation"
whois 8.8.8.8 | head -20   # مالک رنج IP

nmapاسکنر پورت و شبکه

نیاز به نصب
📦 نصب:sudo apt install nmap

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

گزینهکار
-snفقط کشف میزبان‌ها بدون اسکن پورت
-p -همه ۶۵۵۳۵ پورت
-sVتشخیص نسخه سرویس‌ها
-Oحدس سیستم‌عامل (sudo)
-Aهمه‌چیز: نسخه + OS + اسکریپت‌ها
terminal
nmap 192.168.1.0/24 -sn          # چه دستگاه‌هایی روشن است؟
nmap -p 22,80,443 server.local   # پورت‌های خاص
sudo nmap -sV -p- 192.168.1.10   # همه پورت‌ها با نسخه
nmap --top-ports 20 target.com
⚠️
اسکن پورت روی شبکه‌ها و سرورهایی که مجوز نداری، در بسیاری از کشورها جرم محسوب می‌شود. nmap را فقط برای محیط خودت استفاده کن.

netstatاتصالات و پورت‌های شبکه (نسخه قدیمی)

نیاز به نصب
📦 نصب:sudo apt install net-tools

اجداد ss. روی توزیع‌های مدرن دیگر پیش‌فرض نصب نیست، ولی چون هنوز در هزاران آموزش و اسکریپت قدیمی دیده می‌شود، شناختنش لازم است. برای کار روزمره، ss را در بخش ۱۹ ترجیح بده.

terminal
netstat -tulpn        # پورت‌های باز + پروسه (معادل ss -tulpn)
netstat -an | grep ESTABLISHED   # اتصالات برقرار
netstat -r             # جدول مسیریابی (معادل ip route)
netstat -i              # آمار کارت‌های شبکه
ℹ️
معادل هر گزینه netstat در ابزار مدرن: netstat -tulpnss -tulpn، netstat -rip route، netstat -iip -s link.

nslookupپرس‌وجوی DNS (ساده و تعاملی)

نیاز به نصب
📦 نصب:sudo apt install dnsutils

نسخه ساده‌تر و قدیمی‌تر dig؛ خروجی کمتر ولی تعاملی. برای اسکریپت‌نویسی dig +short بهتر است، اما برای یک نگاه سریع تعاملی هنوز رایج است.

terminal
nslookup example.com              # IP دامنه
nslookup example.com 8.8.8.8       # پرس‌وجو از یک DNS مشخص
nslookup                            # حالت تعاملی
> set type=MX
> example.com

route / ifconfigمسیریابی و رابط شبکه (سبک قدیمی)

نیاز به نصب
📦 نصب:sudo apt install net-tools

پدربزرگ‌های دستور ip. سال‌هاست منسوخ اعلام شده‌اند ولی هنوز روی سرورهای قدیمی و در مستندات کهنه دیده می‌شوند. هر کاری با این‌ها می‌شود، با ip هم می‌شود — کامل‌تر.

terminal
ifconfig                        # لیست کارت‌های شبکه (معادل ip addr)
ifconfig eth0 up                 # روشن‌کردن یک کارت
ifconfig eth0 192.168.1.50 netmask 255.255.255.0

route -n                         # جدول مسیریابی عددی
sudo route add default gw 192.168.1.1
💡
معادل مدرن: ifconfigip addr، route -nip route. جزئیات کامل ip در بخش ۴۱ هست.

hostnameنمایش یا تنظیم نام میزبان

پیش‌فرض سیستم

نام سیستم را چاپ می‌کند یا (موقتاً) تغییر می‌دهد. برای تغییر دائمی و هماهنگ با systemd، از hostnamectl (بخش ۱۵) استفاده کن.

terminal
hostname                # نام فعلی
hostname -I              # همه IPهای این دستگاه ★
hostname -f               # نام کامل (FQDN)
sudo hostname new-name    # تغییر موقت (با ری‌استارت برمی‌گردد)

iftop / nethogsپایش زنده پهنای باند

نیاز به نصب
📦 نصب:sudo apt install iftop nethogs

دو مانیتور زنده مکمل هم: iftop ترافیک را بر اساس اتصال (کدام IP با کدام IP) نشان می‌دهد، nethogs بر اساس پروسه (کدام برنامه بیشترین پهنای باند را می‌خورد).

terminal
sudo iftop                    # ترافیک زنده بر اساس اتصال
sudo iftop -i eth0 -n         # روی یک کارت خاص، بدون DNS lookup

sudo nethogs                  # کدام پروسه بیشترین ترافیک را دارد؟
sudo nethogs eth0             # محدود به یک کارت شبکه
💡
سرور یهو کند شده و شک داری یک پروسه دارد پهنای باند را می‌خورد؟ اول nethogs بزن تا مقصر را پیدا کنی، بعد با iftop ببین دارد با کجا حرف می‌زند.
📡

20. HTTP و دانلود

7 دستور و مبحث

curlچاقوی سوئیسی انتقال داده

پیش‌فرض سیستم

درخواست HTTP/HTTPS به هر شکل: دانلود، تست API، ارسال فرم، چک سلامت سرویس. پرکاربردترین ابزار اتصال ترمینال به دنیای وب.

گزینهکار
-o file / -Oذخیره در فایل / با نام اصلی
-Lدنبال‌کردن redirectها
-Iفقط هدرها (HEAD)
-X POSTمتد دلخواه: GET/POST/PUT/DELETE
-d 'k=v'بدنه درخواست (data)
-H 'k: v'هدر دلخواه (Authorization و…)
-F file=@xآپلود multipart (فرم فایل)
-s / -Sساکت / خطاها نشان بده
-wقالب خروجی: کد وضعیت، زمان و…
--max-time 10مهلت کل
terminal
curl example.com                      # چاپ محتوای صفحه
curl -O https://site.com/file.zip     # دانلود با همان نام
curl -o out.html https://example.com  # دانلود با نام دلخواه
curl -L -o img.jpg https://bit.ly/xyz # دنبال‌کردن ریدایرکت
curl -I https://example.com           # فقط هدرها: کد 200؟ سرور چی؟
curl -s https://api.github.com/users/octocat | jq .name   # API + jq

# تست API:
curl -X POST https://api.example.com/users \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer TOKEN" \
     -d '{"name":"Ali","email":"[email protected]"}'

curl -F "[email protected]" https://upload.example.com   # آپلود فایل
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" https://example.com   # مانیتور
curl --max-time 5 https://slow.example.com            # با مهلت
curl cheat.sh/tar                                     # شیت‌شیت آنلاین دستورها!
curl ifconfig.me                                      # IP عمومی من چیست؟
💡
برای اسکریپت‌های مانیتورینگ این الگو طلاست: curl -sf https://site/health >/dev/null || notify-send "سایت پایین است"-f یعنی با کد 4xx/5xx شکست بخور.

wgetدانلودر قدرتمند و بازگشتی

پیش‌فرض سیستم

دانلود فایل‌ها با ازسرگیری، پس‌زمینه و توانایی آینه‌کردن کل سایت. برای دانلودهای طولانی بهتر از curl.

گزینهکار
-cادامه دانلود نیمه‌کاره ★
-bپس‌زمینه
-qساکت
-r / -np / -kبازگشتی / فقط زیر پوشه / اصلاح لینک‌ها برای مرور
--limit-rate=200kمحدودیت سرعت
-i list.txtدانلود لیستی
terminal
wget https://example.com/iso/ubuntu.iso
wget -c https://example.com/iso/ubuntu.iso    # ادامه از همان‌جا
wget -q --show-progress file.iso
wget -b -o dl.log https://slow-server/big.bin  # پس‌زمینه
wget -i links.txt                             # لیست لینک‌ها
wget --limit-rate=300k http://host/file.zip
wget -r -np -k https://docs.example.com/guide/   # آینه مستندات
wget --spider https://example.com             # فقط چک وجود (کد 200؟)

httpiecurl انسانی و خوانا

نیاز به نصب
📦 نصب:sudo apt install httpie # یا: pip install httpie

تست API با سینتکس طبیعی و خروجی رنگی JSON — جایگزین دوست‌داشتنی curl برای توسعه‌دهنده‌ها.

terminal
http GET api.github.com/users/octocat
http POST localhost:8000/api/todos title="خرید نان" done:=false
http -v PUT api.example.com/items/1 name="جدید"   # -v نمایش کامل درخواست
http --download example.com/file.zip

aria2cدانلودر چندقطعه‌ای فوق‌سریع

نیاز به نصب
📦 نصب:sudo apt install aria2

دانلود با چند اتصال هم‌زمان (۱۶x سریع‌تر برای فایل‌های حجیم)، ازسرگیری و دانلود از چند منبع.

terminal
aria2c -x 16 https://example.com/big.iso   # ۱۶ اتصال موازی
aria2c -c big.iso                          # ادامه دانلود
aria2c -i links.txt -j 3                   # لیست، ۳ دانلود هم‌زمان

yt-dlpدانلود ویدیو/صدا از یوتیوب و هزاران سایت دیگر

نیاز به نصب
📦 نصب:sudo apt install yt-dlp

ادامه‌راه فعال youtube-dl؛ نه‌فقط یوتیوب، بلکه از هزاران سایت ویدیو/پادکست پشتیبانی می‌کند. کیفیت، فرمت خروجی و حتی فقط صدا را می‌توانی انتخاب کنی.

terminal
yt-dlp "URL"                          # کیفیت پیش‌فرض (بهترین)
yt-dlp -f "bv*+ba" "URL"                # بهترین ویدیو + بهترین صدا جدا
yt-dlp -x --audio-format mp3 "URL"        # فقط صدا، تبدیل به mp3 ★
yt-dlp --list-formats "URL"                 # لیست همه کیفیت‌های موجود
yt-dlp -o "%(title)s.%(ext)s" "URL"           # نام‌گذاری خروجی بر اساس عنوان
⚠️
دانلود محتوای دارای کپی‌رایت بدون مجوز صاحب اثر در بسیاری از کشورها ممنوع است؛ فقط برای محتوای خودت یا دارای مجوز آزاد استفاده کن.

ncجک همه‌کاره شبکه (netcat)

نیاز به نصب
📦 نصب:sudo apt install netcat-openbsd

اتصال خام TCP/UDP: تست پورت، ارسال فایل، سرور اضطراری و دیباگ پروتکل‌ها. به آن «چاقوی سوئیسی شبکه» می‌گویند.

گزینهکار
-lحالت گوش‌دهنده (سرور)
-vپرحاشیه
-zاسکن بدون ارسال داده
-uUDP
-w 3مهلت
terminal
nc -zv example.com 443          # پورت باز است؟ ★
nc -zv -w2 10.0.0.5 1-1000      # اسکن ساده بازه پورت
# انتقال فایل (بدون ssh!):
#   دریافت‌کننده:  nc -l 9999 > file.tar.gz
#   فرستنده:      nc IP-مقصد 9999 < file.tar.gz
# سرور اضطراری برای تست:
nc -l 8080                      # هر درخواست مرورگر را خام ببین!
echo "HEAD / HTTP/1.0\r\n\r\n" | nc example.com 80
⚠️
nc رمزگذاری ندارد — انتقال داده حساس فقط با scp/rsync/sftp. برای تست پورت در محیط عملیاتی، ss و nmap دقیق‌ترند.

socatاتصال‌دهنده همه‌چیز به همه‌چیز

نیاز به نصب
📦 نصب:sudo apt install socat

nc در سطح خدا: هر دو سوکت/فایل/پایپ را به هم وصل می‌کند — رله پورت، تونل سریع، محدودکردن دسترسی.

terminal
socat TCP-LISTEN:8080,fork TCP:10.0.0.5:80    # رله پورت ساده
socat TCP-LISTEN:2222,fork,reuseaddr TCP:oldserver:22   # انتقال ssh
echo test | socat - TCP:localhost:25          # صحبت SMTP خام
🧭

21. پیکربندی شبکه و DHCP

6 دستور و مبحث

nmcliمدیریت شبکه با NetworkManager

پیش‌فرض سیستم

کنترل کامل شبکه روی دسکتاپ/سرورهایی با NetworkManager: وصل‌شدن به وای‌فا، ساخت اتصال، DNS و... بدون رابط گرافیکی.

گزینهکار
dev wifi listلیست شبکه‌های وای‌فا اطراف
dev wifi connectاتصال به شبکه
con showاتصال‌های ذخیره‌شده
con up/downوصل/قطع یک اتصال
terminal
nmcli device status
nmcli dev wifi list                    # شبکه‌های اطراف
nmcli dev wifi connect "SSID" password "رمز"
nmcli con show
nmcli con up "Office-WiFi"
nmcli con mod "Office" ipv4.dns 1.1.1.1 8.8.8.8
nmcli con mod "Office" +ipv4.dns 9.9.9.9       # افزودن DNS
nmcli networking off && nmcli networking on    # ری‌استارت شبکه
nmcli radio wifi off                           # خاموش‌کردن وای‌فا

resolvectlDNS کش و resolve محلی

پیش‌فرض سیستم

وضعیت DNS سیستم، تست resolve و خالی‌کردن کش — وقتی «سایت باز نمی‌شود ولی همه‌جا بالا است».

terminal
resolvectl status              # کدام DNSها فعال‌اند؟
resolvectl query example.com   # تست resolve
sudo resolvectl flush-caches   # پاک‌کردن کش DNS ★
resolvectl statistics

dhclientگرفتن IP از DHCP

پیش‌فرض سیستم

درخواست IP خودکار از سرور DHCP — بعد از خرابکاری دستی در تنظیمات شبکه، راه برگشت است.

terminal
sudo dhclient -v eth0          # گرفتن IP جدید
sudo dhclient -r eth0          # رهاکردن IP فعلی
sudo dhclient -v -4 eth0       # فقط IPv4

ethtoolجزئیات لایه فیزیکی کارت شبکه

نیاز به نصب
📦 نصب:sudo apt install ethtool

سرعت/دوبل بودن لینک، وضعیت کابل و قابلیت‌های کارت — وقتی «شبکه کند است» از پایین‌ترین لایه شروع کن.

terminal
sudo ethtool eth0              # سرعت و وضعیت لینک
sudo ethtool -i eth0           # درایور و نسخه‌اش
sudo ethtool -p eth0 5         # چراغ پورت را ۵ ثانیه بچرخان (یافتن کابل!)

tcpdumpاستراق سمع بسته‌های شبکه

نیاز به نصب
📦 نصب:sudo apt install tcpdump

دیدن زنده بسته‌هایی که رد و بدل می‌شوند — دقیق‌ترین ابزار اثبات «داده می‌آید/نمی‌آید» و دیباگ پروتکل‌ها.

گزینهکار
-i anyهمه کارت‌ها
-nبدون resolve نام
port 80فیلتر پورت
host x / net xفیلتر میزبان/شبکه
-w file.pcapذخیره برای تحلیل Wireshark
terminal
sudo tcpdump -i any -n port 443
sudo tcpdump -i eth0 host 8.8.8.8
sudo tcpdump -n -c 20 port 53          # ۲۰ بسته DNS
sudo tcpdump -i any icmp               # فقط پینگ‌ها
sudo tcpdump -w capture.pcap -i eth0 port 80   # برای Wireshark
sudo tcpdump -nn -A port 80 | grep -i "GET /"  # دیدن درخواست‌های HTTP

sysctlپارامترهای زنده کرنل

پیش‌فرض سیستم

دیدن/تغییر تنظیمات کرنل در لحظه: رفتار IP forwarding، بافرهای TCP و… دائمی‌سازی در /etc/sysctl.d/

terminal
sysctl net.ipv4.ip_forward
sudo sysctl -w net.ipv4.ip_forward=1          # موقت (تا ریبوت)
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-forward.conf
sudo sysctl --system                           # بارگذاری همه فایل‌ها
sysctl net.core.rmem_max vm.swappiness
👥

22. کاربران، گروه‌ها و sudo

11 دستور و مبحث

شناسنامه کاربر: /etc/passwd و /etc/shadow

terminal
# هر خط passwd: نام:رمز:x:UID:GID:توضیح:خانه:شل
ali:x:1000:1000:Ali:/home/ali:/bin/bash
#  x یعنی رمز در /etc/shadow (هش‌شده) است
#  UID 0 = root · UIDهای 1000+ = انسان‌ها · زیر 1000 = سرویس‌ها
grep ali /etc/passwd
getent passwd ali          # با پشتیبانی LDAP/NIS
getent group developers    # اعضای گروه

ساخت کاربر

adduser ali تعاملی (Debian) · useradd -m -s دستی

تغییر عضویت

usermod -aG گروه ali ★ (a=افزودن بدون حذف قبلی‌ها!)

قفل حساب

sudo usermod -L ali یا sudo passwd -l ali

حذف

deluser --remove-home ali

useraddساخت کاربر (سبک پایین‌سطح)

پیش‌فرض سیستم

ساخت کاربر با کنترل کامل پارامترها (در Red Hat هم همین استاندارد است).

گزینهکار
-mساخت پوشه خانه ★
-s /bin/bashشل کاربر
-G g1,g2گروه‌های فرعی
-c "توضیح"نام کامل/توضیح
-e 2026-01-01تاریخ انقضای حساب
-u 1500UID دستی
terminal
sudo useradd -m -s /bin/bash -c "Ali Dev" -G sudo,docker ali
sudo passwd ali                        # رمز اولیه
id ali                                 # تأیید
sudo useradd -m -e 2026-03-20 -s /usr/sbin/nologin guest1   # حساب موقت بدون شل

adduserساخت کاربر تعاملی (Debian/RHEL)

پیش‌فرض سیستم

روی Debian/Ubuntu نسخه دوستانه‌تر useradd است: رمز و مشخصات را خودش می‌پرسد و خانه می‌سازد.

terminal
sudo adduser sara
sudo adduser sara sudo            # افزودن به sudo (Debian)
sudo adduser sara docker

usermodتغییر کاربر موجود

پیش‌فرض سیستم

تغییر شل، گروه‌ها، نام کاربری، خانه و قفل حساب.

گزینهکار
-aG گروهافزودن به گروه بدون از دست دادن گروه‌های قبلی ★
-sتغییر شل
-l نام_جدیدتغییر نام کاربری
-d /مسیر -mتغییر خانه + انتقال محتوا
-L / -Uقفل / بازکردن
terminal
sudo usermod -aG docker ali        # دسترسی داکر بدون sudo ★
sudo usermod -aG sudo,adm ali
sudo usermod -s /usr/sbin/nologin temp-user   # قطع شل
sudo usermod -L sara               # قفل
sudo usermod -U sara               # بازکردن
sudo usermod -l newname -d /home/newname -m oldname
⚠️
اشتباه رایج مرگبار: usermod -G docker ali بدون -a — کاربر از همه گروه‌های قبلی‌اش (ممکن است sudo!) حذف می‌شود. همیشه -aG.

userdelحذف کاربر

پیش‌فرض سیستم

حذف حساب؛ با -r پوشه خانه هم پاک می‌شود.

terminal
sudo userdel temp-user
sudo userdel -r old-user          # با خانه و فایل‌هایش
ls /home                          # تأیید

groupaddساخت گروه

پیش‌فرض سیستم

گروه جدید می‌سازد برای مدیریت دسترسی‌های تیمی.

terminal
sudo groupadd developers
sudo gpasswd -a ali developers     # افزودن عضو
sudo gpasswd -d ali developers     # حذف عضو
sudo groupdel old-team             # حذف گروه
groups ali                         # گروه‌های ali
getent group developers

idشناسنامه کاربر فعلی یا دیگران

پیش‌فرض سیستم

UID، GID و همه گروه‌های کاربر را در یک نگاه می‌دهد — سریع‌ترین چک عضویت گروه.

terminal
id
id ali
id -nG ali                 # فقط نام گروه‌ها
id -gn                     # گروه اصلی من

suتغییر هویت کاربر

پیش‌فرض سیستم

ورود به شل کاربر دیگر (معمولاً root). با خط تیره محیط کامل کاربر را هم بارگذاری کن.

terminal
su -               # تبدیل به root با محیط کامل (رمز root)
su ali             # شل به نام ali ولی محیط من
su - ali           # کامل با محیط ali
exit               # برگشت به هویت قبلی

sudoاجرای دستور با اختیارات دیگران (معمولاً root)

پیش‌فرض سیستم

امن‌ترین راه کار مدیریتی: هر دستور با هویت root اجرا می‌شود و در لاگ ثبت می‌شود. اعضای گروه sudo/wheel مجازند.

گزینهکار
-iشل لاگین root کامل (بهتر از su برای کارهای چندمرحله‌ای)
-u کاربراجرا به نام کاربر دیگر، نه لزوماً root
-lچه دستورهایی برای من مجاز است؟
!!تکرار دستور قبلی با sudo
terminal
sudo systemctl restart nginx
sudo -u www-data ls /var/www       # با هویت www-data
sudo -l                            # امتیازات من چیست؟
sudo !!                            # آخ که یادم رفت sudo!
sudo -i                            # ورود کامل root
sudo visudo                        # ویرایش امن فایل sudoers (هرگز مستقیم!)
⚠️
اگر خودت را از گروه sudo حذف کردی و پنجره‌ی روت باز نداری، راه برگشتی وجود ندارد. قبل از تغییرات خطرناک، یک ترمینال root باز نگه دار: sudo -i در تب دیگر.

chshتغییر شل پیش‌فرض کاربر

پیش‌فرض سیستم

شل ورود کاربر را عوض می‌کند (شل باید در /etc/shadows معتبر باشد).

terminal
chsh -l                      # لیست شل‌های مجاز (بعضی سیستم‌ها)
chsh -s /bin/zsh             # برای خودم
sudo chsh -s /bin/bash ali   # برای دیگری

getentپرس‌وجوی دیتابیس‌های سیستم

پیش‌فرض سیستم

پرس‌وجوی یکپارچه از passwd، group، hosts و… حتی وقتی منبع LDAP/NIS است — در اسکریپت‌ها بهتر از خواندن مستقیم فایل‌ها.

terminal
getent passwd | wc -l        # چند حساب داریم؟
getent group sudo
getent hosts example.com     # resolve هم می‌کند

faillockمدیریت قفل حساب پس از خطاهای رمز

پیش‌فرض سیستم

در سیستم‌های جدید، تلاش‌های ناموفق رمز را می‌شمارد و حساب را قفل می‌کند؛ برای بازکردن دستی این دستور است.

terminal
faillock --user ali           # وضعیت تلاش‌ها
sudo faillock --user ali --reset   # بازنشانی قفل
📦

23. پکیج‌منیجرها

10 دستور و مبحث

جنگل پکیج‌منیجرهای لینوکس

Debian / Ubuntu

apt (مدیر) + dpkg (پایه) — فرمت .deb

Fedora / RHEL

dnf (مدیر) + rpm (پایه) — فرمت .rpm

Arch / Manjaro

pacman + مخزن کاربران AUR با yay/paru

همه‌جا (سندباکس)

snap و flatpak — مستقل از توزیع

زبان‌ها

pip (پایتون)، npm (node)، cargo (rust) — جدا از سیستم

قانون: هر برنامه سیستم را با «پکیج‌منیجر توزیع» نصب کن نه اسکریپت‌های کپی‌دستی؛ آپدیت و حذف تمیز از همین مسیر ممکن می‌شود.

aptمدیر پکیج Debian/Ubuntu

پیش‌فرض سیستم

نصب، حذف و به‌روزرسانی نرم‌افزار از مخازن. دستورهای مدرن apt معادل apt-get و خواناترین انتخاب هستند.

گزینهکار
updateبه‌روزرسانی فهرست مخازن (خود پکیج‌ها نه!)
upgradeارتقای پکیج‌های نصب‌شده
full-upgradeارتقا با اجازه حذف/جابه‌جایی (برای تغییرات بزرگ)
install / removeنصب / حذف (configها می‌مانند)
purgeحذف کامل با configها
autoremoveپاک‌کردن وابستگی‌های بی‌استفاده
search / showجست‌وجو / جزئیات پکیج
list --upgradableچه چیزهایی آماده ارتقا است
-yبدون سؤال تأیید
terminal
sudo apt update && sudo apt upgrade -y        # آپدیت کامل ★
sudo apt install nginx git htop
sudo apt install ./local-package.deb          # نصب فایل deb محلی
sudo apt remove nginx && sudo apt purge nginx # حذف + پاک‌سازی config
sudo apt autoremove --purge                   # جاروی وابستگی‌ها
apt search "markdown editor"
apt show nginx | less                         # نسخه، حجم، وابستگی‌ها
apt list --upgradable
apt list --installed | grep -i docker
apt-cache policy nginx                        # از کدام مخزن و چه نسخه‌ای نصب می‌شود؟

dpkgپایه مدیریت .deb

پیش‌فرض سیستم

کار مستقیم با فایل‌های .deb بدون مخزن: نصب فایل محلی، لیست و جست‌وجوی مالکیت فایل‌ها.

گزینهکار
-i file.debنصب فایل
-lلیست پکیج‌های نصب‌شده
-L پکیجچه فایل‌هایی نصب کرد؟
-S فایلکدام پکیج این فایل را گذاشت؟ ★
-r / -Pحذف / حذف کامل
--configure -aترمیم نصب‌های نیمه‌تمام
terminal
sudo dpkg -i anydesk.deb
# اگر خطای وابستگی داد (ترفند حرفه‌ای):
sudo apt -f install
dpkg -l | grep -i docker
dpkg -L nginx | head
dpkg -S /usr/bin/curl
sudo dpkg --configure -a      # بعد از قطع‌شدن وسط نصب

dnfمدیر پکیج Fedora/RHEL

پیش‌فرض سیستم

مدیر پکیج خانواده Red Hat؛ در نسخه‌های جدید dnf5 است. منطق کاملاً مشابه apt دارد.

گزینهکار
install / removeنصب / حذف
upgradeارتقای کل سیستم
search / infoجست‌وجو / جزئیات
providesکدام پکیج این فایل/قابلیت را می‌دهد ★
historyتاریخچه تراکنش‌ها + undo!
terminal
sudo dnf install htop nginx
sudo dnf upgrade
dnf search redis
dnf info docker
dnf provides "*/ifconfig"        # کدام پکیج ifconfig دارد؟ (net-tools)
sudo dnf history                 # چه تراکنش‌هایی انجام شد
sudo dnf history undo 42         # برگشت تراکنش! ★
sudo dnf autoremove

rpmپایه مدیریت .rpm

پیش‌فرض سیستم

کار مستقیم با فایل‌های rpm: نصب، کوئری، امضا.

گزینهکار
-ivhنصب با نمایش پیشرفت
-qaلیست همه
-ql پکیجفایل‌های پکیج
-qf فایلمالک فایل
-eحذف
terminal
rpm -qa | grep -i nginx
rpm -ql nginx | head
rpm -qf /usr/bin/ls

pacmanمدیر پکیج Arch

پیش‌فرض سیستم

مدیر پکیج سریع Arch با سینتکس فشرده؛ مخزن AUR با کمکی‌های yay/paru گسترده‌ترین مخزن دنیاست.

گزینهکار
-Syuهمگام‌سازی + ارتقای کل سیستم ★
-S نامنصب
-Rns نامحذف کامل با وابستگی‌های یتیم
-Ss / -Siجست‌وجو / اطلاعات
-Qکوئری نصب‌شده‌ها
-Scپاک‌سازی کش
terminal
sudo pacman -Syu              # آپدیت کامل سیستم (قبل از هر نصب!)
sudo pacman -S tmux htop
sudo pacman -Rns package-name
pacman -Ss "pdf editor"
pacman -Qs docker             # جست‌وجو در نصب‌شده‌ها
pacman -Qi bash
pacman -Ql nginx | head
# AUR با yay (نصب yay):
sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si
yay -S google-chrome

snapپکیج‌های sandboxی Canonical

پیش‌فرض سیستم

پکیج‌های مستقل از توزیع با وابستگی‌های داخلی و آپدیت خودکار؛ استارتاپ کندتر اما ایزوله.

terminal
snap list
sudo snap install code --classic
sudo snap install nextcloud
sudo snap refresh            # آپدیت همه
sudo snap remove app

flatpakپکیج‌های sandboxی همه‌توزیعی

پیش‌فرض سیستم

اکوسیستم اپ‌های دسکتاپ ایزوله با مخزن Flathub؛ در Fedoras نقش اصلی را دارد.

terminal
flatpak search "obs studio"
flatpak install flathub com.obsproject.Studio
flatpak list
flatpak update
flatpak uninstall com.obsproject.Studio

pipمدیر پکیج پایتون

پیش‌فرض سیستم

نصب کتابخانه‌های پایتون. در توزیع‌های جدید، نصب در سطح سیستم محدود شده؛ برای محیط‌های مجزا از venv استفاده کن.

terminal
pip --version
# روش مدرن و امن: محیط مجازی
python3 -m venv .venv
source .venv/bin/activate
pip install requests pandas
pip list
pip freeze > requirements.txt
pip install -r requirements.txt
deactivate
# نصب فقط برای کاربر فعلی (بدون venv):
pip install --user requests

npmمدیر پکیج Node.js

پیش‌فرض سیستم

مدیر پکیج اکوسیستم جاوااسکریپت.

terminal
npm -v
npm install -g typescript        # سراسری
npm install axios                # محلی پروژه
npm update
npm ls --depth=0

yum / zypperپکیج‌منیجر نسخه‌های قدیمی RHEL و openSUSE

پیش‌فرض سیستم

yum جد dnf است — روی CentOS 7 و RHEL 7 به پایین هنوز پیش‌فرض است و دستورهایش تقریباً یک‌به‌یک با dnf یکسان است. zypper همان نقش را روی خانواده openSUSE/SLES بازی می‌کند.

terminal
yum install nginx           # نصب (هم‌معنی با dnf install)
yum update                    # به‌روزرسانی کل سیستم
yum remove nginx                # حذف
yum search "web server"          # جست‌وجو

zypper install nginx               # نصب روی openSUSE
zypper refresh                       # به‌روزرسانی لیست مخازن
zypper update                          # آپدیت کامل
zypper search nginx                      # جست‌وجو
💡
اگر yum بلدی، dnf را رایگان بلدی — دستورهایشان معادل یک‌به‌یک هم هستند؛ dnf فقط سریع‌تر و با وابستگی‌یابی بهتر است.

24. زمان‌بندی وظایف

5 دستور و مبحث

زبان crontab در ۳۰ ثانیه

terminal
#  ┌──────── دقیقه (0-59)
#  │ ┌────── ساعت (0-23)
#  │ │ ┌──── روزِ ماه (1-31)
#  │ │ │ ┌── ماه (1-12)
#  │ │ │ │ ┌ روزِ هفته (0-6؛ یکشنبه=0)
#  │ │ │ │ │
  * * * * *  دستور

  30 2 * * *    هر روز ساعت ۲:۳۰ بامداد
  0 */6 * * *   هر ۶ ساعت
  */15 * * * *  هر ۱۵ دقیقه
  0 9-17 * * 1-5  ساعت ۹ تا ۱۷، فقط شنبه تا چهارشنبه (هفته کاری)
  0 0 1 * *     نیمه‌شب اول هر ماه
  @reboot       فقط موقع بوت
  @daily/@weekly/@monthly  میانبرهای رایج
⚠️
cron محیط (PATH, HOME) محدودی دارد و خروجی را ایمیل می‌کند. در crontabها همیشه مسیرهای مطلق بنویس، لاگ به فایل بفرست (>> log 2>&1) و مقایسه/متغیرها را داخل اسکریپت بگذار نه خود خط cron.

crontabمدیریت وظایف زمان‌بندی‌شده کاربر

پیش‌فرض سیستم

هر کاربر جدول cron خودش را دارد. این دستورها آن را ویرایش/لیست/حذف می‌کنند.

گزینهکار
-eویرایش جدول خودت ★
-lلیست وظایف
-rحذف کل جدول (خطرناک: تأیید ندارد!)
-u کاربرمدیریت جدول کاربر دیگر (با sudo)
terminal
crontab -e
#  نمونه‌های داخل crontab:
#  */5 * * * * /opt/scripts/healthcheck.sh >> /var/log/health.log 2>&1
#  30 3 * * * /usr/local/bin/backup.sh
#  0 4 * * 0  /opt/scripts/weekly-report.sh
#  @reboot /opt/scripts/start-daemon.sh

crontab -l                        # لیست
sudo crontab -l -u www-data       # جدول کاربر دیگر
sudo crontab -e -u root           # جدول روت
# دیباگ: آیا اصلاً اجرا شد؟
grep CRON /var/log/syslog | tail
journalctl -u cron -n 20
# تست دستی همان محیط cron:
env -i /bin/bash --noprofile /opt/scripts/healthcheck.sh
⚠️
crontab -r کل جدول را بدون سؤال پاک می‌کند. عادت امن: crontab -l > ~/cron-backup.txt قبل از هر ویرایش، یا alias بگذار alias cronr='echo "از -l بکاپ بگیر!"'

atاجرای یک‌باره در زمان مشخص

نیاز به نصب
📦 نصب:sudo apt install at

برخلاف cron که تکراری است، at یک دستور را فقط یک بار در آینده اجرا می‌کند — «یه ربع دیگه این اسکریپت رو بزن».

terminal
echo "/opt/scripts/cleanup.sh" | at 23:30
echo "shutdown -h now" | at now + 90 minutes
at 2am tomorrow << 'EOF'
/opt/scripts/night-sync.sh
EOF
atq                      # لیست کارهای صف‌شده
atrm 3                   # حذف کار شماره ۳

systemd-timerتایمرهای systemd (جایگزین مدرن cron)

پیشرفته

تایمرها با journal یکپارچه‌اند، وابستگی و اجرای جاافتاده (catch-up) را هندل می‌کنند و برای سرورهای جدی استانداردتر از cron شده‌اند.

terminal
# 1) سرویس کار (myjob.service):
sudo tee /etc/systemd/system/myjob.service << 'EOF'
[Unit]
Description=My Scheduled Job

[Service]
Type=oneshot
ExecStart=/opt/scripts/myjob.sh
EOF

# 2) تایمرش (myjob.timer):
sudo tee /etc/systemd/system/myjob.timer << 'EOF'
[Unit]
Description=Run myjob daily

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now myjob.timer
systemctl list-timers                # همه تایمرها و اجرای بعدی ★
systemctl status myjob.service       # آخرین اجرا + لاگ

sleepمکث بین دستورها

پیش‌فرض سیستم

توقف اجرا برای مدت مشخص؛ در حلقه‌های retry و اسکریپت‌های پایش.

terminal
sleep 5
sleep 2m && echo "دو دقیقه گذشت"
# retry با فاصله:
for i in 1 2 3; do curl -sf http://api/health && break; sleep 5; done

anacronاجرای وظایف جاافتاده (لپ‌تاپ‌ها)

پیش‌فرض سیستم

اگر سیستم در زمان cron خاموش بود، وظایف روزانه/هفتگی را بعد از روشن‌شدن اجرا می‌کند — درمان «هر هفته خاموش بود و بکاپ اجرا نشد».

terminal
cat /etc/anacrontab
#  1  5  cron.daily  nice run-parts /etc/cron.daily
sudo systemctl status anacron
🔗

25. SSH، انتقال فایل و تونل

8 دستور و مبحث

جعبه‌ابزار SSH

اتصال

ssh user@host · با کلید: بدون رمز ★

ساخت کلید

ssh-keygen -t ed25519

نصب کلید روی سرور

ssh-copy-id user@host

کپی فایل

scp ساده · rsync هوشمند · sftp تعاملی

پیکربندی

~/.ssh/config — اسم‌های کوتاه برای سرورها

پورت‌فوروارد

-L محلی · -R معکوس · -D پروکسی socks

sshشل رمزنگاری‌شده از راه دور

پیش‌فرض سیستم

استاندارد اتصال به سرورها؛ حمل‌کننده شل، فایل، پورت‌فوروارد و حتی VPN. با کلید + config تبدیل به تجربه‌ای یک‌کلیکی می‌شود.

گزینهکار
-p پورتپورت غیر ۲۲
-i کلیدفایل کلید خصوصی
-v / -vvvدیباگ اتصال
-L 8080:localhost:80پورت‌فوروارد محلی
-R 9000:localhost:3000فوروارد معکوس
-D 1080پروکسی SOCKS5
-Cفشرده‌سازی
-Xاجرای برنامه گرافیکی از راه دور
terminal
ssh [email protected]
ssh -p 2222 [email protected]
ssh -i ~/.ssh/id_ed25519 ali@host

# پورت‌فوروارد: دیتابیس سرور را روی 5433 لوکال ببین
ssh -L 5433:localhost:5432 ali@server
# حالا در psql لوکال: host=localhost port=5433

# معکوس: برنامه لوکال من را روی سرور باز کن (دمو!)
ssh -R 9000:localhost:3000 ali@server

# پروکسی امن برای مرورگر:
ssh -D 1080 -C -q ali@server
# تنظیم proxy socks5://localhost:1080 در مرورگر

ssh -X ali@desktop                       # برنامه GUI از راه دور
ssh -v ali@host 2>&1 | grep -i auth      # چرا لاگین نمی‌شود؟
💡
فایل ~/.ssh/config زندگی‌ات را تغییر می‌دهد:
terminal
Host prod
    HostName 203.0.113.10
    User ali
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

Host db
    HostName 10.0.0.5
    ProxyJump prod        # از طریق سرور prod به db برس
بعدش فقط: ssh prod و ssh db

ssh-keygenساخت و مدیریت کلیدهای SSH

پیش‌فرض سیستم

جفت‌کلید می‌سازد (خصوصی + عمومی). الگوریتم مدرن ed25519 سریع‌تر و امن‌تر از RSA قدیمی است.

گزینهکار
-t ed25519نوع کلید
-C توضیحبرچسب (معمولاً ایمیل)
-f fileنام فایل
-pتغییر passphrase
-l -fاثر انگشت کلید
-R hostپاک‌کردن host از known_hosts
terminal
ssh-keygen -t ed25519 -C "[email protected]"
# پیش‌فرض: ~/.ssh/id_ed25519 (خصوصی) و id_ed25519.pub (عمومی)
ls -l ~/.ssh/
# کلید خصوصی باید مجوز 600 داشته باشد:
chmod 600 ~/.ssh/id_ed25519
ssh-keygen -l -f ~/.ssh/id_ed25519.pub      # اثر انگشت
ssh-keygen -p -f ~/.ssh/id_ed25519          # تغییر رمز کلید
ssh-keygen -R 203.0.113.10                  # بعد از ری‌نصب سرور
⚠️
کلید خصوصی هرگز از دستگاهت بیرون نمی‌رود و هرگز به گیت/چت/ایمیل نمی‌رود. فقط فایل .pub روی سرورها می‌نشیند.

ssh-copy-idنصب کلید عمومی روی سرور

پیش‌فرض سیستم

کلید عمومی‌ات را به فایل authorized_keys سرور اضافه می‌کند؛ بعد از آن لاگین بدون رمز کار می‌کند.

terminal
ssh-copy-id [email protected]
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 ali@host
# تست: باید بدون رمز وارد شوی
ssh [email protected]
# سخت‌گیری امنیتی بعد از کارکردن کلیدها (دقت!):
# در /etc/ssh/sshd_config: PasswordAuthentication no

scpکپی فایل روی SSH

پیش‌فرض سیستم

cp اما بین دو دستگاه با رمزنگاری ssh. برای فایل‌های بزرگ/چندگانه rsync بهتر است.

گزینهکار
-P پورتپورت (حرف بزرگ!)
-i کلیدکلید
-rبازگشتی پوشه
-Cفشرده‌سازی
terminal
scp file.txt ali@host:/tmp/
scp -r myfolder ali@host:~/backup/
scp ali@host:/var/log/app.log ./            # از سرور به لوکال
scp -P 2222 -C big.bin ali@host:~/
scp file1.txt file2.txt ali@host:~/         # چند فایل

sftpانتقال تعاملی امن

پیش‌فرض سیستم

نشست تعاملی انتقال فایل روی ssh — با ls، cd، get و put مثل ftp قدیمی اما امن.

terminal
sftp ali@host
#  ls, cd, pwd, lls, lcd
#  get file.txt              # از سرور
#  put file.txt              # به سرور
#  get -r remote-folder/     # پوشه
#  bye                       # خروج

sshfsسوارکردن پوشه سرور به‌عنوان دیسک

نیاز به نصب
📦 نصب:sudo apt install sshfs

پوشه‌ای روی سرور را مثل درایو محلی mount می‌کند؛ با ویرایشگر خودت روی فایل‌های سرور کار می‌کنی.

terminal
mkdir ~/server-files
sshfs ali@host:/var/www ~/server-files
ls ~/server-files
fusermount -u ~/server-files        # جدا کردن

ssh-agentنگهبان کلیدها در حافظه

پیش‌فرض سیستم

یک بار passphrase کلید را می‌گیری و تا پایان نشست همه اتصال‌ها بی‌سؤال می‌شوند.

terminal
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519
ssh-add -l                  # کلیدهای بارگذاری‌شده
# در ترمینال‌های جدید دوباره همان eval $(ssh-agent) یا با keychain مدیریت کن

ssh-debugدیباگ خطاهای رایج SSH

پیشرفته

کارت مرجع برای رایج‌ترین خطاها و راه‌حل‌شان.

terminal
# Connection refused → سرویس sshd روشن نیست یا پورت/فایروال:
sudo systemctl status sshd ; sudo ss -tlnp | grep ssh
# Permission denied (publickey) → کلید/مجوز:
ls -l ~/.ssh          # روی سرور: 700 پوشه، 600 authorized_keys
sudo tail -f /var/log/auth.log    # ببین سرور چه می‌گوید
ssh -vvv user@host 2>&1 | grep -iE "offer|trying|denied"
# Host key verification failed → سرور ری‌نصب شده:
ssh-keygen -R "آی‌پی-سرور"   # و دوباره وصل شو
🛡️

26. امنیت: رمزنگاری و هش

11 دستور و مبحث

چند تمرین امنیتی پایه که همیشه باید رعایت شود

sha256sumبصمه (هش) فایل برای تأیید سلامت

پیش‌فرض سیستم

اثرانگشت فایل را می‌گیرد؛ برای چک‌کردن سالم‌بودن دانلودها و تشخیص تغییر فایل‌ها.

گزینهکار
-cبررسی بر اساس فایل لیست
-bحالت باینری
terminal
sha256sum ubuntu-24.04.iso
sha256sum *.tar.gz > hashes.txt
sha256sum -c hashes.txt          # بعداً همه را یک‌جا چک کن ★
# md5sum و sha1sum قدیمی‌ترند؛ برای امنیت sha256 به بالا

md5sum / base64هش سریع و انکودینگ متن

پیش‌فرض سیستم

md5sum برادر سریع‌تر و ناامن‌تر sha256sum است — هنوز برای مقایسه سریع دو فایل (نه امنیت) رایج است. base64 کاری با هش ندارد؛ داده باینری را به متن قابل‌چاپ تبدیل می‌کند، مثلاً برای گذاشتن یک عکس داخل JSON یا یک فایل env.

terminal
md5sum file.iso                    # هش سریع (فقط برای مقایسه، نه امنیت)
echo -n "ali" | md5sum              # هش یک رشته

base64 secret.png > secret.b64      # انکود فایل به متن
base64 -d secret.b64 > secret.png   # دیکود برگشت به باینری
echo -n "user:pass" | base64        # ساخت هدر Basic Auth ★
⚠️
base64 رمزنگاری نیست — فقط انکودینگ است و هرکسی در چند ثانیه دیکودش می‌کند. برای رمز واقعی، از gpg یا openssl enc استفاده کن.

gpgرمزنگاری و امضای OpenPGP

پیش‌فرض سیستم

رمزنگاری قوی فایل با رمز عبور یا کلید، امضای دیجیتال و مدیریت کلیدهای PGP.

گزینهکار
-cرمز متقارن با passphrase
-dرمزگشایی
-e -r گیرندهرمز با کلید عمومی گیرنده
--signامضا
--gen-keyساخت جفت‌کلید
terminal
gpg -c secrets.txt            # secrets.txt.gpg (سؤال رمز)
gpg -d secrets.txt.gpg > secrets.txt
gpg --gen-key                 # ساخت جفت‌کلید
gpg --list-keys
gpg -e -r [email protected] report.pdf      # فقط ali می‌تواند باز کند
gpg --verify file.tar.gz.sig file.tar.gz  # چک امضا ★
gpg --show-keys some-repo.asc             # کلید مخازن نرم‌افزاری

opensslجعبه‌ابزار TLS/رمزنگاری

پیش‌فرض سیستم

ساخت کلید و CSR، بازرسی گواهی سایت‌ها، تست اتصال TLS و رمزهای متقارن.

terminal
# گواهی و زنجیره یک سایت را ببین:
openssl s_client -connect example.com:443 -brief < /dev/null
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates -subject -issuer

# ساخت خودامضا برای داخلی:
openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365

# رندوم و هش:
openssl rand -hex 32          # کلید ۲۵۶ بیتی تصادفی
openssl rand -base64 24       # رمز قابل‌تایپ
echo -n "متن" | openssl dgst -sha256

ufwفایروال ساده Ubuntu

نیاز به نصب
📦 نصب:sudo apt install ufw

فایروال دوست‌داشتنی: سه دستور تا یک سرور ایمن. قانون طلایی: اول اجازه SSH، بعد فعال‌سازی!

گزینهکار
allow/denyاجازه/منع پورت یا سرویس
statusوضعیت و قوانین
enable/disableروشن/خاموش کل فایروال
deleteحذف قانون
limitمحدودسازی در برابر brute-force
terminal
sudo ufw allow OpenSSH            # اول این! ★
sudo ufw allow 80,443/tcp
sudo ufw allow from 10.0.0.0/24 to any port 22   # فقط شبکه داخلی
sudo ufw limit ssh                # ضد بروت‌فورس
sudo ufw enable
sudo ufw status numbered
sudo ufw delete 3                 # حذف قانون شماره ۳
sudo ufw default deny incoming

fail2banمسدودسازی خودکار IPهای مهاجم

نیاز به نصب
📦 نصب:sudo apt install fail2ban

لاگ‌های سرویس‌هایی مثل SSH را زیر نظر می‌گیرد و اگر یک IP چند بار پشت‌سرهم رمز اشتباه بزند، خودکار و موقتاً با iptables/nftables مسدودش می‌کند — مکمل خوبی برای ufw، چون آن فقط پورت باز/بسته می‌کند ولی رفتار مشکوک را نمی‌بیند.

terminal
sudo systemctl enable --now fail2ban
sudo fail2ban-client status               # لیست jailهای فعال
sudo fail2ban-client status sshd            # جزئیات jail مربوط به ssh

sudo fail2ban-client set sshd unbanip 1.2.3.4   # آزادکردن دستی یک IP
sudo tail -f /var/log/fail2ban.log                # مشاهده زنده تصمیم‌ها
💡
تنظیمات پیش‌فرض را هرگز مستقیم در jail.conf ویرایش نکن — یک کپی به‌نام jail.local بساز، چون آپدیت پکیج فایل conf را بازنویسی می‌کند.

firewall-cmdفایروال firewalld (RHEL/Fedora)

پیش‌فرض سیستم

فایروال استاندارد خانواده Red Hat با مفهوم zoneها و تغییر زنده.

terminal
sudo firewall-cmd --state
sudo firewall-cmd --list-all
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

unattended-upgradeآپدیت خودکار امنیتی

نیاز به نصب
📦 نصب:sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades

وصله‌های امنیتی خودکار نصب می‌شوند — مهم‌ترین تنظیم یک‌باره برای آرامش همیشگی سرورهای Ubuntu/Debian.

terminal
sudo unattended-upgrade --dry-run -d   # تست
cat /etc/apt/apt.conf.d/20auto-upgrades
sudo apt-mark hold nginx               # معاف‌کردن پکیج خاص از آپدیت خودکار

lynisادیت امنیتی سیستم

نیاز به نصب
📦 نصب:sudo apt install lynis

چک‌لیست خودکار hardening: صدها مورد را می‌سنجد و پیشنهاد دقیق می‌دهد.

terminal
sudo lynis audit system | less
sudo lynis audit system --quick | grep -i warning

visudoویرایش امن فایل sudoers

پیش‌فرض سیستم

تنها راه مجاز ویرایش /etc/sudoers: قبل از ذخیره سینتکس را چک می‌کند تا دسترسی sudo با یک تایپو قفل نشود.

terminal
sudo visudo
#  نمونه قوانین:
#  ali    ALL=(ALL) ALL                # همه دستورها با رمز
#  %devs  ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
#         ↑ گروه devs فقط ری‌استارت myapp بدون رمز
sudo visudo -c              # فقط اعتبارسنجی همه فایل‌ها

auditdردیابی رویدادهای امنیتی

نیاز به نصب
📦 نصب:sudo apt install auditd

ثبت خودکار رخدادهای امنیتی (چه کسی چه فایلی را عوض کرد) با قوانین دقیق — استاندارد بررسی‌های بعد از حادثه.

terminal
sudo auditctl -w /etc/passwd -p wa -k identity-change
sudo ausearch -k identity-change | tail
sudo aureport --auth            # گزارش لاگین‌ها
✏️

27. ویرایشگرهای متنی ترمینال

5 دستور و مبحث

کمترین چیزی که از vim باید بلد باشی

terminal
vim file.txt
#   دو حالت: حالت NORMAL (حرکت) و حالت INSERT (تایپ)
#   i            ورود به حالت تایپ
#   Esc          برگشت به حالت NORMAL
#   :w           ذخیره     :q خروج    :wq یا ZZ ذخیره و خروج
#   :q!          خروج بدون ذخیره (فرار!)
#   dd حذف خط    yy کپی خط   p چسباندن   u بازگردانی (undo)
#   /کلمه        جست‌وجو     n مورد بعدی
#   gg اول فایل  G آخر فایل  :5 رفتن به خط ۵
#   :%s/old/new/g   جایگزینی در کل فایل
ℹ️
در هر سرور اضطراری، vim (یا حداقل vi) حاضر است. همین چند کلید بالا کافی است تا هرگز گیر نکنی.

vimویرایشگر قدرتمند همه‌جاحاضر

پیش‌فرض سیستم

ویرایشگر حالت‌محور: با کلیدها حرکت و ویرایش می‌کنی نه با ماوس. منحنی یادگیری دارد ولی بعد از آن هیچ‌جای دیگر آرامش نمی‌دهی. روی هر سرور یونیکسی حاضر است.

گزینهکار
+نام‌فایلبازکردن و پرش به خط مشخص: vim +42 f.py
-d file1 file2حالت diff (مثل vimdiff)
-Rفقط‌خواندنی
terminal
vim notes.txt

# --- ویرایش مفید ---
#   ciw   تغییر کلمه زیر مکان‌نما (change inner word)
#   .     تکرار آخرین تغییر ★
#   v → حرکت → y   انتخاب بصری و کپی
#   >>    تورفتگی خط     :set number شماره خط
#   :split / :vsplit   دو فایل هم‌زمان  (Ctrl+w w جابه‌جایی)

vimdiff old.conf new.conf          # مقایسه بصری
vim +/ERROR app.log                # باز شود و برو به اولین ERROR
# پیکربندی مینیمال برای ~/.vimrc:
#   syntax on
#   set number relativenumber
#   set tabstop=4 shiftwidth=4 expandtab
#   set hlsearch incsearch ignorecase smartcase

nanoویرایشگر ساده و بی‌دردسر

پیش‌فرض سیستم

ویرایشگر عادی‌مثل‌نوت‌پد داخل ترمینال — همه میان‌برها پایین صفحه نوشته شده. برای ویرایش‌های سریع config عالی است.

terminal
nano /etc/hosts
#   Ctrl+O ذخیره (Enter تأیید) · Ctrl+X خروج
#   Ctrl+W جست‌وجو · Ctrl+K بریدن خط · Ctrl+U چسباندن
nano +10 script.py            # باز شدن از خط ۱۰
sudo nano /etc/ssh/sshd_config

microویرایشگر مدرن با میان‌برهای معمولی

نیاز به نصب
📦 نصب:sudo apt install micro # یا: curl getmicro.dev | sh

ویرایشگر ترمینالی با Ctrl+C/Ctrl+V واقعی، پشتیبانی ماوس، هایلایت سینتکس و افزونه — بدون حالت‌های عجیب vim.

terminal
micro app.py
#   Ctrl+S ذخیره · Ctrl+Q خروج · Ctrl+F جست‌وجو
#   Ctrl+Z undo مثل همیشه!

helixویرایشگر ترمینالی نسل جدید

نیاز به نصب
📦 نصب:sudo apt install helix # dnf: helix · pacman: helix

ویرایشگر modal بدون پیکربندی اولیه: LSP، tree-sitter و انتخاب چندمکانی از جعبه.

terminal
hx src/main.rs
#  :o فایل جدید · space f جست‌وجوی فایل · gd رفتن به تعریف

vimdiffمقایسه و ادغام بصری دو فایل

پیش‌فرض سیستم

دو فایل را کنار هم با هایلایت تفاوت‌ها باز می‌کند؛ برای حل تعارض‌های git ادغام مفید است.

terminal
vimdiff file_old.conf file_new.conf
#   ]c پرش به تفاوت بعدی    [c قبلی
#   :diffget  گرفتن از پنل دیگر   :diffput دادن به پنل دیگر
#   Ctrl+w w جابه‌جایی بین پنل‌ها    :qa خروج از همه

28. ابزارهای مدرن ترمینال

10 دستور و مبحث

ابزارهای مدرن که ارزش نصب دارند

جست‌وجوی تعاملی

fzf — فیلتر فازی هر چیزی، کلید Ctrl+R را زنده می‌کند

پرش بین پوشه‌ها

zoxidez نام به پرتکرارترین مسیر می‌پرد

ls رنگی‌تر

eza — آیکون، git status و درخت

cat با رنگ

bat — در بخش فایل‌ها معرفی شد

دیسک تعاملی

ncdu / duf — در بخش دیسک

مانیتور

btop — در بخش پروسه‌ها

این‌ها جایگزین‌های «دلسوزانه» ابزارهای کلاسیک‌اند: هیچ‌کدام حیاتی نیستند، ولی روزانه دقیقه‌ها وقت آزاد می‌کنند.

fzfفیلتر فازی تعاملی

نیاز به نصب
📦 نصب:sudo apt install fzf # dnf: fzf · pacman: fzf

هر لیستی (فایل‌ها، تاریخچه، خروجی) را با تایپ چند حرف زنده فیلتر می‌کند. بعد از نصبش Ctrl+R تاریخچه جادویی می‌شود و Ctrl+T نام فایل درج می‌کند.

گزینهکار
--multiانتخاب چندتایی
--previewپیش‌نمایش فایل سمت راست ★
--height 40%بازشدن در بخشی از صفحه
terminal
fzf                          # انتخاب فایل از کل پروژه
vim $(fzf)                   # بازکردن فایل انتخابی
git checkout $(git branch | fzf)
kill -9 $(ps aux | fzf | awk '{print $2}')
fzf --preview 'bat --color=always {}'   # با پیش‌نمایش رنگی
# جست‌وجو در تاریخچه با پیش‌نمایش:
history | fzf --tac

zoxideپرش هوشمند بین پوشه‌ها

نیاز به نصب
📦 نصب:sudo apt install zoxide # بعدش در .bashrc: eval "$(zoxide init bash)"

پوشه‌های پرتکرارت را یاد می‌گیرد؛ با z بخشی-از-نام مستقیم به همان مسیر می‌پری.

terminal
z projects        # به ~/work/projects اگر همیشه همان‌جا می‌روی
z web src         # الگوها را ترکیب کن
zi                # تعاملی با fzf

ezals نسل جدید

نیاز به نصب
📦 نصب:sudo apt install eza # یا باینری از GitHub eza-community/eza

لیست فایل‌ها با رنگ، آیکون، وضعیت git و نمای درختی داخلی.

terminal
eza -l --icons --git
eza --tree --level=2
eza -lah --sort=modified

lazygitرابط ترمینالی زیبا برای git

نیاز به نصب
📦 نصب:sudo apt install lazygit # یا باینری از GitHub jesseduffield/lazygit

کل git (استیج، کامیت، برنچ، rebase، تعارض) در یک نمای پنلی تعاملی — برای کارهای روزمره git سریع‌تر از خط فرمان است، ولی زیرنویس‌های متنی هندبوکِ git را جایگزین نمی‌کند.

terminal
lazygit
#  space استیج · c کامیت · push با P · پنل‌ها با اعداد ۱-۵
#  در نمای فایل: Enter دیدن diff · d دور انداختن تغییرات

glancesداشبورد همه‌منظوره مانیتورینگ

نیاز به نصب
📦 نصب:sudo apt install glances

در یک صفحه: CPU، RAM، شبکه، دیسک، دما، کانتینرها و هشدارهای رنگی. حالت سرور-کلاینت هم دارد.

terminal
glances
glances -w                 # حالت وب: مرورگر روی پورت 61208

cheat-shشیت‌شیت آنلاین از داخل ترمینال

پیشرفته

با curl از cheat.sh برای هر دستور، مثال‌های آماده می‌گیری — بدون نصب هیچ‌چیز (نیاز به اینترنت).

terminal
curl cheat.sh/tar
curl cheat.sh/find~/
curl cheat.sh/rsync      # «~» یعنی فقط بخش EXAMPLES

wtfutilداشبورد شخصی ترمینال

نیاز به نصب
📦 نصب:sudo apt install wtfutil

داشبورد ماژولار: ساعت، آب‌وهوا، باتری، git، kubernetes و… در یک نمای چیده‌شده.

terminal
wtfutil

deltaنمایش رنگی و کنارهم git diff

نیاز به نصب
📦 نصب:sudo apt install git-delta

جایگزین pager پیش‌فرض git diff: کنارهم (side-by-side)، هایلایت نحوی، و شماره خط — خواندن دیف‌های بزرگ را چند برابر راحت‌تر می‌کند.

terminal
# یک‌بار در ~/.gitconfig تنظیم کن، همیشه فعال بماند
git config --global core.pager delta
git config --global delta.side-by-side true

git diff                 # حالا خودکار با delta نمایش داده می‌شود
git log -p                # همینطور تاریخچه با دیف رنگی

gcc / make / cmakeکامپایل و ساخت کد سورس

نیاز به نصب
📦 نصب:sudo apt install build-essential cmake

پایه‌ی نصب هزاران پروژه از سورس. gcc یک فایل C/C++ را مستقیم کامپایل می‌کند؛ make بر اساس یک Makefile ترتیب کامپایل چند فایل را مدیریت می‌کند؛ cmake یک لایه بالاتر است که خودش Makefile (یا معادلش) را برای پلتفرم تو تولید می‌کند.

terminal
gcc hello.c -o hello && ./hello    # کامپایل مستقیم یک فایل
gcc -Wall -O2 main.c -o app         # با هشدارها + بهینه‌سازی

make                                  # اجرای Makefile در پوشه جاری
make install                           # نصب سیستمی بعد از build
make clean                              # پاک‌کردن فایل‌های ساخته‌شده

mkdir build && cd build                  # الگوی استاندارد cmake ★
cmake ..
make -j$(nproc)                            # کامپایل موازی با همه هسته‌ها
💡
وقتی یک README می‌گوید «./configure && make && make install»، دقیقاً همین سه ابزار پشتش هستند.

python3 / node / go / cargoاجرای مستقیم برنامه به زبان‌های دیگر

نیاز به نصب

اگر یک اسکریپت یا پروژه به این زبان‌ها گرفتی، این‌ها نقطه ورودشان از ترمینال‌اند: python3 مفسر پایتون، node اجرای مستقیم جاوااسکریپت خارج از مرورگر، go run/build برای Go، و cargo (همراه با کامپایلر rustc) برای Rust.

terminal
python3 script.py                # اجرای مستقیم
python3 -m http.server 8000        # وب‌سرور فوری برای تست ★
python3 -c "print(2**10)"           # یک خط کد بدون فایل

node app.js                          # اجرای جاوااسکریپت خارج مرورگر
node -e "console.log(1+1)"            # یک خط کد

go run main.go                          # کامپایل + اجرا در یک قدم
go build -o app main.go                  # فقط باینری خروجی

cargo new myproject                        # پروژه جدید Rust
cargo run                                    # کامپایل + اجرا
cargo build --release                          # باینری بهینه‌شده نهایی
🌿

29. Git — کنترل نسخه

23 دستور و مبحث

نقشه ذهنی گیت در ۶۰ ثانیه

گیت سه ناحیه دارد: Working Directory (فایل‌هایت)، Staging (آماده‌کامیت‌ها با git add) و Repository (تاریخچه با git commit). جریان روزمره:

terminal
git status            # الان کجا ایستاده‌ام؟ (همیشه اول بزن!)
git add file.py       # فایل به صحنه برود
git add -p            # تکه‌تکه انتخاب کن (حرفه‌ای‌ترین راه)
git commit -m "پیام"  # ثبت در تاریخچه
git push              # فرستادن به سرور (مثل GitHub)
git pull              # آوردن تغییرات دیگران

gitخودِ گیت + پیکربندی اولیه

پیش‌فرض سیستم

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

گزینهکار
config --globalتنظیمات همیشگی کاربر
initساخت مخزن جدید در پوشه فعلی
clone URLدانلود کامل یک مخزن با تاریخچه
--versionنسخه
terminal
git --version
git config --global user.name "Ali Rezaei"
git config --global user.email "[email protected]"
git config --global init.defaultBranch main
git config --global core.editor "nano"
git config --global --list

git init                        # مخزن جدید
git clone https://github.com/user/repo.git
git clone --depth 1 URL         # فقط آخرین نسخه (سریع برای مخازن عظیم)

git-statusوضعیت فعلی مخزن

پیش‌فرض سیستم

دوست صمیمی: چه فایل‌هایی عوض شده، چه چیزی روی صحنه است، در کدام برنچ هستی.

گزینهکار
-sخروجی کوتاه
-sbکوتاه + نام برنچ
terminal
git status
git status -s
git status -sb        # ## main...origin/main [ahead 2]

git-addآماده‌سازی تغییرات برای کامیت

پیش‌فرض سیستم

تغییرات را به ناحیه staging می‌برد؛ با -p تکه‌به‌تکه انتخاب می‌کنی — راه ساختن کامیت‌های تمیز.

گزینهکار
.همه تغییرات پوشه فعلی
-Aهمه تغییرات کل مخزن
-pتعاملی: هر تکه را بپرس ★
-uفایل‌های ردیابی‌شده (بدون جدیدها)
terminal
git add app.py
git add src/
git add -p                    # انتخاب تکه‌به‌تکه
git add -A
# اشتباه کردی؟ برگردان:
git restore --staged app.py

git-commitثبت تاریخچه

پیش‌فرض سیستم

عکس لحظه‌ای از صحنه را با پیام در تاریخچه ثبت می‌کند. پیام خوب: چه چیزی و چرا، در حد ۵۰ حرف.

گزینهکار
-mپیام مستقیم
-aخودکار add برای فایل‌های ردیابی‌شده
--amendاصلاح آخرین کامیت ★
--amend --no-editفقط اضافه‌کردن فایل به کامیت قبلی
terminal
git commit -m "Fix: خطای null در لاگین"
git commit -am "Refactor config loader"
git commit --amend -m "پیام درست‌تر"        # فقط قبل از push!
git add forgotten.txt && git commit --amend --no-edit
# فرمت متداول پیام:
#   feat: قابلیت جدید / fix: رفع باگ / docs / refactor / test / chore

git-logتاریخچه کامیت‌ها

پیش‌فرض سیستم

سفر در زمان پروژه: چه کسی، کی، چه چیزی را عوض کرد.

گزینهکار
--onelineیک خط برای هر کامیت
--graph --allنمای درختی همه برنچ‌ها ★
-n NN کامیت آخر
-p فایلتغییرات هر کامیت روی فایل
--authorفیلتر نویسنده
--since/--untilفیلتر زمان
terminal
git log
git log --oneline -10
git log --oneline --graph --all --decorate    # نقشه کامل ★
git log -p app.py                             # تاریخچه یک فایل
git log --author="Ali" --since="2 weeks ago"
git log --stat                                # با آمار فایل‌ها
git log -S "نام-تابع"                          # کی این را اضافه/حذف کرد؟

git-diffنمایش تفاوت‌ها

پیش‌فرض سیستم

چه چیزی عوض شده: بین کاری و صحنه، بین کامیت‌ها، بین برنچ‌ها.

گزینهکار
خالیکاری در برابر آخرین کامیت
--stagedتغییرات آماده‌کامیت
A Bبین دو کامیت/برنچ
--statخلاصه فایل‌ها
terminal
git diff
git diff --staged
git diff main..feature
git diff HEAD~1 -- app.py       # تغییرات کامیت آخر روی فایل
git diff --stat main..dev

git-branchمدیریت شاخه‌ها

پیش‌فرض سیستم

برنچ‌ها خط‌های موازی توسعه‌اند. ساخت، لیست، حذف.

گزینهکار
خالیلیست برنچ‌ها
نامساخت برنچ جدید
-d / -Dحذف امن / حذف اجباری
-aبا برنچ‌های ریموت
-mتغییر نام
terminal
git branch
git branch feature/login
git switch feature/login         # برو به برنچ
git branch -d old-feature
git branch -a
git branch -m old-name new-name
git branch --merged              # کدام‌ها ادغام شده‌اند (امن حذف)

git-switchجابه‌جایی بین برنچ‌ها (مدرن)

پیش‌فرض سیستم

جانشین کاربردی checkout برای سوییچ برنچ — واضح‌تر و امن‌تر.

گزینهکار
-cساخت + سوییچ ★
-برنچ قبلی
terminal
git switch main
git switch -c hotfix/header      # بساز و برو
git switch -                     # برگشت

git-mergeادغام برنچ‌ها

پیش‌فرض سیستم

تغییرات یک برنچ را به برنچ فعلی می‌آورد. تعارض‌ها را دستی حل می‌کنی و کامیت ادغام می‌سازی.

terminal
git switch main
git merge feature/login
#  تعارض؟ فایل‌های <<<<<<< دار را باز کن، حل کن، بعد:
git add resolved.py
git merge --continue
git merge --abort                # فرار از وسط ادغام
# مرتب نگه‌داشتن تاریخچه (به‌جای merge):
git rebase main

git-rebaseبازنویسی تمیز تاریخچه

پیشرفته

کامیت‌های برنچ را روی نوک برنچ دیگر می‌نشاند تا تاریخچه خطی و تمیز شود؛ با -i کامیت‌ها را ادغام/مرتب/ویرایش می‌کنی.

گزینهکار
-iتعاملی: squash/reorder/edit ★
--ontoجابه‌جایی پیشرفته
--continue/--abortادامه/فرار
terminal
git switch feature && git rebase main      # آپدیت با نوک main
git rebase -i HEAD~3          # سه کامیت آخر: squash و مرتب
# تعارض: حل کن → git add . → git rebase --continue
git rebase --abort            # همیشه راه برگشت
# بعد از rebase برنچ‌ی push شده: git push --force-with-lease
⚠️
هرگز برنچ‌های مشترک (مثل main تیم) را rebase/force-push نکن؛ تاریخچه‌ای که دیگران بر آن کار کرده‌اند را خراب می‌کنی. قانون: rebase فقط برای برنچ‌های شخصی و قبل از اشتراک.

git-remoteاتصال به مخازن راه دور

پیش‌فرض سیستم

مدیریت آدرس‌های ریموت (مثل origin روی GitHub).

terminal
git remote -v
git remote add origin [email protected]:user/repo.git
git remote set-url origin NEW-URL
git remote remove origin

git-pushفرستادن کامیت‌ها به ریموت

پیش‌فرض سیستم

تاریخچه محلی را به سرور می‌فرستد؛ اولین push با -u برنچ را متصل می‌کند.

گزینهکار
-u origin mainاولین push + اتصال برنچ ★
--force-with-leaseforce امن‌تر (چک می‌کند کسی جلو نزده)
--tagsبا تگ‌ها
--deleteحذف برنچ ریموت
terminal
git push
git push -u origin main
git push origin feature/login
git push --tags
git push origin --delete old-branch

git-pullآوردن و ادغام تغییرات ریموت

پیش‌فرض سیستم

دو کار در یک: fetch (آوردن) + merge (ادغام). برای تاریخچه تمیز: fetch بعد rebase.

terminal
git pull
git pull --rebase            # بدون کامیت ادغام ★
git fetch --all              # فقط آوردن، بدون ادغام
git log origin/main --oneline -5   # دیدن تغییرات ریموت قبل از ادغام

git-stashقفسه‌گذاری موقت تغییرات

پیش‌فرض سیستم

تغییرات نیمه‌کاره را کنار می‌گذارد تا برنچ عوض کنی و بعد برش گردانی — درمان «وسط کار هستم ولی باید فوری برنچ عوض کنم».

گزینهکار
push -mذخیره با پیام
listلیست قفسه‌ها
popبرگرداندن آخرین
apply stash@{n}برگرداندن بدون حذف
dropدور انداختن
terminal
git stash push -m "کار روی فرم لاگین"
git switch main     # برو کار دیگری بکن
git switch feature/login
git stash pop
git stash list
git stash pop stash@{2}

git-restoreبازگردانی فایل‌ها (مدرن)

پیش‌فرض سیستم

دور ریختن تغییرات کاری یا برداشتن فایل از صحنه — با هشدار: عملیات بازگشت‌ناپذیر روی تغییرات ذخیره‌نشده!

گزینهکار
--stagedفقط از صحنه بردار، تغییرات بماند ★
--source=HEAD~2از کامیت خاص برگردان
terminal
git restore app.py                 # تغییرات کاری را دور بریز
git restore --staged app.py        # از staging خارج کن (تغییرات بماند)
git restore --source=main app.py   # نسخه main را بیاور

git-resetحرکت نشانگر برنچ

پیشرفته

سه درجه: soft (کامیت‌ها باز شوند، تغییرات در صحنه)، mixed (پیش‌فرض؛ تغییرات کاری)، hard (همه‌چیز پاک).

گزینهکار
--softفقط کامیت‌ها باز شوند
--hardپاک‌سازی کامل به آن نقطه
HEAD~nn کامیت عقب
terminal
git reset --soft HEAD~1       # کامیت آخر را باز کن، تغییرات بمانند ★
git reset HEAD~1              # مثل soft ولی خارج از صحنه
git reset --hard origin/main  # هم‌سان‌سازی کامل با ریموت (خطر: محلی پاک!)

git-revertخنثی‌سازی امن یک کامیت

پیش‌فرض سیستم

به‌جای پاک‌کردن تاریخچه (مثل reset)، کامیت جدیدی می‌سازد که اثر کامیت قبلی را برمی‌گرداند — امن برای برنچ‌های مشترک.

terminal
git revert abc123
git revert HEAD               # آخرین کامیت خنثی شود
git revert -m 1 merge-commit  # خنثی‌سازی یک ادغام

git-blameکی این خط را نوشت؟

پیش‌فرض سیستم

برای هر خط فایل، کامیت و نویسنده‌اش را نشان می‌دهد — ابزار اصلی تحقیق درباره «این چرا این‌طوری است؟».

گزینهکار
-L 10,20فقط خط‌های ۱۰ تا ۲۰
-wنادیده‌گرفتن تغییرات فاصله
terminal
git blame app.py
git blame -L 40,60 app.py
git blame -w app.py | grep ali
# در IDEها هم دکمه blame دارید؛ همین دستور پشتش است

git-tagبرچسب نسخه‌ها

پیش‌فرض سیستم

نشان‌گذاری نقاط مهم تاریخچه مثل نسخه‌های منتشرشده (v1.2.0).

terminal
git tag
git tag v1.2.0
git tag -a v1.2.0 -m "نسخه پایدار"
git push origin v1.2.0
git show v1.2.0

git-cherry-pickانتخاب یک کامیت مشخص

پیشرفته

فقط یک کامیت خاص از برنچ دیگر را به برنچ فعلی می‌آورد — مثلاً بردن یک فیکس از برنچ توسعه به برنچ پایدار.

terminal
git cherry-pick abc123
git cherry-pick -n abc123     # بدون کامیت (فقط تغییرات)
git cherry-pick --continue    # بعد از حل تعارض

ghرسمی GitHub از ترمینال

نیاز به نصب
📦 نصب:sudo apt install gh && gh auth login

ساخت PR، مرور issueها و همه کارهای GitHub بدون مرورگر.

terminal
gh repo clone user/repo
gh pr create --fill
gh pr list
gh pr checkout 42
gh issue create -t "باگ لاگین" -b "توضیحات"
gh run watch                  # پیگیری اکشن‌ها

glabرسمی GitLab از ترمینال

نیاز به نصب
📦 نصب:sudo apt install glab && glab auth login

معادل gh برای اکوسیستم GitLab: ساخت Merge Request، مرور issueها و پیگیری pipelineها بدون مرورگر.

terminal
glab repo clone group/project
glab mr create --fill
glab mr list
glab mr checkout 42
glab issue create -t "باگ لاگین" -d "توضیحات"
glab pipeline ci view                # پیگیری زنده pipeline

gitignoreفایل .gitignore — چه چیزهایی وارد مخزن نشود

پیش‌فرض سیستم

الگوهای فایل‌های بی‌بالاست (buildها، رمزها، node_modules).

terminal
cat .gitignore
#  نمونه‌های رایج:
#  node_modules/
#  __pycache__/
#  *.log
#  .env
#  dist/
#  .DS_Store

git rm --cached file.txt      # فایل ردیابی‌شده را از این به بعد نادیده بگیر
git check-ignore -v file.txt  # کدام قانون این فایل را می‌گیرد؟
⚠️
فایل .env و هر کلید/رمزی هرگز به git نروند — حتی اگر بعداً پاکش کنی، در تاریخچه می‌ماند. اگر فاش شد: کلید را فوراً عوض کن.
🐳

30. Docker و کانتینرها

12 دستور و مبحث

واژه‌نامه داکر در یک نگاه

Image تصویر

قالب فقط‌خواندنی برنامه+وابستگی‌ها — مثل کلاس

Container کانتینر

یک نمونه در حال اجرای image — مثل شیء

Dockerfile

دستورالعمل ساخت image

Registry

انبار imageها: Docker Hub، ghcr.io

Volume

فضای ذخیره ماندگار بیرون از کانتینر

dockerموتور کانتینر

نیاز به نصب
📦 نصب:curl -fsSL https://get.docker.com | sh # یا: sudo apt install docker.io && sudo usermod -aG docker $USER

ساخت، اجرا و مدیریت کانتینرها. بعد از افزودن کاربر به گروه docker، برای اکثر دستورها sudo لازم نیست.

گزینهکار
psلیست کانتینرها
runاجرای کانتینر جدید
execاجرای دستور داخل کانتینر در حال اجرا
logsلاگ کانتینر
stop/start/restartکنترل چرخه حیات
rm / rmiحذف کانتینر / تصویر
buildساخت تصویر از Dockerfile
system pruneجاروی منابع بی‌استفاده
terminal
docker version
docker ps                      # کانتینرهای در حال اجرا
docker ps -a                   # همه حتی متوقف‌ها ★
docker run hello-world         # تست سلامت نصب
docker run -d --name web -p 8080:80 nginx
#   -d پس‌زمینه · --name اسم · -p پورت‌میزبان:پورت‌کانتینر
docker run -it --rm ubuntu bash      # محیط اوبونتو یک‌بارمصرف ★
docker exec -it web bash             # ورود به شل کانتینر در حال اجرا
docker logs -f --tail 50 web
docker stop web && docker rm web
docker system df                # چقدر فضا گرفته؟
docker system prune -a          # پاک‌سازی کامل (مواظب باش!)

docker-runگزینه‌های پرکاربرد run

نیاز به نصب

مرجع سریع مهم‌ترین فلگ‌های docker run که ۹۰٪ کارها را پوشش می‌دهند.

گزینهکار
-dپس‌زمینه (detached)
-itتعاملی با ترمینال
--rmبعد از توقف حذف شود
-p 8080:80انتقال پورت
-v /data:/app/dataاتصال پوشه میزبان به کانتینر
-e KEY=valمتغیر محیطی
--nameنام‌گذاری
--networkشبکه دلخواه
--restart=alwaysخودکار استارت بعد از کرش/بوت
terminal
# پایگاه داده با ماندگاری:
docker run -d --name db \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  --restart=always \
  postgres:16

# ابزار موقت با فایل‌های من:
docker run --rm -it -v "$PWD":/work -w /work python:3.12 bash
docker run --rm -v "$PWD":/data alpine ls /data
docker run --rm --network host curlimages/curl -s ifconfig.me

docker-composeچند کانتینر با یک فایل

نیاز به نصب
📦 نصب:همراه docker نصب می‌شود (پلاگین: docker compose)

کل استک پروژه (وب+db+کش) را در یک docker-compose.yml تعریف و با یک دستور بالا/پایین می‌بری.

terminal
docker compose up -d          # بالا آوردن همه سرویس‌ها ★
docker compose ps
docker compose logs -f web
docker compose exec web bash
docker compose down           # خاموشی (volumeها می‌مانند)
docker compose down -v        # با حذف داده‌ها (خطر!)
docker compose up -d --build  # بازسازی تصویر و اجرا
docker compose pull && docker compose up -d   # آپدیت تمیز

docker-buildساخت تصویر از Dockerfile

نیاز به نصب

از فایل Dockerfile یک تصویر قابل‌انتشار می‌سازد.

terminal
docker build -t myapp:1.0 .
docker build -t myapp:latest --no-cache .
#  Dockerfile مینیمال:
#  FROM python:3.12-slim
#  WORKDIR /app
#  COPY requirements.txt .
#  RUN pip install -r requirements.txt
#  COPY . .
#  CMD ["python", "app.py"]
docker image ls
docker tag myapp:1.0 user/myapp:1.0
docker push user/myapp:1.0

docker-imagesمدیریت تصاویر

نیاز به نصب

لیست، حذف و بازرسی تصاویر.

terminal
docker images
docker rmi nginx:latest
docker rmi $(docker images -f dangling=true -q)   # تصاویر بی‌برچسب
docker image prune -a
docker history myapp:1.0        # هر لایه چند بایت اضافه کرده؟

docker-logsلاگ کانتینر

نیاز به نصب

خروجی stdout/stderr پروسه اصلی کانتینر.

گزینهکار
-fزنده
--tail nn خط آخر
--sinceاز زمان مشخص
-tبا timestamp
terminal
docker logs web
docker logs -f --tail 100 web
docker logs --since 30m web | grep -i error

docker-statsمصرف زنده منابع کانتینرها

نیاز به نصب

مثل top ولی برای کانتینرها: CPU، RAM، شبکه و I/O هر کانتینر.

terminal
docker stats
docker stats --no-stream      # عکس لحظه‌ای

docker-inspectجزئیات کامل یک کانتینر/تصویر

نیاز به نصب

همه متادیتا به‌صورت JSON — با jq به هر چیزی می‌رسی.

terminal
docker inspect web | jq '.[0].State'
docker inspect web | jq -r '.[0].NetworkSettings.IPAddress'
docker inspect --format '{{.Config.Image}}' web

docker-cpکپی فایل بین میزبان و کانتینر

نیاز به نصب

مثل scp ولی به داخل/بیرون کانتینر — برای گرفتن فایل تولیدشده یا تزریق فایل.

terminal
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./config.yml web:/app/config.yml

docker-volumeماندگاری داده‌ها

نیاز به نصب

کانتینرها بی‌حافظه‌اند؛ volumeها داده‌ها را زنده نگه می‌دارند.

terminal
docker volume ls
docker volume create mydata
docker run -d -v mydata:/var/lib/mysql mysql
docker volume inspect mydata
docker volume prune            # حذف volumeهای بی‌صاحب (با احتیاط!)

docker-networkشبکه کانتینرها

نیاز به نصب

کانتینرهای روی یک شبکه custom با نام همدیگر را می‌بینند (DNS داخلی).

terminal
docker network ls
docker network create appnet
docker run -d --name db --network appnet postgres
docker run -d --name web --network appnet -p 8080:80 myapp
#   حالا web با نام «db» به دیتابیس می‌رسد!
docker network inspect appnet | jq '.[0].Containers'

podmanجایگزین بدون‌دیمون و rootless داکر

نیاز به نصب
📦 نصب:sudo apt install podman

همان تجربه‌ی داکر، ولی بدون یک دیمون مرکزی که با روت اجرا می‌شود — هر کانتینر پروسه‌ی مستقل خودش را دارد و می‌تواند کاملاً rootless (بدون sudo) اجرا شود. دستورهایش عمداً تقریباً یک‌به‌یک با docker یکسان‌اند.

terminal
alias docker=podman          # خیلی‌ها همین یک خط را کافی می‌دانند ★
podman run -d -p 8080:80 nginx
podman ps
podman images
podman build -t myapp .

podman generate systemd --new --name myapp   # ساخت unit سرویس از یک کانتینر
podman pod create --name mypod                 # گروه‌بندی چند کانتینر (شبیه Pod در K8s)
💡
چون دیمون مرکزی ندارد، اگر ترمینال بسته شود کانتینرهای rootless هم معمولاً متوقف می‌شوند؛ برای دائمی‌کردن، از podman generate systemd یا فلگ --restart استفاده کن.
🧩

31. Regex و الگوهای پیشرفته

2 دستور و مبحث

مرجع سریع Regex (عبارات باقاعده)

Regex زبان توصیف الگوهاست؛ grep، sed، awk، vim و تقریباً هر زبان برنامه‌نویسی آن را می‌فهمند. سه دیالکت اصلی: BRE (پیش‌فرض grep)، ERE (grep -E / sed -E) و PCRE (grep -P).

terminal
.        هر یک کاراکتر (به‌جز نویلاین)
^        شروع خط          $        پایان خط
*        صفر یا بیشتر از قبلی     +  یک یا بیشتر (ERE)
?        صفر یا یکی (ERE)          {2,5}  دو تا پنج بار
[abc]    یکی از a,b,c     [^abc]   هیچ‌کدام از این‌ها
[a-z0-9] بازه حروف و رقم‌ها
(...)    گروه (ERE)       \1 \2    ارجاع به گروه در BRE
|        یا منطقی (ERE):  cat|dog
\b       مرز کلمه         \s \w \d فاصله/کلمه/رقم (PCRE)
(?=...)  look-ahead مثبت  (?<=...) look-behind (PCRE)

# مثال‌های واقعی:
grep -E '^[A-Z]{3}[0-9]{4}$' codes.txt        # سه حرف بزرگ + چهار رقم
grep -Eo '[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}' f.txt   # ایمیل‌ها
grep -Eo 'https?://[^ ]+' page.txt            # لینک‌ها
grep -P '^\d{4}-\d{2}-\d{2}' log.txt         # خط‌های با تاریخ
sed -E 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/\3-\1-\2/g' f  # mm/dd/yyyy→yyyy-mm-dd

حریص بودن

کوانتیفایرها حریص‌اند: <.*> کل <a><b> را می‌بلعد. نسخه غیرحریص: <.*?> (PCRE)

کاراکترهای خاص

برای جست‌وجوی خودِ نقطه یا ستاره: \. و \* — یا با -F regex را خاموش کن

تست قبل از استفاده

سایت regex101.com را برای دیباگ PCRE و ERE دوست داشته باش

grep-practicesتمرین‌های ترکیبی regex در پایپ

پیشرفته

الگوهای آماده‌ی پرکاربرد که در لاگ و داده واقعی مکرر لازم می‌شوند.

terminal
# استخراج آی‌پی‌های منحصربه‌فرد از لاگ
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log | sort | uniq -c | sort -rn | head

# خطاهای با timestamp امروز
grep -E "^$(date +%F)" app.log | grep -i error

# شماره موبایل ایران
grep -Eo '09[0-9]{9}' contacts.txt | sort -u

# کدهای وضعیت HTTP و شمارش آن‌ها
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# حذف تگ‌های HTML ساده
sed -E 's/<[^>]+>//g' page.html

# اعداد فارسی به انگلیسی در یک خط
tr '۰۱۲۳۴۵۶۷۸۹' '0123456789' < file.txt

glob-vs-regexتفاوت Glob و Regex — کلاسیک‌ترین اشتباه

پیشرفته

Glob برای «نام فایل‌ها» است (شل تفسیرش می‌کند)؛ Regex برای «محتوای متن» (grep تفسیرش می‌کند). یک * در این دو معنی متفاوت دارد!

terminal
# GLOB — در نام فایل‌ها (ls, cp, find -name):
ls *.log                 # هر چیزی که به log ختم شود
find . -name "report?.pdf"

# REGEX — در متن (grep, sed):
grep '^Error.*timeout' app.log
grep -E 'user[0-9]+' users.txt

# در find هر دو دنیا ممکن است:
find . -regex '.*\.\(png\|jpg\)'     # regex روی کل مسیر
find . -name '*.png'                  # glob روی نام
📜

32. Bash Scripting کامل

7 دستور و مبحث

ساختار استاندارد یک اسکریپت حرفه‌ای

terminal
#!/usr/bin/env bash
# myscript.sh — توضیح کوتاه کاری که می‌کند
set -euo pipefail          # سه گنجشک در دست: سخت‌گیری کامل
IFS=$'\n\t'                # جداساز امن (اختیاری، پیشرفته)

# ─── توابع کمکی ───
log()  { printf '\e[32m[INFO]\e[0m %s\n' "$*"; }
err()  { printf '\e[31m[ERR ]\e[0m %s\n' "$*" >&2; exit 1; }
usage(){ cat << EOF
استفاده: $0 <ورودی> [خروجی]
EOF
}

# ─── اعتبارسنجی آرگومان ───
[[ $# -ge 1 ]] || { usage; exit 64; }
INPUT="$1"

# ─── پاک‌سازی در خروج (حتی وسط خطا) ───
TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT

# ─── بدنه ───
log "شروع پردازش $INPUT"
… 
log "تمام شد"

متغیرها و جایگذاری‌ها (expansion)

terminal
NAME="علی"                # تعریف: بدون فاصله دور از =
echo "سلام $NAME"          # استفاده داخل نقل‌قول ★
echo "${NAME}جان"          # جدا کردن مرز نام
echo "${NAME^^}"           # بزرگ‌کردن حروف
echo "${NAME:0:2}"         # دو کاراکتر اول
FILE="report.old.txt"
echo "${FILE%.*}"          # report.old    (حذف کوتاه‌ترین پسوند)
echo "${FILE##*.}"         # txt           (فقط پسوند)
echo "${FILE#report.}"     # old.txt       (حذف پیشوند)
BASE="${1:-پیش‌فرض}"        # اگر خالی/تعریف‌نشده بود → پیش‌فرض ★
: "${CONFIG:=/etc/app.conf}"   # اگر خالی بود مقدار بده
[[ -z "$X" ]] && echo "خالی"
[[ -n "$X" ]] && echo "پر"
${CMD:? "پارامتر الزامی است"}   # اگر خالی بود بکش با پیام

# جایگذاری دستور — خروجی دستور داخل رشته:
TODAY=$(date +%F)
COUNT=$(ls *.log 2>/dev/null | wc -l)
echo "امروز $TODAY و $COUNT لاگ داریم"
FILES=$(find . -name '*.py')     # برای خطوط: mapfile بهتر است
mapfile -t LINES < input.txt     # هر خط یک عضو آرایه ★

آرگومان‌ها و شرط‌ها

terminal
# ── آرگومان‌ها ──
echo "$0 = نام اسکریپت، $1 اولین آرگومان، $2 دومین"
echo "تعداد: $#   همه: $@"
FIRST="${1:?لازم است}"              # الزامی
shift                               # آرگومان‌ها را یک‌قدم جلو
DEFAULT="${2:-100}"                 # اختیاری با پیش‌فرض

# ── حلقه روی فلگ‌ها ──
while [[ $# -gt 0 ]]; do
  case "$1" in
    -v|--verbose) VERBOSE=1 ;;
    -o|--output)  OUT="$2"; shift ;;
    -h|--help)    usage; exit 0 ;;
    *)            err "آرگومان ناشناس: $1" ;;
  esac
  shift
done

# ── شرط‌ها ──
if [[ -f /etc/passwd ]]; then echo "فایل است"; fi
if [[ -d /tmp ]]; then … fi
if [[ "$A" == "$B" ]]; then … fi          # مقایسه رشته
if [[ "$A" != "x" && "$B" == "y" ]]; then … fi
if [[ "$A" =~ ^[0-9]+$ ]]; then echo "عدد است"; fi   # regex با =~ ★
if (( NUM > 5 )); then … fi               # مقایسه عددی

# جدول تست‌های فایل:
#  -e موجود · -f فایل · -d پوشه · -L لینک
#  -r خواندنی · -w نوشتنی · -x اجرایی
#  -s غیرخالی (اندازه>0) · file1 -nt file2 جدیدتر از

حلقه‌ها و case

terminal
# ── for روی لیست ──
for f in *.log; do
  [[ -e "$f" ]] || continue          # اگر glob چیزی نیافت
  echo "پردازش $f"
done

# ── for با بازه ──
for i in {1..10}; do echo "گام $i"; done
for i in $(seq 0 5 100); do echo "$i%"; done
for (( i=0; i<10; i++ )); do echo "$i"; done      # سبک C

# ── while با خواندن امن فایل ★ ──
while IFS= read -r line; do
  echo "خط: $line"
done < input.txt

# خواندن امن از پایپ (متغیرها بیرون حلقه هم می‌مانند):
while IFS= read -r line; do … done < <(grep pattern file)

# ── until ──
until ping -c1 -W1 8.8.8.8 &>/dev/null; do
  echo "صبر برای شبکه…" ; sleep 2
done

# ── case: جایگزین تمیز ifهای زنجیره‌ای ──
case "$1" in
  start)   echo "شروع" ;;
  stop)    echo "توقف" ;;
  restart) echo "ری‌استارت" ;;
  -h|--help) usage ;;
  *)       echo "دستور ناشناس: $1" >&2; exit 64 ;;
esac

توابع و آرایه‌ها

terminal
# ── توابع ──
greet() {
  local name="$1"                 # local حیاتی است!
  echo "سلام $name"
  return 0                        # فقط کد خروج 0-255
}
greet "علی"
RESULT=$(greet "سارا")             # خروجی تابع را بگیر

backup_dir() {
  local src="$1" dst="$2"
  [[ -d "$src" ]] || { echo "منبع نیست: $src" >&2; return 1; }
  tar -czf "$dst" -C "$(dirname "$src")" "$(basename "$src")"
}

# ── آرایه‌ها ──
SERVERS=("web1" "web2" "db1")
echo "${SERVERS[0]}"              # عضو اول
echo "${SERVERS[-1]}"             # آخرین
echo "${#SERVERS[@]}"             # تعداد
echo "${SERVERS[@]}"              # همه (نقل‌قولی: "${SERVERS[@]}" ★)
SERVERS+=("cache1")               # افزودن
for s in "${SERVERS[@]}"; do ping -c1 "$s"; done

# آرایه انجمنی (دیکشنری):
declare -A PORTS=( [web]=80 [db]=5432 [ssh]=22 )
echo "${PORTS[db]}"
for k in "${!PORTS[@]}"; do echo "$k → ${PORTS[$k]}"; done

ورودی کاربر، سیگنال‌ها و کدهای خروج

terminal
# ── read ──
read -r -p "نام تو: " NAME
echo "خوش آمدی $NAME"
read -r -s -p "رمز: " PASS ; echo        # -s مخفی‌کردن تایپ
read -r -t 5 -p "۵ ثانیه فرصت: " ANS || echo "(بی‌جواب)"
read -r -n 1 -p "ادامه؟ (y/n) " A ; echo

# ── trap: اجرای کار در برخورد سیگنال ──
cleanup() { rm -rf "$WORKDIR"; echo "پاک‌سازی شد"; }
trap cleanup EXIT INT TERM

# اسکریپت self-reload برای تغییر فایل config:
trap 'echo "ری‌لود…" ; exec "$0"' HUP

# ── کد خروج ──
ls /nonexistent 2>/dev/null
echo "$?"          # غیرصفر = شکست
exit 0             # موفق
exit 1             # خطای عمومی
exit 64            # آرگومان غلط (قرارداد sysexits)
exit 127           # دستور پیدا نشد  ·  126 اجرا نشدنی
somecmd || exit 1
somecmd || { echo "شکست" >&2; exit 1; }

دیباگ و امن‌نویسی

terminal
# ── دیباگ ──
bash -n script.sh            # فقط چک سینتکس
bash -x script.sh            # trace کامل گام‌به‌گام
bash -x script.sh 2> trace.log
# در نقطه دلخواه:
set -x    … منطقه مشکوک …    set +x
PS4='+ $(date +%T) L$LINENO: ' bash -x s.sh   # trace با زمان و خط

# ── قوانین امن‌نویسی ──
# ۱) همیشه "…" دور متغیرها:   "$FILE"  نه  $FILE
# ۲) مسیرهای مطلق در cron:      /usr/bin/rsync  نه  rsync
# ۳) فایل موقت فقط با mktemp
# ۴) ورودی کاربر را رد نکن به دستور خطرناک:
read -r DIR
case "$DIR" in ''|*[!a-zA-Z0-9_/-]*) echo "نام نامعتبر" >&2; exit 1;; esac
# ۵) eval فقط با اطمینان ۱۰۰٪ از محتوا — تقریباً هیچ‌وقت!
# ۶) chmod 750 برای اسکریپت‌های عملیاتی؛ رمزها را داخل اسکریپت نگذار
#    از فایل محافظت‌شده یا secret manager بخوان:
chmod 600 /etc/myapp/credentials && source /etc/myapp/credentials

خطاهای رایج Bash و درمان‌ها

VAR = 5

فاصله دور از = ممنوع! بنویس VAR=5

rm $FILE

بدون نقل‌قول با فاصله‌ها می‌شکند → rm "$FILE"

for f in $(ls)

با فاصله در نام فایل‌ها می‌شکند → for f in * یا find -print0

if [$X == y]

دور از [ فاصله لازم است → if [[ $X == y ]]

cd $dir && rm *

اگر cd شکست بخورد * در پوشه فعلی اجرا می‌شود → اول چک کن cd "$dir" || exit

echo $UNKNOWN

متغیر تایپویی خالیِ بی‌صدا → set -u فعال کن

cmd 2>file >file

هر دو به یک فایل = هم‌پوشانی → &>file یا >f 2>&1

while read; done < <(cmd)

داخل پایپ cmd | while متغیرها می‌پرند → از < <(cmd) استفاده کن

shellcheckلینت bash: اسکریپت‌ت را معاینه کن

نیاز به نصب
📦 نصب:sudo apt install shellcheck # یا افزونه ادیتور

تحلیلگر ایستای اسکریپت‌های شل: صدها باگ رایج را قبل از اجرا می‌گیرد. بعد از نصبش دیگر اسکریپتی بدون shellcheck پوش نکن!

گزینهکار
-S warningسطح شدت
-xاجازه follow کردن sourceها
terminal
shellcheck myscript.sh
shellcheck -S error scripts/*.sh
# خروجی هر مورد: شماره خط + توضیح + لینک wiki با راه‌حل

bash-best-practicesچک‌لیست اسکریپت آماده‌ی عملیات

پیشرفته

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

terminal
#!/usr/bin/env bash
# deploy.sh — الگوی آماده
set -euo pipefail
readonly SCRIPT_NAME=$(basename "$0")
readonly LOCK="/tmp/${SCRIPT_NAME}.lock"

log()  { printf '%s [INFO] %s\n' "$(date '+%F %T')" "$*"; }
die()  { printf '%s [FAIL] %s\n' "$(date '+%F %T')" "$*" >&2; exit 1; }
usage(){ echo "استفاده: $SCRIPT_NAME <environment>"; exit 64; }

[[ $# -eq 1 ]] || usage
ENV="$1"
case "$ENV" in prod|staging|dev) ;; *) die "محیط نامعتبر: $ENV";; esac

exec 9>"$LOCK"
flock -n 9 || die "یک نسخه دیگر در حال اجراست"

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT

log "دیپلوی به $ENV آغاز شد"
rsync -avh --delete --exclude='.git' build/ "deploy@$ENV:/srv/app/"
log 'دیپلوی موفق ✔'

export / env / printenv / unsetمتغیرهای محیطی (environment variables)

پیش‌فرض سیستم

متغیر معمولی فقط داخل همان شل زنده است؛ export آن را به محیط می‌برد تا هر پروسه فرزندی (اسکریپت، برنامه‌ای که صدا می‌زنی) هم ببیندش. env/printenv همه محیط فعلی را نشان می‌دهند، unset یک متغیر را کاملاً پاک می‌کند.

terminal
API_KEY="abc123"          # متغیر شل معمولی؛ فرزندها نمی‌بینندش
export API_KEY             # حالا هر فرزندی می‌بیندش
export DB_HOST=localhost DB_PORT=5432   # چند تا با هم

env                          # لیست کامل محیط
printenv PATH                 # فقط یک متغیر خاص
env VAR=x command             # اجرای یک دستور با یک متغیر موقت فقط برایش ★

unset API_KEY                  # پاک‌کردن کامل متغیر
💡
تفاوت کلیدی: تغییر یک متغیر export‌شده در اسکریپت فرزند، هرگز به شل والد برنمی‌گردد — هر پروسه محیط خودش را جدا کپی می‌کند.

read / trapگرفتن ورودی و واکنش به سیگنال

پیش‌فرض سیستم

read یک خط از ورودی (کاربر یا پایپ) را داخل متغیر می‌ریزد. trap یک تکه کد را به یک سیگنال (مثل Ctrl+C یا خروج اسکریپت) گیر می‌اندازد تا همیشه، حتی در خطا، پاک‌سازی انجام شود.

terminal
read -p "نام را وارد کن: " name    # نمایش پیام + گرفتن ورودی
read -s -p "رمز: " pass             # ورودی مخفی (بدون نمایش تایپ)
read -t 5 -p "سریع جواب بده: " ans   # با سقف زمانی ۵ ثانیه
while IFS= read -r line; do echo "$line"; done < file.txt  # خواندن فایل خط‌به‌خط ★

trap 'echo "در حال خروج..."; rm -f /tmp/lock' EXIT    # همیشه هنگام خروج
trap 'echo "Ctrl+C نادیده گرفته شد"' INT                # گرفتن Ctrl+C
trap - INT                                               # برگرداندن رفتار پیش‌فرض

exec / source / evalاجرای جایگزین، بارگذاری فایل، ارزیابی رشته

پیش‌فرض سیستم

سه ابزار قدرتمند و کمی خطرناک: exec پروسه فعلی را با یک پروسه جدید جایگزین می‌کند (بدون ساخت فرزند)، source (یا .) محتوای یک فایل را در همان شل جاری اجرا می‌کند — نه در یک زیرشل — و eval یک رشته متنی را به‌عنوان دستور واقعی اجرا می‌کند.

terminal
source ~/.bashrc          # اعمال تغییرات بدون باز کردن ترمینال جدید
. ./config.sh               # نقطه هم‌معنی source است

exec > log.txt 2>&1          # از این خط به بعد، همه خروجی/خطا برو تو فایل
exec 9>/tmp/my.lock           # باز کردن یک فایل روی توصیفگر ۹ برای flock

cmd="ls -la /tmp"
eval "$cmd"                    # اجرای رشته به‌عنوان دستور واقعی
⚠️
eval روی ورودی کاربر هرگز اجرا نکن — دقیقاً همان حفره‌ای‌ست که command injection را ممکن می‌کند. فقط روی رشته‌هایی که خودت ساخته‌ای.

declare / shift / getoptsتعریف متغیر تایپ‌دار و پارس‌کردن آرگومان

پیش‌فرض سیستم

declare متغیر را با یک ویژگی خاص (عدد صحیح، آرایه، فقط‌خواندنی) می‌سازد. shift آرگومان‌های ورودی اسکریپت ($1 $2 ...) را یکی به چپ می‌کشد. getopts یک حلقه‌ی رسمی برای خواندن گزینه‌های سبک -x/-f value می‌سازد — همان الگویی که خود دستورهای لینوکس استفاده می‌کنند.

terminal
declare -i count=0        # فقط عدد صحیح
declare -a arr=(a b c)      # آرایه
declare -r PI=3.14           # فقط‌خواندنی (ثابت)
declare -A map=([a]=1 [b]=2)  # آرایه انجمنی (key-value)

# shift: پردازش تعداد نامشخصی آرگومان
while [[ $# -gt 0 ]]; do
  echo "پردازش: $1"
  shift
done

# getopts: پارس رسمی گزینه‌ها
while getopts "f:v" opt; do
  case $opt in
    f) file="$OPTARG" ;;
    v) verbose=1 ;;
  esac
done

shopt / set / true / falseتنظیم رفتار شل و کدهای خروجی

پیش‌فرض سیستم

set و shopt سوییچ‌های رفتاری خود bash را روشن/خاموش می‌کنند (مثل همان set -euo pipefail که بالای هر اسکریپت حرفه‌ای می‌بینی). true/false دو دستور کاملاً خالی هستند که فقط کد خروجی موفق (۰) یا ناموفق (۱) برمی‌گردانند — برای حلقه‌های بی‌نهایت و تست شرط.

terminal
set -e            # با اولین خطا کل اسکریپت متوقف شود
set -u             # استفاده از متغیر تعریف‌نشده = خطا
set -x              # چاپ هر خط قبل از اجرا (دیباگ)
set -o pipefail      # اگر هر جای پایپ شکست، کل پایپ شکست‌خورده حساب شود

shopt -s globstar      # فعال‌کردن ** برای جست‌وجوی بازگشتی
shopt -s nullglob        # اگر wildcard چیزی پیدا نکرد، خالی بماند نه خودِ الگو

while true; do echo tick; sleep 1; done   # حلقه بی‌نهایت با true
command || false                            # اجبار کد خروجی ناموفق
☸️

33. Kubernetes و کانتینرها در مقیاس

7 دستور و مبحث

واژه‌نامه کوبورنتیز در ۹۰ ثانیه

Node نود

یک سرور (فیزیکی/مجازی) که کانتینرها رویش اجرا می‌شوند

Pod پاد

کوچک‌ترین واحد استقرار؛ معمولاً یک کانتینر (گاهی چندتای رفیق)

Deployment

مدیر پادها: چند نسخه، به‌روزرسانی غلتان، برگشت خودکار

Service سرویس

آدرس پایدار برای رسیدن به پادها (پادها می‌میرند و می‌آیند، سرویس ثابت است)

Namespace

پارتیشن منطقی داخل کلاستر برای جداسازی پروژه‌ها/تیم‌ها

Ingress

مسیریاب ترافیک HTTP از بیرون به سرویس‌ها

جریان کار: تو Deployment را تعریف می‌کنی ← کوبورنتیز مطمئن می‌شود همیشه همان تعداد پادِ سالم، همان‌طور که خواستی، اجرا می‌شود. اگر پادی مرد، فوراً جایگزین می‌شود.

ℹ️
برای تمرین محلی، سبک‌ترین راه kind (Kubernetes in Docker) است؛ minikube هم گزینه معروفی است.

kubectlکنترل‌پنل کوبورنتیز

نیاز به نصب
📦 نصب:sudo snap install kubectl --classic # یا: curl -LO 'https://dl.k8s.io/release/$(curl -sL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl'

دستور اصلی صحبت با کلاستر: دیدن منابع، اجرا، دیباگ. تقریباً هر کاری با همین یک باینری انجام می‌شود.

گزینهکار
getلیست منابع: pods, nodes, svc, deploy, ns
describeجزئیات کامل یک منبع + رویدادها
apply -fایجاد/به‌روزرسانی از فایل YAML
deleteحذف منبع
configمدیریت کلاسترها و کاربران (context)
-n ns / -Aدر یک namespace خاص / همه namespaceها
terminal
kubectl version --client
kubectl cluster-info                    # کجا وصلیم؟
kubectl config get-contexts             # کلاسترهای پیکربندی‌شده
kubectl config use-context prod         # سوییچ به کلاستر prod
kubectl get nodes -o wide               # نودها با نسخه و IP
kubectl get pods -A                     # همه پادهای همه namespaceها ★
kubectl get deploy,svc,ingress -n web   # چند نوع منبع با هم
kubectl get events --sort-by=.metadata.creationTimestamp | tail   # آخرین رخدادهای کلاستر
💡
alias پیشنهادی برای .bashrc: alias k=kubectl و alias kgp='kubectl get pods' — ساعت‌ها تایپ کمتر.

kubectl-applyاستقرار با مانفست YAML

نیاز به نصب

حالت اعلامی (declarative): تو حالت مطلوب را در YAML می‌نویسی، کوبورنتیز خودش راه رسیدن به آن را می‌رود. اساس GitOps هم همین است.

terminal
kubectl apply -f deployment.yaml
kubectl apply -f ./k8s/                 # کل پوشه مانفست‌ها
kubectl apply -f - << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels: {app: web}
  template:
    metadata:
      labels: {app: web}
    spec:
      containers:
        - name: web
          image: nginx:1.27
          ports:
            - containerPort: 80
          resources:
            requests: {cpu: 100m, memory: 128Mi}
            limits:   {cpu: 500m, memory: 256Mi}
EOF
kubectl get deploy web
kubectl scale deploy web --replicas=5   # تغییر مقیاس فوری
kubectl edit deploy web                 # ویرایش زنده
kubectl delete -f deployment.yaml

kubectl-debugدیباگ پادها

نیاز به نصب

جعبه‌ابزار چهارگانه وقتی «اپلیکیشن کار نمی‌کند»: لاگ، شل، رویدادها و تونل محلی.

terminal
kubectl logs -f deploy/web --tail=100     # لاگ زنده
kubectl logs deploy/web --previous        # لاگ نمونه قبلیِ کرش‌کرده ★
kubectl exec -it deploy/web -- sh         # ورود به پاد
kubectl describe pod web-7d9f8b6c5-x2p4k  # رویدادها: چرا Pending است؟ ★
kubectl port-forward deploy/web 8080:80   # تست از لوکال
kubectl cp default/web-...:/var/log/a.log ./a.log
kubectl top pods                          # مصرف CPU/RAM پادها
💡
اگر پاد در وضعیت Pending یا CrashLoopBackOff است، ۹۰٪ جواب در kubectl describe pod بخش Events است — همیشه اول آنجا را بخوان.

kubectl-rolloutبه‌روزرسانی غلتان و برگشت

نیاز به نصب

تغییر نسخه بدون قطعی: کوبورنتیز پادهای جدید را کم‌کم بالا می‌آورد و قدیمی‌ها را می‌خواباند؛ اگر خراب شد، یک دستور برمی‌گردی.

terminal
kubectl set image deploy/web web=nginx:1.28
kubectl rollout status deploy/web         # پیشرفت را دنبال کن
kubectl rollout history deploy/web        # نسخه‌های قبلی
kubectl rollout undo deploy/web           # برگشت فوری ★
kubectl rollout undo deploy/web --to-revision=2
kubectl rollout restart deploy/web        # چرخش همه پادها (مثلاً بعد از تغییر secret)

k9sرابط ترمینالی زیبا برای کلاستر

نیاز به نصب
📦 نصب:باینری از GitHub: curl -sS https://webinstall.dev/k9s | bash # یا snap install k9s --classic

کل کلاستر در یک TUI: پادها، لاگ‌ها، شل، دیپلوی‌ها با کلیدهای میان‌بر و رفرش زنده — بعد از kubectl عادی، دنیا فرق می‌کند.

terminal
k9s
#  :pods        لیست پادها    :deploy     دیپلوی‌ها
#  l روی پاد    لاگ زنده       s           شل داخل پاد
#  d            describe      Ctrl+d       حذف
#  :xray        نمای درختی منابع

helmمدیر پکیج کوبورنتیز

نیاز به نصب
📦 نصب:curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

نصب اپلیکیشن‌های کامل روی کلاستر با «چارت‌ها» — مثل apt ولی برای کوبورنتیز؛ با قالب‌بندی و نسخه‌بندی.

terminal
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm search repo nginx
helm install my-ingress ingress-nginx/ingress-nginx -n ingress --create-namespace
helm list -A
helm upgrade my-ingress ingress-nginx/ingress-nginx
helm rollback my-ingress 1
helm uninstall my-ingress -n ingress

kindکلاستر محلی داخل داکر

نیاز به نصب
📦 نصب:curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 && chmod +x kind && sudo mv kind /usr/local/bin/

یک کلاستر کوبورنتیز کامل داخل Docker برای تمرین و CI — سبک‌ترین راه تجربه kubectl بدون سرور.

terminal
kind create cluster --name dev
kubectl cluster-info --context kind-dev
kind create cluster --config kind-config.yaml   # چند نودی
kind get clusters
kind delete cluster --name dev
🧱

34. nftables و iptables — فایروال سطح پایین

5 دستور و مبحث

مسیر یک بسته در فایروال لینوکس

terminal
شبکه → PREROUTING (nat) → ┬→ FORWARD (فیلتر) → POSTROUTING → بیرون
                              └→ INPUT (فیلتر) → برنامه محلی
برنامه محلی → OUTPUT (فیلتر) → POSTROUTING → بیرون

جدول‌ها:  filter (قبول/رد) · nat (تغییر آدرس/پورت) · mangle (دستکاری خاص)

iptables

رابط کلاسیک — هنوز همه‌جاحاضر، سینتکس معروف

nftables

جانشین رسمی (از ۲۰۱۴): سینتکس تمیزتر، عملکرد بهتر، IPv4/6 یکجا

ufw/firewalld

پوسته‌های دوستانه — در بخش امنیت آشنا شدی؛ اینجا زیرشان کار می‌کنیم
⚠️
هرگز روی سرور راه دور، اول سیاست DROP نگذار بعد قانون SSH را اضافه کن — خودت را از کلاستر بیرون می‌کنی! همیشه اول ACCEPT ssh بعد POLICY DROP.

iptablesفایروال کلاسیک (فیلتر)

پیش‌فرض سیستم

سینتکس قدیمی اما هنوز رایج: زنجیره‌های INPUT/OUTPUT/FORWARD، قانون به قانون از بالا به پایین — اولین تطبیق برنده است.

گزینهکار
-L -n -vلیست قوانین با آمار
-A / -I / -Dافزودن به انتها / درج اول / حذف
-Pسیاست پیش‌فرض زنجیره
-p tcp --dportپروتکل و پورت مقصد
-s / -dIP مبدأ / مقصد
-m conntrackمبتنی بر وضعیت اتصال
-jپرش: ACCEPT/DROP/REJECT
terminal
sudo iptables -L -n -v --line-numbers       # دیدن قوانین با شماره ★
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT       # اول ssh!
sudo iptables -A INPUT -p tcp --dport { ممنوع } 2>/dev/null || true
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT                   # loopback آزاد
sudo iptables -P INPUT DROP                              # بعد از بالاها!
sudo iptables -D INPUT 3                                 # حذف قانون شماره ۳
sudo iptables -F                                         # فلش همه (خیلی مواظب!)
⚠️
iptables -F و سپس قطع‌شدن SSH = قفل بیرون در. روی سرور راه دور، قوانین را اول با اسکریپت کامل اعمال کن و یک جلسه backup (مثلاً در tmux) باز داشته باش. تفاوت DROP و REJECT: DROP سکوت می‌کند، REJECT پیام رد می‌فرستد.

iptables-natNAT و پورت‌فوروارد با iptables

پیش‌فرض سیستم

جدول nat: تغییر آدرس‌ها و پورت‌ها — اشتراک اینترنت برای LAN، فوروارد پورت به سرور داخلی.

terminal
# ۱) فورواردینگ را روشن کن:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# ۲) اشتراک اینترنت (کل LAN از این سرور بیرون برود):
sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

# ۳) فوروارد پورت 8080 بیرون به سرور داخلی 10.0.0.5:80:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 10.0.0.5:80
sudo iptables -A FORWARD -p tcp -d 10.0.0.5 --dport 80 -j ACCEPT

sudo iptables -t nat -L -n -v                # دیدن جدول nat

nftفایروال مدرن nftables

پیش‌فرض سیستم

جانشین رسمی iptables: سینتکس منسجم، جدول‌های خانواده inet (v4+v6 یکجا) و قواعد مجموعه‌ای. در توزیع‌های جدید زیر ufw/firewalld همین نشسته است.

گزینهکار
list rulesetهمه قوانین فعلی ★
add table/chain/ruleساخت سلسله‌مراتب: جدول ← زنجیره ← قانون
flush rulesetپاک‌کردن همه (با احتیاط)
-f fileبارگذاری از فایل
terminal
sudo nft list ruleset                        # وضعیت فعلی

# یک فایروال کامل تمیز (چند خطی):
sudo nft -f - << 'EOF'
flush ruleset
table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    iif "lo" accept
    ct state established,related accept
    tcp dport 22 accept
    tcp dport { 80, 443 } accept
    ip protocol icmp accept
    counter log drop
  }
}
EOF

# دستورات موردی:
sudo nft add rule inet filter input tcp dport 8080 accept
sudo nft add rule inet filter input ip saddr 203.0.113.50 drop
sudo nft list chain inet filter input
sudo nft -a list ruleset                     # با handleها برای حذف
sudo nft delete rule inet filter input handle 12

nftables-persistماندگاری قوانین بعد از ریبوت

پیش‌فرض سیستم

قوانین iptables/nft با ریبوت پر می‌شوند مگر در فایل پیکربندی ذخیره و سرویسشان فعال کنی.

terminal
# nftables:
sudo nft list ruleset | sudo tee /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nft -f /etc/nftables.conf               # تست بارگذاری

# iptables (پکیج iptables-persistent):
sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

# ترجمه یک قانون قدیمی به سینتکس جدید:
sudo iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT

conntrackردیاب اتصال‌های شبکه

نیاز به نصب
📦 نصب:sudo apt install conntrack

جدول همه اتصال‌های زنده‌ای که فایروال دنبال می‌کند — برای دیباگ NAT و فهمیدن بار فایروال.

terminal
sudo conntrack -L | head                     # اتصال‌های فعال
sudo conntrack -L -p tcp --dport 443 | wc -l # چند اتصال TLS؟
sysctl net.netfilter.nf_conntrack_count      # تعداد فعلی
sysctl net.netfilter.nf_conntrack_max        # سقف — پر شدنش یعنی رد شدن اتصال‌ها!
🚀

35. تیونینگ و بهینه‌سازی عملکرد

7 دستور و مبحث

دستور کار تیونینگ: حدس نزن، اندازه بگیر!

ترتیب مقدس: ۱) پایه (baseline) بگیر ← ۲) یک تغییر بده ← ۳) دوباره اندازه بگیر ← ۴) جواب نگرفتی؟ برگردان. تغییرات هم‌زمان یعنی هیچ‌وقت نفهمی کدام کار کرد.

پایه سیستم

vmstat، iostat، free — در بخش مانیتورینگ

پروفایل برنامه

perf — دقیقاً کدام تابع CPU می‌خورد؟

تست بار

stress-ng — سقف سیستم را بشکن، در محیط آزمایش!

تنظیم کرنل

sysctl — swap، بافرها، صف‌های شبکه

سقف پروسه‌ها

ulimit / LimitNOFILE

قدرت پردازنده

cpupower — گاورنر performance

sysctl-tuningتنظیم‌های عملی کرنل

پیش‌فرض سیستم

پرتکرارترین sysctlهایی که روی سرورهای واقعی تنظیم می‌شوند — با توضیح اینکه هر کدام چه دردی دوا می‌کند.

terminal
# ── حافظه ──
sysctl vm.swappiness                     # پیش‌فرض 60؛ دیتابیس‌ها: 1-10
sudo sysctl -w vm.swappiness=10
sysctl vm.vfs_cache_pressure             # پیش‌فرض 100؛ زیرش کش inode را زود می‌تراشد
sysctl vm.dirty_ratio vm.dirty_background_ratio   # روی هارد کند، کمترش کن

# ── شبکه (سرورهای پرترافیک) ──
sysctl net.core.somaxconn                # صف accept؛ وب‌سرور سنگین: 4096
sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.ipv4.tcp_fastopen             # 3 = فعال TFO در دو جهت
sysctl net.ipv4.ip_local_port_range      # پورت‌های خروجی زیاد لازم؟

# ── دائمی‌سازی ──
sudo tee /etc/sysctl.d/99-tuning.conf << 'EOF'
vm.swappiness = 10
vm.vfs_cache_pressure = 50
net.core.somaxconn = 4096
net.ipv4.tcp_fastopen = 3
EOF
sudo sysctl --system                     # بارگذاری همه فایل‌ها
⚠️
هر sysctl بر بار کاری تو بستگی دارد؛ کورکورانه کپی نکن. بعد از هر تغییر، زیر بار واقعی دوباره vmstat و iostat بگیر.

ulimitسقف منابع پروسه‌ها

پیش‌فرض سیستم

سقف فایل‌های باز و منابع هر پروسه. خطای کلاسیک Too many open files دقیقاً از همین‌جا می‌آید.

terminal
ulimit -n                    # سقف فایل باز این شل
ulimit -a                    # همه سقف‌ها
# بالا بردن دائمی برای کاربران (فایل limits.conf):
sudo tee -a /etc/security/limits.conf << 'EOF'
appuser  soft  nofile  65535
appuser  hard  nofile  131072
EOF
# برای سرویس‌های systemd، در خود unit:
#   [Service]
#   LimitNOFILE=65535
prlimit --pid 1234 | head    # محدودیت‌های یک پروسه زنده
# تست سریع سقفِ فعلی:
bash -c 'ulimit -n; ls /proc/$$/fd | wc -l'

perfپروفایلر رسمی لینوکس

نیاز به نصب
📦 نصب:sudo apt install linux-tools-common linux-tools-generic

پاسخ علمی به «چرا کند است؟»: نمونه‌گیری زنده از توابع در حال اجرا، شمارنده‌های CPU و نمودار شعله.

گزینهکار
statشمارنده‌های یک دستور
topنمای زنده توابع پر‌مصرف ★
record/reportضبط + گزارش تمیز
listرویدادهای قابل اندازه‌گیری
terminal
perf stat ls -R /usr > /dev/null         # شمارنده‌های CPU برای یک دستور
sudo perf top                            # کدام تابع الان CPU می‌خورد؟ ★
sudo perf record -F 99 -g -p 1234 -- sleep 30   # ۳۰ ثانیه از پروسه ۱۲۳۴
perf report                              # گزارش تعاملی
sudo perf record -F 99 -a -g -- sleep 10 # کل سیستم
# خروجی record برای flamegraph (پروژه FlameGraph در گیت‌هاب) هم استفاده می‌شود

stress-ngتست فشار سیستم

نیاز به نصب
📦 نصب:sudo apt install stress-ng

سیستم را زیر بار مصنوعی می‌گذارد تا سقف‌ها را ببینی و مطمئن شوی مانیتورینگ و autospacing درست کار می‌کند — فقط روی محیط آزمایش!

terminal
stress-ng --cpu 4 --timeout 60s --metrics-brief      # فشار CPU
stress-ng --vm 2 --vm-bytes 1G --timeout 30s         # فشار حافظه
stress-ng --hdd 2 --hdd-bytes 1G --timeout 60s       # فشار دیسک
stress-ng --cpu 8 --io 4 --vm 2 --timeout 2m --metrics-brief   # ترکیبی
# حین اجرا در ترمینال دوم: watch -d free -h و vmstat 1

cpupowerکنترل فرکانس و گاورنر CPU

نیاز به نصب
📦 نصب:sudo apt install linux-tools-common linux-tools-generic

گاورنر پیش‌فرض (powersave/schedutil) روی سرور می‌تواند تأخیر اضافه بدهد؛ گاورنر performance فرکانس را بالا نگه می‌دارد.

terminal
cpupower frequency-info                    # فرکانس و گاورنر فعلی
sudo cpupower frequency-set -g performance # قفل روی حداکثر ★
cpupower idle-info                         # حالت‌های خواب CPU
# بازگشت:
sudo cpupower frequency-set -g schedutil

fstrimنگهداری SSD

پیش‌فرض سیستم

SSDها برای حفظ سرعت به TRIM دوره‌ای نیاز دارند؛ در توزیع‌های مدرن تایمر هفتگی فعال است — فقط مطمئن شو.

terminal
systemctl status fstrim.timer          # فعال است؟ (پیش‌فرض هفتگی)
sudo fstrim -av                        # اجرای دستی همه پارتیشن‌ها
journalctl -u fstrim.service | tail    # آخرین اجرا چند بود؟

hdparmتست سرعت خام دیسک

پیش‌فرض سیستم

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

terminal
sudo hdparm -Tt /dev/sda
#  -T: کش پردازنده   -t: خواندن واقعی دیسک
sudo hdparm -I /dev/sda | grep -iE "model|serial|speed"
⚠️
بقیه گزینه‌های hdparm (مثل -y و امن‌ترهایش) مستقیماً روی دیسک اثر می‌گذارند؛ برای تست سرعت فقط -Tt کافی است.
🐍

36. محیط‌های پایتون (venv و اکوسیستم)

5 دستور و مبحث

چرا فقط pip install کافی نیست؟

نصب مستقیم با pip در سطح سیستم، دو مشکل می‌سازد: پروژه‌ای که نسخه قدیمی کتابخانه می‌خواهد با پروژه‌ای که جدید می‌خواهد جنگ می‌کنند، و توزیع‌های جدید (PEP 668) اصلاً اجازه نصب سیستم‌سطح نمی‌دهند. راه‌حل‌ها:

venv

محیط مجازی رسمی پایتون — پایه همه‌چیز ★

pipx

نصب ایزوله ابزارهای CLI پایتونی (شل‌شده در سیستم)

pyenv

چند نسخه پایتون کنار هم (3.10، 3.12، …) و سوییچ بین‌شان

uv

نسل جدید فوق‌سریع: جایگزین pip/venv/pip-tools در یک ابزار

poetry

مدیریت کامل پروژه: وابستگی + build + انتشار

venvمحیط مجازی رسمی پایتون

پیش‌فرض سیستم

برای هر پروژه یک پایتونِ جدا با کتابخانه‌های خودش. جریان کاری استانداردی که تقریباً هر پروژه پایتونی از آن استفاده می‌کند.

terminal
# ساخت و فعال‌سازی
python3 -m venv .venv
source .venv/bin/activate          # پرامپت (.venv) می‌گیرد
which python                       # داخل .venv/bin/python است ★
python -V

# کار داخل محیط — بدون sudo!
pip install requests pandas
pip list
pip freeze > requirements.txt      # ثبت نسخه‌های دقیق
pip install -r requirements.txt    # بازسازی در جای دیگر
deactivate

# حذف کامل محیط = پاک‌کردن پوشه:
rm -rf .venv
# در ~/.bashrc میان‌بر بگذار:
#   alias venv='python3 -m venv .venv && source .venv/bin/activate'
💡
پوشه .venv را به .gitignore اضافه کن؛ محیط‌ها با requirements.txt بازسازی می‌شوند نه با کپی. در VSCode، پایتون مفسری را از .venv/bin/python انتخاب کن.

uvهمه‌چیز-در-یک پایتونِ فوق‌سریع

نیاز به نصب
📦 نصب:curl -LsSf https://astral.sh/uv/install.sh | sh # یا: pip install uv

ابزار نسل جدید به زبان Rust: ساخت محیط و نصب پکیج ده‌ها برابر سریع‌تر، با کش هوشمند. در پروژه‌های جدید به‌سرعت دارد استاندارد می‌شود.

terminal
uv venv                            # ساخت .venv
source .venv/bin/activate
uv pip install requests            # مثل pip ولی برق‌آسا
uv pip install -r requirements.txt
uv pip freeze
# مدیریت کامل پروژه (بدون activate هم کار می‌کند):
uv init myproject && cd myproject
uv add requests
uv run python main.py              # محیط خودکار ساخته/همگام می‌شود

pipxابزارهای CLI پایتونی ایزوله

نیاز به نصب
📦 نصب:sudo apt install pipx && pipx ensurepath

برنامه‌های خط‌فرمانی پایتونی (مثل httpie، black، cowsay پایتونی) را هرکدام در محیط جدا نصب می‌کند ولی دستورشان سراسری در دسترس است — پایان جنگ وابستگی‌های ابزارها.

terminal
pipx install httpie
pipx install black
pipx install yt-dlp
pipx list
pipx upgrade black
pipx run pycowsay مOOO             # اجرای موقت بدون نصب!

pyenvچند نسخه پایتون کنار هم

نیاز به نصب
📦 نصب:curl https://pyenv.run | bash # بعدش مواعد .bashrc را طبق راهنمای خودش انجام بده

پایتون 3.10 برای پروژه قدیمی، 3.12 برای جدید، 3.13 برای تست — pyenv همه را نصب و per-project سوییچ می‌کند.

terminal
pyenv install --list | grep " 3\.12"     # نسخه‌های موجود
pyenv install 3.12.7
pyenv install 3.13.1
pyenv global 3.12.7                # پیش‌فرض کل سیستم کاربر
pyenv local 3.13.1                 # فقط این پوشه (فایل .python-version)
pyenv versions
python -V

poetryمدیریت کامل پروژه پایتونی

نیاز به نصب
📦 نصب:curl -sSL https://install.python-poetry.org | python3 -

وابستگی‌ها، محیط مجازی، build و انتشار در یک فایل pyproject.toml — استاندارد رایج پروژه‌های کتابخانه‌ای.

terminal
poetry new mylib && cd mylib        # یا: poetry init در پروژه موجود
poetry add requests
poetry add --group dev pytest
poetry install                      # محیط خودش را هم می‌سازد
poetry run pytest
poetry run python -m mylib
poetry build                        # ساخت wheel/sdist برای انتشار
🧬

37. systemd پیشرفته: نوشتن unit حرفه‌ای

5 دستور و مبحث

آناتومی یک unit فایل حرفه‌ای

terminal
# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp — وب‌سرویس داخلی
Documentation=https://wiki.example.com/myapp
After=network-online.target            # ترتیب: بعد از این‌ها
Wants=network-online.target            # «دوستش دارم» (اگر مرد، من هم نمی‌میرم)
Requires=postgresql.service            # «وابسته‌ام» (اگر مرد، من هم ری‌استارت)

[Service]
Type=notify                            # برنامه آماده‌بودن را خودش خبر می‌دهد
User=appuser
Group=appuser
WorkingDirectory=/opt/app
EnvironmentFile=-/etc/myapp/env        # خط تیره: اگر نبود هم خطا نده
ExecStartPre=/opt/app/bin/migrate --check
ExecStart=/opt/app/bin/server --port 8000
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure                     # فقط در خرابی؛ RestartSec=5
RestartSec=5
LimitNOFILE=65535

# ── سندباکس امنیتی (کم‌کم سختگیر شو) ──
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/myapp

[Install]
WantedBy=multi-user.target

Type=simple

پیش‌فرض؛ ExecStart خودِ پروسه اصلی است

Type=exec

مثل simple ولی تا exec نشود «بالا» حساب نمی‌شود (پایدارتر)

Type=forking

برنامه‌های قدیمی که خودشان دیمون می‌شوند؛ با PIDFile=

Type=oneshot

یک‌بار اجرا و تمام — مناسب اسکریپت‌های مقدماتی/بکاپ

Type=notify

برنامه با sd_notify آماده‌بودن را اعلام می‌کند (سرویس‌های سریع)

unit-anatomyچرخه کامل ساخت و ویرایش سرویس

پیشرفته

جریان استاندارد: بنویس ← reload کن ← فعال کن ← لاگ بگیر. محل فایل‌ها و قوانین override را هم بدان.

terminal
# ۱) فایل در /etc/systemd/system/ بنویس (نه /usr/lib!)
sudo nano /etc/systemd/system/myapp.service
# ۲) بعد از هر تغییر:
sudo systemctl daemon-reload
# ۳) تست سینتکس و استارت:
sudo systemctl enable --now myapp
systemctl status myapp
journalctl -u myapp -f

# ویرایش بدون دست‌زدن به فایل اصلی (drop-in ★):
sudo systemctl edit myapp
#   فایل /etc/systemd/system/myapp.service.d/override.conf می‌سازد
#   فقط بخش‌هایی که override می‌کنی را بنویس:
#   [Service]
#   MemoryMax=512M
sudo systemctl cat myapp        # فایل اصلی + overrideهای اعمال‌شده
# برگرداندن override:
sudo systemctl revert myapp

unit-sandboxingسندباکس امنیتی سرویس‌ها

پیشرفته

systemd می‌تواند هر سرویس را داخل قفس امنیتی اجرا کند: دسترسی حداقلی به فایل‌سیستم، بدون privilege جدید، با شعاع عمل محدود. حتی اگر برنامه hack شود، خسارت در قفس می‌ماند.

گزینهکار
ProtectSystem=strictکل فایل‌سیستم فقط‌خواندنی
ReadWritePathsاستثناهای نوشتنی (فقط مسیر داده سرویس)
PrivateTmp=true/tmp خصوصی برای سرویس
NoNewPrivileges=trueممنوعیت sudo/suid داخل سرویس
ProtectHome=trueپوشه‌های home نامرئی
CapabilityBoundingSet=صفر کردن capabilityهای روت
terminal
# به override سرویس اضافه کن:
sudo systemctl edit myapp
#   [Service]
#   NoNewPrivileges=true
#   ProtectSystem=strict
#   ProtectHome=true
#   PrivateTmp=true
#   ReadWritePaths=/var/lib/myapp /var/log/myapp
#   CapabilityBoundingSet=
#   RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

sudo systemctl restart myapp
systemd-analyze security myapp          # نمره امنیتی ۱-۱۰ ★
# نمره پایین = چه چیزی باز مانده؛ با راهنمایش سختگیرترش کن
systemd-analyze security | head -20     # نمره همه سرویس‌ها کنار هم

unit-templatesunitهای قالبی (@) — چند نمونه از یک تعریف

پیشرفته

با نام@.service یک قالب می‌نویسی و با نام@چیز ده‌ها نمونه می‌سازی — مثلاً یک worker برای هر صف. شناسه بعد از @ در %i می‌نشیند.

terminal
sudo tee /etc/systemd/system/[email protected] << 'EOF'
[Unit]
Description=MyApp worker برای صف %i
After=network-online.target

[Service]
Type=simple
User=appuser
ExecStart=/opt/app/bin/worker --queue %i --concurrency 4
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now myworker@emails
sudo systemctl enable --now myworker@sms
sudo systemctl enable --now myworker@reports
systemctl list-units 'myworker@*'        # همه نمونه‌ها ★
journalctl -u myworker@emails -n 20

unit-socketsفعال‌سازی سوکتی — سرویس وقتی مشتری بیاید بالا می‌آید

پیشرفته

systemd خودش پورت را گوش می‌دهد؛ با اولین اتصال، سرویس را استارت می‌کند و سوکت را تحویلش می‌دهد. نتیجه: راه‌اندازی سریع‌تر بوت، صف‌بندی اتصال‌های هنگام ری‌استارت سرویس، بدون قطعی.

terminal
sudo tee /etc/systemd/system/myapp.socket << 'EOF'
[Unit]
Description=Socket for myapp

[Socket]
ListenStream=8000
Backlog=128

[Install]
WantedBy=sockets.target
EOF

# سرویس بدون Listen خودش؛ سوکت را روی fd ورثه می‌گیرد:
sudo tee /etc/systemd/system/myapp.service << 'EOF'
[Unit]
Description=MyApp socket-activated

[Service]
ExecStart=/opt/app/bin/server --fd $LISTEN_FDS
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.socket
systemctl status myapp.socket

systemd-analyzeتحلیل بوت و سلامت unitها

پیش‌فرض سیستم

چه چیزی بوت را کند کرده؟ کدام سرویس کند است؟ کدام unit فایل خراب دارد؟ جعبه‌ابزار تحلیلی systemd.

terminal
systemd-analyze                        # کل زمان بوت
systemd-analyze blame                  # هر سرویس چند ثانیه؟ ★
systemd-analyze critical-chain         # زنجیره گلوگاه
systemd-analyze verify myapp.service   # چک سینتکس فایل‌ها
systemd-analyze security myapp         # نمره امنیتی سرویس
systemd-analyze plot > boot.svg        # نمودار زمانی بوت (توی مرورگر ببین)
🚑

38. سناریوهای عملی عیب‌یابی

1 دستور و مبحث

سناریو ۱: سرور بالا است ولی سایت باز نمی‌شود

terminal
# ۱) سرویس واقعاً روشن است؟
systemctl status nginx
# ۲) روی کدام پورت گوش می‌دهد؟
sudo ss -tlnp | grep -E ':80|:443'
# ۳) از داخل سرور جواب می‌دهد؟ (شبکه داخلی سالم؟)
curl -sI http://localhost | head -3
# ۴) فایروال اجازه می‌دهد؟
sudo ufw status
# ۵) لاگ‌ها چی می‌گویند؟
journalctl -u nginx -n 30
tail -20 /var/log/nginx/error.log
# ۶) دیسک پر نشده؟ (nginx با دیسک پر گاهی پاسخ نمی‌دهد)
df -h /var
# ۷) پورت از بیرون باز است؟ (از دستگاه خودت)
nc -zv SERVER_IP 80
ℹ️
۹۰٪ مواقع جواب یکی از این‌هاست: سرویس مرده، پورت بسته، دیسک پر، یا config خراب بعد از تغییر.

سناریو ۲: دیسک پر شده

terminal
# ۱) کدام پارتیشن؟
df -h | grep -v tmpfs
# ۲) کدام پوشه؟ (از ریشه یک‌قدم‌به‌قدم)
sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -10
sudo du -xh --max-depth=1 /var | sort -rh | head
# ۳) لاگ‌های غول؟
sudo du -sh /var/log/* | sort -rh | head
sudo journalctl --vacuum-size=200M       # کوچک‌سازی journal
sudo find /var/log -name "*.gz" -mtime +14 -delete
# ۴) فایل حذف‌شده که هنوز جا گرفته؟
sudo lsof +L1 | grep deleted
# ۵) کش apt:
sudo apt clean
# ۶) داکر؟ (معمولاً مقصر بزرگ)
docker system df
docker system prune -a --volumes   # فقط اگر مطمئنی!

سناریو ۳: سرور کند است — گلوگاه کجاست؟

terminal
# ترتیب کلاسیک: CPU؟ RAM؟ دیسک؟ شبکه؟
uptime                # بار با تعداد هسته مقایسه شود
vmstat 1 5            # r=صف CPU ، wa=انتظار دیسک ، si/so=swap
free -h               # available و swap
iostat -x 1 3         # %util دیسک‌ها
ps aux --sort=-%cpu | head    # مقصرهای CPU
ps aux --sort=-%mem | head    # مقصرهای RAM
# dmesg برای OOM Killer:
sudo dmesg -T | grep -i "killed process"
# اگر swap پرشده ولی RAM آزاد هم هست (آرام و غیرعادی):
vmstat 1              # si/so پایدار غیر صفر = thrashing

سناریو ۴: کاربر «اجازه دسترسی ندارم» می‌گیرد

terminal
# ۱) مالکیت و مجوز فایل واقعی چیست؟
ls -l /path/file
namei -l /path/to/file        # مجوز کل زنجیره پوشه‌ها ★
# ۲) کاربر در گروه درست است؟
id username
groups username
# ۳) ACL چیزی را مخفی کرده؟
getfacl /path/file
# ۴) SELinux (RHEL) / AppArmor (Ubuntu)؟
getenforce 2>/dev/null          # RHEL: Enforcing?
sudo aa-status 2>/dev/null | head
# ۵) فقط‌خواندن بودن فایل‌سیستم (دیسک خطادار):
mount | grep " /path"
dmesg | tail -20

سناریو ۵: سرویس بالا نمی‌آید (failed)

terminal
# ۱) وضعیت دقیق + چند خط آخر لاگ:
systemctl status myapp
# ۲) لاگ کامل از بوت:
journalctl -u myapp -b --no-pager | tail -50
# ۳) پرتکرارترین علل:
#   پورت اشغال    → sudo ss -tlnp | grep :PORT
#   دیسک پر       → df -h
#   config خراب   → nginx -t ; sshd -t ; mysqld --validate-config
#   مجوز فایل key → chmod 600 ; chown
#   وابستگی پایین‌دستی مرده → systemctl status postgresql
# ۴) سرویس را دستی با خروجی زنده اجرا کن:
sudo -u appuser /opt/app/bin/start --foreground
# ۵) بعد از رفع:
sudo systemctl reset-failed myapp
sudo systemctl restart myapp

troubleshoot-flowالگوی کلی عیب‌یابی (هر مشکل، هر سیستم)

پیشرفته

چارچوب ذهنی که ادمین‌های باتجربه به‌صورت خودکار اجرا می‌کنند — ترتیب را حفظ کن؛ پریدن از وسط یعنی گم‌شدن.

terminal
۱. چه تغییری اخیراً انجام شد؟        (۹۰٪ مشکلات انسانی‌اند!)
۲. دقیقاً چه چیزی کار نمی‌کند و از کی؟
۳. لایه‌به‌لایه از پایین: سخت‌افزار/دیسک → شبکه → سرویس → اپ
۴. هر فرضیه را با یک دستور تأیید/رد کن، حدس‌زنی ممنوع
۵. لاگ‌ها را بخوان — درست بخوان، نه نگاه کن
۶. یک تغییر در هر لحظه + ثبت هر تغییر
۷. اگر حل شد: بنویس چه شد (runbook) تا دفعه بعد ۵ دقیقه‌ای حل شود

39. چک‌لیست‌های ادمینی

1 دستور و مبحث

چک‌لیست ادمین روزانه (نسخه ۵ دقیقه‌ای)

سلامت کلی

uptime · df -h · free -h

سرویس‌ها

systemctl --failed — هیچ چیز قرمز نباشد

امنیت

sudo last -20 لاگین‌های مشکوک؟ · apt list --upgradable | grep -i securi

بکاپ

آخرین بکاپ موفق کی بود؟ ls -lh /backup

لاگ‌ها

journalctl -p err --since today

مصرف

docker stats --no-stream · du -sh /var/log

چک‌لیست هفتگی

⚠️
بکاپی که هرگز بازیابی‌اش را تست نکرده‌ای، بکاپ نیست؛ امید است.

morning-ritualآیین صبحگاهی سرور (اسکریپت آماده)

پیشرفته

همه چک‌های روزانه در یک اسکریپت که می‌توانی در cron بگذاری یا صبح بزنی.

terminal
#!/usr/bin/env bash
# daily-check.sh — خلاصه سلامت سرور
set -u
BAR="──────────────────────────────"
sec(){ echo; echo "◆ $1"; echo "$BAR"; }

sec "بار سیستم"
uptime
sec "دیسک‌ها"
df -h -x tmpfs -x devtmpfs
sec "حافظه"
free -h
sec "سرویس‌های خراب"
systemctl --failed --no-legend || true
sec "خطاهای امروز"
journalctl -p err --since today --no-pager | tail -15
sec "آخرین لاگین‌ها"
last -n 8 -w
sec "به‌روزرسانی در انتظار"
apt list --upgradable 2>/dev/null | tail -n +2 | head -10
🔐

40. OpenSSH کامل: کل مجموعه و زیرفرمان‌ها

15 دستور و مبحث

خانواده OpenSSH — همه اعضا در یک نگاه

سمت کاربر

ssh · scp · sftp · ssh-keygen · ssh-add · ssh-agent · ssh-keyscan · sshfs · sshuttle

سمت سرور

sshd + فایل‌های پیکربندی /etc/ssh/sshd_config و کلیدهای میزبان در /etc/ssh/ssh_host_*

فایل‌های کاربر

~/.ssh/id_ed25519 کلید · known_hosts اثرانگشت سرورها · authorized_keys کلیدهای مجاز · config تنظیمات

پورت

پیش‌فرض TCP/22 — روی دستگاه‌های نزدیک (LAN) معمولاً اول باید sshd نصب/روشن شود

sshdسرور SSH — اجرا، تست و دیباگ

پیش‌فرض سیستم

سمت سرور اتصال‌ها. برای وصل‌شدن به دستگاه نزدیک (لپ‌تاپ دوم، رزبری‌پای، سرور آزمایشگاهی) اول باید همین نصب و روشن باشد.

گزینهکار
-tتست سینتکس config (بدون اجرا) ★
-Tچاپ کل پیکربندی مؤثر نهایی (با همه پیش‌فرض‌ها)
-Dاجرا در پیش‌زمینه — برای دیباگ و systemd
-d / -ddحالت دیباگ پرجزئیات — چرا اتصال رد می‌شود؟
-p پورتاجرای موقت روی پورت دیگر
-E fileلاگ در فایل مشخص
terminal
# نصب و راه‌اندازی روی دستگاهی که می‌خواهی بهش وصل شوی:
sudo apt install openssh-server
sudo systemctl enable --now ssh

sudo sshd -t                       # بعد از هر تغییر config: تست
sudo sshd -T | grep -iE "permitroot|passwordauth|port "   # پیکربندی مؤثر
sudo sshd -T | grep -i listenaddress

# دیباگ وقتی اتصال نمی‌گیرد (روی سرور، پورت موقت 2222):
sudo /usr/sbin/sshd -d -p 2222
# حالا از کلاینت: ssh -p 2222 user@host — خطاها جلوی چشم است

# کلیدهای میزبان (اثرانگشت سرور):
ls -l /etc/ssh/ssh_host_*
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
# بازتولید کلیدهای میزبان (ری‌نصب تمیز):
sudo rm /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server

ssh-configپیکربندی سمت سرور: sshd_config

پیش‌فرض سیستم

فایل پیکربندی سرور. الگوی امنِ استاندارد برای سرورهای واقعی:

terminal
sudo nano /etc/ssh/sshd_config
#  ── ستون فقرات یک پیکربندی امن ──
#  Port 22                      # یا یک پورت غیرعادی (فقط کم‌کردن نویز، نه امنیت)
#  AddressFamily any
#  PermitRootLogin no           # ورود مستقیم روت ممنوع ★
#  PasswordAuthentication no    # فقط کلید ★
#  PubkeyAuthentication yes
#  KbdInteractiveAuthentication no
#  MaxAuthTries 3
#  LoginGraceTime 30
#  AllowUsers ali sara          # یا AllowGroups ssh-users
#  X11Forwarding no
#  ClientAliveInterval 60       # زنده نگه‌داشتن اتصال‌ها
#  ClientAliveCountMax 3
#  MaxSessions 10
#  Subsystem sftp /usr/lib/openssh/sftp-server

sudo sshd -t && sudo systemctl restart ssh
ss -tlnp | grep :22              # تأیید گوش‌دادن
# پس از اطمینان از کارکردن کلیدها، رمز را ببند (خط PasswordAuthentication بالا)
# فایل‌های مرتبط: /etc/ssh/sshd_config.d/*.conf (overrideهای پکیج‌ها)
⚠️
قبل از بستن PasswordAuthentication، با یک ترمینال دوم مطمئن شو لاگین کلیدی کار می‌کند؛ وگرنه از سرور بیرون می‌مانی.

ssh-addمدیریت کلیدها داخل ssh-agent

پیش‌فرض سیستم

کلید خصوصی را به agent حافظه می‌دهد تا هر بار passphrase نپرسد؛ عمر کلید در حافظه را هم می‌توانی محدود کنی.

گزینهکار
fileافزودن کلید مشخص
-t 1hانقضای کلید از حافظه بعد از مدت
-l / -Lلیست اثرانگشت‌ها / کلیدهای عمومی
-d / -Dحذف یک کلید / همه
-x / -Xقفل با رمز / بازکردن agent
-cتأیید برای هر استفاده
terminal
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519
ssh-add -t 4h ~/.ssh/id_ed25519       # بعد از ۴ ساعت دوباره بپرس
ssh-add -l
ssh-add -D                             # فراموشی همه کلیدها
# اگر آیکون قفل: ssh-add -x برای قفل، -X برای بازکردن
# کلید جیمیل‌مانند متعدد؟ همه را اضافه کن؛ ssh خودش امتحان می‌کند
ssh-add -L                             # کلیدهای عمومی برای کپی در سرورها

ssh-keygen-subsزیرفرمان‌های ssh-keygen — مرجع کامل

پیش‌فرض سیستم

ssh-keygen فقط «ساخت کلید» نیست؛ مجموعه‌ای از زیرفرمان‌ها دارد برای مدیریت کل چرخه حیات کلیدها.

terminal
# ساخت — انواع کلید:
ssh-keygen -t ed25519 -C "ali@laptop"
ssh-keygen -t rsa -b 4096 -m PEM          # rsa برای سیستم‌های قدیمی
ssh-keygen -t ecdsa -b 521
ssh-keygen -f ~/.ssh/work_key              # نام فایل دلخواه

# مدیریت:
ssh-keygen -l -f ~/.ssh/id_ed25519.pub          # اثرانگشت (پیش‌فرض SHA256)
ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub   # اثرانگشت قدمی (برای مقایسه با سایت‌ها)
ssh-keygen -p -f ~/.ssh/id_ed25519              # تغییر/حذف passphrase
ssh-keygen -c -f ~/.ssh/id_ed25519 -C "new@comment"
ssh-keygen -y -f ~/.ssh/id_ed25519              # استخراج کلید عمومی از خصوصی ★
ssh-keygen -F 192.168.1.10                      # جست‌وجو در known_hosts
ssh-keygen -R 192.168.1.10                      # حذف از known_hosts (بعد از ری‌نصب سرور)
ssh-keygen -A                                   # ساخت همه کلیدهای میزبان (sudo)

# تبدیل فرمت:
ssh-keygen -e -f id_rsa.pub                     # خروجی RFC4716 (برای ابزارهای دیگر)
ssh-keygen -p -N "" -f key                      # حذف passphrase (بدون تعاملی)

ssh-keyscanازپیش‌ثبت‌کردن اثرانگشت سرورها

پیش‌فرض سیستم

قبل از اولین اتصال، کلید میزبان سرور را می‌گیرد و در known_hosts می‌گذارد — حذف پیام «The authenticity of host…» برای اسکریپت‌ها و دستگاه‌های نزدیک.

terminal
ssh-keyscan -t ed25519 192.168.1.50 >> ~/.ssh/known_hosts
ssh-keyscan -p 2222 -t rsa,ed25519 server.local
ssh-keyscan -H 192.168.1.50            # با هش‌شدن نام میزبان (حریم بیشتر)
# به‌همراه کلید عمومی خودت، راه‌اندازی بدون سؤال برای رزبری‌پای:
ssh-keyscan raspberrypi.local >> ~/.ssh/known_hosts 2>/dev/null
ssh-copy-id [email protected]

sftp-fullsftp — مرجع همه دستورهای تعاملی

پیش‌فرض سیستم

sftp یک شل کامل فایلی است؛ این‌ها همه فرمان‌های داخل نشست هستند (حرف l = سمت لوکال):

گزینهکار
get/put [-r] [-a]دانلود/آپلود — r بازگشتی، a ادامه نیمه‌کاره
ls/lls · cd/lcdپیمایش ریموت/لوکال
pwd/lpwdمسیر فعلی ریموت/لوکال
mkdir/lmkdir · rm/rmdirساخت و حذف
mv/rename · ln -sجابه‌جایی و لینک
chmod/chown/chgrpمجوز و مالکیت ریموت
df [-h] · duفضا و حجم ریموت
reget/reputادامه انتقال نیمه‌کاره
terminal
sftp -P 2222 ali@server
sftp [email protected]

# داخل نشست:
pwd ; lpwd ; ls -la ; lls
cd /var/www ; lcd ~/projects
get index.html
get -r photos/                  # پوشه کامل
put app.tar.gz
put -r ./dist/ /srv/app/
reget big.iso                   # ادامه دانلود نیمه‌کاره
rename old.txt new.txt ; ln -s /srv/releases/latest current
chmod 640 app.conf ; df -h .

# حالت دسته‌ای — بدون تعامل (برای اسکریپت):
cat > sftp-batch.txt << 'EOF'
cd /srv/incoming
put -r ./backup/
bye
EOF
sftp -b sftp-batch.txt ali@server

scp-fullscp — همه گزینه‌ها و نکته‌های جدید

پیش‌فرض سیستم

از OpenSSH 9 به بعد، scp زیر کاپوت از پروتکل SFTP استفاده می‌کند — به همین دلیل گزینه -O (بازگشت به پروتکل قدیمی) و رفتار جدیدها اهمیت پیدا کرده.

گزینهکار
-Oپروتکل قدیمی SCP — برای سرورهای خیلی قدیمی یا مسیرهای خاص
-3انتقال از طریق لوکال (وقتی دو سرور همدیگر را نمی‌بینند)
-6 / -4اجبار IPv6 / IPv4
-Tغیرفعال‌کردن چک سخت‌گیری نام فایل
-qبی‌صدا
terminal
scp -O file.txt oldserver:/tmp/          # سرور قدیمی
scp -3 hostA:/tmp/a.txt hostB:/tmp/a.txt # از طریق لوکال ★
scp -6 file user@[2001:db8::10]:~/
scp -P 2222 -i ~/.ssh/work_key f.txt ali@host:~/
# چند فایل با الگو (نقل‌قول یادت نره):
scp "ali@host:/var/log/*.gz" ./logs/
# بزرگ‌ها: scp بهتر است مستقیم rsync باشد
rsync -avh --progress -e "ssh -p 2222" bigdir/ ali@host:~/bigdir/

ssh-muxControlMaster — چند نشست روی یک اتصال

پیشرفته

اولین اتصال رمزنگاری می‌شود و نشست‌های بعدی به همان سوکت می‌چسبند — لاگین آنی بدون handshake و بدون passphrase تکراری. برای کار مداوم با یک سرور معرکه است.

terminal
# در ~/.ssh/config برای میزبان پرتکرار:
#   Host prod
#       HostName 203.0.113.10
#       ControlMaster auto
#       ControlPath ~/.ssh/cm-%r@%h:%p
#       ControlPersist 10m        # سوکت تا ۱۰ دقیقه پس از آخرین نشست بماند

ssh prod                          # اتصال اصلی
ssh prod                          # آنی!
scp file.txt prod:~/              # بدون رمز دوم
ssh -O check prod                 # وضعیت مادر
ssh -O forward -L 8080:localhost:80 prod   # اضافه‌کردن تونل به مادر
ssh -O exit prod                  # بستن اتصال مادر

ssh-jumpزنجیره jump و ProxyCommand

پیشرفته

وقتی سرور مقصد فقط از طریق یک سرور میانی (bastion) قابل‌دسترس است — بدون تونل دستی چندمرحله‌ای.

terminal
# تک‌پرش:
ssh -J [email protected] [email protected]
# زنجیره چندپرشی:
ssh -J user@j1,user@j2:2222 target

# نسخه config — خواناتر و قابل‌استفاده برای scp/rsync/sftp:
#   Host db
#       HostName 10.0.0.5
#       User ali
#       ProxyJump bastion
#   Host bastion
#       HostName bastion.example.com
#       User ali
#       IdentityFile ~/.ssh/id_ed25519

ssh db                       # خودش از bastion عبور می‌کند
scp file.txt db:~/           # همه ابزارهای ssh از config پیروی می‌کنند
# روش قدیمی (برای سازگاری):
ssh -o ProxyCommand="ssh -W %h:%p j1" target

ssh-lanاتصال به دستگاه‌های نزدیک (LAN)

پیش‌فرض سیستم

پیداکردن و وصل‌شدن به رایانه‌ها و تک‌بردهای هم‌شبکه — بدون دانستن IP ثابت. مبنای کار: mDNS (نام‌های .local).

terminal
# ۱) کشف دستگاه‌های هم‌شبکه:
ping -c1 raspberrypi.local          # mDNS معمولاً از پیش کار می‌کند ★
avahi-browse -art | less            # همه سرویس‌های شبکه محلی (نصب: avahi-utils)
sudo nmap -sn 192.168.1.0/24        # پویش میزبان‌های زنده
ip neigh                            # دستگاه‌هایی که دیده‌ایم + MAC

# ۲) اولین اتصال به رزبری‌پای:
ssh [email protected]
# رمز پیش‌فرض را عوض کن و کلیدت را نصب کن:
ssh-copy-id [email protected]
ssh-keyscan raspberrypi.local >> ~/.ssh/known_hosts

# ۳) اسم کوتاه در ~/.ssh/config:
#   Host pi
#       HostName raspberrypi.local
#       User pi
ssh pi

ssh-hotspotهات‌اسپات وای‌فای — اتصال مستقیم بدون روتر

پیش‌فرض سیستم

وقتی روتر و LAN در کار نیست: یک دستگاه هات‌اسپات وای‌فای پخش می‌کند، دیگری وصل می‌شود و بعد SSH — کاملاً مستقیم؛ اگر هاست هات‌اسپات اینترنت داشته باشد، دستگاه وصل‌شده هم اینترنت می‌گیرد.

terminal
# ── گام ۱: روی دستگاهی که هات‌اسپات می‌دهد ──
nmcli device status                     # اسم کارت وای‌فای: مثلاً wlan0
nmcli dev wifi hotspot ifname wlan0 ssid pi-hotspot password "12345678"
ip -br addr show wlan0                  # IP هات‌اسپات: معمولاً 10.42.0.1
nmcli con down Hotspot                  # خاموش‌کردن
nmcli con modify Hotspot 802-11-wireless-security.psk "رمز-جدید"
nmcli con modify Hotspot ipv4.addresses 192.168.99.1/24   # تغییر رنج

# ── گام ۲: روی دستگاهی که سرور SSH است ──
nmcli dev wifi connect pi-hotspot password "12345678"
sudo apt install openssh-server && sudo systemctl enable --now ssh
ip -br addr                             # IP خودش: مثلاً 10.42.0.42

# ── گام ۳: از هاست هات‌اسپات به آن دستگاه وصل شو ──
nmap -sn 10.42.0.0/24                   # یافتن IP مقصد (یا: ip neigh)
ssh-copy-id [email protected]
ssh [email protected]

# ── رزبری‌پای بدون مانیتور: قبل از اولین بوت در پارتیشن boot ──
#  1) wpa_supplicant.conf با ssid/psk هات‌اسپات:
#     country=IR
#     update_config=1
#     network={ ssid="pi-hotspot" psk="12345678" key_mgmt=WPA-PSK }
#  2) فایل خالی به اسم: ssh
💡
جهت اتصال مهم نیست — هر طرفی که sshd روشن دارد «سرور» است. فایروال سرور را باز بگذار: sudo ufw allow OpenSSH. هات‌اسپات موبایل هم می‌شود ولی از لینوکس مدیریت نمی‌شود؛ هر دو دستگاه را به گوشی وصل کن و IPها را با nmap -sn 172.20.10.0/28 پیدا کن.
⚠️
هات‌اسپات با رمز ضعیف یعنی دعوت همسایه‌ها به شبکه‌ات — رمز حداقل ۸ کاراکتری WPA2 بگذار و بعد از کار، Hotspot را خاموش کن.

moshmosh — اتصال مقاوم و بی‌تأخیر

نیاز به نصب
📦 نصب:sudo apt install mosh # روی سرور هم باید نصب باشد؛ پورت‌های UDP 60000–61000 باز باشد

جایگزین ssh برای اتصال‌های بی‌ثبات (وای‌فای، موبایل): با قطع‌ووصل شبکه نمی‌میرد، تأخیر را با echo محلی می‌پوشاند و با جابه‌جایی بین شبکه‌ها (رومینگ) زنده می‌ماند. احراز هویتش با ssh است.

terminal
mosh ali@server
mosh --ssh="ssh -p 2222" ali@server
mosh [email protected]          # عالی برای دستگاه‌های نزدیک با وای‌فای ضعیف
# سرور: ufw allow 60000:61000/udp
# کلیدهای میان‌بر: Ctrl+] برای خروج، Ctrl+^ سپس . قطع (نشست زنده می‌ماند)

autosshتونل همیشه-زنده

نیاز به نصب
📦 نصب:sudo apt install autossh

اتصال ssh را زیر نظر می‌گیرد و با هر قطعی خودکار برقرار می‌کند — برای تونل‌های دائمی بین دو سرور/دفتر.

terminal
autossh -M 0 -f -N -L 5433:localhost:5432 ali@server
#   -M 0: پایش با ServerAliveInterval   -f: پس‌زمینه   -N: فقط تونل
# در ~/.ssh/config آن میزبان: ServerAliveInterval 30 و ServerAliveCountMax 3
# راه عملیاتی‌تر: سرویس systemd با Restart=always
#   [Service]
#   ExecStart=/usr/bin/autossh -M 0 -N -o ServerAliveInterval=30 -L 5433:localhost:5432 ali@server
#   Restart=always

sshuttleVPN فقیرانه روی ssh

نیاز به نصب
📦 نصب:sudo apt install sshuttle

کل ترافیک (یا یک ساب‌نت) را از تونل ssh عبور می‌دهد — بدون تنظیم سرور VPN؛ برای دسترسی به شبکه داخلی دفتر از راه دور.

terminal
sudo sshuttle -r ali@server 10.0.0.0/24        # فقط شبکه داخلی
sudo sshuttle -r ali@server 0.0.0.0/0 --exclude 192.168.1.0/24   # همه‌چیز جز لوکال
sudo sshuttle --dns -r ali@server 0/0          # حتی DNS

sshfs-optssshfs — گزینه‌های مهم مونت

نیاز به نصب
📦 نصب:sudo apt install sshfs

اتصال پوشه سرور به‌عنوان دیسک، با گزینه‌های مقاوم‌سازی برای اتصال‌های ناپایدار.

terminal
mkdir -p ~/srv
sshfs ali@server:/srv/app ~/srv \
  -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 \
  -o idmap=user                        # مالکیت‌ها به کاربر لوکال ترجمه شوند
#  گزینه‌های مفید دیگر: umask=022 ، transform_symlinks ، follow_symlinks ،
#  -o cache=yes برای پوشه‌های شلوغ ، -o compression=yes
fusermount3 -u ~/srv                   # جدا کردن امن
🌐

41. دستور ip: مرجع کامل زیرفرمان‌ها

9 دستور و مبحث

زیرفرمان‌های ip — مرور کامل

terminal
ip addr      آدرس‌های IP          ip link     کارت‌ها و لایه ۲
ip route     جدول مسیریابی        ip neigh    جدول ARP/NDP
ip rule      قواعد مسیریابی       ip netns    namespaceهای شبکه
ip tunnel    تونل‌ها (GRE/IPIP)   ip monitor  گوش‌دادن زنده به تغییرات
ip maddr     مالتی‌کست             ip -s       آمار تفصیلی
ip -br       خروجی کوتاه (brief)  ip vrf      جداول VRF

ip-addrip addr — آدرس‌ها

پیش‌فرض سیستم

مدیریت کامل آدرس‌های IPv4/IPv6 روی کارت‌ها — نمایش، افزودن، حذف، خالی‌کردن.

terminal
ip addr                        # همه کارت‌ها با آدرس‌ها
ip -br addr                    # خروجی کوتاه و خوانا ★
ip -c addr show eth0           # با رنگ
ip a show dev eth0
ip a add 192.168.1.50/24 dev eth0          # افزودن (موقت تا ریبوت)
ip a add 2001:db8::10/64 dev eth0
ip a add 192.168.1.51/24 dev eth0 label eth0:alias
ip a del 192.168.1.50/24 dev eth0
ip a flush dev eth0            # خالی‌کردن همه آدرس‌های کارت
ip a replace 192.168.1.52/24 dev eth0     # ساخت یا به‌روزرسانی

ip-routeip route — مسیریابی

پیش‌فرض سیستم

جدول مسیرها: دیدن، افزودن مسیر پیش‌فرض/استاتیک، مسیر سیاه‌چاله و پرس‌وجو.

terminal
ip route                       # جدول مسیرها ★
ip -br route                   # کوتاه
ip route get 8.8.8.8           # بسته به این مقصد از کجا می‌رود؟ ★
ip route get 10.0.0.5 from 192.168.1.50

sudo ip route add default via 192.168.1.1
sudo ip route add 10.10.0.0/16 via 192.168.1.254
sudo ip route add 10.10.0.0/16 dev eth0 metric 100
sudo ip route replace default via 192.168.1.2      # تغییر پیش‌فرض بدون قطعی
sudo ip route add blackhole 203.0.113.0/24         # دور ریختن ترافیک
sudo ip route del 10.10.0.0/16
ip route show table main
ip route show cache

ip-neighip neigh — جدول ARP

پیش‌فرض سیستم

نگاشت IP→MAC دستگاه‌هایی که دیده‌ای — ابزار شناخت شبکه محلی و دیباگ لایه ۲.

terminal
ip neigh                       # جدول کامل
ip -br neigh                   # کوتاه
ip neigh show dev eth0
ip neigh flush all             # خالی‌کردن (اجبار کشف دوباره)
sudo ip neigh replace 192.168.1.9 lladdr aa:bb:cc:dd:ee:ff dev eth0 nud permanent
# ترفند: بعد از nmap -sn، همین جدول پر می‌شود

ip-ruleip rule — مسیریابی سیاست‌محور

پیشرفته

تصمیم‌های مسیریابی بر اساس مبدأ/مقصد (نه فقط مقصد): مثلاً ترافیک یک کاربر یا ساب‌نت همیشه از خط دوم اینترنت برود.

terminal
ip rule                        # قواعد فعلی
ip route show table 100

# همه ترافیکِ با مبدأ خاص از گیت‌وی دوم:
sudo ip route add default via 192.168.2.1 table 100
sudo ip rule add from 192.168.1.50 table 100 priority 100

# ترافیک به پورت مشخص از مسیر دیگر (با fwmark + iptables mangle):
sudo ip rule add fwmark 0x1 table 100
ip rule del priority 100

ip-netnsip netns — namespaceهای شبکه

پیشرفته

شبکه‌های ایزوله کامل داخل یک سیستم — پایه مفهومی کانتینرها؛ برای آزمایش شبکه بدون VM.

terminal
sudo ip netns add red
sudo ip netns list

# اتصال دو namespace با کابل مجازی (veth):
sudo ip link add veth-red type veth peer name veth-blue
sudo ip link set veth-red netns red
sudo ip addr add 10.200.0.1/24 dev veth-blue && sudo ip link set veth-blue up
sudo ip netns exec red ip addr add 10.200.0.2/24 dev veth-red
sudo ip netns exec red ip link set veth-red up
sudo ip netns exec red ip link set lo up

sudo ip netns exec red ping 10.200.0.1
sudo ip netns exec red bash          # ورود کامل به namespace
sudo ip netns del red

ip-tunnelip tunnel — تونل‌های GRE و IPIP

پیشرفته

اتصال دو شبکه دور مثل یک LAN — ساده‌ترین شکل تونل لایه ۳ (برای WireGuard به بخش امنیت سر بزن).

terminal
# روی سرور A:
sudo ip tunnel add gre1 mode gre local 203.0.113.10 remote 198.51.100.20 ttl 255
sudo ip addr add 10.255.0.1/30 dev gre1
sudo ip link set gre1 up

# روی سرور B (برعکس):
sudo ip tunnel add gre1 mode gre local 198.51.100.20 remote 203.0.113.10 ttl 255
sudo ip addr add 10.255.0.2/30 dev gre1
sudo ip link set gre1 up

ping 10.255.0.1
ip tunnel show
sudo ip tunnel del gre1

ip-monitorip monitor — گوش‌دادن زنده

پیش‌فرض سیستم

هر تغییری در لینک/آدرس/مسیر را لحظه‌ای نشان می‌دهد — برای مانیتورینگ و دیباگ DHCP و شبکه‌های شلوغ.

terminal
ip monitor all
ip monitor link,addr
ip -ts monitor route               # با timestamp
# در ترمینال دیگر: sudo ip link set eth0 down — لحظه‌ای خبر می‌دهد

ip-miscip maddr / vrf / stat — بقیه زیرفرمان‌ها

پیشرفته

بقیه اعضای خانواده برای کارهای تخصصی.

terminal
ip maddr show                    # عضویت‌های مالتی‌کست
ip maddr add 224.1.1.1 dev eth0  # (sudo) پیوستن به گروه مالتی‌کست
ip -s link show eth0             # آمار بسته و خطا
ip -br a ; ip -br l ; ip -br r   # خلاصه کامل سیستم در سه خط
ip vrf show                      # جدول‌های VRF (روترهای مدرن)
ip addrlabel                     # سیاست‌های انتخاب آدرس
🧭

42. systemctl: مرجع کامل زیرفرمان‌ها

6 دستور و مبحث

نقشه زیرفرمان‌های systemctl

terminal
چرخه حیات:  start · stop · restart · try-restart · reload · reload-or-restart · kill · clean
فعال‌سازی:  enable · disable · reenable · preset · mask · unmask
پرس‌وجو:    status · show · cat · is-active · is-enabled · list-units · list-unit-files
لیست‌ها:    list-sockets · list-timers · list-jobs · list-dependencies
بوت/انرژی:  get-default · set-default · isolate · rescue · reboot · poweroff · suspend
سیستم:      daemon-reload · daemon-reexec · set-property · reset-failed · edit · revert

systemctl-lifecycleزیرفرمان‌های چرخه حیات

پیش‌فرض سیستم

کنترل روزمره سرویس‌ها با تفاوت‌های ظریفی که فرق «حرفه‌ای» و «کار می‌کند» است.

گزینهکار
try-restartفقط اگر در حال اجراست ری‌استارت کن (برای cronها)
reloadفقط بارگذاری config بدون قطع سرویس
reload-or-restartهر کدام که پشتیبانی می‌کند
kill --signal=HUPارسال سیگنال مستقیم به cgroup سرویس
cleanپاک‌کردن runtime/state/cache دایرکتوری‌های سرویس
terminal
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl try-restart nginx          # فقط اگر روشن است
sudo systemctl reload nginx               # config بدون قطعی
sudo systemctl reload-or-restart nginx
sudo systemctl kill --signal=HUP syslogd  # سیگنال مستقیم
sudo systemctl kill --signal=SIGKILL --kill-who=main myapp   # قهری
sudo systemctl clean myapp                # پاک‌سازی دایرکتوری‌ها
systemctl status nginx --no-pager -l

systemctl-enable-familyفعال‌سازی: enable / mask / preset

پیش‌فرض سیستم

تعیین اینکه سرویس با بوت چه بشود — و مفهوم کمترشناخته mask (قفل مطلق).

گزینهکار
enable --nowفعال + استارت هم‌زمان ★
enable --runtimeفقط تا ریبوت بعدی
enable --globalبرای همه کاربران (unitهای کاربری)
reenableغیرفعال و دوباره فعال (بازسازی symlinkها)
presetاعمال سیاست پیش‌فرض توزیع
mask / unmaskقفل مطلق: حتی دستی هم استارت نمی‌شود / آزادی
terminal
sudo systemctl enable --now nginx
sudo systemctl enable --runtime debug-tools
sudo systemctl disable --now app
sudo systemctl reenable app
sudo systemctl mask foo.service            # حتی start دستی هم رد می‌شود ★
systemctl is-enabled nginx ; systemctl is-active nginx
sudo systemctl preset nginx                # سیاست توزیع

systemctl-queryپرس‌وجو: status / show / cat / لیست‌ها

پیش‌فرض سیستم

همه راه‌های دیدن وضعیت — show برای اسکریپت (خروجی key=value) و status برای انسان.

terminal
systemctl status nginx
systemctl status --failed                  # فقط مرده‌ها
systemctl cat nginx                        # فایل unit + overrideها
systemctl show nginx -p MainPID,ActiveState,MemoryCurrent    # فقط چند خاصیت ★
systemctl show nginx | grep -i restart
systemctl list-units --type=service --state=running
systemctl list-units --type=timer
systemctl list-unit-files --state=enabled
systemctl list-sockets | head              # سوکت‌فعال‌سازی‌ها
systemctl list-timers --all
systemctl list-dependencies nginx          # وابستگی‌ها
systemctl list-dependencies --reverse nginx   # چه کسانی به من وابسته‌اند؟
systemctl is-system-running                # سلامت کل سیستم

systemctl-bootبوت، انرژی و حالت‌های اضطراری

پیش‌فرض سیستم

مدیریت حالت‌های کل سیستم — هدف‌های (target) خاص مثل rescue جایگزین single-user mode قدیمی‌اند.

terminal
systemctl get-default                     # حالت بوت فعلی (graphical/multi-user)
sudo systemctl set-default multi-user     # بوت بدون رابط گرافیکی ★
sudo systemctl isolate multi-user.target  # سوییچ زنده (بستن GUI)

sudo systemctl reboot
sudo systemctl poweroff
sudo systemctl reboot --firmware-setup    # ریبوت به تنظیمات UEFI ★
sudo systemctl suspend ; sudo systemctl hibernate
sudo systemctl rescue                     # حالت تعمیر (رمز روت)
sudo systemctl emergency                  # حداقل‌ترین حالت؛ فایل‌سیستم مشکل‌دار
sudo systemctl --no-wall poweroff         # بدون پیام به کاربران

systemctl-miscdaemon-reload، edit، set-property و بقیه

پیش‌فرض سیستم

ابزارهای نگهداری که کمتر به‌کار می‌روند ولی در موقعیت درست طلا هستند.

terminal
sudo systemctl daemon-reload              # بعد از هر تغییر فایل unit ★
sudo systemctl daemon-reexec              # بازاجرای خود systemd (حالت‌های خاص)
sudo systemctl edit nginx                 # override تعاملی (drop-in)
sudo systemctl revert nginx               # حذف overrideها؛ برگشت به فایل اصلی
sudo systemctl set-property myapp.service MemoryMax=1G   # محدودیت بدون ویرایش فایل
sudo systemctl reset-failed               # پاک‌کردن وضعیت failed از لیست
sudo systemctl add-wants multi-user.target myapp   # wants از خط فرمان
systemctl show-environment

journalctl-formatsjournalctl: قالب‌های خروجی و فیلترهای کامل

پیش‌فرض سیستم

خروجی journalctl برای هر مصرف: انسان، اسکریپت (json) یا تحلیل‌گر لاگ.

گزینهکار
-o short-isoبا تاریخ-ساعت دقیق
-o json / json-prettyبرای jq و پایپلاین‌ها
-o verboseهمه فیلدها
-o catفقط متن پیام
-g الگوجست‌وجوی متن در همه پیام‌ها (با -r برعکس)
-t شناسهفیلتر SYSLOG_IDENTIFIER
--facilitykern/auth/daemon/cron و…
-p err..alertبازه شدت
terminal
journalctl -u nginx -o short-iso
journalctl -u app -o json | jq -r '.MESSAGE' | grep ERROR
journalctl -u app -o json-pretty | head -40
journalctl -g "timeout|refused" -p warning..alert --since today
journalctl -t systemd --since -1h
journalctl --facility=cron --since yesterday
journalctl -b -u ssh                        # از آخرین بوت
journalctl --list-boots                     # همه بوت‌های ثبت‌شده
journalctl --disk-usage
sudo journalctl --rotate && sudo journalctl --vacuum-time=7d
🐳

43. docker: مرجع کامل زیرفرمان‌ها

6 دستور و مبحث

خانواده داکر: بخش‌بندی زیرفرمان‌ها (نسخه‌های جدید)

terminal
docker container   run · ls · start/stop/rm · exec · logs · inspect · stats · prune
docker image       ls · pull · push · build · tag · rmi · save/load · history · prune
docker network     ls · create · connect/disconnect · inspect · rm · prune
docker volume      ls · create · inspect · rm · prune
docker system      df · info · events · prune · version
docker context     ls · create · use — مدیریت چند داکرهاست از یک کلاینت
docker compose     زیرفرمان‌های جدا (کارت مخصوص خودش)
دستورهای مستقیم مثل docker ps و docker run هنوز کار می‌کنند (میانبر همان container ps است)

docker-lifecycleچرخه حیات کانتینر — همه زیرفرمان‌ها

نیاز به نصب

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

terminal
docker create --name web nginx            # ساخته می‌شود ولی اجرا نه
docker start web
docker stop -t 30 web                     # ۳۰ ثانیه مهلت خاموشی مؤدبانه
docker restart -t 10 web
docker pause web ; docker unpause web     # فریز فرآیندها (SIGSTOP)
docker kill -s HUP web                    # سیگنال دلخواه (مثلاً reload)
docker rename web web-old
docker update --memory 512m --restart unless-stopped web   # تغییر زنده محدودیت‌ها
docker wait web                           # تا خروج صبر کن؛ کد خروج را چاپ می‌کند
docker rm -f -v web                       # حذف اجباری + volumeهای بی‌نام
docker container prune --filter "until=24h"

docker-inspect-familyبازرسی: inspect/port/diff/top/events

نیاز به نصب

دیدن داخل کانتینر بدون ورود: چه فایل‌هایی عوض شده، چه پروسه‌ای اجراست، چه رخدادی رخ داده.

terminal
docker inspect web | jq '.[0] | {State, NetworkSettings, Mounts}'
docker inspect -f '{{.State.Health.Status}}' web       # وضعیت healthcheck
docker port web                                        # نگاشت پورت‌ها
docker diff web                                        # فایل‌های تغییرکرده از تصویر ★
docker top web                                         # پروسه‌های داخل
docker events --since 1h --filter type=container       # رخدادهای داکر
docker logs --since 30m --until 10m web
docker logs -f --details web

docker-image-opsزیرفرمان‌های تصویر: save/load/export/commit

نیاز به نصب

جابه‌جایی تصاویر بدون رجیستری و ثبت نسخه دستی — برای سرورهای بدون اینترنت.

terminal
docker pull --platform linux/amd64 nginx:1.27
docker tag myapp:1.0 registry.local:5000/myapp:1.0
docker push registry.local:5000/myapp:1.0

docker save -o nginx.tar nginx:1.27              # بسته‌بندی تصویر
docker load -i nginx.tar                          # بازکردن در سرور دیگر ★
docker export web > fs.tar                        # فقط فایل‌سیستم (بدون تاریخچه لایه‌ها)
docker import fs.tar myapp:imported

docker commit web myapp:snapshot                  # عکس از وضعیت فعلی کانتینر
docker history nginx:1.27                         # هر لایه چند بایت؟
docker image prune -a --filter "until=48h"

docker-contextdocker context — چند داکرهاست، یک کلاینت

نیاز به نصب

سوییچ بین داکر لوکال، سرور عملیات و کلاسترهای دیگر بدون ssh دستی — مثل kubectl context.

terminal
docker context ls
docker context create prod --docker "host=ssh://ali@prod-server"
docker context use prod
docker ps                                    # پروسه‌های سرور prod!
docker context use default
# مصرف موقت بدون تغییر context:
docker --context prod ps

docker-compose-fullcompose: مرجع کامل زیرفرمان‌ها

نیاز به نصب

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

terminal
docker compose up -d --build --wait       # ساخت + اجرا + انتظار برای healthcheck ★
docker compose up -d --scale web=4
docker compose ps -a
docker compose logs -f web db
docker compose exec web bash
docker compose run --rm web python manage.py shell   # اجرای یک‌باره با env کامل
docker compose restart web ; docker compose kill web
docker compose stop db && docker compose start db
docker compose top
docker compose cp web:/etc/hostname ./h
docker compose config                     # اعتبارسنجی + نمایش نهایی yaml ★
docker compose pull && docker compose up -d
docker compose down -v --rmi local        # پاک‌سازی کامل
docker compose ls                         # پروژه‌های compose روی سیستم

docker-systemsystem: پاک‌سازی و وضعیت کل داکر

نیاز به نصب

دیسک سرورهای داکری تقریباً همیشه توسط لایه‌های یتیم پر می‌شود؛ این‌ها جاروی رسمی هستند.

terminal
docker system df                          # چه چیزهایی فضا گرفته ★
docker system df -v                       # تفکیک کامل
docker system events --since 24h
docker system info | grep -iE "server version|storage|cgroup"

# جاروی مرحله‌ای (از بی‌خطرناک به جدی):
docker container prune
docker image prune                        # فقط لایه‌های dangling
docker image prune -a                     # همه تصاویر بی‌کانتینر
docker volume prune --filter "label!=keep"
docker network prune
docker system prune -a --volumes          # همه‌چیز (پیش از این، بکاپ!)
🌿

44. git: زیرفرمان‌های تکمیلی و نجات‌بخش

9 دستور و مبحث

زیرفرمان‌های git که در کارهای جدی لازم می‌شوند

علاوه بر دستورهای روزمره بخش Git، این‌ها برای پروژه‌های بزرگ، عیب‌یابی تاریخچه و نجات فاجعه‌ها هستند — mهرکدام یک ابزار مستقل‌اند.

نجات

reflog — تقریباً هیچ‌چیز در git واقعاً گم نمی‌شود ★

جست‌وجوی باگ

bisect — نصف‌کردن تاریخچه تا یافتن کامیت معیوب

موازی‌کاری

worktree — دو برنچ هم‌زمان، دو پوشه، یک مخزن

تمیزکاری

clean و gc — فایل‌های بی‌ربط و بهینه‌سازی مخزن

git-reflogreflog — فاجعه‌بهره همه‌کاره

پیشرفته

گیت هر جابه‌جایی HEAD را ثبت می‌کند (حدود ۹۰ روز). کامیت‌های «گم‌شده» با reset یا rebase اشتباهی اینجا هستند — آخرین امید همیشه این است.

terminal
git reflog
#  abc1234 HEAD@{0}: reset: moving to HEAD~1
#  def5678 HEAD@{1}: commit: کار مهمی که اشتباهی reset شد!

git reset --hard HEAD@{1}          # برگشت به آن نقطه ★
git branch rescue def5678          # یا ساختن برنچ از آنجا
git reflog show feature            # reflog مخصوص یک برنچ
# قاعده: تا ۹۰ روز فرصت داری؛ بعد gc کامیت‌های بی‌مرجع را می‌تراشد

git-bisectbisect — شکار کامیت معیوب

پیشرفته

جست‌وجوی باینری در تاریخچه: «کدام کامیت باگ را آورد؟» با ۱۰۰۰ کامیت فقط ۱۰ مرحله تست لازم است.

terminal
git bisect start
git bisect bad                     # وضعیت فعلی خراب است
git bisect good v1.2.0             # این تگ سالم بود
#  گیت وسط راه را checkout می‌کند؛ تست کن و بگو:
git bisect bad                     # یا: git bisect good
#  … تا رسیدن به «abc123 is the first bad commit»

git bisect reset                   # برگشت به برنچ اصلی

# حالت خودکار — اسکریپت تست خودش بگوید:
git bisect start HEAD v1.2.0
git bisect run npm test            # خروجی غیرصفر = bad

git-worktreeworktree — چند برنچ هم‌زمان در پوشه‌های جدا

پیشرفته

یک مخزن، چند نسخه checkout‌شده: می‌توانی هم‌زمان روی main و feature کار کنی و بین‌شان فقط cd کنی — بدون clone دوم.

terminal
git worktree add ../hotfix-dir hotfix/urgent
git worktree add ../main-checkout main
cd ../hotfix-dir                   # برنچ hotfix آماده کار
git worktree list
git worktree remove ../hotfix-dir
# نکته: یک برنچ فقط در یک worktree می‌تواند checkout باشد

git-submodulesubmodule — مخزن داخل مخزن

پیشرفته

جایگذاری مخزن دیگری به‌عنوان زیرمجموعه با قفل‌شدن روی یک کامیت مشخص — برای کتابخانه‌های مشترک بین پروژه‌ها.

terminal
git submodule add https://github.com/user/lib.git libs/lib
git submodule init && git submodule update     # بعد از clone اولیه
git submodule update --init --recursive        # کامل‌ترین شکل (الگوی تیمی ★)
git submodule update --remote libs/lib         # آپدیت به آخرین نسخه
git submodule status
git submodule deinit -f libs/lib ; git rm -f libs/lib
# clone پروژه‌دارِ submodule:
git clone --recurse-submodules URL

git-cleanclean — پاک‌سازی فایل‌های untracked

پیشرفته

حذف فایل‌هایی که git ردیابی نمی‌کند (buildها، خروجی‌ها) — حتماً اول با -n پیش‌نمایش!

گزینهکار
-nفقط نشان بده (dry-run) ★
-fحذف کن
-fdبا پوشه‌های خالی
-xحتی ignoreشده‌ها (build artifacts)
-Xفقط ignoreشده‌ها
terminal
git clean -n                 # چی حذف می‌شود؟ همیشه اول این
git clean -fd                # فایل‌ها + پوشه‌های untracked
git clean -fdx               # با node_modules و buildها (مواظب .env!)
git clean -X -n              # فقط ignoreشده‌ها را نشان بده
git clean -fd -- src/        # محدود به مسیر

git-grepgrep — جست‌وجو در مخزن

پیش‌فرض سیستم

مثل grep معمولی ولی فقط روی فایل‌های ردیابی‌شده، با شناخت gitignore و امکان جست‌وجو در برنچ‌های دیگر.

terminal
git grep TODO
git grep -n "def main" -- "*.py"
git grep -i error main                  # جست‌وجو در برنچ دیگر
git grep -e panic --and -e timeout
git grep --count TODO                   # تعداد در هر فایل
git grep -l "deprecated(" v1.2.0        # کدام فایل‌ها در نسخه قدیمی

git-describe-show-archivedescribe / show / archive / bundle

پیش‌فرض سیستم

چهار زیرفرمانِ «درباره نسخه»: نام‌گذاری خودکارساز، دیدن جزئیات، خروجی آرشیو و مخزن قابل‌حمل.

terminal
git describe --tags                     # v1.4.0 (نزدیک‌ترین تگ)
git describe --tags --always            # حتی بدون تگ: هش کوتاه

git show abc123                         # یک کامیت کامل با diff
git show HEAD~3:app/config.py           # فایل در نقطه‌ای از تاریخچه ★
git show --stat HEAD

git archive --format=tar.gz -o rel.tar.gz v1.4.0    # آرشیو از تگ
git archive v1.4.0 src/ | tar -x -C /tmp/rel

git bundle create repo.bundle --all     # کل مخزن در یک فایل ★
git clone repo.bundle restored -b main

git-shortlog-mv-rmshortlog / mv / rm

پیش‌فرض سیستم

سه زیرفرمان کوچک ولی روزمره: آمار نویسنده‌ها، جابه‌جایی و حذف با ردیابی.

terminal
git shortlog -sn                     # رتبه‌بندی کامیت نویسنده‌ها ★
git shortlog -sn --since="6 months"
git shortlog -sne --all              # با ایمیل و همه برنچ‌ها

git mv old.py src/old.py             # جابه‌جایی ردیابی‌شده
git rm file.txt                      # حذف از دیسک + ایندکس
git rm --cached secret.env           # فقط از گیت بردار، دیسک بماند ★
git rm -r old-module/

git-gc-fsckgc / fsck / count-objects — نگهداری مخزن

پیشرفته

بهداشت مخزن‌های قدیمی و بزرگ: فشرده‌سازی، یافتن خرابی‌ها و اندازه‌گیری.

terminal
git count-objects -vH                # اندازه و تعداد اشیا ★
git gc                               # جمع‌آوری و فشرده‌سازی استاندارد
git gc --aggressive --prune=now      # عمیق‌تر (کم‌کاربرد)
git fsck --full                      # تست سلامت کامل مخزن
git fsck --lost-found                # یافتن کامیت‌های یتیم
# مخزن بزرگ؟ جایگزین مدرن برای بازنویسی تاریخچه:
#   git filter-repo (پکیج pip) — پاک‌کردن فایل/رمز از کل تاریخچه
☸️

45. kubectl: زیرفرمان‌های عملیاتی تکمیلی

5 دستور و مبحث

بقیه زیرفرمان‌های kubectl

کنار get/describe/apply، این‌ها کارهای عملیاتی واقعی را پوشش می‌دهند: برچسب‌گذاری، تخلیه نود، پچ زنده، بررسی دسترسی و دیباگ پیشرفته.

kubectl-get-formatsget: قالب‌های خروجی حرفه‌ای

نیاز به نصب

قدرت واقعی kubectl get در قالب خروجی‌اش است — از جدول ساده تا jsonpath برای اسکریپت.

گزینهکار
-o wideستون‌های بیشتر (IP، نود، تصویر)
-o json / yamlخروجی کامل برای jq
-o custom-columnsستون دلخواه
-o jsonpathاستخراج مسیری
-w / --watchزنده — با هر تغییر خط جدید
-l app=webانتخاب با لیبل
--show-labelsنمایش لیبل‌ها
terminal
kubectl get pods -o wide
kubectl get pods -l app=web --show-labels
kubectl get pods -w                       # زنده ★
kubectl get pods -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName'
kubectl get pods -o jsonpath='{.items[*].status.podIP}'
kubectl get deploy web -o json | jq '.spec.replicas'
kubectl get all -n web                    # همه منابع یک namespace
kubectl get events --sort-by=.lastTimestamp | tail

kubectl-label-annotatelabel / annotate — برچسب‌گذاری منابع

نیاز به نصب

لیبل‌ها مبنای انتخاب‌گرها و گزارش‌گیری‌اند؛ annotationها داده آزاد (نسخه، لینک دشبورد، مالک).

terminal
kubectl label pods web-7d9f8b tier=frontend
kubectl label pods web-7d9f8b tier-                 # حذف لیبل
kubectl label deploy web --overwrite version=v2
kubectl annotate deploy web owner="تیم-وب" \
  kubernetes.io/change-cause="افزودن هدر امنیتی"
kubectl get pods -l tier=frontend
kubectl get all -l app=web --show-labels

kubectl-node-opscordon / drain / taint — مدیریت نودها

نیاز به نصب

خارج‌کردن امن نود از سرویس برای ارتقای کرنل یا سخت‌افزار — پادها به نودهای دیگر مهاجرت می‌کنند.

terminal
kubectl cordon node1                    # پاد جدید نگیرد
kubectl drain node1 \
  --ignore-daemonsets --delete-emptydir-data     # تخلیه کامل ★
#  … تعمیر/ارتقا …
kubectl uncordon node1

kubectl taint nodes node1 gpu=true:NoSchedule     # فقط پادهای مجاز بیایند
kubectl taint nodes node1 gpu=true:NoSchedule-    # برداشتن taint
kubectl describe node node1 | grep -A5 Taints
kubectl top node

kubectl-patch-editpatch / edit / replace / explain

نیاز به نصب

تغییر هدفمند منبع زنده — پچ برای تغییرهای کوچک (بدون خطر بازنویسی کل آبجکت)، edit برای دستکاری تعاملی.

گزینهکار
patch -pپچ merge ساده (json)
patch --type=jsonپچ آرایه‌ای دقیق با opهای JSON Patch
editویرایشگر روی منبع زنده
replace -fبازنویسی کامل (خطر از دست رفتن فیلدهای مدیریت‌شده)
explainمستندات ساختار فیلدها ★
terminal
kubectl patch deploy web -p '{"spec":{"replicas":4}}'
kubectl patch deploy web -p \
  '{"spec":{"template":{"spec":{"containers":[{"name":"web","image":"nginx:1.28"}]}}}}'
kubectl patch pvc data --type merge \
  -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
kubectl edit cm app-config
kubectl explain deployment.spec.strategy
kubectl explain pod.spec.containers.resources --recursive | less

kubectl-auth-debugauth can-i / debug / proxy / api-resources

پیشرفته

«آیا اجازه دارم؟»، دیباگ پادهای بی‌شِل و پورتهازما‌یی‌های پیشرفته.

terminal
kubectl auth can-i create deployments
kubectl auth can-i delete pods --as sara -n web
kubectl auth can-i --list                        # کل امتیازهای من

# پاد crash دارد و شل هم ندارد؟ پاد دیباگ چسبان بفرست:
kubectl debug -it pod/web --image=busybox --target=web
kubectl debug node/node1 -it --image=ubuntu      # شل روی خود نود

kubectl proxy --port=8001                        # API کلاستر روی لوکال
curl -s localhost:8001/api/v1/namespaces/default/pods | jq
kubectl api-resources | grep -i deploy
kubectl get csr ; kubectl certificate approve name
📦

46. apt: مرجع کامل زیرفرمان‌ها

5 دستور و مبحث

خانواده apt: apt / apt-get / apt-cache / apt-mark / apt-file

apt

رابط انسانی برای کار روزمره (ترمینال تعاملی)

apt-get / apt-cache

لایه اسکریپت‌پذیر و پایدار — خروجی‌شان بین نسخه‌ها قفل است ★

apt-mark

قفل/آزادسازی نسخه پکیج‌ها

apt-file

جست‌وجوی «کدام پکیج این فایل را دارد» بدون نصب

dpkg-query

کوئری دقیق روی نصب‌شده‌ها

apt-fullapt — همه زیرفرمان‌ها

پیش‌فرض سیستم

علاوه بر install/remove/upgrade، این زیرفرمان‌ها کمتر شناخته‌اند ولی کارهای واقعی را انجام می‌دهند.

terminal
apt list --installed | wc -l
apt list --upgradable
apt list --all-versions nginx
apt list nginx-*                          # الگوی نام

apt search "monitoring agent"
apt show nginx
apt changelog nginx                       # تغییرات نسخه جدید چه؟
apt download nginx                        # فقط دانلود deb بدون نصب ★
sudo apt install -y --no-install-recommends htop   # بدون وابستگی‌های توصیه‌ای
sudo apt install ./local.deb              # با حل خودکار وابستگی‌ها
sudo apt --fix-broken install             # ترمیم نصب نیمه‌کاره ★
sudo apt full-upgrade                     # ارتقا با جابه‌جایی پکیج‌ها
sudo apt edit-sources                     # ویرایش امن مخازن
sudo apt satisfy "nginx (>= 1.24)"        # تعیین نیاز نسخه‌ای
apt help | less

apt-get-scriptapt-get — حالت اسکریپت‌پذیر

پیش‌فرض سیستم

خروجی apt-get پایدار است (برخلاف apt)؛ انتخاب درست Dockerfile و CI — با فلگ‌های غیرتعاملی:

terminal
sudo apt-get update
sudo apt-get install -y --no-install-recommends curl ca-certificates
sudo DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
# نگه‌داشتن فایل config محلی هنگام ارتقا (در Dockerfileها حیاتی):
sudo apt-get -o Dpkg::Options::="--force-confdef" \
             -o Dpkg::Options::="--force-confold" \
             upgrade -y
sudo apt-get clean                        # پاک‌سازی کش deb (لایه داکر کوچک‌تر)
sudo apt-get autoclean

apt-markapt-mark — قفل نسخه پکیج‌ها

پیش‌فرض سیستم

جلوگیری از ارتقای خودکار پکیج حساس (مثلاً درایور یا کرنل) تا سر وقت مناسب.

terminal
sudo apt-mark hold nginx
apt-mark showhold                        # چه چیزهایی قفل است؟
sudo apt-mark unhold nginx
apt-mark showmanual                      # چه چیزهایی دستی نصب شده؟
sudo apt-mark auto libnginx-mod-http-geoip    # نشانه‌گذاری به‌عنوان وابستگی (برای autoremove)

apt-fileapt-file — کدام پکیج این فایل را دارد؟

نیاز به نصب
📦 نصب:sudo apt install apt-file && sudo apt-file update

کلاسیک‌ترین سناریو: «دستور ifconfig نیست — کدام پکیج نصبش می‌کند؟» بدون نصب چیزی جواب می‌دهد.

terminal
apt-file search bin/ifconfig           # net-tools: /usr/bin/ifconfig ★
apt-file search libnginx-mod-stream.so
apt-file list nginx-core
apt-file update                         # بعد از هر apt update دوباره بزن

apt-reposافزودن مخزن شخص ثالث (روش مدرن)

پیش‌فرض سیستم

روش جدید Debian/Ubuntu با فرمت deb822 و کلید در /etc/apt/keyrings — روش قدیمی apt-key حذف شده است.

terminal
sudo install -d -m 0755 /etc/apt/keyrings
#  مثال: مخزن رسمی docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo tee /etc/apt/sources.list.d/docker.sources << 'EOF'
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Signed-By: /etc/apt/keyrings/docker.gpg
EOF

sudo apt update && apt policy docker-ce    # تأیید مخزن جدید
🖥️

47. tmux: مرجع کامل زیرفرمان‌ها

6 دستور و مبحث

زیرفرمان‌های tmux — دو دنیا: کلیدها و فرمان‌ها

هر چیزی که با پیشوند Ctrl+b می‌زنی، پشت صحنه یک «زیرفرمان tmux» است؛ پس هر دو شکل قابل اسکریپت‌شدن‌اند:

terminal
tmux new-session -s work          ≡  Ctrl+b c (پنجره جدید)
tmux split-window -h              ≡  Ctrl+b %
tmux send-keys -t work:0 'ls' Enter   ← خودکارسازی از بیرون!

tmux-sessionsزیرفرمان‌های session

نیاز به نصب
📦 نصب:sudo apt install tmux

مدیریت کامل جلسه‌ها — از شل، اسکریپت یا حتی از داخل tmux دیگر.

terminal
tmux new -s work                    # ساخت
tmux new -s build -d                # ساخت بدون ورود (detached) ★
tmux ls
tmux attach -t work
tmux attach -d -t work              # اتصال با بیرون‌راندن نشست قبلی
tmux switch-client -t build         # از داخل tmux سوییچ
tmux rename-session -t work dev
tmux has -t work && echo هست
tmux kill-session -t work
tmux kill-server                    # پایان همه (مواظب باش!)

tmux-windowsزیرفرمان‌های window

نیاز به نصب

پنجره‌ها = تب‌های tmux. هر window یک شماره و نام دارد.

terminal
tmux new-window -n editor           # (داخل: Ctrl+b c)
tmux new-window -t work:5 -n logs
tmux rename-window -t work:1 "api"  # (داخل: Ctrl+b ,)
tmux select-window -t work:2        # (داخل: Ctrl+b 2)
tmux select-window -p ; tmux select-window -n   # قبلی/بعدی
tmux move-window -s work:3 -t work:9
tmux kill-window -t work:5
# میان‌برهای داخل: Ctrl+b w لیست تعاملی ★  Ctrl+b p/n قبلی/بعدی  Ctrl+b & بستن

tmux-panesزیرفرمان‌های pane

نیاز به نصب

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

terminal
tmux split-window -h                # عمودی (Ctrl+b %)
tmux split-window -v -t work:0.0    # افقی (Ctrl+b ")
tmux split-window -v -p 30          # ۳۰٪ ارتفاع برای پنل جدید
tmux resize-pane -D 5 ; tmux resize-pane -R 10   # تغییر اندازه
tmux select-pane -t work:0.1
tmux select-pane -L ; tmux select-pane -U       # حرکت
tmux swap-pane -U                   # جابه‌جایی با بالایی
tmux break-pane -t work:0.1         # جدا کردن پنل به window خودش
tmux join-pane -s work:1 -t work:0  # چسباندن دو پنجره به هم
tmux kill-pane -t work:0.2
# داخل: Ctrl+b z زوم پنل تمام‌صفحه ★  Ctrl+b q نمایش شماره‌ها  Ctrl+b x بستن

tmux-copyکپی‌پیست: copy-mode و bufferها

نیاز به نصب

حالت کپی tmux مثل vim کار می‌کند و با mouse on هم اسکرول ماوس خودکار واردش می‌شود.

terminal
tmux copy-mode -t work:0            # ورود به حالت اسکرول/کپی (داخل: Ctrl+b [)
#  داخل حالت کپی:  ↑↓ حرکت  / جست‌وجو  n بعدی
#  v شروع انتخاب   y کپی   Space انتخاب مستطیلی? (نه، انتخاب خطی)
tmux list-buffers
tmux show-buffer -b buffer0
tmux save-buffer -b buffer0 out.txt
tmux paste-buffer -t work:1         # (داخل: Ctrl+b ])
tmux set-option -g mouse on         # با ماوس: درگ = کپی، کلیک = انتخاب پنل

tmux-scriptingخودکارسازی: send-keys و source-file

پیشرفته

قدرت واقعی tmux: می‌توانی کل محیط کاری‌ات را با یک اسکریپت بالا بیاوری و به پنجره‌ها «تایپ» کنی.

terminal
# ارسال دستور به یک پنجره مشخص (بدون باز کردن tmux):
tmux send-keys -t work:0 'htop' Enter
tmux send-keys -t work:1 C-c        # کلید کنترل هم می‌شود فرستاد

# بازسازی کل محیط با یک اسکریپت:
cat > ~/dev-setup.sh << 'EOF'
#!/usr/bin/env bash
tmux new-session -d -s dev -n editor
tmux send-keys -t dev:editor 'nvim .' C-m
tmux new-window -t dev -n server
tmux send-keys -t dev:server 'npm run dev' C-m
tmux split-window -h -t dev:server
tmux send-keys -t dev:server.1 'docker compose logs -f' C-m
tmux attach -t dev
EOF
chmod +x ~/dev-setup.sh && ~/dev-setup.sh

tmux-configتنظیمات مفید ~/.tmux.conf

نیاز به نصب

چند خط که تجربه tmux را از «قابل‌تحمل» به «لذت‌بخش» می‌برد.

terminal
# ~/.tmux.conf
set -g mouse on                     # ماوس کامل: کلیک، درگ، اسکرول
set -g history-limit 100000         # تاریخچه بزرگ ★
set -g base-index 1                 # پنجره‌ها از ۱ شروع شوند
setw -g pane-base-index 1
set -g default-shell /bin/bash
set -g status-style 'bg=colour238,fg=white'
set -g status-right '#[fg=cyan]#H #[default]%H:%M'
bind r source-file ~/.tmux.conf \; display 'reload شد'   # Ctrl+b r

# اعمال: tmux source-file ~/.tmux.conf  (یا داخل tmux: Ctrl+b : سپس source)
tmux show-options -g | grep mouse   # بررسی
🧩

50. راهنمای توزیع‌ها و تفاوت‌های آن‌ها

مرجع سریع ۸ خانواده لینوکسی

این جدول مشخص می‌کند هر دستور متعلق به کدام خانواده است و برای نصب ابزارها از چه مسیر استانداردی استفاده شود. نام بسته‌ها ممکن است در نسخه‌های مختلف تغییر کند؛ قبل از اجرای دستور، مدیر بسته توزیع خودت را تشخیص بده.

● هسته سیستم / معمولاً پیش‌فرض● نیازمند نصب بسته● مخصوص توزیع یا خانواده● خطرناک: بازبینی قبل از اجرا
توزیعخانوادهمدیر بستهبه‌روزرسانی و نصبسرویس/شبکه رایجمسیرهای مهم
DebianDebianapt، dpkgsudo apt update && sudo apt full-upgradesystemd، ifupdown/NetworkManager/etc/apt، /etc/network
UbuntuDebianapt، dpkg، snapsudo apt install packagesystemd، NetworkManager، گاهی netplan/etc/netplan، /snap
FedoraRPMdnf، rpmsudo dnf upgrade --refreshsystemd، NetworkManager/etc/yum.repos.d، /etc/dnf
RHELRPMdnf، rpm، subscription-managersudo dnf updatesystemd، NetworkManager، SELinux/etc/yum.repos.d، /etc/selinux
ArchArchpacman، AUR helpersudo pacman -Syusystemd، NetworkManager یا systemd-networkd/etc/pacman.conf، /etc/makepkg.conf
Alpineمستقل، muslapksudo apk update && sudo apk upgradeOpenRC، ifupdown-ng/etc/apk، /etc/init.d
openSUSERPMzypper، rpmsudo zypper refresh && sudo zypper updatesystemd، NetworkManager/etc/zypp، /etc/sysconfig
Gentooسورس‌محورemerge، eselect، equerysudo emerge --sync && sudo emerge -avuDN @worldOpenRC یا systemd/etc/portage، /var/db/repos

تشخیص توزیع و مدیر بسته

terminal
cat /etc/os-release
command -v apt dnf pacman apk zypper emerge 2>/dev/null
# تشخیص اسکریپتی ساده:
. /etc/os-release; printf '%s %s\\n' "$ID" "$VERSION_ID"
⚠️
دستورهای نصب و ارتقا را بین خانواده‌ها جابه‌جا نکن. در Alpine، musl و OpenRC با glibc و systemd تفاوت دارند؛ در RHEL نیز اشتراک و مخازن فعال اهمیت دارد.
🧱

51. نقشه زیرفرمان‌های اصلی ابزارهای مهم

پوشش فرمان‌های مدرن و عملیاتی

این فهرست به‌جای ادعای پوشش تک‌تک فلگ‌ها، زیرفرمان‌های اصلی و پرتکرار را یکجا نشان می‌دهد. برای گزینه‌های نسخه نصب‌شده همیشه --help و man را هم بخوان.

dnf / yum

  • install، remove، upgrade
  • search، info، provides
  • list، repoquery، history
  • module، group، clean

pacman

  • -S نصب، -R حذف، -U فایل محلی
  • -Ss جست‌وجو، -Si اطلاعات
  • -Qo مالک فایل، -Qs نصب‌شده
  • -Syu ارتقای کامل، -Sc پاک‌سازی

apk

  • add، del، fix
  • search، info، policy
  • list، update، upgrade
  • audit، cache، manifest

zypper

  • install، remove، update
  • search، info، what-provides
  • lr، ar، rr مدیریت مخزن
  • ps، locks، patch

emerge

  • --sync، --search، --info
  • --ask، --verbose، --pretend
  • --depclean، --update --deep
  • --newuse، --changed-use، --config

flatpak / snap

  • Flatpak: remote-add، search، install، run، update، remove
  • Snap: find، install، list، refresh، revert، connect

podman

  • run، ps، exec، logs
  • build، images، pull، push
  • pod، network، volume
  • generate systemd، machine، system

kubectl

  • get، describe، logs، exec
  • apply، delete، diff، patch
  • rollout، scale، autoscale
  • config، auth، top، debug
terminal
# الگوی عمومی کشف زیرفرمان‌ها
command --help
command subcommand --help
man command
info command 2>/dev/null
# مثال‌های سریع:
dnf help ; pacman --help ; apk --help ; zypper help ; emerge --help
kubectl api-resources ; docker --help ; git help -a
⚖️

52. مقایسه ابزارهای هم‌خانواده

انتخاب ابزار درست برای سناریوی درست
سناریوگزینه قدیمی/رایجگزینه مدرن یا جایگزینتفاوت مهم
مدیریت بسته Debianapt-getaptapt برای انسان؛ apt-get برای اسکریپت و خروجی پایدار
مدیریت بسته RPMyumdnfdnf نسل جدید و انتخاب پیش‌فرض Fedora/RHEL جدید
شبکهifconfig، routeipابزارهای قدیمی net-tools محدود و عموماً منسوخ‌اند
فایروالiptablesnft، nftablesnftables معماری جدید؛ frontend توزیع ممکن است متفاوت باشد
جست‌وجوی فایلfindfdfind تقریباً همه‌جا هست؛ fd سریع‌تر و ساده‌تر ولی نیازمند نصب است
جست‌وجوی متنgreprg، aggrep پایه و قابل‌اعتماد؛ rg مناسب کد و احترام‌گذار به gitignore
کانتینرdockerpodmanPodman daemonless و rootless؛ Compose و اکوسیستم Docker گسترده‌تر
لاگ سرویسtail /var/log/*.logjournalctlدر سیستم‌های systemd، journal فیلتر و metadata بهتری دارد
زمان‌بندیcronsystemd timertimer وابستگی، لاگ و وضعیت سرویس را بهتر مدیریت می‌کند
دانلودwgetcurlwget برای دانلود بازگشتی؛ curl برای HTTP/API و انتقال‌های متنوع
رمزنگاری فایلgpgageGPG کامل‌تر؛ age ساده‌تر و مناسب رمزنگاری فایل
شل تعاملیbashzsh، fishاسکریپت‌های قابل‌حمل را با POSIX/Bash نگه دار؛ fish سازگاری Bash ندارد
💡
«مدرن‌تر» همیشه «بهتر» نیست: برای اسکریپت نجات روی یک سرور تازه، ابزارهای پایه مثل sh، grep، find و tar معمولاً از ابزارهای اضافی قابل‌اعتمادترند.
🗺️

48. نقشه راه یادگیری

0 دستور و مبحث

نقشه راه یادگیری: از صفر تا ترمینال‌باز

مرحله ۱ — هفته ۱ و ۲

پیمایش و فایل‌ها: cd/ls/cp/mv/rm/mkdir + cat/less/head/tail + tab completion. هدف: بدون ترس در سیستم جابه‌جا شوی.

مرحله ۲ — هفته ۳ و ۴

متن و پایپ: grep/sort/uniq/cut/wc + | و > . هدف: بتوانی از لاگ ۱۰۰ مگی در ۳۰ ثانیه جواب بگیری.

مرحله ۳ — ماه ۲

مجوزها، فرآیندها، بکاپ: chmod/chown + ps/top/kill + tar/rsync + ssh. هدف: مدیریت یک VPS شخصی کامل.

مرحله ۴ — ماه ۳ و ۴

Bash Scripting: توابع، شرط‌ها، حلقه‌ها + shellcheck. هدف: اولین اتوماسیون واقعی خودت.

مرحله ۵ — ماه ۵ و ۶

سیستم: systemd، journalctl، دیسک، cron، کاربران. هدف: راه‌اندازی و نگهداری سرور عملیاتی.

مرحله ۶ — بعدش

تخصص: Docker، شبکه عمیق، Git حرفه‌ای، امنیت، یا هر مسیری که کارت می‌کشد.

قانون طلایی یادگیری

ℹ️
توصیه کتاب: «The Linux Command Line» از William Shotts — رایگان و بهترین کتاب متنی این مسیر. برای عمق: «How Linux Works».

49. برگه تقلب نهایی

1 دستور و مبحث

برگه تقلب: پرتکرارترین ترکیب‌های یک‌خطی

terminal
# ── فایل‌ها ──
du -sh * | sort -rh | head            # بزرگ‌ترین پوشه‌ها
find . -mtime -1 -type f              # فایل‌های ۲۴ ساعت اخیر
rsync -avh --progress src/ dst/       # کپی هوشمند با پیشرفت
tar -czf out.tar.gz folder/           # بکاپ فشرده

# ── متن و لاگ ──
grep -i error app.log | tail -20      # خطاهای آخر
grep -rn "TODO" . --include="*.py"    # جست‌وجو در کد
sort f | uniq -c | sort -rn | head    # پرتکرارترین‌ها
tail -f app.log | grep --line-buffered ERROR

# ── سیستم ──
uptime && free -h && df -h            # سلامت در یک خط
ps aux --sort=-%cpu | head            # پر‌مصرف‌های CPU
sudo ss -tulpn                        # پورت‌های باز
systemctl --failed                    # سرویس‌های مرده

# ── شبکه ──
ping -c4 1.1.1.1                      # اینترنت؟
curl -sI https://site.com | head -1   # سایت بالا است؟
dig +short domain.com                 # IP دامنه
ssh -L 5432:localhost:5432 user@srv   # تونل دیتابیس

# ── اضطراری ──
sudo dmesg -T | tail                  # آخرین رخداد کرنل
journalctl -b -1                      # لاگ بوت قبلی
sudo lsof +L1 | grep deleted          # فضای فانتوم
timeout 10 command                    # گروگان‌گیر را نجات بده

final-wordsسخن آخر

پیشرفته

سه جمله‌ای که اگر حافظه‌ات فقط این‌قدر جا داشت، ارزش ذخیره دارند:

terminal
۱.  قبل از Enter خواندن، جزء دین ترمینال‌نشین‌هاست.
۲.  هر مشکلی که یک بار حل کردی، دفعه بعد اسکریپتش کن.
۳.  man page و لاگ‌ها هرگز دروغ نمی‌گویند؛ ما فقط کم می‌خوانیم.