آموزش مدیریت سرور Ubuntu

راهنمای جامع مدیریت سرور لینوکس Ubuntu از مبانی خط فرمان تا پیکربندی سرویس‌ها، امنیت و اتوماسیون.

چگونه سیستم و سرور لینوکسی خود را مدیریت کنیم
چگونه سیستم و سرور لینوکسی خود را مدیریت کنیم

فهرست مطالب

دسترسی سریع به فصل‌ها و بخش‌های آموزش

فصل ۱: مبانی خط فرمان (CLI)

ابتدا یونیکس ایجاد شد تا همه حق استفاده از کامپیوتر را داشته باشند و هسته GNU Linux ایجاد شد و چند خانواده از آن مشتق شد. تمایز آنها در ریپازیتوری ها و نرم افزارهای آنها مثل میز کارشان است. ریپازیتوری محل جمع آوری نرم افزارهای قابل نصب روی سیستم عامل هستند. توزیع های فوق طیفی شامل چندین نوع سیستم عامل را تشکیل می دهند که مشهورترین آنها عبارتند از:

  • Debian
    • Ubuntu
    • Kali Linux
  • Redhat
    • Fedora
    • CentOS
  • Slackware
  • FreeBSD
  • OpenSUSE
در لینوکس دکمه super key icon in keyboard دکمه سوپر نامیده می شود.

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

۱.۱ ساختار یک دستور در لینوکس

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

command  -options  arguments
   |         |         |
  دستور    سوییچ‌ها   ورودی‌ها

مثال:

ls -la /home
  • ls → دستور (لیست کردن)
  • -la → سوییچ‌ها (l = long format, a = all files)
  • /home → آرگومان (مسیری که باید لیست شود)

سوییچ‌ها با - (کوتاه) یا -- (بلند) نوشته می‌شوند:

ls -a          # کوتاه
ls --all       # بلند
ls -la         # چند سوییچ ترکیبی

۱.۲ ساختار فایل‌سیستم لینوکس

برخلاف ویندوز که درایوها (C:, D:) به صورت جداگانه تعریف می‌شوند، در لینوکس یک درخت واحد وجود دارد که از / (ریشه) آغاز می‌شود.

مسیر کاربرد
/ ریشه کل فایل‌سیستم
/home دایرکتوری کاربران عادی
/root دایرکتوری کاربر root
/etc فایل‌های تنظیمات
/var لاگ‌ها و داده‌های متغیر
/tmp فایل‌های موقت
/bin, /usr/bin دستورات اجرایی
/dev دستگاه‌ها (دیسک، USB و غیره)
/proc, /sys اطلاعات کرنل و سیستم

مسیر مطلق در مقابل مسیر نسبی:

/etc/nginx/nginx.conf    # مطلق (از / شروع می‌شود)
./config.txt             # نسبی (از مسیر جاری)
../logs/                 # نسبی (یک سطح بالاتر)

نمادهای خاص:

  • . → دایرکتوری جاری
  • .. → دایرکتوری والد
  • ~ → دایرکتوری خانگی کاربر (/home/username)

pwd — نمایش مسیر جاری

pwd
# /home/ali

ls — لیست کردن محتویات

ls                # لیست ساده
ls -l             # لیست با جزئیات
ls -a             # نمایش فایل‌های مخفی
ls -lh            # حجم به صورت خوانا (KB, MB)
ls -la /etc       # ترکیبی روی مسیر مشخص
ls -R             # بازگشتی (recursive)

خروجی ls -l:

-rw-r--r-- 1 ali ali 4096 Sep 11 10:30 file.txt
│└┬┘└┬┘└┬┘ │  │   │    │        │      │
│ │  │  │  │  │   │    │        │      └─ نام فایل
│ │  │  │  │  │   │    │        └─ تاریخ
│ │  │  │  │  │   │    └─ حجم
│ │  │  │  │  │   └─ گروه
│ │  │  │  │  └─ مالک
│ │  │  │  └─ تعداد لینک
│ └──┴──┴─ دسترسی‌ها
└─ نوع فایل (- فایل، d دایرکتوری، l لینک)

cd — تغییر مسیر

cd /etc           # رفتن به مسیر مطلق
cd nginx           # رفتن به دایرکتوری داخل مسیر جاری
cd ..              # یک سطح بالاتر
cd ~               # دایرکتوری خانگی
cd -               # بازگشت به دایرکتوری قبلی
cd                 # دایرکتوری خانگی

۱.۲.۲ مدیریت فایل و دایرکتوری

ایجاد

touch file.txt              # ایجاد فایل خالی
mkdir mydir                 # ایجاد دایرکتوری
mkdir -p a/b/c              # ایجاد دایرکتوری‌های تودرتو

کپی

cp file.txt /tmp/           # کپی فایل
cp -r mydir /tmp/           # کپی بازگشتی دایرکتوری
cp -v file.txt backup.txt   # نمایش جزئیات

انتقال و تغییر نام

mv file.txt /tmp/           # انتقال
mv old.txt new.txt          # تغییر نام

حذف

rm file.txt                 # حذف فایل
rm -r mydir                 # حذف دایرکتوری
rm -rf mydir                # حذف اجباری بدون تایید (خطرناک)
rm -i file.txt              # حذف با تایید

هشدار: دستور rm -rf / موجب نابودی کل سیستم می‌شود. هرگز این دستور را با sudo یا روی / اجرا نکنید. r یعنی recursive — بازگشتی، یعنی اگه mydir پوشه بود، محتویات داخلش رو هم حذف کن (فایل‌ها، زیرپوشه‌ها، همه‌چیز)

۱.۲.۳ مشاهده محتوای فایل

cat file.txt                # نمایش کل فایل
less file.txt               # نمایش صفحه‌به‌صفحه (q برای خروج)
head file.txt               # ده خط اول
head -n 20 file.txt         # بیست خط اول
tail file.txt               # ده خط آخر
tail -f /var/log/syslog     # دنبال کردن زنده لاگ (Ctrl+C برای خروج)

۱.۲.۳.۱ بررسی متادیتای فایل با stat

دستور stat اطلاعات کامل متادیتای یک فایل یا دایرکتوری را نمایش می‌دهد: مالک، گروه، سطح دسترسی، اندازه، زمان‌های دسترسی و تغییر و تعداد لینک‌ها. این ابزار در ممیزی امنیتی و اسکریپت‌نویسی کاربرد فراوانی دارد.

stat file.txt                     # نمایش کامل متادیتا
stat -c '%U:%G %a %n' file.txt    # خروجی سفارشی: مالک:گروه دسترسی نام
stat -c '%a' file.txt             # فقط دسترسی octal
stat -c '%U' file.txt             # فقط نام مالک
stat -c '%G' file.txt             # فقط نام گروه

# بررسی چند فایل با یک دستور
stat -c '%U:%G %a %n' /srv/app/deploy.sh /srv/app/lib.sh /srv/app/audit.sh

خروجی نمونه:

root:root 755 /srv/app/deploy.sh
root:root 755 /srv/app/lib.sh
root:root 755 /srv/app/audit.sh

این خروجی برای ممیزی سریع فایل‌های حساس روی سرور بسیار کاربردی است. می‌توان خروجی را به ابزارهایی مانند awk یا grep نیز ارسال کرد تا فایل‌هایی با دسترسی غیرمجاز شناسایی شوند:

find /srv -type f -exec stat -c '%a %n' {} \; | grep -E '^77[0-7]'

find — جستجوی فایل

