← همه آموزش‌ها

دستورات پرکاربرد Linux

راهنمای ساده و عملی Terminal برای توسعه‌دهندگان و برنامه‌نویسان

بنر دستورات لینوکس: یک ترمینال با دستورهای ls، grep، systemctl و ss.
چند دستور اصلی، اگر با هم ترکیب شوند، بیشتر کار روزمره سرور را راه می‌اندازند.

در این آموزش چه یاد می‌گیریم؟

لازم نیست صدها دستور Linux را حفظ کنید. کافی است دستورهای اصلی را بشناسید، بدانید چطور راهنمای آن‌ها را بخوانید و چند ابزار را با Pipe به هم متصل کنید.

در این مطلب از حرکت بین پوشه‌ها شروع می‌کنیم و به جست‌وجوی Log، مدیریت Process، بررسی Port، SSH، Permission و عیب‌یابی یک سرویس واقعی می‌رسیم.

۱. قبل از شروع

بیشتر مثال‌های این آموزش در Bash اجرا می‌شوند و روی توزیع‌هایی مثل Ubuntu، Debian، Fedora و Rocky Linux کاربرد دارند. بعضی optionها ممکن است در macOS یا نسخه‌های دیگر ابزارها کمی فرق کنند.

ساختار کلی بیشتر دستورها چنین است:

command [options] [arguments]

# مثال
ls -lah /var/log
  • command: نام برنامه، مانند ls
  • option: تغییر رفتار دستور، مانند -l
  • argument: ورودی دستور، مانند مسیر /var/log

راهنمای هر دستور

man ls
ls --help
apropos "search files"

در صفحه man با کلیدهای جهت حرکت کنید، با /word جست‌وجو و با q خارج شوید.

Linux به حروف کوچک و بزرگ حساس است؛ App.log و app.log دو فایل متفاوت هستند.

pwd — الان کجا هستم؟

pwd
# /home/sara/projects/shop-api

ls — چه فایل‌هایی اینجا هستند؟

ls
ls -l       # نمایش جزئیات
ls -a       # شامل فایل‌های مخفی
ls -lah     # جزئیات + مخفی + حجم خوانا
ls -lt      # مرتب‌سازی بر اساس زمان تغییر

cd — تغییر پوشه

cd /var/log       # مسیر مطلق
cd src            # مسیر نسبی
cd ..             # یک سطح بالاتر
cd ~              # پوشه Home کاربر
cd -              # برگشت به مسیر قبلی

مسیر مطلق از / شروع می‌شود. مسیر نسبی از محل فعلی محاسبه می‌شود. . یعنی مسیر فعلی و .. یعنی والد آن.

ساخت و حذف پوشه

mkdir logs
mkdir -p src/api/controllers
rmdir empty-directory

option -p پوشه‌های میانی را نیز در صورت نیاز می‌سازد. rmdir فقط پوشه خالی را حذف می‌کند.

۳. ساخت، کپی، انتقال و حذف فایل

touch app.log                    # ساخت فایل خالی یا به‌روزرسانی زمان آن
cp appsettings.json backup.json # کپی فایل
cp -a config/ config-backup/    # کپی پوشه با حفظ مشخصات
mv old-name.txt new-name.txt    # تغییر نام
mv app.log logs/                # انتقال
rm old-file.txt                 # حذف فایل
rm -i important.txt             # سؤال قبل از حذف
فایل حذف‌شده با rm معمولاً وارد Recycle Bin نمی‌شود. دستورهای rm -rf و به‌خصوص اجرای آن‌ها با sudo می‌توانند در چند ثانیه اطلاعات مهم را نابود کنند. قبل از فشردن Enter، مسیر و متغیرها را دوباره بررسی کنید.

شناخت نوع و مشخصات فایل

file publish/app
stat appsettings.json
realpath appsettings.json
  • file نوع واقعی محتوا را تشخیص می‌دهد.
  • stat حجم، Permission و زمان‌های فایل را نشان می‌دهد.
  • realpath مسیر کامل و نهایی را چاپ می‌کند.

۴. مشاهده محتوای فایل‌ها

cat appsettings.json         # مناسب فایل کوتاه
less large.log               # مشاهده صفحه‌به‌صفحه
head -n 20 app.log           # ۲۰ خط اول
tail -n 100 app.log          # ۱۰۰ خط آخر
tail -f app.log              # دنبال کردن خطوط جدید Log
wc -l app.log                # تعداد خط‌ها

