آموزش مدیریت سرور 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 برای خروج)

۱.۲.۴ جستجو

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)

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

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

۱.۳.۱ 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

۱.۳.۴ 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                    # نمایش اطلاعات کامل کاربر

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

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

فصل ۳: مدیریت پکیج با 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                     # نمایش فضای مصرفی
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

در 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 → پنجره بعدی / قبلی
  • " → تقسیم افقی
  • % → تقسیم عمودی