find /etc -name "*.conf"              # فایل‌های .conf
find / -type d -name "nginx"          # دایرکتوری با نام nginx
find /var/log -size +10M              # فایل‌های بزرگ‌تر از 10MB
find /home -mtime -7                  # تغییر یافته در هفت روز اخیر

grep — جستجو در محتوا

grep "error" /var/log/syslog          # خطوط شامل error
grep -i "error" file.txt              # بدون حساسیت به بزرگی و کوچکی حروف
grep -r "localhost" /etc/             # جستجوی بازگشتی در دایرکتوری
grep -n "root" /etc/passwd            # نمایش شماره خط
grep -v "comment" file.txt            # خطوطی که شامل الگو نیستند

۱.۲.۵ Pipe و Redirection

Pipe (|) — انتقال خروجی یک دستور به ورودی دستور بعدی

ps aux | grep nginx                   # پروسه‌های nginx
cat /etc/passwd | wc -l               # تعداد کاربران
ls -la | less                         # مشاهده لیست به صورت صفحه‌به‌صفحه
history | grep "apt"                  # دستورات apt در تاریخچه

Redirection — هدایت ورودی و خروجی

ls > files.txt                # نوشتن خروجی (بازنویسی)
ls >> files.txt               # افزودن خروجی
cat < files.txt               # ارسال فایل به عنوان ورودی
command 2> error.log          # ذخیره فقط خطاها
command &> all.log            # ذخیره خروجی و خطا
command > /dev/null           # دور ریختن خروجی

۱.۲.۵.۱ اجرای زنجیره‌ای دستورات با && و ||

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

cd /var/log && ls -lh          # فقط اگر cd موفق بود، ls اجرا شود
apt update && apt upgrade       # به‌روزرسانی و سپس ارتقا
command1 || echo "failed"       # اگر دستور اول شکست خورد، پیام چاپ شود

۱.۲.۶ ویرایشگر متن (nano)

برای کار روی سرور، nano ساده‌ترین گزینه است:

nano /etc/hosts

کلیدهای میانبر nano:

  • Ctrl + O → ذخیره
  • Ctrl + X → خروج
  • Ctrl + W → جستجو
  • Ctrl + K → برش خط
  • Ctrl + U → چسباندن

برای کارهای حرفه‌ای‌تر، یادگیری vim توصیه می‌شود؛ اما برای شروع nano کافی است.

۱.۲.۷ کمک گرفتن

man ls                # راهنمای کامل
ls --help             # راهنمای خلاصه
man -k "copy"         # جستجو در راهنماها
apropos network       # دستورات مرتبط با شبکه

در محیط man: با q خارج شوید، با / جستجو کنید و با n به نتیجه بعدی بروید.

۱.۲.۸ ترفندهای ترمینال

کلید کارکرد
Tab تکمیل خودکار دستور یا مسیر
Ctrl + C قطع دستور در حال اجرا
Ctrl + Z متوقف کردن موقت (suspend)
Ctrl + L پاک کردن صفحه
Ctrl + R جستجو در تاریخچه
↑ / ↓ دستورات قبلی و بعدی
history نمایش دستورات قبلی
!! اجرای مجدد آخرین دستور
Ctrl + A رفتن به ابتدای خط
Ctrl + E رفتن به انتهای خط

۱.۲.۹ تمرین عملی فصل ۱

در صورت دسترسی به یک سیستم Ubuntu (ماشین مجازی یا سرور)، تمرین‌های زیر را انجام دهید:

# 1. رفتن به /var/log و لیست کردن محتویات
cd /var/log && ls -lh

# 2. ایجاد دایرکتوری تمرین
mkdir ~/practice && cd ~/practice

# 3. ایجاد سه فایل
touch file1.txt file2.txt file3.txt

# 4. افزودن محتوا
echo "hello linux" > file1.txt
echo "server admin" >> file1.txt

# 5. مشاهده محتوا
cat file1.txt

# 6. جستجو در تمام فایل‌ها
grep "linux" *.txt

# 7. شمارش خطوط فایل passwd
wc -l /etc/passwd

# 8. مشاهده پنج کاربر آخر سیستم
tail -n 5 /etc/passwd

# 9. پاکسازی
cd ~ && rm -rf practice

۱.۲.۱۰ چک‌لیست یادگیری فصل ۱

  • تفاوت مسیر مطلق و نسبی
  • کار با ls، cd، pwd، mkdir، touch، cp، mv و rm
  • مشاهده فایل با cat، less، head و tail
  • جستجو با find و grep
  • استفاده از pipe (|) و redirection (>، >>)
  • کار با ویرایشگر nano
  • کمک گرفتن با man و --help
  • میانبرهای صفحه‌کلید (Tab، Ctrl+C، Ctrl+R)

۱.۳ ابزارهای پایه و ضروری خط فرمان

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

۱.۳.۱ lsb_release — شناسایی نسخه توزیع

دستور lsb_release اطلاعات نسخه توزیع لینوکس را نمایش می‌دهد. نام آن از LSB (Linux Standard Base) گرفته شده که استانداردی برای یکسان‌سازی ساختار توزیع‌های لینوکسی است. این دستور یکی از اولین ابزارهایی است که روی هر سرور جدید برای تشخیص دقیق توزیع و نسخه آن استفاده می‌شود.

lsb_release -a          # نمایش تمام اطلاعات توزیع
lsb_release -d          # فقط توضیحات (Description)
lsb_release -r          # فقط شماره نسخه (Release)
lsb_release -c          # فقط نام رمزی نسخه (Codename)
lsb_release -i          # فقط نام توزیع (Distributor ID)
lsb_release -s -r       # فقط نسخه بدون برچسب (مناسب اسکریپت)

خروجی نمونه روی Ubuntu 22.04:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy
فیلد معنی
Distributor ID نام توزیع (Ubuntu، Debian، CentOS و...)
Description توضیح کامل نسخه
Release شماره نسخه (مثلاً 22.04)
Codename نام رمزی نسخه (مثلاً jammy، focal، noble)

پیام «No LSB modules are available» طبیعی است و به معنی نصب نبودن پکیج lsb-core است. برای حذف این پیام: sudo apt install lsb-core.

کاربرد در اسکریپت‌نویسی برای شرط‌گذاری بر اساس نسخه سیستم:

#!/bin/bash
VERSION=$(lsb_release -rs)
if [ "$VERSION" = "22.04" ]; then
    echo "این اسکریپت برای Ubuntu 22.04 است"
else
    echo "نسخه پشتیبانی‌نشده: $VERSION"
    exit 1
fi

در صورت نبود lsb_release روی سیستم، از جایگزین‌های زیر می‌توان استفاده کرد:

cat /etc/os-release         # استاندارد جدیدتر، روی اکثر توزیع‌ها موجود است
cat /etc/issue              # ساده و سریع
hostnamectl                 # اطلاعات سیستم و توزیع
uname -a                    # اطلاعات کرنل (نه توزیع)

۱.۳.۲ ping — بررسی اتصال شبکه

ابزار ping برای بررسی دسترسی به یک میزبان و اندازه‌گیری زمان پاسخ استفاده می‌شود.

ping google.com              # بررسی اتصال به میزبان
ping -c 4 8.8.8.8            # ارسال چهار بسته و توقف

۱.۳.۳ ip — مدیریت و بررسی شبکه

ابزار ip جایگزین مدرن ifconfig است و برای مشاهده و پیکربندی اینترفیس‌های شبکه استفاده می‌شود.

ip a                         # نمایش اینترفیس‌ها و آدرس‌ها
ip r                         # نمایش جدول مسیریابی
ip link                      # وضعیت لینک‌ها

