RUN0(1) run0 RUN0(1)

run0 - اجرای امن دستور با دسترسی کاربر دیگر (جایگزین مدرن sudo)

run0 [OPTIONS...] [COMMAND...]

دستور run0 می‌تواند برای دستیابی موقت و تعاملی به دسترسی‌های ارتقایافته یا متفاوت به کار رود. این ابزار هدفی مشابه با sudo(8) را دنبال می‌کند، اما در چند زمینه کلیدی عملکرد متفاوتی دارد:

•هیچ‌گونه اعتبارنامه یا بافت امنیتی و اجرایی از فراخواننده به دستورات فراخوانی‌شده به ارث نمی‌رسد، زیرا این دستورات در قالب یک سرویس تازه و ایزوله‌شده که توسط مدیر سرویس منشعب شده است اجرا می‌شوند.
•احراز هویت از طریق polkit[1] صورت می‌پذیرد، بنابراین اعلان احراز هویت (در صورت امکان) از ترمینال ایزوله می‌گردد.
•یک شبه‌ترمینال (pseudo-tty) مستقل برای دستور فراخوانی‌شده اختصاص می‌یابد، که چرخه حیات آن را تفکیک کرده و برای امنیت بیشتر آن را جداسازی می‌کند.
•هیچ سازوکار بیت دسترسی فایل SetUID/SetGID در پیاده‌سازی این ابزار به کار نرفته است.

در مجموع، این موارد باید جایگزینی امن‌تر و پایدارتر برای سازوکار sudo فراهم سازند، به‌ویژه در محیط‌های سیستم‌عامل که پشتیبانی از SetUID/SetGID در دسترس نیست (برای نمونه با تنظیم متغیر NoNewPrivileges= در systemd-system.conf(5)).

هر نشستی که از طریق run0 فراخوانی شود، از طریق پشته PAM با عنوان "systemd-run0" اجرا خواهد شد.

توجه داشته باشید که run0 به عنوان یک فراخوانی چندمنظوره (multi-call) جایگزین برای systemd-run(1) پیاده‌سازی شده است. بدین معنی که run0 یک پیوند نمادین (symbolic link) به فایل اجرایی systemd-run است؛ اگر از طریق این پیوند نمادین فراخوانی شود رفتاری مطابق با run0 خواهد داشت، و در غیر این صورت مانند systemd-run عمل می‌کند.

گزینه‌های زیر پشتیبانی می‌شوند:

--unit=

استفاده از این نام واحد به‌جای نامی که به طور خودکار تولید می‌شود.

اضافه‌شده در نگارش ۲۵۶.

--property=

تنظیم یک ویژگی برای واحد سرویسی که ایجاد می‌شود. این گزینه مقداری را در همان قالب دستور set-property در systemctl(1) می‌پذیرد.

اضافه‌شده در نگارش ۲۵۶.

--description=

ارائه توضیحات برای واحد سرویسی که فراخوانی می‌شود. در صورت تعیین نشدن، خود دستور به عنوان توضیحات به کار خواهد رفت. بخش Description= در systemd.unit(5) را ببینید.

اضافه‌شده در نگارش ۲۵۶.

--slice=

قرار دادن واحد .service جدید به عنوان بخشی از برش (slice) مشخص‌شده، به‌جای user.slice.

اضافه‌شده در نگارش ۲۵۶.

--slice-inherit

قرار دادن واحد .service جدید در همان برشی (slice) که خود run0 در آن فراخوانی شده است. این گزینه می‌تواند با --slice= ترکیب شود، که در این حالت برش تعیین‌شده از طریق --slice= درون برشی قرار می‌گیرد که دستور run0 در آن فراخوانی شده است.

مثال: فرض کنید run0 در برش foo.slice فراخوانی شده و آرگومان --slice= برابر با bar باشد. در این صورت واحد زیرمجموعه foo-bar.slice قرار خواهد گرفت.

اضافه‌شده در نگارش ۲۵۶.

--user=, -u, --group=, -g

