دستورات پرکاربرد Linux
راهنمای ساده و عملی Terminal برای توسعهدهندگان و برنامهنویسان
در این آموزش چه یاد میگیریم؟
لازم نیست صدها دستور Linux را حفظ کنید. کافی است دستورهای اصلی را بشناسید، بدانید چطور راهنمای آنها را بخوانید و چند ابزار را با Pipe به هم متصل کنید.
در این مطلب از حرکت بین پوشهها شروع میکنیم و به جستوجوی Log، مدیریت Process، بررسی Port، SSH، Permission و عیبیابی یک سرویس واقعی میرسیم.
۱. قبل از شروع
بیشتر مثالهای این آموزش در Bash اجرا میشوند و روی توزیعهایی مثل Ubuntu، Debian، Fedora و Rocky Linux کاربرد دارند. بعضی optionها ممکن است در macOS یا نسخههای دیگر ابزارها کمی فرق کنند.
ساختار کلی بیشتر دستورها چنین است:
command [options] [arguments]
# مثال
ls -lah /var/log
command: نام برنامه، مانندlsoption: تغییر رفتار دستور، مانند-largument: ورودی دستور، مانند مسیر/var/log
راهنمای هر دستور
man ls
ls --help
apropos "search files"
در صفحه man با کلیدهای جهت حرکت کنید، با /word جستوجو و با q خارج شوید.
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.
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
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
۱۳. فشردهسازی و استخراج فایلها
# ساخت 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
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
History، Alias و میانبرهای مفید
history
history | grep docker
alias ll='ls -lah'
alias gs='git status'
unalias gs
Ctrl+R: جستوجوی تعاملی در HistoryCtrl+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/
--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
۱۷. خلاصه سریع دستورات
| نیاز | دستور اصلی |
|---|---|
| مسیر فعلی | pwd |
| نمایش فایلها | ls -lah |
| تغییر مسیر | cd |
| کپی یا انتقال | cp، mv |
| مشاهده Log زنده | tail -f |
| جستوجوی فایل | find |
| جستوجوی متن | rg، grep |
| Permission | chmod، chown |
| Process | ps، pgrep، top، kill |
| Portهای باز | ss -lntp |
| تست HTTP | curl |
| فضای دیسک | df -h، du -sh |
| حافظه | free -h |
| Service | systemctl |
| 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 است.