۱.۳.۴ ss — بررسی اتصالات و پورت‌ها

ابزار ss جایگزین سریع‌تر netstat است و برای مشاهده پورت‌های باز و اتصالات فعال کاربرد دارد.

ss -tulnp                    # پورت‌های باز و پروسه‌های مرتبط
ss -tan                      # اتصالات TCP

۱.۳.۵ tcpdump — تحلیل ترافیک شبکه

ابزار tcpdump یک تحلیل‌گر خط فرمانی برای ضبط و بررسی بسته‌های شبکه است. برخلاف ss که فقط فهرست اتصالات را نشان می‌دهد، tcpdump محتوای واقعی ترافیک را در سطح بسته (packet) نمایش می‌دهد و برای عیب‌یابی مشکلات شبکه، بررسی اتصالات، تحلیل امنیتی و اشکال‌زدایی سرویس‌ها بسیار کاربردی است.

برای نصب و اجرا به دسترسی root نیاز است:

apt install tcpdump
sudo tcpdump -D                  # لیست اینترفیس‌های قابل شنود
ساختار پایه و سوییچ‌های مهم

دستور tcpdump ترکیبی از سوییچ‌های کنترل خروجی و یک فیلتر BPF (Berkeley Packet Filter) است:

سوییچ کارکرد
-i <iface> انتخاب اینترفیس (مثلاً eth0، tun0، any)
-n عدم تبدیل IP به نام دامنه (DNS)
-nn عدم تبدیل IP و پورت به نام سرویس
-c <N> ضبط فقط N بسته و سپس توقف
-w file.pcap ذخیره در فایل برای تحلیل با Wireshark
-r file.pcap خواندن از فایل ذخیره‌شده
-A نمایش محتوا به صورت ASCII (برای ترافیک غیررمز)
-X نمایش محتوا به صورت HEX و ASCII
-v / -vv / -vvv افزایش سطح جزئیات خروجی
-s <N> تعیین اندازه snapshot هر بسته (۰ = کامل)
فیلترهای پرکاربرد (BPF)

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

sudo tcpdump -ni eth0                            # همه ترافیک روی eth0
sudo tcpdump -ni eth0 'host 8.8.8.8'            # ترافیک با یک میزبان مشخص
sudo tcpdump -ni eth0 'tcp port 443'            # فقط HTTPS
sudo tcpdump -ni eth0 'udp port 53'             # فقط DNS
sudo tcpdump -ni eth0 'src 192.168.1.10'        # فقط بسته‌های ارسالی از این IP
sudo tcpdump -ni eth0 'dst 192.168.1.10'        # فقط بسته‌های ورودی به این IP
sudo tcpdump -ni eth0 'net 192.168.1.0/24'      # کل یک ساب‌نت
sudo tcpdump -ni eth0 'tcp[tcpflags] & tcp-syn != 0'  # فقط بسته‌های SYN

می‌توان فیلترها را با and، or و not ترکیب کرد:

sudo tcpdump -ni tun0 -nn 'host 192.168.9.101 and tcp port 443'
sudo tcpdump -ni eth0 'not port 22 and not arp'
مثال‌های عملی

۱. بررسی اتصال به یک سرور خاص روی پورت ۴۴۳:

sudo tcpdump -ni any -nn 'host 192.168.9.101 and tcp port 443'

خروجی نمونه:

14:23:01.123456 IP 192.168.9.50.54321 > 192.168.9.101.443: Flags [S], seq ...
14:23:01.123789 IP 192.168.9.101.443 > 192.168.9.50.54321: Flags [S.], ack ...
14:23:01.124001 IP 192.168.9.50.54321 > 192.168.9.101.443: Flags [.], ack ...

اگر فقط Flags [S] (SYN) ببینید و پاسخ [S.] نیاید، یعنی اتصال توسط فایروال یا سرور مقصد مسدود شده است.

۲. ذخیره ترافیک برای تحلیل در Wireshark:

sudo tcpdump -ni eth0 -s 0 -w capture.pcap 'tcp port 80'

سپس فایل capture.pcap را به سیستم محلی منتقل کرده و با Wireshark باز کنید. سوییچ -s 0 باعث می‌شود کل بسته (بدون برش) ذخیره شود.

۳. مشاهده محتوای درخواست‌های HTTP (غیررمز):

sudo tcpdump -ni eth0 -A 'tcp port 80 and host example.com'

هدرها و بدنه درخواست به صورت ASCII نمایش داده می‌شوند. توجه کنید که این روش فقط برای ترافیک بدون رمزنگاری (HTTP ساده) کار می‌کند و روی HTTPS بی‌اثر است.

۴. بررسی DHCP و DNS:

sudo tcpdump -ni eth0 -vv 'port 67 or port 68'    # DHCP
sudo tcpdump -ni eth0 'udp port 53'               # DNS

۵. عیب‌یابی VPN:

sudo tcpdump -ni tun0 -nn 'host 10.8.0.1'

برای بررسی اینکه ترافیک واقعاً از تونل VPN عبور می‌کند یا نه. اینترفیس‌های رایج VPN شامل tun0، wg0 (WireGuard) و ppp0 هستند.

نکات امنیتی و کارایی
  • روی سرورهای پرترافیک، tcpdump بدون فیلتر می‌تواند CPU و دیسک را تحت فشار بگذارد. همیشه از فیلتر و سوییچ -c استفاده کنید.
  • محتوای ترافیک HTTPS رمزنگاری‌شده است و tcpdump فقط متادیتا (IP، پورت، فلگ‌ها، اندازه) را نشان می‌دهد.
  • ضبط ترافیک ممکن است شامل اطلاعات حساس باشد. فایل‌های .pcap را امن نگه دارید و پس از تحلیل حذف کنید.
  • در محیط‌های تولیدی، به‌جای tcpdump از ابزارهای تخصصی مثل tshark یا termshark برای تحلیل راحت‌تر استفاده کنید.
  • برای فیلترهای پیچیده‌تر، مستندات رسمی pcap-filter را ببینید: man pcap-filter.
ترکیب با ابزارهای دیگر

خروجی tcpdump را می‌توان به ابزارهای دیگر منتقل کرد:

# شمارش بسته‌های ارسالی به یک IP خاص
sudo tcpdump -ni eth0 -c 100 'dst 8.8.8.8' 2>/dev/null | wc -l

# ذخیره در فایل فشرده برای انتقال
sudo tcpdump -ni eth0 -s 0 -w - 'port 443' | gzip > capture.pcap.gz

# خواندن از فایل و جستجو
sudo tcpdump -r capture.pcap -nn | grep '192.168.9.101'

۱.۳.۶ curl و wget — انتقال داده از شبکه

این دو ابزار برای دانلود فایل، تست API و بررسی پاسخ سرورها استفاده می‌شوند.

curl https://example.com                   # دریافت محتوا
curl -I https://example.com                # فقط هدرها
curl -o file.zip https://example.com/f.zip # ذخیره در فایل
curl -fsSL https://example.com/install.sh | bash   # دریافت و اجرا

wget https://example.com/file.zip          # دانلود فایل
wget -c https://example.com/file.zip       # ادامه دانلود نیمه‌کاره

۱.۳.۷ رفع خطاهای نصب پکیج

در صورت بروز مشکل در نصب پکیج‌ها، می‌توان از دستورات زیر استفاده کرد:

sudo apt --fix-broken install              # رفع وابستگی‌های شکسته
sudo dpkg -i package.deb                   # نصب فایل deb دانلود شده
sudo apt install -f                        # تکمیل نصب پس از dpkg

۱.۳.۸ rsync — همگام‌سازی و پشتیبان‌گیری

