پرش به محتویات

۱. مبانی ترمینال و شناخت سیستم

این فصل پایهٔ کار روزانهٔ مدیر سیستم است. قبل از هر تغییر روی سرور، باید بتوانید محیط، کاربر جاری، نسخهٔ توزیع و وضعیت سلامت اولیه را در کمتر از یک دقیقه تشخیص دهید.

چرا این بخش مهم است؟

  • بیشتر اشتباهات عملیاتی از «فرض اشتباه دربارهٔ محیط» شروع می‌شود (فکر کردن که روی Ubuntu هستید در حالی که Rocky است، یا روی staging هستید در حالی که production است).
  • دستورهای یکسان در توزیع‌های مختلف مسیر، نام بسته یا رفتار متفاوت دارند.
  • بدون شناخت sudo، history و متغیرهای محیطی، عیب‌یابی و مستندسازی ناقص می‌ماند.

راهنمای سریع فرمان‌ها

فرمان کاربرد اصلی سطح ریسک
man / command --help راهنمای کامل / خلاصه بدون تغییر
type / command -v تشخیص مسیر و نوع فرمان بدون تغییر
history تاریخچهٔ پوسته بدون تغییر
date / timedatectl ساعت و منطقهٔ زمانی بدون تغییر (تنظیم ساعت: تغییر)
hostnamectl نام میزبان و اطلاعات سیستم بدون تغییر
uname اطلاعات هسته و معماری بدون تغییر
uptime زمان روشن بودن و load average بدون تغییر
whoami, id, who, w کاربر و نشست‌های فعال بدون تغییر
env / printenv متغیرهای محیطی بدون تغییر
tmux نشست پایدار (قطع اتصال، کار را نمی‌کشد) بدون تغییر
sudo اجرای فرمان با مجوز بالاتر تغییر تا مخرب

قبل از اولین فرمان روی یک سرور

یک ثانیه مکث کنید و سه سؤال را جواب دهید:

  1. کدام سرور؟ hostname -f — با آنچه می‌خواستید یکی است؟ (prompt را طوری تنظیم کنید که نام میزبان و محیط را همیشه نشان دهد؛ برای production رنگ قرمز.)
  2. کدام کاربر؟ id — root هستم؟ چرا؟
  3. در چه نشستی؟ اگر اتصال SSH قطع شود، کار نیمه‌کاره می‌ماند؟ → از tmux استفاده کنید.
# prompt هشداردهنده برای production (در ~/.bashrc همان سرور)
# نمونه: نام میزبان قرمز + مسیر
PS1='\[\e[1;31m\]\u@\h\[\e[0m\]:\w\$ '

مثال‌های عملی روزمره

# راهنما
man systemctl
systemctl --help
man 5 systemd.service          # صفحهٔ man مربوط به فایل unit
man -k "disk usage"            # جست‌وجو در راهنما بر اساس موضوع

# تشخیص فرمان
type ls
type -a python3                # همهٔ نسخه‌ها و alias ها
command -v docker              # مسیر (یا خالی اگر نصب نیست)

# تاریخچه و زمان
history | tail -n 30
history | grep -i "systemctl"
date '+%F %T %Z'
timedatectl status

# هویت سیستم
hostnamectl
uname -a
cat /etc/os-release
cat /etc/redhat-release 2>/dev/null || true

# سلامت سریع
uptime
cat /proc/loadavg
whoami
id
w

نکتهٔ عملیاتی

خروجی uptime و /proc/loadavg را همیشه نسبت به تعداد هسته تفسیر کنید.
nproc تعداد هستهٔ منطقی را نشان می‌دهد. load متوسط ۱.۵ روی ماشین ۲ هسته‌ای معقول است؛ روی ماشین ۳۲ هسته‌ای نشانهٔ بیکاری است.

نشست پایدار با tmux

اگر SSH قطع شود، فرمان‌های در حال اجرا (مثل apt upgrade، rsync یا یک مهاجرت طولانی) با SIGHUP کشته می‌شوند و ممکن است سیستم در وضعیت نیمه‌کاره بماند. هر کار طولانی را داخل tmux اجرا کنید.

