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

runuser - اجرای یک دستور با هویت کاربر و گروه مشخص

runuser [options] -u user [[--] command [argument...]]

runuser [options] [-] [user [argument...]]

دستور runuser می‌تواند برای اجرای دستورها با شناسه کاربر و گروه جایگزین استفاده شود. اگر گزینه -u داده نشود، runuser به معناشناسی سازگار با su برگشت می‌کند و یک پوسته اجرا می‌شود. تفاوت بین دستورهای runuser و su در این است که runuser گذرواژه درخواست نمی‌کند (زیرا فقط می‌تواند توسط کاربر root اجرا شود) و از پیکربندی PAM متفاوتی استفاده می‌کند. دستور runuser نیازی ندارد با مجوزهای set-user-ID نصب شود.

اگر نشست PAM مورد نیاز نباشد، راهکار پیشنهادی استفاده از دستور setpriv(1) است.

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

برای سازگاری با گذشته، runuser به طور پیش‌فرض دایرکتوری جاری را تغییر نمی‌دهد و تنها متغیرهای محیطی HOME و SHELL (به علاوه USER و LOGNAME اگر کاربر هدف root نباشد) را تنظیم می‌کند. این نسخه از runuser برای مدیریت نشست از PAM استفاده می‌کند.

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

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

-c, --command=command

ارسال command به پوسته با گزینه -c. یک نشست جدید از طریق setsid(2) ایجاد می‌کند. برای حفظ همان نشست به --session-command مراجعه کنید.

-f, --fast

ارسال -f به پوسته، که بسته به نوع پوسته ممکن است مفید باشد یا نباشد.

-g, --group=group

گروه اصلی مورد استفاده. این گزینه فقط برای کاربر root مجاز است.

-G, --supp-group=group

مشخص کردن یک گروه تکمیلی. این گزینه فقط برای کاربر root در دسترس است. اگر گزینه --group مشخص نشده باشد، اولین گروه تکمیلی مشخص‌شده به عنوان گروه اصلی نیز استفاده می‌شود.

-, -l, --login

شروع پوسته به عنوان یک پوسته ورود (login shell) با محیطی مشابه یک ورود واقعی:
•پاکسازی تمام متغیرهای محیطی به جز TERM، COLORTERM، NO_COLOR و متغیرهای مشخص‌شده توسط --whitelist-environment
•مقداردهی اولیه متغیرهای محیطی HOME، SHELL، USER، LOGNAME و PATH
•تغییر مسیر به دایرکتوری خانگی کاربر هدف
•تنظیم argv[0] پوسته به '-' به منظور تبدیل پوسته به یک پوسته ورود

-m, -p, --preserve-environment

حفظ کل محیط، یعنی عدم تنظیم HOME، SHELL، USER یا LOGNAME. در صورت مشخص شدن گزینه --login، این گزینه نادیده گرفته می‌شود.

-P, --pty

ایجاد یک ترمینال کاذب (pseudo-terminal) برای نشست. ترمینال مستقل امنیت بهتری فراهم می‌کند زیرا کاربر ترمینال را با نشست اصلی به اشتراک نمی‌گذارد. لطفاً به توصیه امنیتی درباره آسیب‌پذیری TIOCSTI در ادامه توجه کنید.

کل نشست را می‌توان به پس‌زمینه نیز منتقل کرد (مانند runuser --pty -u user -- command &). اگر ترمینال کاذب فعال باشد، runuser به عنوان یک پروکسی بین نشست‌ها عمل می‌کند (همگام‌سازی stdin و stdout).

این قابلیت عمدتاً برای نشست‌های تعاملی طراحی شده است. اگر ورودی استاندارد یک ترمینال نباشد، بلکه به عنوان مثال یک پایپ (pipe) باشد (مانند echo "date" | runuser --pty -u user)، پرچم ECHO برای ترمینال کاذب غیرفعال می‌شود تا از خروجی نامرتب جلوگیری شود.

-s, --shell=shell