ابزار rsync برای کپی و همگام‌سازی فایل‌ها به صورت محلی یا از راه دور استفاده می‌شود و در انتقال‌های بزرگ بسیار بهینه عمل می‌کند.

rsync -avz /home/ /backup/home/
rsync -avz --delete /src/ /dst/
rsync -avz -e ssh /home/ user@server:/backup/

۱.۳.۹ tmux — مدیریت نشست‌ها

با tmux می‌توانید نشست SSH را حتی پس از قطع ارتباط زنده نگه دارید. این ویژگی برای اجرای دستورات طولانی بسیار مهم است.

apt install tmux
tmux new -s work           # ایجاد نشست جدید
tmux attach -t work        # اتصال به نشست
tmux ls                    # لیست نشست‌ها

میانبرهای مهم tmux (پس از فشردن Ctrl+B):

  • d → جدا شدن از نشست (detach)
  • c → ایجاد پنجره جدید
  • n / p → پنجره بعدی / قبلی
  • " → تقسیم افقی
  • % → تقسیم عمودی

فصل ۲: مدیریت کاربران و دسترسی‌ها

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

۲.۱ مدیریت کاربران

useradd ali               # ایجاد کاربر
useradd -m -s /bin/bash ali   # ایجاد کاربر با دایرکتوری خانگی و شل
passwd ali                # تنظیم رمز عبور
usermod -aG sudo ali      # افزودن به گروه sudo
userdel -r ali            # حذف کاربر و دایرکتوری خانگی

۲.۲ مدیریت گروه‌ها

groupadd developers       # ایجاد گروه
groupdel developers       # حذف گروه
groups ali                # نمایش گروه‌های کاربر
id ali                    # در صورتی که مجوز داشته باشید: نمایش اطلاعات کامل کاربر

id                        # نمایش اطلاعات کامل کاربر جاری مثلا:
                          # uid=1001(admin) gid=1001(admin) groups=1001(admin),27(sudo),100(users)

UID یا User ID یک شناسه عددی منحصر به فرد برای کاربر است. کاربر root معمولاً UID=0 دارد.

GID یا Group ID شناسه عددی گروه اصلی (Primary Group) کاربر است.

groupsلیست تمام گروه‌هایی که کاربر عضو آن‌هاست (شامل گروه اصلی و گروه‌های اضافی/Secondary). هر گروه با فرمت GID(Name) نمایش داده می‌شود.

کاربردهای اصلی دستور id:

  • بررسی سطح دسترسی: برای فهمیدن اینکه کاربر فعلی چه مجوزهایی دارد (مثلاً آیا در گروه sudo یا wheel هست یا نه).
  • عیب‌یابی مشکلات مجوز (Permission): وقتی برنامه‌ای به فایلی دسترسی ندارد، با id می‌توانید بررسی کنید که آیا کاربر در گروه مناسب قرار دارد یا خیر.
  • اسکریپت‌نویسی: در اسکریپت‌های شل برای بررسی اینکه اسکریپت با کاربر root اجرا می‌شود یا نه (مثلاً if [ "$(id -u)" -eq 0 ]; then ...).

۲.۳ سطوح دسترسی فایل‌ها

chmod 755 script.sh       # تنظیم دسترسی
chmod u+x script.sh       # افزودن دسترسی اجرا به مالک
chown ali:ali file.txt    # تغییر مالک و گروه

۲.۳.۱ درک خروجی دسترسی در ls -l

وقتی دستور ls -l را اجرا می‌کنید، ستون اول خروجی نشان‌دهنده نوع فایل و سطوح دسترسی است:

-rwxr-xr-x 1 ali ali 4096 Sep 11 10:30 script.sh
│└┬┘└┬┘└┬┘
│ │  │  └── دسترسی سایر کاربران (others)
│ │  └───── دسترسی گروه (group)
│ └──────── دسترسی مالک (user)
└────────── نوع فایل: - فایل، d دایرکتوری، l لینک

هر گروه سه‌کاراکتری شامل ترکیبی از حروف زیر است:

  • r → خواندن (read)
  • w → نوشتن (write)
  • x → اجرا (execute)
  • - → بدون دسترسی

۲.۳.۲ نمایش عددی (Octal) دسترسی‌ها

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

دسترسی مقدار دودویی مقدار عددی
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

پس دسترسی rwxr-xr-x معادل است با:

مالک  → rwx → 7
گروه  → r-x → 5
سایر  → r-x → 5
نتیجه: 755

۲.۳.۳ دسترسی‌های رایج و کاربردشان

عدد نماد کاربرد
644 rw-r--r-- فایل‌های معمولی، صفحات وب، تنظیمات
600 rw------- فایل‌های خصوصی مثل کلید SSH (id_rsa)
755 rwxr-xr-x اسکریپت‌های اجرایی، دایرکتوری‌های عمومی
700 rwx------ دایرکتوری خصوصی کاربر (~/.ssh)
777 rwxrwxrwx دسترسی کامل برای همه — خطرناک و ناامن
664 rw-rw-r-- فایل‌های گروهی که اعضای گروه می‌توانند ویرایش کنند

۲.۳.۴ حالت‌های تغییر دسترسی با chmod

دو روش برای تنظیم دسترسی وجود دارد:

روش عددی (Octal):

chmod 755 script.sh       # rwxr-xr-x
chmod 644 config.txt      # rw-r--r--
chmod 600 ~/.ssh/id_rsa   # rw-------
chmod -R 755 /var/www     # بازگشتی روی دایرکتوری

روش نمادی (Symbolic):

chmod u+x script.sh       # افزودن اجرا به مالک
chmod g-w file.txt        # حذف نوشتن از گروه
chmod o-rwx secret.txt    # حذف همه دسترسی‌ها از سایر
chmod a+r public.txt      # افزودن خواندن به همه (a = all)
chmod u=rw,g=r,o= file    # تنظیم دقیق دسترسی‌ها

حروف نمادی:

  • u → مالک (user)
  • g → گروه (group)
  • o → سایر (others)
  • a → همه (all = u+g+o)
  • + → افزودن، - → حذف، = → تنظیم دقیق

۲.۳.۵ توصیه‌های امنیتی

  • هرگز دسترسی 777 روی فایل‌های حساس تنظیم نکنید.
  • برای کلیدهای خصوصی SSH همیشه 600 بگذارید، وگرنه SSH اجازه اتصال نمی‌دهد.
  • دسترسی اجرا (x) را فقط روی فایل‌هایی بگذارید که نیاز به اجرا دارند.
  • برای دایرکتوری‌ها، دسترسی 755 یا 750 منطقی است، نه 777.
  • بعد از هر تغییر، با ls -l یا stat -c '%a %n' file نتیجه را بررسی کنید.

فصل ۳: مدیریت پکیج با APT

اوبونتو از ابزار apt برای مدیریت پکیج‌ها استفاده می‌کند.

۳.۱ دستورات پایه APT

apt update                # به‌روزرسانی لیست پکیج‌ها
apt upgrade               # به‌روزرسانی پکیج‌های نصب‌شده
apt install nginx         # نصب پکیج
apt remove nginx          # حذف پکیج
apt autoremove            # حذف پکیج‌های بی‌استفاده
apt search nginx          # جستجوی پکیج

۳.۲ مدیریت مخازن

cat /etc/apt/sources.list
add-apt-repository ppa:example/ppa

فصل ۴: مدیریت سرویس‌ها با systemd

سیستم‌عامل اوبونتو از systemd برای مدیریت سرویس‌ها استفاده می‌کند.