tmux new -A -s ops             # ساخت یا اتصال دوباره به نشست «ops»
tmux ls                        # فهرست نشست‌ها
tmux attach -t ops             # اتصال دوباره بعد از قطع شدن
# داخل tmux:  Ctrl+b سپس d  = جدا شدن (detach) بدون کشتن کار

برای ثبت کامل یک نشست (مستندسازی رخداد):

script -a -q /var/tmp/session-$(date +%F-%H%M).log   # ثبت ورودی/خروجی؛ با exit تمام می‌شود

فایل ثبت نشست حساس است

خروجی script ممکن است رمز یا توکن را شامل شود (هر چه روی صفحه آمد). مجوز آن را 600 کنید و بعد از رخداد امن نگه دارید یا حذف کنید.

اجرای امن با sudo

# فقط بررسی وضعیت — بدون تغییر
sudo systemctl status ssh
sudo -l                    # لیست مجوزهای sudo کاربر جاری
sudo -n true && echo "sudo بدون رمز مجاز است" || echo "sudo رمز می‌خواهد"

# اجرا به‌جای کاربر دیگر (بدون root شدن)
sudo -u appuser -- id
  • sudo -l نشان می‌دهد کاربر چه فرمان‌هایی را مجاز است با sudo اجرا کند.
  • sudo -i یک shell کامل root باز می‌کند — فقط وقتی واقعاً لازم است استفاده کنید و بعد از کار exit بزنید.
  • در محیط‌های سازمانی، ترجیحاً از sudo برای یک فرمان مشخص استفاده کنید نه shell تعاملی root؛ هر فرمان در لاگ ثبت می‌شود (journalctl _COMM=sudo یا /var/log/auth.log).
  • بعد از اشتباه رمز یا پایان کار حساس: sudo -k اعتبار کش‌شدهٔ sudo را پاک می‌کند.

هشدار

هرگز پسورد root یا خروجی sudo -l حاوی اطلاعات حساس را در تیکت عمومی یا Git قرار ندهید.

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

کار فرمان / کلید
نمایش مسیر جاری pwd
رفتن به مسیر مطلق cd /var/log
رفتن به پوشهٔ والد cd ..
بازگشت به مسیر قبلی cd -
پوشهٔ خانگی cd ~ یا فقط cd
تکمیل خودکار Tab (دوبار برای لیست)
قطع فرمان جاری Ctrl+C
جست‌وجو در تاریخچه Ctrl+R سپس تایپ بخشی از فرمان
رفتن به ابتدای خط Ctrl+A
رفتن به انتهای خط Ctrl+E
پاک‌کردن خط Ctrl+U
اجرای مجدد آخرین فرمان با sudo sudo !! (قبل از Enter مطمئن شوید فرمان درست است)
# مثال ترکیبی
cd /var/log
pwd
ls -lt | head
cd -

تشخیص دقیق توزیع و معماری

# استاندارد مدرن
cat /etc/os-release
# خروجی نمونه: ID=ubuntu / VERSION_ID=22.04 یا ID=rocky / VERSION_ID=9

# هسته و معماری
uname -r
uname -m
dpkg --print-architecture 2>/dev/null || true          # Debian/Ubuntu
rpm --eval '%{_arch}' 2>/dev/null || true               # RHEL/Fedora/Rocky
getconf LONG_BIT                                        # 32 یا 64

# مجازی است یا فیزیکی؟
systemd-detect-virt || true

# اطلاعات سخت‌افزاری خلاصه
lscpu | head -20
free -h

تفاوت توزیع‌ها

قبل از کپی‌کردن دستور از اینترنت:

  • Debian/Ubuntu → apt / dpkg / systemctl + مسیرهای /etc/apt
  • RHEL/Rocky/Alma → dnf/yum / rpm + SELinux اغلب فعال است
  • Alpine → apk و معمولاً OpenRC به‌جای systemd
  • SLES → zypper

متغیرهای محیطی مهم

