</>

لینوکس‌پارسی

مرجع فارسی آموزش لینوکس

Gentoo • Arch • Debian • Ubuntu • Kali • Parrot
پرش به محتوای اصلی

Command Palette

Search for a command to run...

sudo در Ubuntu

آموزش کامل sudo در Ubuntu: چرا root قفل است، پیکربندی sudoers، NOPASSWD، دسترسی گروهی و رفع خطاهای رایج sudo.

مقدماتی۵ دقیقه مطالعهآخرین بروزرسانی: ۹ تیر ۱۴۰۵ویرایش در گیت‌هاب

در Ubuntu، برخلاف بسیاری از توزیع‌ها، حساب root به‌طور پیش‌فرض قفل است. تمام کارهای مدیریتی از طریق sudo انجام می‌شود. در این آموزش با فلسفهٔ sudo، پیکربندی sudoers و نکات امنیتی آشنا می‌شوید.

sudo چیست؟#

sudo (Superuser DO) به یک کاربر عادی اجازه می‌دهد دستوراتی را با دسترسی root (یا کاربر دیگر) اجرا کند، بدون اینکه رمز root را بداند. در Ubuntu، اولین کاربری که در نصب می‌سازید، به‌صورت خودکار به گروه sudo اضافه می‌شود.

چرا Ubuntu از sudo استفاده می‌کند؟#

  • امنیت: حساب root قفل است و حملهٔ brute-force روی آن بی‌فایده است
  • پیگیری: هر دستور sudo در /var/log/auth.log ثبت می‌شود
  • کنترل: می‌توان دقیقاً تعیین کرد کدام کاربر کدام دستور را بتواند اجرا کند
  • موقت بودن: دسترسی sudo بعد از چند دقیقه منقضی می‌شود

استفادهٔ پایه از sudo#

# اجرای یک دستور به‌عنوان root
sudo apt update
# [sudo] password for ali: ********
 
# اجرای چند دستور به‌عنوان root
sudo -i
# (این یک shell کامل به‌عنوان root باز می‌کند)
# root@ubuntu:~#
 
# اجرای دستور به‌عنوان کاربر دیگر
sudo -u maryam whoami
# maryam
 
# اجرای یک دستور با محیط کاربر
sudo -u maryam -H bash -c 'echo $HOME'
# /home/maryam

sudo -i در برابر sudo -s

  • sudo -i یک login shell کامل می‌دهد (متغیرها reset می‌شوند، به home می‌رود)
  • sudo -s یک non-login shell می‌دهد (متغیرهای کاربر فعلی حفظ می‌شوند)
  • برای کارهای مدیریتی، sudo -i مناسب‌تر است.

timeout تایید sudo#

پس از وارد کردن رمز، sudo به‌مدت ۱۵ دقیقه (پیش‌فرض) دیگر رمز نمی‌پرسد:

# تمدید تایید (بدون اجرای دستور)
sudo -v
 
# باطل‌کردن تایید (نیاز به رمز دوباره)
sudo -k
 
# اجرای یک دستور بدون cache کردن رمز
sudo -k apt update

پیکربندی sudoers#

فایل پیکربندی sudo در /etc/sudoers قرار دارد. این فایل را هرگز مستقیم ویرایش نکنید؛ همیشه از visudo استفاده کنید:

# ویرایش امن فایل sudoers
sudo visudo

visudo قبل از ذخیره، syntax فایل را بررسی می‌کند. اگر خطا باشد، از ذخیره جلوگیری می‌کند تا سیستم قفل نشود.

فرمت فایل sudoers#

# User privilege specification
root    ALL=(ALL:ALL) ALL
 
# Members of the admin group may gain root privileges
%admin  ALL=(ALL) ALL
 
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
 
# کاربر خاص
ali     ALL=(ALL:ALL) ALL

فرمت کلی:

user    host=(run_as_user:run_as_group) command

به‌عنوان مثال:

  • ali ALL=(ALL:ALL) ALL — کاربر ali می‌تواند روی همهٔ هاست‌ها، به‌عنوان همهٔ کاربران، همهٔ دستورات را اجرا کند
  • %sudo ALL=(ALL:ALL) ALL — اعضای گروه sudo (با % مشخص می‌شوند)

افزودن کاربر به گروه sudo#

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

# افزودن کاربر به گروه sudo
sudo usermod -aG sudo maryam
 
# یا با adduser
sudo adduser maryam sudo
 
# کاربر باید logout و login کند تا گروه جدید اعمال شود

پیکربندی‌های پیشرفته sudoers#

۱. اجرای بدون رمز برای یک کاربر#

# اجرای همهٔ دستورات بدون رمز
ali ALL=(ALL) NOPASSWD: ALL

۲. اجرای بدون رمز برای دستور خاص#