۴.۱ دستورات systemctl

systemctl start nginx     # شروع سرویس
systemctl stop nginx      # توقف سرویس
systemctl restart nginx   # راه‌اندازی مجدد
systemctl enable nginx    # فعال‌سازی در بوت
systemctl status nginx    # مشاهده وضعیت

۴.۲ مشاهده لاگ‌ها با journalctl

journalctl -u nginx       # لاگ‌های سرویس مشخص
journalctl -f             # دنبال کردن زنده لاگ‌ها
journalctl --since "1 hour ago"

فصل ۵: پیکربندی شبکه

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

۵.۱ فایل پیکربندی netplan

nano /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
netplan apply             # اعمال تنظیمات

۵.۲ ابزارهای بررسی شبکه

ip a                      # نمایش آدرس‌های شبکه
ip r                      # نمایش جدول مسیریابی
ss -tulnp                 # نمایش پورت‌های باز
ping google.com           # تست اتصال

فصل ۶: فایروال با UFW

ابزار ufw یک رابط ساده برای مدیریت فایروال در اوبونتو است.

۶.۱ دستورات پایه UFW

ufw enable                # فعال‌سازی فایروال
ufw status                # مشاهده وضعیت
ufw allow 22              # اجازه به پورت SSH
ufw allow 80/tcp          # اجازه به HTTP
ufw deny 23               # مسدود کردن پورت
ufw delete allow 80       # حذف قانون

فصل ۷: مدیریت Storage

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

۷.۱ مشاهده دیسک‌ها

lsblk                     # نمایش دیسک‌ها و پارتیشن‌ها
df -h                     # Disk Free نمایش فضای مصرفی
du -sh /var/log           # حجم دایرکتوری

۷.۲ پارتیشن‌بندی و mount

fdisk /dev/sdb            # پارتیشن‌بندی
mkfs.ext4 /dev/sdb1       # ساخت فایل‌سیستم
mount /dev/sdb1 /mnt      # اتصال

برای اتصال دائمی، ورودی مربوطه در /etc/fstab اضافه می‌شود.

فصل ۸: وب‌سرور و سرویس‌های رایج

در این فصل نصب و پیکربندی سرویس‌های پرکاربرد سرور بررسی می‌شود.

۸.۱ نصب Nginx

apt install nginx
systemctl enable --now nginx

۸.۲ تنظیم Virtual Host

nano /etc/nginx/sites-available/example.com
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

۸.۳ گواهی SSL با Certbot

apt install certbot python3-certbot-nginx
certbot --nginx -d example.com

فصل ۹: کانتینر و مجازی‌سازی

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

۹.۱ نصب Docker

apt install docker.io
systemctl enable --now docker

۹.۲ دستورات پایه Docker

docker run -d -p 80:80 nginx
docker ps
docker stop <container_id>
docker logs <container_id>

فصل ۱۰: اتوماسیون و امنیت

اتوماسیون وظایف تکراری و رعایت اصول امنیتی، بخش نهایی این راهنماست.

۱۰.۱ اسکریپت‌نویسی شل

#!/bin/bash
echo "Starting backup..."
tar -czf /backup/home-$(date +%F).tar.gz /home
echo "Backup completed."

۱۰.۱.۱ مبانی Bash — متغیرها، شرط‌ها و حلقه‌ها

Bash (Bourne Again Shell) پوسته پیش‌فرض اکثر توزیع‌های لینوکس از جمله Ubuntu است. هر اسکریپتی که با #!/bin/bash شروع شود، توسط Bash تفسیر می‌شود. در ادامه با مهم‌ترین مفاهیم Bash آشنا می‌شوید.

پوسته‌ها و تفاوت آن‌ها با Bash

پوسته (Shell) لایه‌ای بین کاربر و هسته سیستم‌عامل است که دستورات شما را تفسیر و اجرا می‌کند. Bash یکی از رایج‌ترین پوسته‌هاست، اما تنها پوسته موجود نیست. بسته به سیستم‌عامل و سلیقه کاربر، ممکن است پوسته‌های متفاوتی نصب و استفاده شوند:

پوسته مخترع / توزیع ویژگی
sh Bourne Shell — اصلی‌ترین پوسته یونیکس ساده و استاندارد، پایه بسیاری از پوسته‌ها
bash GNU — پیش‌فرض اکثر توزیع‌های لینوکس تکامل‌یافته sh با امکانات بیشتر مثل history و Tab completion
zsh پیش‌فرض macOS از نسخه Catalina قابلیت‌های پیشرفته‌تر، افزونه‌پذیر با Oh My Zsh
fish Friendly Interactive Shell سینتکس ساده‌تر، تکمیل خودکار هوشمند
dash در برخی توزیع‌ها مثل Debian به عنوان sh سیستم سبک و سریع، مناسب اسکریپت‌های سیستمی
ksh Korn Shell — قدیمی‌تر در یونیکس و مک پایه برخی ویژگی‌های bash و zsh

سیستم‌های یونیکسی مثل macOS به طور پیش‌فرض از zsh استفاده می‌کنند و پوسته‌های کلاسیک‌تری مثل ksh و sh هم در آن‌ها موجود است. روی سرورهای Ubuntu، پوسته پیش‌فرض bash است.

برای مشاهده پوسته فعلی و پوسته‌های نصب‌شده:

echo $SHELL                # پوسته فعلی کاربر
cat /etc/shells            # لیست پوسته‌های مجاز سیستم
chsh -s /bin/zsh           # تغییر پوسته پیش‌فرض کاربر (اختیاری)

نکته مهم: اسکریپت‌هایی که با #!/bin/bash شروع می‌شوند همیشه توسط bash اجرا می‌شوند، حتی اگه پوسته تعاملی شما zsh یا fish باشد. اما اسکریپت‌هایی که با #!/bin/sh شروع می‌شوند ممکن است در توزیع‌های مختلف به پوسته‌های متفاوتی اشاره کنند (مثلاً در Ubuntu به dash و در macOS به bash). به همین دلیل برای اسکریپت‌های پیچیده توصیه می‌شود صریحاً #!/bin/bash بنویسید.

فایل‌های راه‌اندازی Bash — .bashrc و .bash_profile

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

فایل زمان اجرا کاربرد اصلی
/etc/profile هنگام ورود کاربر تنظیمات سراسری برای همه کاربران
/etc/bash.bashrc هر بار باز شدن شل تعاملی تنظیمات سراسری Bash
~/.bash_profile هنگام ورود به سیستم (login shell) متغیرهای محیطی، اجرای .bashrc
~/.bashrc هر بار باز شدن شل تعاملی جدید alias، توابع، prompt، تنظیمات ظاهری
~/.bash_logout هنگام خروج از سیستم پاکسازی موقت، بستن نشست‌ها

برای ویرایش فایل شخصی خود:

nano ~/.bashrc             # ویرایش تنظیمات پوسته
source ~/.bashrc           # اعمال تغییرات بدون بستن ترمینال

نمونه‌ای از تنظیمات مفید در ~/.bashrc:

# alias برای دستورات پرکاربرد
alias ll='ls -alF'
alias update='sudo apt update && sudo apt upgrade'
alias ports='ss -tulnp'

# افزودن مسیر شخصی به PATH
export PATH="$HOME/bin:$PATH"

# متغیر محیطی سفارشی
export EDITOR=nano

# prompt رنگی با نمایش وضعیت git
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \w\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

