۱. مبانی ترمینال و شناخت سیستم¶
این فصل پایهٔ کار روزانهٔ مدیر سیستم است. قبل از هر تغییر روی سرور، باید بتوانید محیط، کاربر جاری، نسخهٔ توزیع و وضعیت سلامت اولیه را در کمتر از یک دقیقه تشخیص دهید.
چرا این بخش مهم است؟¶
- بیشتر اشتباهات عملیاتی از «فرض اشتباه دربارهٔ محیط» شروع میشود (فکر کردن که روی 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 |
اجرای فرمان با مجوز بالاتر | تغییر تا مخرب |
قبل از اولین فرمان روی یک سرور¶
یک ثانیه مکث کنید و سه سؤال را جواب دهید:
- کدام سرور؟
hostname -f— با آنچه میخواستید یکی است؟ (prompt را طوری تنظیم کنید که نام میزبان و محیط را همیشه نشان دهد؛ برای production رنگ قرمز.) - کدام کاربر؟
id— root هستم؟ چرا؟ - در چه نشستی؟ اگر اتصال 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 ممکن است رمز یا توکن را شامل شود (هر چه روی صفحه آمد). مجوز آن را 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 مطمئن شوید فرمان درست است) |
تشخیص دقیق توزیع و معماری¶
# استاندارد مدرن
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 بنویسید.
خلاصهٔ اجرایی¶
- هویت سیستم و کاربر را با
hostnamectl+id+cat /etc/os-releaseمشخص کنید. - کار طولانی را در
tmuxاجرا کنید. - سلامت اولیه را با
uptime+free -h+df -hTبگیرید. - فقط وقتی نیاز به مجوز بالاتر دارید از
sudoاستفاده کنید و ترجیحاً یک فرمان مشخص. - تفاوت توزیع را قبل از کپی دستور از اینترنت بررسی کنید.