SU(1) دستورات کاربر SU(1)

su - اجرای یک دستور با شناسه کاربر و گروه جایگزین

su [گزینه‌ها] [-] [کاربر [آرگومان...]]

دستور su اجازه می‌دهد دستورها با شناسه کاربر و گروه جایگزین اجرا شوند.

هنگامی که بدون مشخص کردن کاربر فراخوانی شود، su به طور پیش‌فرض یک پوسته تعاملی را به عنوان root اجرا می‌کند. هنگامی که کاربر مشخص شود، می‌توان آرگومانهای بیشتری تعیین کرد که در این صورت به پوسته منتقل می‌شوند.

برای سازگاری با گذشته، su به طور پیش‌فرض دایرکتوری جاری را تغییر نمی‌دهد و تنها متغیرهای محیطی HOME و SHELL (به علاوه USER و LOGNAME اگر کاربر هدف root نباشد) را مقداردهی می‌کند. توصیه می‌شود همیشه از گزینه --login (به جای فرم کوتاه آن -) استفاده شود تا از عوارض جانبی ناشی از ترکیب محیط‌ها جلوگیری به عمل آید.

این نسخه از su برای احراز هویت، مدیریت حساب و نشست از PAM استفاده می‌کند. برخی از گزینه‌های پیکربندی موجود در پیاده‌سازی‌های دیگر su، مانند پشتیبانی از گروه wheel، باید از طریق PAM پیکربندی شوند.

دستور su عمدتاً برای کاربران بدون امتیاز طراحی شده است؛ راهکار پیشنهادی برای کاربران دارای امتیاز (مانند اسکریپت‌هایی که توسط کاربر ریشه اجرا می‌شوند) استفاده از دستور غیر set-user-ID به نام runuser(1) است که نیازی به احراز هویت ندارد و پیکربندی PAM مجزایی ارائه می‌دهد. اگر به نشست PAM اصلاً نیازی نباشد، راهکار پیشنهادی استفاده از دستور setpriv(1) است.

توجه داشته باشید که su در تمام موارد برای اعمال تغییر نهایی متغیرهای محیطی از PAM (pam_getenvlist(3)) استفاده می‌کند. گزینه‌های خط فرمان مانند --login و --preserve-environment محیط را قبل از تغییر توسط PAM تحت تأثیر قرار می‌دهند.

از نسخه 2.38 دستور su محدودیت‌های منابع فرایند شامل RLIMIT_NICE، RLIMIT_RTPRIO، RLIMIT_FSIZE، RLIMIT_AS و RLIMIT_NOFILE را بازنشانی می‌کند.

ارسال دستور به پوسته با گزینه -c.
ارسال -f به پوسته، که بسته به پوسته ممکن است مفید باشد یا نباشد.
مشخص کردن گروه اصلی. این گزینه فقط برای کاربر root در دسترس است.
مشخص کردن گروه تکمیلی. این گزینه فقط برای کاربر root در دسترس است. اولین گروه تکمیلی مشخص‌شده در صورتی که گزینه --group مشخص نشده باشد، به عنوان گروه اصلی نیز استفاده می‌شود.
-, -l, --login
شروع پوسته به عنوان یک پوسته ورود (login shell) با محیطی مشابه ورود واقعی:
  • پاکسازی تمام متغیرهای محیطی به جز TERM و متغیرهای مشخص‌شده با --whitelist-environment
  • مقداردهی اولیه متغیرهای محیطی HOME، SHELL، USER، LOGNAME و PATH
  • تغییر مسیر به دایرکتوری خانگی کاربر هدف
  • تنظیم argv[0] پوسته به '-' به منظور تبدیل پوسته به یک پوسته ورود
حفظ کل متغیرهای محیطی، یعنی عدم مقداردهی HOME، SHELL، USER یا LOGNAME. در صورت مشخص شدن گزینه --login، این گزینه نادیده گرفته می‌شود.
ایجاد یک ترمینال کاذب (pseudo-terminal) برای نشست. ترمینال مستقل امنیت بهتری فراهم می‌کند زیرا کاربر ترمینال را با نشست اصلی به اشتراک نمی‌گذارد. این کار می‌تواند برای جلوگیری از تزریق ترمینال از طریق TIOCSTI ioctl و سایر حملات امنیتی علیه توصیف‌کننده‌های فایل ترمینال استفاده شود. کل نشست را می‌توان به پس‌زمینه نیز منتقل کرد (مانند su --pty - نام_کاربر -c برنامه &). اگر ترمینال کاذب فعال باشد، su به عنوان یک پروکسی بین نشست‌ها عمل می‌کند (همگام‌سازی ورودی و خروجی استاندارد).
این ویژگی عمدتاً برای نشست‌های تعاملی طراحی شده است. اگر ورودی استاندارد یک ترمینال نباشد، بلکه به عنوان مثال یک پایپ (pipe) باشد (مانند echo "date" | su --pty)، پرچم ECHO برای ترمینال کاذب غیرفعال می‌شود تا از خروجی نامرتب جلوگیری شود.
اجرای پوسته مشخص‌شده به جای پوسته پیش‌فرض. پوسته مورد نظر بر اساس قوانین زیر و به ترتیب انتخاب می‌شود:
  • پوسته مشخص‌شده با --shell
  • پوسته مشخص‌شده در متغیر محیطی SHELL، در صورتی که گزینه --preserve-environment استفاده شده باشد
  • پوسته فهرست‌شده در مدخل passwd کاربر هدف
  • /bin/sh