نکته مهم درباره تفاوت .bashrc و .bash_profile: در Ubuntu معمولاً .bash_profile وجود ندارد و فقط .bashrc استفاده می‌شود. اما در macOS و برخی توزیع‌ها، .bash_profile هنگام ورود اجرا می‌شود و معمولاً درون آن .bashrc را فراخوانی می‌کنند تا کد تکراری نشود:

# محتوای معمول .bash_profile
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

متغیرها در Bash

در Bash برای تعریف متغیر از علامت = بدون فاصله استفاده می‌شود. برای خواندن مقدار متغیر، علامت $ قبل از نام آن قرار می‌گیرد. توجه کنید که در سمت چپ و راست = نباید فاصله باشد.

#!/bin/bash

NAME="Ali"
AGE=30
CITY="Tehran"

echo "Name: $NAME"
echo "Age: $AGE"
echo "City: ${CITY}"

# متغیر فقط‌خواندنی (ثابت)
readonly PI=3.14

# متغیرهای ویژه
echo "اسکریپت: $0"          # نام اسکریپت
echo "آرگومان اول: 
" # اولین آرگومان echo "تعداد آرگومان‌ها: $#" # تعداد آرگومان‌ها echo "همه آرگومان‌ها: $@" # همه آرگومان‌ها echo "کد خروج آخرین دستور: $?" # وضعیت خروج echo "PID اسکریپت: $" # شناسه پروسه

نکته: نام متغیرها به حروف بزرگ و کوچک حساس است. name و NAME دو متغیر متفاوت هستند. برای محاسبات عددی از $(( )) استفاده کنید:

A=10
B=3
echo $((A + B))     # 13
echo $((A * B))     # 30
echo $((A / B))     # 3 (تقسیم صحیح)
echo $((A % B))     # 1 (باقیمانده)

شرط‌ها در Bash

ساختار if در Bash به شکل زیر است. شرط‌ها داخل [ ] (تست) یا [[ ]] (تست پیشرفته) نوشته می‌شوند و باید دور آن‌ها فاصله باشد.

#!/bin/bash

FILE="/etc/passwd"

if [ -f "$FILE" ]; then
    echo "فایل وجود دارد"
elif [ -d "$FILE" ]; then
    echo "دایرکتوری است"
else
    echo "چیزی پیدا نشد"
fi

# مقایسه اعداد
NUM=10
if [ "$NUM" -gt 5 ]; then
    echo "بزرگ‌تر از ۵ است"
fi

# مقایسه رشته‌ها
NAME="Ali"
if [ "$NAME" = "Ali" ]; then
    echo "سلام علی"
fi

عملگرهای پرکاربرد در شرط‌ها:

عملگر معنی
-f file فایل وجود دارد و فایل معمولی است
-d dir دایرکتوری وجود دارد
-e path مسیر وجود دارد
-r / -w / -x قابل خواندن / نوشتن / اجرا
-z str رشته خالی است
-n str رشته غیرخالی است
-eq / -ne برابر / نابرابر (اعداد)
-gt / -lt بزرگ‌تر / کوچک‌تر (اعداد)
= / != برابر / نابرابر (رشته‌ها)
&& / || و / یا منطقی

ساختار case

برای انتخاب بین چند حالت، case بسیار خواناتر از زنجیره if/elif است:

#!/bin/bash

ACTION="
" case "$ACTION" in start) echo "شروع سرویس..." ;; stop) echo "توقف سرویس..." ;; restart) echo "راه‌اندازی مجدد..." ;; *) echo "استفاده: $0 {start|stop|restart}" exit 1 ;; esac

حلقه‌ها در Bash

حلقه for:

#!/bin/bash

# روی لیست
for FRUIT in apple banana orange; do
    echo "میوه: $FRUIT"
done

# روی محدوده عددی
for i in {1..5}; do
    echo "شماره: $i"
done