echo "$PATH"
echo "$HOME"
echo "$USER"
echo "$SHELL"
echo "$LANG"
printenv | sort | head -40

# موقت برای یک نشست
export EDITOR=vim
export HISTTIMEFORMAT="%F %T "

# خروجی پایدار و قابل‌پردازش (زبان/محلی را خنثی می‌کند؛ برای اسکریپت‌ها)
LC_ALL=C df -h
  • PATH تعیین می‌کند سیستم فرمان‌ها را از کجا پیدا کند.
  • در اسکریپت‌های عملیاتی همیشه مسیر کامل فرمان‌های حساس را بنویسید (/usr/bin/systemctl به‌جای فقط systemctl) تا وابسته به PATH کاربر نباشد.
  • printenv ممکن است رمز و توکن را نشان دهد (متغیرهای محیطی). خروجی آن را بی‌فکر در تیکت نچسبانید.

بررسی سریع سلامت سیستم (Checklist یک‌دقیقه‌ای)

قبل از هر تغییر مهم این دستورها را اجرا و خروجی را نگه دارید:

date; hostnamectl --static; uptime
grep -E '^(NAME|VERSION)=' /etc/os-release
free -h
df -hT /
systemctl is-system-running 2>/dev/null || true
systemctl --failed --no-pager
who

خروجی این مجموعه را می‌توانید در ابتدای تیکت یا گزارش رخداد بچسبانید. نسخهٔ کامل‌تر آن scripts/incident-snapshot.sh است (راهنمای رخداد).

خطاهای رایج و عیب‌یابی

نشانه علت احتمالی روش بررسی
command not found بسته نصب نیست یا PATH اشتباه type cmd ، echo $PATH ، نصب بسته
Permission denied کمبود مجوز یا SELinux/AppArmor ls -l ، id ، sudo -l
ساعت سیستم اشتباه NTP خراب یا timezone غلط timedatectl ، chronyc tracking
sudo: a password is required کاربر در sudoers نیست یا NOPASSWD ندارد sudo -l ، فایل‌های /etc/sudoers.d/
user is not in the sudoers file کاربر مجاز نیست (این رویداد لاگ می‌شود) با مدیر هماهنگ کنید؛ کاربران و مجوزها
نشست SSH وسط کار قطع شد شبکه یا timeout از tmux استفاده کنید؛ SSH
متن فارسی در ترمینال به‌هم‌ریخته ترمینال RTL/شکل‌دهی ندارد خروجی را در فایل ذخیره و در ویرایشگر باز کنید؛ LANG=en_US.UTF-8 برای پایداری فرمان‌ها

نکات امنیتی و عملیاتی

  • همیشه قبل از sudo فرمان را بدون sudo تست کنید اگر ممکن است.
  • از history -c یا پاک‌کردن دستی history برای مخفی‌کردن کار حساس استفاده نکنید؛ به‌جای آن از حساب جدا و لاگ مرکزی استفاده کنید.
  • رمز را هرگز در خط فرمان ندهید (mysql -pSECRET)؛ در history و ps دیده می‌شود. از فایل با مجوز 600، متغیر محیطی موقت یا prompt استفاده کنید. برای ندیدن یک فرمان در history، قبل از آن یک فاصله بگذارید (اگر HISTCONTROL=ignorespace فعال باشد) — این جایگزین رعایت اصل بالا نیست.
  • در سرورهای اشتراکی، w و who را چک کنید تا ببینید چه کسی همزمان لاگین است.
  • برای مستندسازی، خروجی uname -a و cat /etc/os-release را در ابتدای هر runbook بنویسید.

خلاصهٔ اجرایی

  1. هویت سیستم و کاربر را با hostnamectl + id + cat /etc/os-release مشخص کنید.
  2. کار طولانی را در tmux اجرا کنید.
  3. سلامت اولیه را با uptime + free -h + df -hT بگیرید.
  4. فقط وقتی نیاز به مجوز بالاتر دارید از sudo استفاده کنید و ترجیحاً یک فرمان مشخص.
  5. تفاوت توزیع را قبل از کپی دستور از اینترنت بررسی کنید.