مرجع کامل، راستچین و فارسی برای کار با ترمینال: از مبانی تا ادمینی حرفهای. با فونت وزیرمتن (Vazirmatn)، بیش از 400 دستور در 52 بخش، جدول گزینهها، مثالهای واقعی ترمینال، مسیر نصب پکیجها، Bash Scripting کامل، شبکه، امنیت، Git، Docker، Kubernetes، OpenSSH کامل و مرجع زیرفرمانها (ip، systemctl، apt، tmux). کاملاً آفلاین — بدون هیچ وابستگی اینترنتی.
فونت: Vazirmatnمونواسپیس: JetBrains Monoجستوجوی زنده: کلید /دکمه کپی روی همه کدهاتم تاریک / روشنRTL کامل
Shell یک برنامه است که دستورهای متنی شما را میخواند، تفسیر میکند و به سیستمعامل میدهد. وقتی پایهها را بلد باشی، در هر توزیعی — از سرور بدون رابط گرافیکی گرفته تا رزبریپای — خانهای. معروفترین شلها:
bash — استانداردِ د فاکتوی اکثر توزیعها (Bourne Again Shell)
zsh — پیشفرض macOS با قابلیتهای بیشتر
fish — دوستانه با پیشنهاد خودکار، ولی ناسازگار با سینتکس POSIX
sh — معمولاً لینکی به bash در حالت سازگار (dash در Debian سبکتر است)
این هندبوک همهجا روی bash تمرکز دارد، چون روی ۹۹٪ سرورها همین حضور دارد.
ساختار عمومی یک دستور
terminal
command [options] [arguments]
ls -la /etc # ls=دستور، -la=گزینهها، /etc=آرگومان
ls = نام برنامهای که اجرا میشود
-la = گزینهها (options / flags) رفتار دستور را عوض میکنند
/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 # فقط یکی
$HOME خانه · $USER نام کاربر · $PATH مسیر جستوجوی برنامهها
#!/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 کامل توضیح دادهام.
از یک ترمینال، چند پنجره و پنل میسازد. مهمترین ویژگی: جلسهها با قطعشدن 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 # بستن جلسه
مستند استاندارد یونیکس برای تقریباً هر دستور. یادگیری قدمزدن داخل 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) طلا هستند.
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 خروج
نرمافزارهای نصبشده بهصورت مستقل (مثل 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
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نام فایل بدون مسیر
پیشفرض سیستم
از یک مسیر، فقط آخرین جزء (نام فایل) را میدهد؛ در اسکریپتها برای کار با نام فایلها لازم میشود.
هرگز در اسکریپت از /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 # فقط ساخت پوشه با مجوز
محتوای یک یا چند فایل را روی خروجی میریزد؛ برای فایلهای کوچک، ساخت فایل سریع و الحاق فایلها.
گزینه
کار
-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 N
N خط اول
-c N
N بایت اول
-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 N
N خط آخر
-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مقایسه بایتبهبایت
پیشفرض سیستم
دو فایل را بایتبهبایت مقایسه میکند و اولین تفاوت را اعلام میکند؛ برای چککردن سلامت کپیها از هر نوع فایلی.
سه ستون میدهد: فقط در فایل ۱، فقط در فایل ۲، مشترک. ابزار مجموعهسازی روی خطوط — به شرط مرتببودن ورودی.
گزینه
کار
-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 # بعد اجرای واقعی
قدرت واقعی لینوکس در ترکیب ابزارهای کوچک است: هر دستور یک کار را خوب انجام میدهد و خروجیاش را به دستور بعدی میدهد. سه چیز که این ترکیب را ممکن میکند:
| (pipe) خروجی یک دستور را ورودی بعدی میکند
> و >> خروجی را در فایل مینویسند (بازنویسی / افزودن)
2> و &> جریان خطا را جدا یا با هم میبرند
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
مطابقت کلمه کامل
-E
regex توسعهیافته (معادل egrep): + ? | {n,m}
-F
جستوجوی ساده بدون regex (سریعتر)
-P
regex پرل با look-ahead (PCRE)
-o
فقط بخش منطبق را چاپ کن
-A n / -B n / -C n
n خط بعد/قبل/اطرافِ هر مطابقت
--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 محبوبترین الگوی آماری ترمینال است.
از هر خط، بخش مشخصی (فیلد با جداکننده یا بازه کاراکتر) را برمیدارد. ساده و سریع برای داده جدولی مثل 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 میخواند — پس معمولاً داخل پایپ است.
جانشین مدرن 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
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
-E
regex توسعهیافته (بدون بکاسلشهای اضافه)
-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 روی ساختار تودرتو همیشه یک جایی میشکند.
متن فارسی دو چالش دارد: انکودینگ (UTF-8 استاندارد است) و جهت نمایش RTL. چند واقعیت کاربردی:
هر فایل متنی را قبل از پردازش با file -i چک کن؛ اگر utf-8 نبود با iconv تبدیل کن.
حروف فارسی مثل «ی» و «ک» دو شکل دارند: عربی (U+064A / U+0643) و فارسی (U+06CC / U+06A9). برای جستوجوی مطمئن اول نرمالایز کن.
نیمفاصله (U+200C) در grep با -P '\x{200C}' پیدا میشود.
ابزار uconv برای نرمالایز یونیکد عالی است.
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
جستوجوی زنده و دقیق روی دیسک — همیشه موجود، همه شرطها
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 وسط مسیر با یک اشتباه کوچک قابل برگشت نیست.
جستوجوی فایل با سینتکس ساده و رنگی و سریعتر از 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تبدیل خروجی به آرگومان
پیشفرض سیستم
خروجی یک دستور را به آرگومان دستور دیگر تبدیل میکند — حلقه حلقهزدن دستی را حذف میکند و ستون فقرات پایپهای حرفهای است.
خروجی ls -l با رشتهای مثل -rwxr-x--- شروع میشود:
terminal
- rwx r-x --- ali dev 1.2M report.pdf
│ │ │ │ │ │
│ │ │ └ دیگران (others)
│ │ └ گروه (group)
│ └ مالک (owner/user)
└ نوع: - فایل، d پوشه، l لینک
r=خواندن(4) w=نوشتن(2) x=اجرا(1)
rwx = 4+2+1 = 7 → rwxr-x--- = 750
مجوز روی فایل
r خواندن محتوا · w ویرایش · x اجرا بهعنوان برنامه
مجوز روی پوشه
r دیدن لیست · w ساخت/حذف فایل داخلش · x ورود (cd)
عدد 777؟!
همهچیز برای همه — تقریباً همیشه اشتباه است. برای پوشه اشتراکی 775/770 و برای اسکریپت 755 مناسب است.
lnساخت لینک نمادین یا سخت
پیشفرض سیستم
دو نوع لینک: نمادین (-s) مثل میانبر است و اگر اصلی پاک شود میشکند؛ سخت نام دیگری برای همان داده است — پاککردن یکی، داده را نگه میدارد تا آخرین نام هم پاک شود.
گزینه
کار
-s
لینک نمادین (symlink) — رایجترین
-f
بازنویسی لینک موجود
-i
سؤال قبل از بازنویسی
-v
نمایش عملیات
terminal
ln -s /opt/myapp/v2.1/current # میانبر به نسخه فعال ★
ln -sf /opt/myapp/v2.2 current # سوییچ نسخه اتمی در دیپلوی
ln -s ~/projects/web ~/desktop-link
ln file.txt hardlink.txt # لینک سخت (فقط روی یک فایلسیستم)
ls -li file.txt hardlink.txt # inode یکسان = همان داده
readlink -f current # میرسد به کجا؟
💡
الگوی حرفهای دیپلوی: app روی /opt/app-v2.2 نصب میشود و /opt/current همیشه symlink به نسخه فعال است؛ برگشت به نسخه قبل = یک ln -sfn
chmodتغییر مجوزها
پیشفرض سیستم
مجوز خواندن/نوشتن/اجرای فایلها را تغییر میدهد — دو سبک: عددی (755) و نمادی (u+x).
گزینه
کار
755 / 644
عددی: مالک/گروه/دیگران با r=4 w=2 x=1
u+x
نمادی: مالک (u) گروه (g) دیگران (o) همه (a) + اضافه − حذف = تنظیم
-R
بازگشتی روی کل پوشه
--reference=f
کپی مجوزهای فایل دیگر
terminal
chmod +x script.sh # اجرایی کردن ★
chmod 755 deploy.sh # rwxr-xr-x
chmod 644 config.yml # rw-r--r-- (فایلهای معمولی)
chmod 600 ~/.ssh/id_ed25519 # فقط مالک (شرط ssh!) ★
chmod 700 private/ # پوشه فقط برای خودت
chmod -R g+w shared/ # گروه بنویسد، بازگشتی
chmod a-r secret.txt # از همه خواندن را بگیر
chmod u=rw,g=r,o= notes.txt # تنظیم صریح هر سطح
chmod --reference=good.conf bad.conf # هممجوز کردن با فایل سالم
# مجوزهای پیشفرض پوشه: 755 (با umask 022)
⚠️
هرگز اسکریپتها و پوشههای وب را 777 نکن. مشکل «اجرا نمیشود» تقریباً همیشه با chmod +x حل میشود و مشکل «سرور بنویسد» با مالکیت درست (chown www-data) — نه با بازکردن درِ همهجا.
chownتغییر مالک و گروه فایل
پیشفرض سیستم
مالک و گروه فایل/پوشه را عوض میکند (نیاز به root). پرکاربردترین سناریو: دادن فایلهای وب به کاربر سرویس.
گزینه
کار
user:group
مالک و گروه با هم
-R
بازگشتی
--reference=f
کپی مالکیت از فایل دیگر
-h
روی خود symlink نه مقصد
terminal
sudo chown ali file.txt
sudo chown ali:developers project/
sudo chown -R www-data:www-data /var/www/html # استاندارد وب ★
sudo chown :team report.txt # فقط گروه
ls -la /var/www/html # نتیجه را چک کن
رمز خودت یا (با sudo) رمز کاربر دیگر را عوض میکند.
گزینه
کار
-S
وضعیت رمز کاربر
-l / -u
قفل / بازکردن حساب
-e
اجبار تغییر رمز در لاگین بعدی
terminal
passwd # تغییر رمز خودم
sudo passwd ali # تغییر رمز کاربر ali
sudo passwd -S ali # وضعیت: P=فعال L=قفل
sudo passwd -l ali # قفل حساب (مثلاً کارمند خروجکرده)
sudo passwd -e ali # در اولین ورود رمز عوض کن
chpasswd <<< "ali:NewPass123" # تعویض غیرتعاملی (در اسکریپت)
هر پروسه سه جریان دارد: 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: ضبط نشست را با زمانبندی اصلی دوباره پخش میکند — آموزش و بازبینی عملیات.
لیست پروسهها — برخلاف 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 # فقط یک پروسه
نسخه مدرن 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 (پایان نرم) است — برنامه فرصت ذخیره و تمیزکاری دارد.
امروزه توصیه استاندارد: کارهای جدی را در 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 دوم
چه مدت سیستم روشن است، چند کاربر دارد و مهمتر از همه: میانگین بار (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 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: مدل، تعداد هسته/ترد، فرکانس، معماری، پشتیبانی مجازیسازی.
برخلاف 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/ — نام فایل همیشه با تاریخ درست میشود.
اگر 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 و تغییر اندازه زنده — ابزار استاندارد سرورهای مدرن.
فرمت یعنی پاکشدن همه داده آن پارتیشن. آخرین بار نام دستگاه را با 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 options
ro، 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» یعنی پروسهای داخلش کار میکند.
گزینه
کار
-l
lazy: بعداً جدا میشود (وقتی بازها بسته شدند)
-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
# دیدن فایل و فرمتش:
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 را.
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.
نمایش/تنظیم زمان، منطقه زمانی و 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 برایش بنویس تا دیگر تکرار نشود.
آرشیو ≠ فشردهسازی: 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.
فرمت همهجا-شناخت. برای فرستادن فایل به ویندوز یا هرجای دیگر، انتخاب اول است.
گزینه
کار
-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 خروجی را ببین.
خانواده 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پورتها و اتصالهای سوکت
پیشفرض سیستم
لیست سوکتهای باز: چه برنامهای روی چه پورتی گوش میدهد، چه اتصالهایی برقرار است — بازرسی امنیتی و عیبیابی «پورت اشغال».
گزینه
کار
-t
TCP
-u
UDP
-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 میآید
اگر سایت برای تو باز نمیشود: dig +short site.com @1.1.1.1 را با dig +short site.com مقایسه کن — اختلاف یعنی DNS محلی/ISP مشکل دارد. کش محلی را با sudo resolvectl flush-caches خالی کن.
مالک دامنه، تاریخ ثبت/انقضا و مسؤول 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 -tulpn → ss -tulpn، netstat -r → ip route، netstat -i → ip -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
💡
معادل مدرن: ifconfig → ip addr، route -n → ip 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 ببین دارد با کجا حرف میزند.
تست 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 سریعتر برای فایلهای حجیم)، ازسرگیری و دانلود از چند منبع.
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: تست پورت، ارسال فایل، سرور اضطراری و دیباگ پروتکلها. به آن «چاقوی سوئیسی شبکه» میگویند.
کنترل کامل شبکه روی دسکتاپ/سرورهایی با 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 و خالیکردن کش — وقتی «سایت باز نمیشود ولی همهجا بالا است».
# هر خط 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 1500
UID دستی
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 # بازنشانی قفل
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 فقط سریعتر و با وابستگییابی بهتر است.
# ┌──────── دقیقه (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 خودش را دارد. این دستورها آن را ویرایش/لیست/حذف میکنند.
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 خاموش بود، وظایف روزانه/هفتگی را بعد از روشنشدن اجرا میکند — درمان «هر هفته خاموش بود و بکاپ اجرا نشد».
استاندارد اتصال به سرورها؛ حملکننده شل، فایل، پورتفوروارد و حتی 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 "آیپی-سرور" # و دوباره وصل شو
قبل از اجرای هر اسکریپت اینترنتی، اول بخوانش: less script.sh.
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 و رمزهای متقارن.
فایروال دوستداشتنی: سه دستور تا یک سرور ایمن. قانون طلایی: اول اجازه 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ها و تغییر زنده.
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
ثبت خودکار رخدادهای امنیتی (چه کسی چه فایلی را عوض کرد) با قوانین دقیق — استاندارد بررسیهای بعد از حادثه.
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
ویرایشگر 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 خروج از همه
📦 نصب: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 # باینری بهینهشده نهایی
جانشین کاربردی 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 فقط برای برنچهای شخصی و قبل از اشتراک.
دو کار در یک: 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~n
n کامیت عقب
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 بدون مرورگر.
ساخت، اجرا و مدیریت کانتینرها. بعد از افزودن کاربر به گروه 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 # آپدیت تمیز
کانتینرها بیحافظهاند؛ 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 استفاده کن.
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 روی نام
set -o pipefail: شکست وسط پایپ کل پایپ را شکستخورده کن (نه فقط آخرین دستور)
trap … EXIT: پاکسازی تضمینی فایلهای موقت
متغیرها و جایگذاریها (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
# ── دیباگ ──
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چکلیست اسکریپت آمادهی عملیات
پیشرفته
قالب نهایی که میتوانی مستقیم کپی کنی و شروع کنی — لاگ، قفل، پاکسازی و کد خروج دارد.
متغیر معمولی فقط داخل همان شل زنده است؛ 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 # اجبار کد خروجی ناموفق
یک سرور (فیزیکی/مجازی) که کانتینرها رویش اجرا میشوند
Pod پاد
کوچکترین واحد استقرار؛ معمولاً یک کانتینر (گاهی چندتای رفیق)
Deployment
مدیر پادها: چند نسخه، بهروزرسانی غلتان، برگشت خودکار
Service سرویس
آدرس پایدار برای رسیدن به پادها (پادها میمیرند و میآیند، سرویس ثابت است)
Namespace
پارتیشن منطقی داخل کلاستر برای جداسازی پروژهها/تیمها
Ingress
مسیریاب ترافیک HTTP از بیرون به سرویسها
جریان کار: تو Deployment را تعریف میکنی ← کوبورنتیز مطمئن میشود همیشه همان تعداد پادِ سالم، همانطور که خواستی، اجرا میشود. اگر پادی مرد، فوراً جایگزین میشود.
ℹ️
برای تمرین محلی، سبکترین راه kind (Kubernetes in Docker) است؛ minikube هم گزینه معروفی است.
دستور اصلی صحبت با کلاستر: دیدن منابع، اجرا، دیباگ. تقریباً هر کاری با همین یک باینری انجام میشود.
گزینه
کار
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 هم همین است.
جانشین رسمی (از ۲۰۱۴): سینتکس تمیزتر، عملکرد بهتر، 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 / -d
IP مبدأ / مقصد
-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 # سقف — پر شدنش یعنی رد شدن اتصالها!
ترتیب مقدس: ۱) پایه (baseline) بگیر ← ۲) یک تغییر بده ← ۳) دوباره اندازه بگیر ← ۴) جواب نگرفتی؟ برگردان. تغییرات همزمان یعنی هیچوقت نفهمی کدام کار کرد.
پایه سیستم
vmstat، iostat، free — در بخش مانیتورینگ
پروفایل برنامه
perf — دقیقاً کدام تابع CPU میخورد؟
تست بار
stress-ng — سقف سیستم را بشکن، در محیط آزمایش!
تنظیم کرنل
sysctl — swap، بافرها، صفهای شبکه
سقف پروسهها
ulimit / LimitNOFILE
قدرت پردازنده
cpupower — گاورنر performance
sysctl-tuningتنظیمهای عملی کرنل
پیشفرض سیستم
پرتکرارترین sysctlهایی که روی سرورهای واقعی تنظیم میشوند — با توضیح اینکه هر کدام چه دردی دوا میکند.
هر 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'
پاسخ علمی به «چرا کند است؟»: نمونهگیری زنده از توابع در حال اجرا، شمارندههای 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 درست کار میکند — فقط روی محیط آزمایش!
نصب مستقیم با 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 انتخاب کن.
ابزار نسل جدید به زبان 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
وابستگیها، محیط مجازی، 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 برای انتشار
# /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 مینشیند.
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 # نمودار زمانی بوت (توی مرورگر ببین)
# ۱) سرویس واقعاً روشن است؟
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) تا دفعه بعد ۵ دقیقهای حل شود
پیشفرض 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
اتصال پوشه سرور بهعنوان دیسک، با گزینههای مقاومسازی برای اتصالهای ناپایدار.
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-linkip link — کارتهای شبکه
پیشفرض سیستم
کنترل لایه ۲: بالا/پایین کردن کارت، MTU، نام، MAC و ساخت رابطهای مجازی.
terminal
ip link # همه رابطها
ip -br link # کوتاه: وضعیت UP/DOWN ★
ip -d link show eth0 # جزئیات کامل (درایور و قابلیتها)
ip -s -s link show eth0 # آمار ارور و drop
sudo ip link set eth0 up
sudo ip link set eth0 down
sudo ip link set eth0 mtu 9000 # جومbo فریمها
sudo ip link set eth0 address aa:bb:cc:dd:ee:ff # تغییر MAC
sudo ip link set eth0 name wan0 # تغییر نام (کارت باید down باشد)
# رابط مجازی:
sudo ip link add myvlan link eth0 type vlan id 100
sudo ip link add br0 type bridge
sudo ip link del myvlan
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 # سیاستهای انتخاب آدرس
خانواده داکر: بخشبندی زیرفرمانها (نسخههای جدید)
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"
جابهجایی تصاویر بدون رجیستری و ثبت نسخه دستی — برای سرورهای بدون اینترنت.
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 # همهچیز (پیش از این، بکاپ!)
علاوه بر دستورهای روزمره بخش 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/
کنار 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
هر چیزی که با پیشوند 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 یک شماره و نام دارد.
تقسیمبندی صفحه و جابهجایی — قلب کار روزمره داخل 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. راهنمای توزیعها و تفاوتهای آنها
مرجع سریع ۸ خانواده لینوکسی
این جدول مشخص میکند هر دستور متعلق به کدام خانواده است و برای نصب ابزارها از چه مسیر استانداردی استفاده شود. نام بستهها ممکن است در نسخههای مختلف تغییر کند؛ قبل از اجرای دستور، مدیر بسته توزیع خودت را تشخیص بده.
● هسته سیستم / معمولاً پیشفرض● نیازمند نصب بسته● مخصوص توزیع یا خانواده● خطرناک: بازبینی قبل از اجرا
دستورهای نصب و ارتقا را بین خانوادهها جابهجا نکن. در Alpine، musl و OpenRC با glibc و systemd تفاوت دارند؛ در RHEL نیز اشتراک و مخازن فعال اهمیت دارد.
🧱
51. نقشه زیرفرمانهای اصلی ابزارهای مهم
پوشش فرمانهای مدرن و عملیاتی
این فهرست بهجای ادعای پوشش تکتک فلگها، زیرفرمانهای اصلی و پرتکرار را یکجا نشان میدهد. برای گزینههای نسخه نصبشده همیشه --help و man را هم بخوان.
# ── فایلها ──
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 و لاگها هرگز دروغ نمیگویند؛ ما فقط کم میخوانیم.