# روی فایل‌ها
for FILE in /var/log/*.log; do
    echo "پردازش $FILE"
done

# شبیه C
for ((i=0; i<10; i++)); do
    echo "i=$i"
done

حلقه while:

#!/bin/bash

COUNT=1
while [ "$COUNT" -le 5 ]; do
    echo "شمارش: $COUNT"
    COUNT=$((COUNT + 1))
done

# خواندن خط به خط یک فایل
while IFS= read -r LINE; do
    echo "خط: $LINE"
done < /etc/passwd

حلقه until: برعکس while عمل می‌کند و تا زمانی که شرط نادرست است اجرا می‌شود:

#!/bin/bash

COUNT=1
until [ "$COUNT" -gt 5 ]; do
    echo "شمارش: $COUNT"
    COUNT=$((COUNT + 1))
done

توابع در Bash

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

#!/bin/bash

# تعریف تابع
greet() {
    local NAME="
" # local: متغیر محلی echo "سلام $NAME!" } # تابع با مقدار بازگشتی add() { echo $((
+ )) } # تابع با بررسی خطا check_root() { if [ "$EUID" -ne 0 ]; then echo "این اسکریپت نیاز به دسترسی root دارد" exit 1 fi } # فراخوانی greet "Ali" RESULT=$(add 5 3) echo "نتیجه: $RESULT" check_root

ورودی و خروجی در Bash

#!/bin/bash

# خواندن ورودی از کاربر
read -p "نام خود را وارد کنید: " USER_NAME
echo "سلام $USER_NAME"

# خواندن رمز عبور (بدون نمایش)
read -sp "رمز عبور: " PASSWORD
echo

# خواندن با تایم‌اوت
read -t 5 -p "سریع جواب بده: " ANSWER

# نوشتن در فایل
echo "متن جدید" >> /tmp/log.txt

# خواندن از فایل
while read -r LINE; do
    echo "$LINE"
done < /tmp/log.txt

مدیریت خطا در Bash

در اسکریپت‌های جدی، مدیریت خطا حیاتی است. set -e باعث می‌شود اسکریپت با اولین خطا متوقف شود:

#!/bin/bash
set -euo pipefail

# -e : توقف در صورت خطا
# -u : خطا در صورت استفاده از متغیر تعریف‌نشده
# -o pipefail : خطا در صورت شکست هر دستور در pipe

# اجرای دستور و بررسی خطا
if ! command -v nginx > /dev/null 2>&1; then
    echo "nginx نصب نیست"
    exit 1
fi

# trap: اجرای دستور در زمان خروج
cleanup() {
    echo "پاکسازی..."
    rm -f /tmp/tempfile
}
trap cleanup EXIT

مثال کامل: اسکریپت پشتیبان‌گیری

در ادامه یک اسکریپت کامل و کاربردی که مفاهیم بالا را ترکیب می‌کند:

#!/bin/bash
set -euo pipefail

# تنظیمات
BACKUP_DIR="/backup"
SOURCE_DIR="/home"
DATE=$(date +%F_%H-%M)
ARCHIVE="$BACKUP_DIR/home-$DATE.tar.gz"
KEEP_DAYS=7

# بررسی root
if [ "$EUID" -ne 0 ]; then
    echo "لطفاً با sudo اجرا کنید"
    exit 1
fi

# ایجاد دایرکتوری پشتیبان
mkdir -p "$BACKUP_DIR"

# گرفتن پشتیبان
echo "شروع پشتیبان‌گیری از $SOURCE_DIR ..."
tar -czf "$ARCHIVE" "$SOURCE_DIR"
echo "پشتیبان ساخته شد: $ARCHIVE"

# حذف پشتیبان‌های قدیمی
echo "حذف پشتیبان‌های قدیمی‌تر از $KEEP_DAYS روز..."
find "$BACKUP_DIR" -name "home-*.tar.gz" -mtime +$KEEP_DAYS -delete

# نمایش فضای مصرفی
echo "فضای فعلی پشتیبان:"
du -sh "$BACKUP_DIR"

این اسکریپت را در مسیری مثل /usr/local/bin/backup.sh ذخیره کنید، با chmod +x اجرایی کنید و سپس در cron زمان‌بندی کنید (بخش بعدی را ببینید).

۱۰.۲ زمان‌بندی با Cron

crontab -e
# اجرای روزانه در ساعت ۳ بامداد
0 3 * * * /usr/local/bin/backup.sh

۱۰.۳ به‌روزرسانی‌های امنیتی خودکار

apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades

۱۰.۴ پشتیبان‌گیری با rsync

rsync -avz /home/ user@backup-server:/backup/

فصل ۱۱ (مطالعه اختیاری): ابزارهای تخصصی و تکمیلی

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

۱۱.۱ tree — نمایش درختی دایرکتوری‌ها

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

apt install tree                  # نصب ابزار

tree                              # نمایش درختی مسیر جاری
tree /etc                         # نمایش درختی یک مسیر خاص
tree -L 2                         # فقط دو سطح اول
tree -d                           # فقط دایرکتوری‌ها
tree -a                           # نمایش فایل‌های مخفی
tree -h                           # نمایش حجم فایل‌ها
tree -I "node_modules|.git"       # نادیده گرفتن الگوها

۱۱.۲ htop — نمایش زنده پروسه‌ها

ابزار htop نسخه پیشرفته‌تر top است و نمای بهتری از مصرف CPU، حافظه و پروسه‌ها ارائه می‌دهد.

apt install htop
htop

کلیدهای مفید در htop:

  • F3 → جستجو
  • F4 → فیلتر
  • F5 → نمایش درختی پروسه‌ها
  • F6 → تغییر ستون مرتب‌سازی
  • F9 → ارسال سیگنال (kill)
  • q → خروج

۱۱.۳ ncdu — تحلیل مصرف دیسک

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

apt install ncdu
ncdu /var
ncdu /home

۱۱.۴ jq — پردازش خروجی JSON

ابزار jq برای خواندن، فیلتر و قالب‌بندی داده‌های JSON در خط فرمان استفاده می‌شود.

apt install jq

curl -s https://api.example.com/data | jq .
cat data.json | jq '.items[] | .name'

۱۱.۵ ابزارهای Node.js و npm

برای اجرای پروژه‌های جاوااسکریپت روی سرور، به Node.js و npm نیاز خواهید داشت:

node --version               # نسخه Node.js
npm --version                # نسخه npm

npm install                  # نصب وابستگی‌های پروژه
npm install -g <package>     # نصب سراسری یک پکیج
sudo npm install -g <package> # نصب سراسری با دسترسی مدیر
npx <command>                # اجرای مستقیم پکیج بدون نصب دائمی

npm install                  # نصب وابستگی‌ها
npm run <script>             # اجرای اسکریپت تعریف‌شده در package.json
npm run build                # ساخت نسخه تولید
npm start                    # اجرای پروژه

۱۱.۶ ابزارهای Docker

Docker برای اجرای سرویس‌ها در محیط‌های ایزوله استفاده می‌شود و مدیریت آن از مهارت‌های مهم سرور است:

docker --version             # نسخه Docker

docker ps                    # کانتینرهای در حال اجرا
docker ps -a                 # همه کانتینرها
docker images                # لیست ایمیج‌ها

docker volume ls             # لیست والیوم‌ها
docker volume prune          # حذف والیوم‌های بی‌استفاده

docker system df             # مصرف فضای Docker
docker system prune          # پاکسازی منابع بی‌استفاده

docker compose up            # اجرای سرویس‌ها
docker compose up -d         # اجرای در پس‌زمینه
docker compose down          # توقف و حذف سرویس‌ها
docker compose ps            # وضعیت سرویس‌ها
docker compose logs          # مشاهده لاگ‌ها
docker compose logs -f       # دنبال کردن زنده لاگ‌ها

docker exec -it <name> bash  # ورود به کانتینر
docker stop <name>           # توقف کانتینر
docker start <name>          # شروع کانتینر
docker restart <name>        # راه‌اندازی مجدد
docker rm <name>             # حذف کانتینر

۱۱.۷ ابزارهای Git

Git برای مدیریت نسخه‌ها و انتشار کد روی سرور استفاده می‌شود:

git status                   # وضعیت مخزن
git branch                   # لیست شاخه‌ها
git checkout <branch>        # تغییر شاخه (روش قدیمی)
git switch <branch>          # تغییر شاخه (روش جدید)
git add .                    # افزودن تغییرات
git commit -m "message"      # ثبت تغییرات
git push                     # ارسال به مخزن دور
git pull                     # دریافت از مخزن دور
git log                      # تاریخچه کامیت‌ها
git diff                     # نمایش تغییرات
git remote -v                # لیست ریموت‌ها

۱۱.۸ ابزارهای Cloudflare Wrangler

Wrangler ابزار خط فرمان Cloudflare برای مدیریت و انتشار پروژه‌های Serverless است:

npx wrangler                       # اجرای Wrangler
npx wrangler --help                # راهنمای کلی
npx wrangler observability --help  # راهنمای بخش observability
npx wrangler deploy                # انتشار پروژه

۱۱.۹ ابزارهای Python و pip و uv

برای اجرای پروژه‌های پایتون و مدیریت پکیج‌ها:

python3 --version            # نسخه پایتون
python3                      # ورود به مفسر پایتون

pip --version                # نسخه pip
pip3 install <package>       # نصب پکیج

uv --version                 # نسخه uv
uv run <script>              # اجرای اسکریپت با uv
uv tool install <tool>       # نصب ابزار سراسری با uv

۱۱.۱۰ سایر ابزارهای پرکاربرد

ابزار کاربرد
duf نمایش زیبا و خوانا از فضای دیسک
bat جایگزین cat با قابلیت هایلایت و شماره خط
ripgrep (rg) جایگزین سریع‌تر grep
fd جایگزین ساده‌تر و سریع‌تر find
fzf جستجوی تعاملی در لیست‌ها و فایل‌ها
lsof نمایش فایل‌ها و پورت‌های باز توسط پروسه‌ها
netstat / ss بررسی اتصالات شبکه
htop / glances مانیتورینگ سیستم
fail2ban مسدودسازی خودکار حملات SSH

سوالات متداول

پاسخ به پرسش‌های رایج درباره آموزش مدیریت سرور Ubuntu

آیا برای مدیریت سرور Ubuntu حتماً باید با خط فرمان (CLI) کار کنم؟

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

تفاوت مسیر مطلق و مسیر نسبی در لینوکس چیست؟

مسیر مطلق از ریشه / شروع می‌شود (مثل /etc/nginx/nginx.conf)، در حالی که مسیر نسبی از دایرکتوری جاری محاسبه می‌شود. نمادهای خاص شامل . (دایرکتوری جاری)، .. (دایرکتوری والد) و ~ (دایرکتوری خانگی کاربر) هستند.

آیا دستور rm -rf / واقعاً کل سیستم را نابود می‌کند؟

بله. این دستور به صورت بازگشتی و اجباری همه فایل‌ها را از ریشه حذف می‌کند و موجب نابودی کل سیستم می‌شود. هرگز این دستور را با sudo یا روی / اجرا نکنید.

چگونه می‌توانم IP عمومی سرور را بدون مراجعه به پنل ابری دریافت کنم؟

با استفاده از curl و سرویس‌هایی مثل icanhazip.com می‌توانید IP عمومی سرور را دریافت کنید:

curl -4 icanhazip.com              # دریافت آی‌پی عمومی IPv4
curl -6 icanhazip.com              # دریافت آی‌پی عمومی IPv6
curl -s icanhazip.com              # حالت بی‌صدا (بدون نوار پیشرفت)

سوییچ -4 باعث می‌شود curl فقط از پروتکل IPv4 استفاده کند. اگر سرور شما هم IPv4 و هم IPv6 داشته باشد، بدون این سوییچ ممکن است آی‌پی IPv6 برگردانده شود.

می‌توانید آی‌پی عمومی را در یک متغیر ذخیره کرده و در اسکریپت‌ها استفاده کنید:

MY_IP=$(curl -4 -s icanhazip.com)
echo "آی‌پی عمومی من: $MY_IP"

سرویس‌های جایگزین برای دریافت آی‌پی عمومی:

  • curl -4 ifconfig.me — سرویس محبوب، خروجی مشابه
  • curl -4 ipinfo.io/ip — فقط آی‌پی را برمی‌گرداند
  • curl -4 api.ipify.org — ساده و سریع، فقط IPv4
  • curl -4 ifconfig.co — خروجی با اطلاعات بیشتر

نکته امنیتی: این سرویس‌ها آی‌پی شما را می‌بینند. اگر نگران حریم خصوصی هستید، از سرویس‌های شناخته‌شده استفاده کنید یا یک اندپوینت ساده روی سرور خودتان بسازید.

وقتی اینترنت بین‌الملل قطع است می‌توانید از دستور زیر استفاده کنید:

curl https://api.ipmyp.ir

یا با دستوراتی که در بخش مدیریت و بررسی شبکه ip کارت شبکه public خود را مشاهده نمایید.

اگر سیستم با مودم به اینترنت متصل است یا وارد تنظیمات مودم خود شوید و در صفحه status به دنبال public ip بگردید، یا از دستورات telnet یا ssh به شکل زیر استفاده کنید (بسته به Firmware مودم متفاوت است):

# اتصال به مودم
telnet 192.168.1.1
# یا
ssh admin@192.168.1.1

# سپس در CLI مودم (بسته به مدل):
show interface wan
# یا
ifstatus mob1s1a1_4 | jsonfilter -e '@["ipv4-address"][0].address'
اگر نصب پکیج‌ها با خطا مواجه شود چه باید کرد؟

در صورت بروز مشکل در نصب پکیج‌ها، می‌توان از دستورات زیر استفاده کرد:

sudo apt --fix-broken install              # رفع وابستگی‌های شکسته
sudo dpkg -i package.deb                   # نصب فایل deb دانلود شده
sudo apt install -f                        # تکمیل نصب پس از dpkg
تفاوت LTS و نسخه‌های عادی Ubuntu چیست و کدام برای سرور مناسب‌تر است؟

نسخه‌های LTS (Long Term Support) پشتیبانی طولانی‌مدت (معمولاً ۵ سال) دارند و برای سرورها توصیه می‌شوند، چون به‌روزرسانی‌های امنیتی و پایداری بیشتری دریافت می‌کنند. نسخه‌های عادی پشتیبانی کوتاه‌تری دارند و برای دسکتاپ و تست مناسب‌ترند.

چگونه نشست SSH را پس از قطع ارتباط زنده نگه دارم؟

با ابزار tmux می‌توانید نشست SSH را حتی پس از قطع ارتباط زنده نگه دارید. این ویژگی برای اجرای دستورات طولانی بسیار مهم است.

apt install tmux
tmux new -s work           # ایجاد نشست جدید
tmux attach -t work        # اتصال به نشست
tmux ls                    # لیست نشست‌ها

میانبرهای مهم tmux (پس از فشردن Ctrl+B):

  • d → جدا شدن از نشست (detach)
  • c → ایجاد پنجره جدید
  • n / p → پنجره بعدی / قبلی
  • " → تقسیم افقی
  • % → تقسیم عمودی

فهرست واژگان

واژه‌نامه تخصصی مدیریت سرور Ubuntu — تعریف کوتاه اصطلاحات کلیدی این راهنما

APT
ابزار مدیریت پکیج در توزیع‌های مبتنی بر Debian و Ubuntu که برای نصب، حذف و به‌روزرسانی نرم‌افزارها استفاده می‌شود.
Bash
پوسته پیش‌فرض اکثر توزیع‌های لینوکس (Bourne Again Shell) که دستورات خط فرمان و اسکریپت‌ها را تفسیر می‌کند.
CLI
رابط خط فرمان (Command Line Interface)؛ محیطی متنی برای اجرای دستورات که در سرورها جایگزین رابط گرافیکی است.
cron
سرویس زمان‌بندی در لینوکس که اجرای خودکار دستورات و اسکریپت‌ها را در زمان‌های مشخص ممکن می‌کند.
Docker
پلتفرم کانتینری برای اجرای سرویس‌ها در محیط‌های ایزوله و سبک، مستقل از سیستم‌عامل میزبان.
GUI
رابط گرافیکی کاربر (Graphical User Interface)؛ محیطی مبتنی بر پنجره و آیکون که در سرورها معمولاً وجود ندارد.
journalctl
ابزار مشاهده و مدیریت لاگ‌های systemd که برای بررسی رخدادهای سرویس‌ها به کار می‌رود.
LSB
استاندارد Linux Standard Base که برای یکسان‌سازی ساختار توزیع‌های لینوکسی تعریف شده و دستور lsb_release بر پایه آن اطلاعات نسخه توزیع را نمایش می‌دهد.
LTS
نسخه با پشتیبانی طولانی‌مدت (Long Term Support)؛ برای سرورها توصیه می‌شود چون به‌روزرسانی امنیتی طولانی‌تری دارد.
mount
فرایند اتصال یک فایل‌سیستم یا دیسک به یک مسیر در درخت فایل‌سیستم لینوکس.
netplan
ابزار پیکربندی شبکه در نسخه‌های جدید Ubuntu که تنظیمات را از فایل‌های YAML می‌خواند.
octal
نمایش عددی سطوح دسترسی فایل در لینوکس؛ هر رقم بین ۰ تا ۷ بیانگر دسترسی مالک، گروه و سایر کاربران است.
pipe
عملگر | که خروجی یک دستور را به ورودی دستور بعدی منتقل می‌کند.
redirection
هدایت ورودی یا خروجی یک دستور به فایل یا مقصد دیگر با عملگرهایی مانند >، >> و <.
SSH
پروتکل امن اتصال از راه دور به سرور که تمامی عملیات مدیریتی از طریق آن انجام می‌شود.
stat
دستور نمایش متادیتای فایل شامل مالک، گروه، دسترسی، اندازه و زمان‌های تغییر.
sudo
دستوری برای اجرای یک فرمان با دسترسی کاربر ریشه (root) بدون نیاز به ورود مستقیم به حساب root.
systemd
سیستم مدیریت سرویس‌ها و فرایندها در توزیع‌های مدرن لینوکس که با ابزار systemctl کنترل می‌شود.
tcpdump
ابزار خط فرمانی ضبط و تحلیل بسته‌های شبکه برای عیب‌یابی، بررسی امنیتی و تحلیل ترافیک.
tmux
ابزار مدیریت نشست‌های ترمینال که نشست SSH را حتی پس از قطع ارتباط زنده نگه می‌دارد.
UFW
فایروال ساده و کاربرپسند (Uncomplicated Firewall) در Ubuntu که مدیریت قوانین فایروال را آسان می‌کند.
Virtual Host
قابلیت وب‌سرور برای میزبانی چند دامنه روی یک سرور با تنظیمات مستقل.