اگر کاربر هدف دارای یک پوسته محدودشده باشد (یعنی در /etc/shells فهرست نشده باشد)، گزینه --shell و متغیر محیطی SHELL نادیده گرفته می‌شوند مگر اینکه کاربر فراخوان root باشد.
مشابه -c، اما یک نشست جدید ایجاد نمی‌کند (استفاده از آن توصیه نمی‌شود).
هنگام پاکسازی محیط برای --login، متغیرهای محیطی مشخص‌شده در فهرست جداشده با ویرگول را بازنشانی نمی‌کند. فهرست سفید برای متغیرهای محیطی HOME، SHELL، USER، LOGNAME و PATH نادیده گرفته می‌شود.
نمایش راهنما و خروج.
نمایش نسخه و خروج.

به هنگام دریافت SIGINT، SIGQUIT یا SIGTERM، دستور su فرایند فرزند خود را خاتمه داده و سپس با همان سیگنال دریافتی خود را خاتمه می‌دهد. فرزند ابتدا با SIGTERM خاتمه می‌یابد؛ پس از تلاش ناموفق و ۲ ثانیه تأخیر، فرزند توسط SIGKILL کشته می‌شود.

دستور su فایل‌های پیکربندی /etc/default/su و /etc/login.defs را می‌خواند. موارد پیکربندی زیر برای su مرتبط هستند:

میزان تأخیر بر حسب ثانیه در صورت شکست در احراز هویت. این عدد باید یک عدد صحیح غیرمنفی باشد.
متغیر محیطی PATH را برای یک کاربر معمولی تعریف می‌کند. مقدار پیش‌فرض /usr/local/bin:/bin:/usr/bin است.
متغیر محیطی PATH را برای کاربر root تعریف می‌کند. ENV_SUPATH اولویت دارد. مقدار پیش‌فرض /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin است.
اگر روی yes تنظیم شود و گزینه‌های --login و --preserve-environment مشخص نشده باشند، su متغیر PATH را مقداردهی اولیه می‌کند.

متغیر محیطی PATH ممکن است در سیستم‌هایی که /bin و /sbin در /usr ادغام شده‌اند متفاوت باشد؛ این متغیر همچنین تحت تأثیر گزینه خط فرمان --login و تنظیمات سیستم PAM (مانند pam_env(8)) قرار می‌گیرد.

دستور su به طور معمول وضعیت خروج دستوری را که اجرا کرده بازمی‌گرداند. اگر دستور توسط یک سیگنال کشته شده باشد، su شماره آن سیگنال را به علاوه ۱۲۸ بازمی‌گرداند.

وضعیت خروج ایجاد شده توسط خود su:

1
خطای عمومی پیش از اجرای دستور درخواستی
126
دستور درخواستی قابل اجرا نبود
127
دستور درخواستی پیدا نشد

/etc/pam.d/su
فایل پیکربندی پیش‌فرض PAM
/etc/pam.d/su-l
فایل پیکربندی PAM در صورت مشخص شدن --login
/etc/default/su
فایل پیکربندی logindef مخصوص دستور
/etc/login.defs
فایل پیکربندی logindef سراسری

به دلایل امنیتی، su همیشه تلاش‌های ناموفق برای ورود را در فایل btmp ثبت می‌کند، اما اصلاً در فایل lastlog نمی‌نویسد. از این راهکار می‌توان برای کنترل رفتار su از طریق پیکربندی PAM استفاده کرد. اگر می‌خواهید از ماژول pam_lastlog(8) برای چاپ پیام هشدار در مورد تلاش‌های ناموفق برای ورود استفاده کنید، باید pam_lastlog(8) پیکربندی شود تا فایل lastlog را نیز به‌روزرسانی کند؛ به عنوان مثال توسط:

session required pam_lastlog.so nowtmp

این دستور su از su در coreutils گرفته شده است که بر اساس پیاده‌سازی David MacKenzie بود. نسخه util-linux توسط Karel Zak بازنویسی و بازسازی شده است.

نوشته شده توسط Karel Zak و David MacKenzie.

برای گزارش باگ‌ها از سامانه پیگیری مشکلات در آدرس زیر استفاده کنید:
https://github.com/util-linux/util-linux/issues

حق نشر © 2014 Karel Zak <kzak@redhat.com>
مجوز GPLv2+: مجوز عمومی همگانی گنو نسخه ۲ یا بالاتر. این نرم‌افزار آزاد است: شما می‌توانید آن را تغییر داده و دوباره توزیع کنید. هیچ ضمانتی وجود ندارد، تا حدی که قانون اجازه می‌دهد.

setpriv(1), login.defs(5), shells(5), pam(8), runuser(1)

2022-05-11 util-linux 2.38.1