تغییر وضعیت به کاربر/گروه مشخص‌شده. در صورت تعیین نشدن، پیش‌فرض "root" خواهد بود، مگر آنکه از --area= یا --empower استفاده شود (به پایین مراجعه کنید)، که در این صورت پیش‌فرض کاربر فراخواننده خواهد بود.

اضافه‌شده در نگارش ۲۵۶.

--nice=

اجرای نشست فراخوانی‌شده با سطح nice مشخص‌شده.

اضافه‌شده در نگارش ۲۵۶.

--chdir=, -D

اجرای نشست فراخوانی‌شده با دایرکتوری کاری مشخص‌شده. در صورت تعیین نشدن، در صورت جابجایی به کاربر ریشه (root)، پیش‌فرض دایرکتوری کاری فعلی کلاینت خواهد بود و در غیر این صورت پوشه خانگی کاربر هدف خواهد بود.

اضافه‌شده در نگارش ۲۵۶.

--via-shell

فراخوانی شل ورود (login shell) کاربر هدف و اجرای دستور مشخص‌شده (در صورت وجود) از طریق آن.

اضافه‌شده در نگارش ۲۵۸.

-i

میان‌بری برای --via-shell --chdir='~'.

اضافه‌شده در نگارش ۲۵۸.

--setenv=NAME[=VALUE]

اجرای نشست فراخوانی‌شده با مقداردهی متغیر محیطی مشخص‌شده. این پارامتر می‌تواند بیش از یک بار برای تعیین چندین متغیر به کار رود. هنگامی که "=" و VALUE حذف شوند، مقدار متغیر هم‌نام در محیط فراخواننده استفاده خواهد شد.

اضافه‌شده در نگارش ۲۵۶.

--background=COLOR

تغییر رنگ پس‌زمینه ترمینال به رنگ ANSI مشخص‌شده تا زمانی که نشست ادامه دارد. در صورت تعیین نشدن، پس‌زمینه هنگام کار به عنوان کاربر ریشه (root) به رنگ متمایل به قرمز، و هنگام کار تحت UID دیگر به رنگ متمایل به زرد تغییر می‌یابد تا تغییری در دسترسی‌ها را یادآوری کند. رنگ مشخص‌شده باید یک رنگ پس‌زمینه ANSI X3.64 SGR باشد، یعنی رشته‌هایی نظیر "40", "41", ..., "47", "48;2;...", "48;5;...". برای جزئیات بیشتر به ANSI Escape Code (Wikipedia)[2] مراجعه کنید. برای غیرفعال‌سازی، این گزینه را روی یک رشته خالی تنظیم نمایید.

مثال: "--background=44" برای پس‌زمینه آبی.

اضافه‌شده در نگارش ۲۵۶.

--pty, --pty-late, --pipe

درخواست تخصیص یک شبه‌TTY برای نشست run0 (در صورت استفاده از --pty یا --pty-late)، یا درخواست انتقال مستقیم توصیف‌کننده‌های فایل STDIO فراخواننده (در صورت استفاده از --pipe). گزینه --pty-late بسیار شبیه به --pty است، اما پردازش TTY را تنها پس از تکمیل راه‌اندازی واحد آغاز می‌کند و ورودی را تا آن زمان برای رمزهای عبور یا عامل‌های polkit باقی می‌گذارد. اگر هیچ‌یک از این سوییچ‌ها تعیین نشود، یا اگر هم --pipe و هم یکی از گزینه‌های --pty/--pty-late تعیین شوند، حالت به طور خودکار انتخاب خواهد شد: اگر ورودی استاندارد، خروجی استاندارد و خطای استاندارد همگی به یک TTY متصل باشند، یک شبه‌TTY تخصیص می‌یابد (در حالت --pty-late مگر آنکه --no-ask-password تعیین شده باشد که در آن صورت --pty انتخاب می‌شود)، در غیر این صورت توصیف‌کننده‌های فایل مربوطه به صورت مستقیم منتقل می‌شوند.

گزینه‌های --pty و --pipe در نگارش ۲۵۷ اضافه شدند.

