دستور sudo که به صورت «sudoedit» هم قابل استفاده است، در لینوکس مخفف عبارت «superuser do» یا بر اساس برخی منابع، «substitute user do» است. sudo در لینوکس در اصل برنامهای است که به منظور اجرای دستوری به عنوان کاربری دیگر (اغلب Superuser) به کار گرفته میشود. در ادامه این نوشتار از مجله تم آف سعی شده است تا به طور جامع به این پرسش پاسخ داده شود که برنامه یا همان دستور sudo در لینوکس چیست، چه کاربردهایی دارد و چطور میتوان از آن استفاده کرد.
مقدمه
اگر sudo در لینوکس را در ابتدای دستورات دیگر قرار دهیم، آن دستور با مجوزهای سطح بالاتر اجرا میشود. به عبارت دیگر، این دستور به کاربر این امکان را میدهد تا همچون سوپریوزر، از مجوزهای لازم برای اجرای دستورات نیازمند مجوز سطح بالا بهرهمند شود.
استفاده از این دستور به نوعی شبیه به اجرای یک برنامه با حالت «Run as Administrator» در ویندوز است. این قابلیت به کاربر این امکان را میدهد تا بیش از یک مدیر سیستم یا همان ادمین (سوپر یوزر یا کاربر روت) داشته باشیم. هر کاربری میتواند از دستور sudo در لینوکس استفاده کند، به شرطی که حساب کاربری او در آدرس /etc/sudoers
اضافه شده باشد. هر چند در این صورت هم به طور پیشفرض نیاز به وارد کردن پسورد خودِ کاربر (و نه لزوما پسورد روت) وجود دارد.
در ادامه با استفاده از راهنمای برنامه sudo در لینوکس، دقیقتر شرح دادهایم که دستور sudo در لینوکس چیست و شما هم میتوانید با استفاده از دستور «man sudo» راهنمای این برنامه مهم را در محیط خط فرمان خود مطالعه و اطلاعات بیشتری را در خصوص آن کسب کنید.
دستور sudo در لینوکس چیست؟
sudo در لینوکس به کاربر مجاز اجازه میدهد تا مطابق آنچه در خط مشی امنیتی مشخص شده است، دستوری را به عنوان سوپریوزر یا یوزری دیگر اجرا کند. برای جستجوی شناسه کاربری در خط مشی امنیتی، «شناسه کاربر» (User-ID) واقعی کاربرِ فراخوانی کننده و نه شناسه اثربخش به عنوان شناسه مورد جستجو استفاده میشود.
برنامه sudo در لینوکس از معماری پلاگین (افزونه) برای خط مشیهای امنیتی، حسابرسی و ثبتوقایع (لاگبرداری) ورودی-خروجیها پشتیبانی میکند. اشخاص ثالث میتوانند پلاگینهای خودشان را توسعه دهند و منتشر کنند تا بتوانند به طور پیوسته و مستقیم با فرانتاند برنامه sudo در لینوکس کار کنند. خط مشی پیشفرض امنیتی، «sudoers» نام دارد که از طریق فایل «/etc/sudoers» یا از طریق LDAP پیکربندی میشود. برای اطلاعات بیشتر میتوان به بخش مربوط به پلاگینها در راهنمای گنو/لینوکس مراجعه کرد.
خط مشی امنیتی تعیین میکند که یک کاربر (یوزر) در لینوکس چه حقوق ویژهای را، در صورت وجود، برای اجرای sudo دارد. ممکن است بر اساس خط مشی مربوطه، کاربران خودشان را به وسیله پسورد یا سایر ساز و کارها تایید هویت کنند. اگر تایید هویت لازم باشد، در صورت عدم وارد کردن رمز در مدت زمانی قابل تنظیم، برنامه sudo بسته خواهد شد. این محدودیت به سیاست اتخاذ شده مربوط میشود. محدودیت زمانی خط مشی sudoگرها به طور پیشفرض برابر با صفر دقیقه است.
خط مشیهای امنیتی ممکن است از ذخیرهسازی موقت مشخصات کاربری پشتیبانی کنند تا کاربر اجازه داشته باشد sudo را دوباره برای مدت زمانی مشخصی، بدون نیاز به احراز هویت مجدد، اجرا کند. به طور پیشفرض، خط مشی sudoers مشخصات کاربری را بر اساس هر ترمینال به مدت ۱۵ دقیقه به صورت موقت ذخیرهسازی یا کش میکند.
ساختار دستور sudo در لینوکس
برنامه یا دستور sudo در لینوکس طبق ساختاری کلی نوشته و اجرا میشود و سینتکس آن به صورت زیر است.
sudo
در این ساختار، «OPTIONS»، «تنظیمات انتخابی» نحوه اجرای sudo هستند و «COMMAND» دستور اصلی است که قصد اجرای آن را به عنوان کاربری دیگر یا یک Superuser داریم. در ادامه به آپشنها یا همان تنظیمات انتخابی مختلف دستور sudo در کنار سایر فرمانهای لینوکس میپردازیم.
تنظیمات قابل انتخاب دستور sudo در لینوکس
میتوان با به یاد آوردن اینکه حرف موجود، مخفف چه کلمهای است، کاربرد آپشن مورد نظر را نیز به یاد آورد یا به راحتی میتوان با دستور man و باز کردن راهنمای برنامه sudo، کلیه آپشنهای این دستور و کاربرد آنها را متوجه شد. مثلاً آپشن -V
مخفف کلمه «Version» یا شماره نسخه است که فارغ از فرمان وارد شده، تقریباً همیشه برای همین مورد استفاده میشود.
نکته آخر اینکه، آپشنها در لینوکس و به طور کلی همه چیز در لینوکس به بزرگ یا کوچک بودن حروف حساس هستند. یعنی آپشن -v
با -V
فرق دارد و هر یک کاربرد متفاوتی دارند. دستور sudo در لینوکس، مثل بسیاری از دستورات دیگر، آپشنهای مختلف و زیادی دارد که در ادامه به برخی از مهمترین آنها پرداخته شده است.
- آپشن -V
: همانطور که بیان شد، این آپشن نسخه sudo را نشان میدهد. چرا که خود دستور sudo در لینوکس یک برنامه به حساب میآید که وظیفهاش کنترل و بررسی مجوزهای کاربران است.
- آپشن -l
: مخفف کلمه «list» است و دستوراتی که کاربر میتواند به همراه sudo اجرا کند را لیست میکند. در تصویر زیر با وارد کردن دستور سودو در لینوکس به همراه آپشن -l
مشخص میشود که کاربر میتواند همه دستورات را با sudo اجرا کند.
- آپشن -h
: مخفف کلمه «help» است و پیام راهنمایی را برای نحوه استفاده از دستور سودو در لینوکس برای کاربر به نمایش میگذارد (به طور کلی اگر برنامه یا دستوری در لینوکس به صورت پیش ساخته در شل موجود باشد یا به بیان دیگر دستور Shell Builtin باشد، با استفاده از دستور help هم میتوان راهنمایی آن را در خط فرمان چاپ و آن را مطالعه کرد. همچنین از دستور man برای مشاهده راهنمای دستوراتی استفاده میشود که در لینوکس یک برنامه مجزا یا همان اپلیکیشن به حساب میآیند. با استفاده از دستور type میتوان مشخص کرد که آیا یک دستور Shell Builtin است یا برنامهای مستقل محسوب میشود.
- آپشن -v
: مخفف کلمه «validate» است. اگر قرار باشد sudo مدت زمان برخورداری از مجوزها را برای یک کاربر به روز کند، این عمل با درخواست دوباره رمز عبور صورت میگیرد و تا پنج دقیقه اضافهتر مجوزها در اختیار کاربر باقی میمانند.
- آپشن -k
: مخفف کلمه «kill» است و بعد از اجرا، کاربر نیاز دارد برای اجرای دوباره دستور sudo، پسوردش را وارد کند. در حقیقت زمانی با وارد کردن این دستور زمانی که کاربر میتواند بدون نیاز به وارد کردن پسورد، از sudo استفاده کند به پایان میرسد. گفتنی است اجرای خود این آپشن نیازی به وارد کردن پسورد ندارد. لازم به ذکر است آپشن -K
(با حرف بزرگ) هم همین کاربرد را دارد، با این تفاوت که بدون در نظر گرفتن استثناها و پیشفرضها این کار را میکند و اصطلاحا «sure kill» میکند و از kill شدن کامل اطمینان حاصل خواهد شد.
- آپشن -b
: مخفف کلمه «background» است و باعث میشود sudo دستوراتی که به مجوز نیاز دارند را در پسزمینه اجرا کند.
- آپشن -n
: مخفف «non-interactive» است و به کاربر اجازه میدهد تا بدون نیاز به وارد کردن پسورد، sudo کند. این آپشن مخصوصاً در مواقعی کاربرد دارد که نیاز به اجرای دستورات در پسزمینه یا درون یک اسکریپت داریم.
- آپشن -u
: مخفف «user» است و برای اجرای دستور به عنوان کاربری مشخص استفاده میشود. میتوان کاربر مورد نظر را با ارائه یوزرنیم یا «UID» بعد از کاراکتر «#» (مثلا #2761
) مشخص کرد.
- آپشن -H
: مخفف «home» است و در پوشه home کاربر یک متغیر محیطی یا «home env variable» میسازد.
- آپشن -s
: مخفف «shell» است و یک نمونه از پوسته به وسیله متغیر محیطی SHELL اجرا میکند. نوع پوسته ممکن است بسته به فایل passwd
متفاوت باشد.
- آپشن -S
: مخفف «stdin» است و پسورد را به جای ترمینال، از «standard input» میخواند.
- آپشن –
: این آپشن منجر به توقف پردازش سایر آپشنهای دستور sudo میشود. این مورد در کنار آپشن -s
کاربردی است.
- آپشن -a
: مخفف «authentication type» است. این آپشن به دستور sudo این قابلیت را میدهد تا با استفاده از روش اعتبارسنجی ذکر شده، کاربر را بر اساس محتویات /etc/login/.config
تایید کند. لازم است ادمین از قبل روشهای مخصوص اعتبارسنجی از جمله مدخل «auto-sudo» را در /etc/login/.config
ذکر کند.
دستورات لینوکس کاربردی از مبتدی تا پیشرفته – 50 دستور مهم
گفتنی است بسیاری از این آپشنها معمولاً برای همه دستورات لینوکس یکسان هستند. مثلا ۲ دستور زیر به ترتیب برای بررسی شماره نسخه پایتون و «انجیناکس» (در صورت نصب بودن از قبل) استفاده میشوند. دقت شود که هر دو از آپشن -v
استفاده میکنند.
python -v
nginx -v
همچنین لازم است به یاد داشته باشیم که هر یک از این آپشنها به جای عبارت «OPTIONS» در ساختار کلی ذکر شده قرار میگیرند.
متغیرهای محیطی در دستور sudo
در جدول زیر هر یک از متغیرهای محیطی دستور سودو در لینوکس به همراه توضیحاتش ارائه شده است.
عنوان متغیر محیطی | توضیح |
EDITOR | ویرایشگر پیشفرضی است که کاربر حین استفاده از آپشن -e
و وقتی از آن استفاده میکند که متغیر VISUAL تنظیم نشده باشد. |
HOME | آدرس خانه کاربر هدف حین استفاده از آپشنهای -H
یا -s است. |
PATH | شامل لیستی از پوشههایی است که باید برای یافتن یک فرمان جستجو شوند. مقدار پیشفرض این متغیر در محل /etc/profile
موجود است. |
SHELL | با تنظیم این متغیر میتوان نوع پوسته اجرایی را حین استفاده از آپشن -s
مشخص کرد. |
sudo_COMMAND | دستوری را ذخیره میکند که توسط sudo اجرا میشود. |
sudo_PROMPT | متن درخواست پسورد را تعیین میکند. |
sudo_USER | مخصوص نام کاربری است که درخواست مجوزها را داده است. |
sudo_UID | مربوط به «UID» یا شماره مخصوص کاربری است که درخواست مجوزها را داده است. |
sudo_GID | مخصوص «GID» یا شماره گروه کاربری است که درخواست مجوزها را داده است. |
sudo_PS1 | PS1 در صورت تنظیم به مقدار خود تنظیم میشود. |
USER | روی کاربر فعلی تنظیم میشود، مگر اینکه آپشن -u
از قبل مقداردهی شده باشد. |
VISUAL | یک ویرایشگر متن پیشفرض است که در حالت -e
استفاده میشود. |
حال پس از معرفی اجمالی این دستور، به شرح تاریخچهای کوتاه از آن میپردازیم.
تاریخچه دستور سودو در لینوکس
زیرسیستم sudo توسط «Cliff Spencer» و «Robert Coggeshall» در سال ۱۳۵۹ و در دپارتمان علوم کامپیوتر دانشگاه SUNY/Buffalo نوشته شد. هر چند پایه و اساس آن در سالهای ۱۳۶۵ تا ۱۳۷۲ در دانشگاه «Boulder» کلرادو توسط «تاد سی میلر» دستخوش تغییر شد و خودِ او نیز اولین نسخه sudo را منتشر کرد.
معماری دستور sudo چگونه است؟
برخلاف دستور su، کاربران میتوانند تنها در زمان نیاز پسورد خود را به sudo ارائه دهند، بدون اینکه نیازی به دسترسی سوپریوزر داشته باشند. کامپیوتر پس از وارد کردن پسورد، دسترسیهای مربوطه را به کاربر میدهد و پس از آن سیستم به سراغ فرمان وارد شده میرود. این دسترسیها برای مدت کوتاهی (معمولا ۵ دقیقه برای هر ترمینال در حال اجرا) آزاد هستند و کاربر نیازی به وارد کردن دوباره پسورد در این زمان ندارد. همچنین به عنوان قابلیتی امنیتی، میتوان تنظیمات sudo را طوری تغییر داد تا هر دستور وارد شده را لاگ (ثبت وقایع) کند.
در توزیعهای لینوکسی (در کنار مک او اس) دستور sudo جایگزین استفاده پیشفرض از لاگین مجدد برای سوپریوزر شده است. یعنی دیگر نیازی نیست حتما یک سوپریوزر وارد حساب کاربری خود شود تا دستورات مخصوص را اجرا کند، بلکه میتواند به راحتی با استفاده از دستور sudo و وارد کردن پسورد، آنها را اجرا کند.
پیکربندی دستور sudo در لینوکس چگونه است ؟
فایل موجود در آدرس /etc/sudoers
حاوی فهرست همه گروهها یا فهرست کاربرانی است که اجازه اجرای مجموعهای از دستورات را دارند و در عین حال، حقوق کاربر root یا کاربر فهرست شده دیگری را هم دارند. برنامه sudo ممکن است به گونهای پیکربندی شده باشد که برای استفاده از آن نیاز به وارد کردن رمز عبور وجود داشته باشد.
چه ابزارهای جایگزینی برای sudo وجود دارند ؟
دستور visudo
ابزار خط فرمانی است که اجازه ویرایش فایل تنظیمات sudo را میدهد. با این ابزار میتوان درستی کدهای نوشته شده را بررسی کرد. همچنین با قفل کردن فایل تنظیمات، از ویرایشهای همزمان جلوگیری میکند. در ویندوز نیز ابزار «runas» کاری مشابه انجام میدهد که البته محدودیتهایی دارد و به طور کلی اجازه ارتقای سطح کاربر را نمیدهد، بلکه تنها میتوان فرآیند فرزند را به عنوان کاربری دیگر اجرا کرد. گفتنی است در سالهای بعد، ابزاری با شباهت بیشتر به sudo و su به همراه «Hamilton C shell» به ویندوز اضافه شد.
رابطهای کاربری گرافیکی برای sudo نیز موجود هستند. از جمله آنها میتوان به «gksudo» اشاره کرد که البته در دبیان منسوخ شده است و در اوبونتو هم (که از دبیان مشتق شده) موجود نیست. سایر رابطها ارتباط مستقیمی به sudo ندارند، اما برخی کاربریهای آن مثل دسترسی ادمین (به صورت موقت) را پیاده میکنند تا کارهایی مثل تصدیق سرویسها در مک او اس اکس یا کنترل حسابهای کاربری روی ویندوز تسهیل شوند. ابزار «doas» روی توزیع «OpenBSD» از سال ۱۳۹۴ در دسترس است که با هدف جایگزینی دستور sudo طراحی شد.
دستور su با sudo چه تفاوتی دارد؟
معمولا کاربران قدیمیتر لینوکس عادت دارند تا از دستور su برای کسب دسترسیهای سوپریوزر استفاده کنند. این دستور آدرس روت یعنی /root
را به عنوان پوشه «home» ما در نظر میگیرد. معمولا لاگین کردن به عنوان سوپریوزر ایده خوبی نیست و بهتر است پس از ورود به حساب کاربری عادی، با استفاده از دستور su یا sudo موقتا دسترسیهای لازم را فراهم کنیم. چه بسا برخی از توزیعها مثل اوبونتو که از sudo استفاده میکنند، قابلیت لاگین کردن به عنوان کاربر روت را به طور کامل حذف کردهاند.
با وجود تفاوتهایی جزئی، این دو دستور بسیار شبیه به یکدیگر هستند. به وسیله دستور su میتوان به حساب کاربری دیگری وارد شد و در نتیجه همه دسترسیهای حساب مقصد را به دست آورد، در حالی که با دستور sudo صرفا میتوان یک فرمان را با دسترسیهای کاربر دیگر اجرا کرد. پس از استفاده از دستور su و اتمام کار نیز میتوان با استفاده از دستور exit از حساب کاربری مربوطه خارج و دوباره وارد حساب کاربری اصلی خود شد.
دستور sudo در لینوکس چه کار می کند ؟
دستور sudo در مواقعی که از ترمینال استفاده میکنیم، بسیار پرکاربرد است. با این دستور میتوان بدون نیاز به ورود با یوزر روت و افشای رمز عبور آن، موقتاً به یک کاربر دستهای از اختیاراتی را اعطا کرد که مورد نیازش است. نحوه اجرای این دستور بستگی به توزیع مورد استفاده دارد.
برخی از توزیعها (مثل اوپن سوزه، ردهت یا فدورا) امکان ورود به حساب روت را میدهند، در حالی که برخی دیگر (مثل اوبونتو یا دبیان) اینطور نیستند. در اکثر مواقع، از سادهترین شکل دستور sudo استفاده میشود. یعنی کافی است آن را قبل از فرمان مورد نظر که نیاز به دسترسیهای سوپریوزر دارد، قرار دهیم و معمولاً نیازی به اضافه کردن آپشنها نیست.
چگونه sudo را نصب کنیم ؟
در عمل، sudo ابزار و برنامهای است که معمولا به طور پیشفرض روی لینوکس نصب هست و نیازی به کار اضافه برای نصب آن وجود ندارد.
هر چند برای تایید نصب بودن آن میتوان مراحل زیر را طی کرد:
- ترمینال باز شود.
- دستور sudo تایپ شده و کلید اینتر را میزنیم.
- پیغام خروجی مشخص میکند آیا sudo از قبل نصب هست یا خیر و اگر با پیغامی مثل «دستور sudo یافت نشد» مواجه شدیم، یعنی نیاز داریم sudo را نصب کنیم. متن دقیق این پیغام بسته با توزیع مورد استفاده میتواند متفاوت باشد.
- در صورت نیاز به نصب sudo، میتوانیم از دستور زیر استفاده کنیم تا پکیج نرمافزاری مربوطه، دانلود و نصب شود:
pacman -S sudo #توزیعهای مبتنی بر آرچ لینوکس apt install sudo #اوبونتو و سایر توزیعهای مبتنی بر دبیان yum install sudo #فدورا، سنت او اس و سایر توزیعهایی مبتنی بر ردهت
نمونهای از اجرای دستور نصب sudo روی اوبونتو در ادامه آمده است.
اگر sudo روی کامیپوتری از قبل نصب باشد و نیاز داشته باشیم تا آن را بهروزرسانی کنیم، میتوانیم طبق تصویر زیر عمل کنیم.
sudo apt-get update
جمع بندی
تقریباً در همه توزیعهای رایج میتوان از sudo استفاده کرد و برای یک کاربر لینوکس غیرممکن است که به آن نیاز پیدا نکند. چرا که بسیاری از فعالیتهای کلیدی مثل نصب نرمافزار جدید یا ویرایش فایلهای سیستم و تغییر بسیاری از تنظیمات نیاز به دسترسیهایی دارند که در اختیار هر کاربر معمولی نیست.
بنابراین ۲ راه حل داریم، یکی اینکه از دستور su استفاده کنیم و به عنوان یک کاربر دیگر که سوپریوزر هست، دستورات را وارد کنیم و راه حل دوم این است که به طور موقت و بدون نیاز به ارائه پسورد root به هر کاربری، تنها دسترسیهایی را در اختیارش قرار دهیم که نیاز دارد و آن هم به شرط وارد کردن رمز عبور حساب کاربری آن یوزر انجام خواهد شد. راه حل دوم که امنتر و منطقیتر به نظر میرسد، همان استفاده از دستور sudo است. تنها کافی خواهد بود کلمه sudo را قبل از فرمان مورد نظر بنویسیم و پس از وارد کردن دستور مورد نظر به طور کامل و زدن کلید اینتر، رمز عبور حساب خودمان را وارد کنیم تا دستور مربوطه با سطح دسترسی بالاتر اجرا شود.
در لینوکس برای هر کاربر معمولی پوشهای مخصوص در آدرس /home/
ایجاد و فایلها و تنظیمات کاربر مربوطه در آن نگهداری میشود. کاربرد اصلی دستور sudo این است که میتوان بدون نیاز به ورود به حساب دیگران یا داشتن رمز عبور روت، مجوزهای لازم را موقتا فراهم کرد.
در این مطلب از مجله تم آف به بررسی عمیق دستور sudo در لینوکس پرداختیم. اینکه دقیقا چطور عمل میکند، چگونه طراحی شده، با چه آپشنهایی و در چه قالبی میتواند استفاده شود، چه فرقی با دستور su دارد، چه ابزارهای جایگزینی دارد و اندکی نیز از تاریخچهاش گفتیم. همچنین در آخر به نحوه نصب آن در صورت نیاز پرداخته شد.