# فقط apt بدون رمز
ali ALL=(ALL) NOPASSWD: /usr/bin/apt

۳. محدود کردن به دستورات خاص#

# فقط می‌تواند systemctl restart nginx را اجرا کند
deploy ALL=(root) /usr/bin/systemctl restart nginx

۴. گروهی با دسترسی محدود#

# گروه developers می‌تواند docker را اجرا کند
%developers ALL=(root) /usr/bin/docker, /usr/bin/docker-compose

۵. فایل‌های جداگانه در sudoers.d#

برای مدیریت بهتر، می‌توانید به‌جای ویرایش فایل اصلی، فایل‌های جداگانه در /etc/sudoers.d/ بسازید:

# ساخت فایل برای یک کاربر
sudo visudo -f /etc/sudoers.d/maryam
# /etc/sudoers.d/maryam
maryam ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

فایل اصلی sudoers این خط را دارد که فایل‌های داخل sudoers.d/ را هم شامل می‌شود:

@includedir /etc/sudoers.d

هر کاربر، یک فایل

بهترین روش مدیریت sudoers این است که برای هر کاربر یا هر نقش، یک فایل جداگانه در /etc/sudoers.d/ بسازید. این کار پیکربندی را مرتب نگه می‌دارد و کنترل نسخه را ساده می‌کند.

فایل‌های log#

دستورات sudo در Ubuntu در /var/log/auth.log ذخیره می‌شوند:

# مشاهدهٔ آخرین دستورات sudo
sudo tail /var/log/auth.log | grep sudo
 
# یا با journalctl
journalctl -u sudo
# یا
journalctl -g sudo
# خروجی نمونه:
# Jun 30 12:00:01 ubuntu sudo: ali : TTY=pts/0 ; PWD=/home/ali ; USER=root ; COMMAND=/usr/bin/apt update
# Jun 30 12:05:32 ubuntu sudo: ali : TTY=pts/0 ; PWD=/home/ali ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx

فعال‌کردن root (اختیاری)#

اگر واقعاً نیاز دارید root را فعال کنید:

# تنظیم رمز root
sudo passwd root
# New password: ********
# Retype new password: ********
 
# حالا می‌توانید با su - وارد root شوید
su -

فعال‌کردن root توصیه نمی‌شود

در Ubuntu، فعال‌کردن root توصیه نمی‌شود. این کار امنیت سیستم را کاهش می‌دهد و الگوی Ubuntu را نقض می‌کند. اگر به shell root نیاز دارید، از sudo -i استفاده کنید.

خطاهای رایج#

۱. user is not in the sudoers file#

ali is not in the sudoers file. This incident will be reported.

راه‌حل: کاربر به گروه sudo اضافه نشده. از یک کاربر دیگر sudoer یا از recovery mode استفاده کنید:

# از کاربر دیگری که sudo دارد
sudo usermod -aG sudo ali
 
# یا از recovery mode بوت کنید و در root shell بنویسید:
usermod -aG sudo ali

۲. syntax error در sudoers#

اگر فایل sudoers را مستقیم ویرایش کرده‌اید و سیستم قفل شده، از recovery mode استفاده کنید:

# بوت به recovery mode → root shell
# اجرای visudo برای رفع خطا
visudo

همیشه visudo استفاده کنید

هرگز فایل /etc/sudoers را با nano یا vim مستقیم ویرایش نکنید. یک خطای syntax می‌تواند دسترسی sudo شما را کاملاً قطع کند و شما را مجبور به بوت recovery کند.

۳. NOPASSWD کار نمی‌کند#

دلیل رایج: ترتیب قوانین در sudoers. قانون پایین‌تر، قانون بالاتر را override می‌کند. اگر NOPASSWD را در /etc/sudoers.d/ گذاشته‌اید اما هنوز رمز می‌خواهد، مطمئن شوید فایل بعد از %sudo ALL=(ALL:ALL) ALL در فایل اصلی لود می‌شود (که این‌طور است).

۴. sudo: unable to resolve host#

sudo: unable to resolve host ubuntu-pc

راه‌حل: hostname در /etc/hosts نیست:

# بررسی hostname
hostname
 
# افزودن به /etc/hosts
echo "127.0.1.1 $(hostname)" | sudo tee -a /etc/hosts

خلاصه و مرحلهٔ بعد#

sudo در Ubuntu جایگزین مستقیم root است و کنترل امن روی کارهای مدیریتی فراهم می‌کند. با استفاده از visudo و فایل‌های /etc/sudoers.d/، می‌توانید دسترسی‌ها را به‌صورت دقیق و امن مدیریت کنید.

به‌عنوان گام بعدی:

اشتراک‌گذاری:

این صفحه در تاریخ ۹ تیر ۱۴۰۵ به‌روزرسانی شده است.