برای Logهای بزرگ از less استفاده کنید؛ برخلاف cat کل خروجی را یک‌باره روی Terminal نمی‌ریزد. در less با Shift+G به انتها بروید.

# دنبال کردن Log و نمایش فقط خطاها
tail -f app.log | grep --line-buffered -i "error"

find — پیدا کردن فایل

find . -type f -name "*.cs"
find ./logs -type f -mtime -1
find . -type f -size +100M
find . -type d -name "bin"
  • -type f: فقط فایل
  • -type d: فقط پوشه
  • -mtime -1: تغییرکرده در ۲۴ ساعت اخیر
  • -size +100M: بزرگ‌تر از ۱۰۰ مگابایت

grep و rg — پیدا کردن متن

grep -n "ConnectionString" appsettings.json
grep -RIn --exclude-dir=.git "TODO" .
grep -i "timeout" app.log

# ripgrep سریع‌تر و مناسب Repositoryهای کد
rg "AddDbContext"
rg -t cs "CancellationToken"
rg -g "*.json" "localhost"

grep تقریباً همه‌جا نصب است. rg یا Ripgrep معمولاً سریع‌تر است، فایل‌هایی را که Git نادیده می‌گیرد کنار می‌گذارد و برای جست‌وجو در Source Code تجربه بهتری فراهم می‌کند.

اگر نام فایل را می‌دانید، find مناسب است؛ اگر متن داخل فایل را می‌خواهید، از grep یا rg استفاده کنید.

۶. Pipe و Redirect؛ قدرت واقعی Terminal

کاراکتر | خروجی دستور سمت چپ را به ورودی دستور سمت راست می‌دهد:

ps aux | grep dotnet
cat access.log | sort | uniq -c | sort -nr
du -h --max-depth=1 | sort -h

Redirect خروجی را در فایل ذخیره می‌کند:

dotnet build > build.log          # جایگزینی فایل
dotnet test >> test.log           # افزودن به انتهای فایل
command 2> errors.log             # فقط stderr
command > all.log 2>&1           # stdout و stderr
dotnet test | tee test.log        # هم نمایش، هم ذخیره
> محتوای قبلی فایل را پاک می‌کند، اما >> خروجی را به انتهای آن اضافه می‌کند.

پردازش ساده خروجی

cut -d: -f1 /etc/passwd
sort names.txt
sort names.txt | uniq
awk '{print $1}' access.log
sed 's/http:/https:/g' urls.txt

برای تغییر فایل‌های مهم ابتدا خروجی sed را بدون option ویرایش در Terminal ببینید و سپس از فایل نسخه پشتیبان بگیرید.

۷. Permission، مالکیت و sudo

خروجی ls -l ممکن است چنین باشد:

-rwxr-x--- 1 sara developers 2048 Jul 19 20:10 deploy.sh

سه گروه Permission به‌ترتیب مربوط به مالک، گروه و دیگران هستند. r خواندن، w نوشتن و x اجرا است.

chmod u+x deploy.sh          # اجازه اجرا برای مالک
chmod 640 appsettings.json   # مالک rw، گروه r، دیگران هیچ
chmod 755 deploy.sh          # مالک rwx، بقیه r-x

chown sara:developers app.log
chown -R sara:developers ./logs

id
groups
sudo systemctl restart shop-api
مقدارهای عددی از جمع r=4، w=2 و x=1 ساخته می‌شوند؛ مثلاً 7 یعنی rwx و 5 یعنی r-x.
برای حل سریع خطای Permission از chmod 777 استفاده نکنید. ابتدا مالک، گروه و حداقل دسترسی لازم را مشخص کنید. sudo نیز فقط باید برای همان دستور مدیریتی لازم استفاده شود.

۸. مشاهده و مدیریت Processها

ps aux
ps -ef
pgrep -af dotnet
top
htop                 # در صورت نصب بودن
uptime

برای خاتمه Process:

kill 2481            # ارسال SIGTERM؛ فرصت خروج تمیز
kill -TERM 2481
kill -KILL 2481      # توقف اجباری؛ آخرین راه
pkill -f "dotnet Shop.Api.dll"
ابتدا SIGTERM بفرستید. SIGKILL به برنامه فرصت flush کردن Log، بستن connection یا cleanup نمی‌دهد. قبل از pkill الگو را با pgrep -af بررسی کنید.

Jobهای Shell

dotnet run &          # اجرا در Background
jobs

# Ctrl+Z برنامه فعلی را موقتاً متوقف می‌کند
bg %1                 # ادامه Job شماره ۱ در Background
fg %1                 # آوردن آن به Foreground