گزینه --pty-late در نگارش ۲۵۸ اضافه شد.

--shell-prompt-prefix=STRING

تنظیم یک رشته به عنوان پیشوند اعلان (پرامپت) شل. این گزینه در نهایت متغیر محیطی $SHELL_PROMPT_PREFIX را برای برنامه فراخوانی‌شده کنترل می‌کند، که معمولاً به اعلان شل وارد می‌شود. به طور پیش‌فرض – در صورت پشتیبانی از ایموجی‌ها –، یک ایموجی ابرقهرمان نمایش داده می‌شود (🦸). این مقدار پیش‌فرض را همچنین می‌توان با ارسال متغیر محیطی $SYSTEMD_RUN_SHELL_PROMPT_PREFIX به run0 تغییر داد (یا غیرفعال کرد)؛ به پایین مراجعه کنید. برای غیرفعال کردن پیشوند اعلان شل، آن را روی یک رشته خالی تنظیم کنید.

اضافه‌شده در نگارش ۲۵۷.

--lightweight=BOOLEAN

کنترل می‌کند که آیا مدیر سرویس مختص کاربر (per-user service manager) برای کاربر هدف فعال شود یا خیر. به طور پیش‌فرض (تنظیم‌نشده یا تنظیم روی auto)، اگر کاربر هدف "root" یا یک کاربر سیستمی باشد، مدیر سرویس کاربر در اثر فراخوانی run0 فعال نمی‌شود؛ در غیر این صورت فعال خواهد شد.

این گزینه در نهایت متغیر محیطی $XDG_SESSION_CLASS را که pam_systemd(8) از آن پیروی می‌کند، کنترل می‌نماید.

اضافه‌شده در نگارش ۲۵۸.

--area=AREA

کنترل "ناحیه" (area) حساب کاربری هدف جهت ورود. نواحی در واقع دایرکتوری‌های خانگی ثانویه درون دایرکتوری خانگی اصلی کاربر هدف هستند؛ به عنوان مثال ورود به ناحیه "foobar" از یک حساب به این معنی است که در هنگام ورود، مقدار $HOME برابر با ~/Areas/foobar تنظیم می‌شود.

در صورت استفاده از این گزینه، کاربر پیش‌فرض برای انتقال از ریشه (root) به خود کاربر فراخواننده تغییر می‌یابد (اما گزینه --user= اولویت دارد؛ به بالا مراجعه کنید). یا به عبارت دیگر، تعیین ناحیه بدون مشخص کردن کاربر، سازوکاری برای ایجاد یک نشست جدید از کاربر فراخواننده صرفاً با یک ناحیه متفاوت است.

این گزینه در نهایت متغیر محیطی $XDG_AREA را که pam_systemd(8) از آن پیروی می‌کند، کنترل می‌نماید.

برای جزئیات بیشتر درباره مفهوم ناحیه (area)، به pam_systemd_home(8) مراجعه فرمایید.

اضافه‌شده در نگارش ۲۵۸.

--empower

در صورت تعیین، run0 دسترسی‌های کاربر انتخاب‌شده (با استفاده از --user=) یا کاربر فعلی را (اگر کاربری صراحتاً انتخاب نشده باشد) ارتقا می‌دهد. در حال حاضر این به معنای اعطای تمام قابلیت‌های لینوکس (capabilities) به فرآیند فراخوانی‌شده و افزودن گروه "empower" به عنوان یک گروه تکمیلی است (که تمام کنش‌های polkit به طور پیش‌فرض برای آن مجاز است)، اما ممکن است در آینده دسترسی‌های دیگری نیز هنگام استفاده از این گزینه اعطا شود.

توجه داشته باشید که سایر فرآیندهای (غیرممتاز) کاربر انتخاب‌شده نسبت به فرآیند فراخوانی‌شده دارای دسترسی کنترل خواهند بود. در محیط‌هایی که ممکن است فرآیندهای مخربی تحت عنوان کاربر انتخاب‌شده در حال اجرا باشند، توصیه می‌شود از این گزینه استفاده نکنید.