اجرای shell مشخص‌شده به جای پوسته پیش‌فرض. پوسته مورد اجرا به ترتیب بر اساس قوانین زیر انتخاب می‌شود:
•پوسته مشخص‌شده با --shell
•پوسته مشخص‌شده در متغیر محیطی SHELL در صورتی که گزینه --preserve-environment استفاده شده باشد
•پوسته فهرست‌شده در مدخل passwd کاربر هدف
•/bin/sh

اگر کاربر هدف دارای یک پوسته محدودشده باشد (یعنی در /etc/shells فهرست نشده باشد)، گزینه --shell و متغیر محیطی SHELL نادیده گرفته می‌شوند مگر اینکه کاربر فراخوان root باشد.

--session-command=command

مشابه -c، اما یک نشست جدید ایجاد نمی‌کند. (توصیه نمی‌شود.) لطفاً به توصیه امنیتی درباره آسیب‌پذیری TIOCSTI در ادامه توجه کنید.

-T, --no-pty

عدم ایجاد ترمینال کاذب، برعکس --pty و -P. لطفاً به توصیه امنیتی درباره آسیب‌پذیری TIOCSTI در ادامه توجه کنید.

-u, --user=user

اجرای command با شناسه کاربری (UID) و شناسه گروهی (GID) مؤثر نام کاربری user.

-w, --whitelist-environment=list

هنگام پاکسازی محیط برای --login، متغیرهای محیطی مشخص‌شده در list جداشده با ویرگول را بازنشانی نکنید. فهرست سفید برای متغیرهای محیطی HOME، SHELL، USER، LOGNAME و PATH نادیده گرفته می‌شود.

-h, --help

نمایش متن راهنما و خروج.

-V, --version

نمایش نسخه و خروج.

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

ENV_PATH (رشته)

متغیر محیطی PATH را برای یک کاربر معمولی تعریف می‌کند. مقدار پیش‌فرض /usr/local/bin:/bin:/usr/bin است.

ENV_ROOTPATH (رشته)، ENV_SUPATH (رشته)

متغیر محیطی PATH را برای root تعریف می‌کند. ENV_SUPATH اولویت دارد. مقدار پیش‌فرض /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin است.

ALWAYS_SET_PATH (بولی)

اگر روی yes تنظیم شود و --login و --preserve-environment مشخص نشده باشند، runuser متغیر PATH را مقداردهی اولیه می‌کند.

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

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

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

1

خطای عمومی پیش از اجرای دستور درخواستی

126

دستور درخواستی قابل اجرا نبود

127

دستور درخواستی پیدا نشد

/etc/pam.d/runuser

فایل پیکربندی پیش‌فرض PAM

/etc/pam.d/runuser-l

فایل پیکربندی PAM در صورت مشخص شدن --login

/etc/default/runuser

فایل پیکربندی logindef اختصاصی runuser

/etc/login.defs

فایل پیکربندی logindef سراسری

اگر runuser یک ترمینال را با نشست اصلی به اشتراک بگذارد، به طور بالقوه در برابر ارتقای دسترسی از طریق تزریق دستور ioctl مربوط به TIOCSTI/TIOCLINUX آسیب‌پذیر است. دو راهکار توکار برای جلوگیری از این مورد وجود دارد: یا می‌توانید از runuser با گزینه -c استفاده کنید که یک نشست جدید را از طریق setsid(2) بدون یک ترمینال کنترلی آغاز می‌کند. یا اگر مورد کاربردی شما به یک ترمینال کنترلی نیاز دارد (مثلاً یک نشست تعاملی)، می‌توانید با گزینه --pty یا -P به runuser دستور دهید که از یک ترمینال کاذب استفاده کند.

این دستور runuser از دستور su در coreutils که بر اساس پیاده‌سازی David MacKenzie بود، و دستور runuser فدورا توسط Dan Walsh برگرفته شده است.

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

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

دستور runuser بخشی از بسته util-linux است که می‌تواند از بایگانی هسته لینوکس https://www.kernel.org/pub/linux/utils/util-linux. دریافت شود.

2026-09-02 util-linux 2.42.3