nohup ./worker > worker.log 2>&1 &

برای سرویس واقعی Production به‌جای nohup از systemd، container orchestrator یا process manager مناسب استفاده کنید.

۹. شبکه، HTTP و Portها

ip addr                 # آدرس‌های شبکه
ip route                # Route و Default Gateway
ss -lntp                # TCP portهای در حال Listen
ss -lntp | grep :5000

ping -c 4 example.com
dig +short example.com
nc -vz example.com 443

تست API با curl

curl -I https://example.com
curl -sS http://localhost:5000/health
curl -v http://localhost:5000/api/orders

curl -X POST http://localhost:5000/api/orders \
  -H "Content-Type: application/json" \
  -d '{"productId":42,"quantity":2}'
  • -I: فقط Header پاسخ
  • -sS: خروجی کم، ولی نمایش خطا
  • -v: جزئیات connection و Headerها برای عیب‌یابی
  • -L: دنبال کردن Redirect

برای دانلود فایل:

curl -fLO https://example.com/app.tar.gz
wget https://example.com/app.tar.gz
اگر API داخل container است، localhost داخل آن container به همان container اشاره می‌کند، نه host یا container دیگر.

۱۰. دیسک، حافظه و منابع سیستم

df -h                       # فضای File Systemها
du -sh ./logs               # حجم یک پوشه
du -h --max-depth=1 /var    # حجم زیرپوشه‌ها
free -h                     # RAM و Swap
lsblk -f                    # Disk و Mount Point
uname -a                    # Kernel و معماری
lscpu                       # اطلاعات CPU
uptime                      # زمان روشن بودن و Load Average

وقتی دیسک پر شده است، ابتدا با df -h File System پر را پیدا کنید و سپس با du پوشه‌های بزرگ همان مسیر را بررسی کنید.

مقدار available در خروجی free -h معمولاً برای تصمیم‌گیری مهم‌تر از ستون free است؛ Linux از RAM آزاد برای Cache استفاده می‌کند و در صورت نیاز آن را پس می‌گیرد.

۱۱. مدیریت Service و مشاهده Log

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

systemctl status shop-api
sudo systemctl start shop-api
sudo systemctl stop shop-api
sudo systemctl restart shop-api
sudo systemctl reload shop-api
sudo systemctl enable shop-api
systemctl is-active shop-api
systemctl is-enabled shop-api

restart Process را از نو اجرا می‌کند. reload فقط وقتی کار می‌کند که Service بارگذاری دوباره تنظیمات را پشتیبانی کند.

journalctl — Logهای systemd

journalctl -u shop-api
journalctl -u shop-api -n 100
journalctl -u shop-api -f
journalctl -u shop-api --since "30 minutes ago"
journalctl -u shop-api -p err
journalctl -b                    # از آخرین Boot

برای پیام‌های Kernel:

dmesg --level=err,warn
journalctl -k -b

۱۲. نصب و به‌روزرسانی Packageها

ابتدا توزیع را تشخیص دهید:

cat /etc/os-release

Ubuntu و Debian

sudo apt update
sudo apt install ripgrep
apt search ripgrep
apt show ripgrep
sudo apt remove ripgrep

Fedora، RHEL جدید و Rocky Linux

sudo dnf check-update
sudo dnf install ripgrep
dnf search ripgrep
dnf info ripgrep
sudo dnf remove ripgrep

Arch Linux

sudo pacman -Syu
sudo pacman -S ripgrep
pacman -Ss ripgrep
sudo pacman -R ripgrep
دستورهای package manager را بین توزیع‌ها ترکیب نکنید. در Production قبل از به‌روزرسانی گسترده، changelog، backup و برنامه rollback داشته باشید.

۱۳. فشرده‌سازی و استخراج فایل‌ها

# ساخت tar.gz
tar -czf release.tar.gz ./publish

# دیدن محتوا بدون استخراج
tar -tzf release.tar.gz

# استخراج
tar -xzf release.tar.gz

# استخراج در مسیر مشخص
tar -xzf release.tar.gz -C /opt/shop

# ZIP
zip -r source.zip ./src
unzip source.zip
unzip -l source.zip
Archive ناشناس را مستقیم در مسیر مهم استخراج نکنید. ابتدا فهرست آن را با tar -tf یا unzip -l ببینید و در یک پوشه موقت باز کنید.

۱۴. Environment Variable، PATH و Shell

env
printenv ASPNETCORE_ENVIRONMENT
echo "$PATH"

export ASPNETCORE_ENVIRONMENT=Production
export ConnectionStrings__Default="..."