اضافه‌شده در نگارش ۲۵۹.

--same-root-dir

اجرای نشست run0 در همان دایرکتوری ریشه‌ای (root directory) که دستور run0 در آن اجرا شده است.

اضافه‌شده در نگارش ۲۵۹.

--machine=

اجرای عملیات در یک کانتینر محلی. نام کانتینر را جهت اتصال مشخص کنید.

اضافه‌شده در نگارش ۲۵۶.

--no-ask-password

عدم درخواست احراز هویت از کاربر برای عملیات دارای دسترسی ویژه.

-h, --help

چاپ متن راهنمای کوتاه و خروج.

--version

چاپ رشته نگارش کوتاه و خروج.

تمامی آرگومان‌های خط فرمان پس از نخستین آرگومان غیرگزینه‌ای، بخشی از خط فرمان فرآیند راه‌اندازی‌شده خواهند شد. اگر هیچ خط فرمانی مشخص نشود، یک شل تعاملی فراخوانی می‌گردد. شلی که فراخوانی می‌شود را می‌توان از طریق گزینه --via-shell - که در صورت تعیین، شل کاربر هدف استفاده می‌شود - یا --setenv=SHELL=... کنترل کرد. به طور پیش‌فرض، در صورت اجرای محلی، شل کاربر مبدأ اجرا می‌شود، یا در صورت استفاده از --machine= مسیر /bin/sh اجرا خواهد شد.

توجه داشته باشید که بر خلاف sudo، ابزار run0 همیشه شل‌ها را با ویژگی‌های معنایی شل ورود (login shell) اجرا می‌کند، بدون توجه به اینکه گزینه -i تعیین شده باشد یا خیر.

در صورت موفقیت، مقدار 0 برگردانده می‌شود. اگر run0 در آغاز نشست با شکست روبرو شود یا دستور تعیین‌شده ناموفق باشد، یک مقدار بازگشتی غیرصفر برگردانده خواهد شد.

همانند systemd-run، این نشست محیط سیستم را از مدیر سرویس به ارث می‌برد. علاوه بر این، متغیرهای محیطی زیر تنظیم خواهند شد:

$TERM

از $TERM کاربر فراخواننده کپی می‌شود. می‌توان با --setenv= آن را بازنویسی کرد.

اضافه‌شده در نگارش ۲۵۶.

$SUDO_USER

روی نام کاربری کاربر مبدأ تنظیم می‌شود.

اضافه‌شده در نگارش ۲۵۶.

$SUDO_UID

روی شناسه عددی یونیکس (UID) کاربر مبدأ تنظیم می‌شود.

اضافه‌شده در نگارش ۲۵۶.

$SUDO_GID

روی شناسه عددی گروه اصلی یونیکس (GID) نشست مبدأ تنظیم می‌شود.

اضافه‌شده در نگارش ۲۵۶.

$SHELL_PROMPT_PREFIX

به طور پیش‌فرض روی ایموجی ابرقهرمان (در صورت پشتیبانی) تنظیم می‌شود، اما می‌تواند با متغیر محیطی $SYSTEMD_RUN_SHELL_PROMPT_PREFIX (به پایین مراجعه کنید) یا سوییچ --shell-prompt-prefix= (به بالا مراجعه کنید) بازنویسی شود.

اضافه‌شده در نگارش ۲۵۷.

متغیرهای زیر می‌توانند به run0 ارسال شوند:

$SYSTEMD_RUN_SHELL_PROMPT_PREFIX

در صورت تنظیم، پیشوند پیش‌فرض اعلان شل را که run0 برای شل فراخوانی‌شده تنظیم می‌کند (ایموجی ابرقهرمان) بازنویسی می‌نماید. برای غیرفعال کردن پیشوند اعلان شل، آن را روی یک رشته خالی تنظیم کنید.

اضافه‌شده در نگارش ۲۵۷.

systemd(1), systemd-run(1), sudo(8), machinectl(1), pam_systemd(8)

1.
polkit
2.
ANSI Escape Code (Wikipedia)
systemd 261.2