command -v dotnet
type -a dotnet
which dotnet

export فقط برای Shell فعلی و فرزندان آن معتبر است. برای تنظیم دائمی این مقدار در Bash می‌توانید آن را به ~/.bashrc اضافه کنید و فایل را دوباره بارگذاری کنید:

source ~/.bashrc
Secretهایی مثل password و token را در command history، فایل عمومی shell یا Repository ذخیره نکنید. از Secret Manager، فایل محافظت‌شده یا قابلیت مدیریت Secret محیط اجرا استفاده کنید.

History، Alias و میانبرهای مفید

history
history | grep docker

alias ll='ls -lah'
alias gs='git status'
unalias gs
  • Ctrl+R: جست‌وجوی تعاملی در History
  • Ctrl+C: قطع برنامه جاری
  • Ctrl+L: پاک کردن صفحه
  • Tab: تکمیل نام دستور، فایل یا پوشه
  • Ctrl+A و Ctrl+E: اول و آخر خط

۱۵. SSH و انتقال فایل

اتصال امن به سرور

ssh deploy@server.example.com
ssh -p 2222 deploy@server.example.com
ssh -i ~/.ssh/id_ed25519 deploy@server.example.com

ساخت SSH Key

ssh-keygen -t ed25519 -C "developer@example.com"
ssh-copy-id deploy@server.example.com

برای Private Key یک passphrase قوی بگذارید، Permission آن را محدود نگه دارید و هرگز آن را داخل Git قرار ندهید.

scp و rsync

# کپی یک فایل به سرور
scp release.tar.gz deploy@server:/opt/releases/

# دریافت فایل از سرور
scp deploy@server:/var/log/shop/app.log ./

# همگام‌سازی بهینه پوشه
rsync -avz --progress ./publish/ deploy@server:/opt/shop/
option --delete در rsync فایل‌های اضافی مقصد را حذف می‌کند. ابتدا با --dry-run نتیجه را پیش‌نمایش کنید.

۱۶. مثال واقعی: چرا API بالا نمی‌آید؟

فرض کنید shop-api پاسخ نمی‌دهد. به‌جای اجرای تصادفی دستورها، مرحله‌به‌مرحله جلو بروید:

مرحله ۱: وضعیت Service

systemctl status shop-api --no-pager

مرحله ۲: Logهای اخیر

journalctl -u shop-api -n 100 --no-pager
journalctl -u shop-api --since "10 minutes ago" -p warning

مرحله ۳: آیا Process اجرا شده؟

pgrep -af "Shop.Api"
ps aux | grep "[S]hop.Api"

مرحله ۴: آیا Port باز است؟

ss -lntp | grep :5000

مرحله ۵: تست محلی Health Check

curl -v http://127.0.0.1:5000/health

مرحله ۶: بررسی منابع

df -h
free -h
top

مرحله ۷: بررسی DNS و مقصد خارجی

dig +short database.example.com
nc -vz database.example.com 5432
این ترتیب سریعاً مشخص می‌کند که مشکل از اجرا نشدن برنامه، خطای تنظیمات، اشغال بودن Port، کمبود دیسک یا RAM، مشکل DNS یا دسترسی شبکه است.

۱۷. خلاصه سریع دستورات

نیازدستور اصلی
مسیر فعلیpwd
نمایش فایل‌هاls -lah
تغییر مسیرcd
کپی یا انتقالcp، mv
مشاهده Log زندهtail -f
جست‌وجوی فایلfind
جست‌وجوی متنrg، grep
Permissionchmod، chown
Processps، pgrep، top، kill
Portهای بازss -lntp
تست HTTPcurl
فضای دیسکdf -h، du -sh
حافظهfree -h
Servicesystemctl
Log سیستمjournalctl
اتصال سرورssh
انتقال فایلscp، rsync

جمع‌بندی

  • به‌جای حفظ کردن همه optionها، استفاده از man و --help را یاد بگیرید.
  • با |، Redirect، grep و rg می‌توانید خروجی‌ها را سریع تحلیل کنید.
  • برای عیب‌یابی، از وضعیت Service و Log شروع کنید و بعد Process، Port و منابع را بررسی کنید.
  • قبل از rm، chmod -R، chown -R، kill -KILL و rsync --delete دوباره فکر کنید.
  • دستور را ابتدا روی محیط Development یا مسیر آزمایشی امتحان کنید.

بهترین راه یادگیری Linux، استفاده روزانه و حل مسئله‌های واقعی در Terminal است.