Если действия, которые необходимо выполнять от имени root, можно разделить на отдельные процессы/скрипты, то вы можете запускать эти процессы как root с setuid. Это очень удобный инструмент, который, на мой взгляд, используется слишком редко.
Что такое setuid-процессы? Посмотрите, например, на пароль
команда. Его может запустить любой пользователь, но его нужно запускать от имени пользователя root, так как ему необходимо изменить пароль, хранящийся в файле, к которому может получить доступ только root (/и т.д./тень
).
Как это делается? Посмотрите разрешения на /USR/бен/пароль
бинарный:
-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd
«s» вместо «x» в поле владельца означает, что этот двоичный файл будет запускаться с правами его владельца — root.
Таким образом каждый бинарный можно запустить от имени пользователя root (или любого другого пользователя), независимо от того, кто его вызывает.
Однако на сценарии бит setuid игнорируется из соображений безопасности. Итак, чтобы запустить сценарий в качестве root вам нужно использовать бинарная оболочка который вызовет скрипт изнутри. Вы можете использовать следующую простую программу C для создания такой оболочки:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
основной ()
{
инт рс;
сетуид(0);
rc=WEXITSTATUS(system("/path/to/your/script" ));
выход(рс);
}
Скомпилируйте программу и сделайте исполняемый файл setuid корневым (при условии, что исполняемый файл называется обертка
, делать sudo chown root: корневая оболочка
с последующим обертка sudo chmod o+s
).
КСТАТИ. Сценарий, который запускается изнутри оболочки, не обязательно должен иметь setuid; только обертка должна.
Редактировать: из вашего объяснения в комментариях видно, что вы хотите запустить определенный rm -rf /некоторые/путь
команду от имени пользователя root и заботятся о том, чтобы случайно не удалить что-либо еще. В этом случае я предлагаю просто заменить /путь/к/вашему/сценарию
часть в программе-оболочке выше этой самой командой rm -rf /некоторые/путь
, и просто запустите обертка
двоичный файл из вашего скрипта в том месте, где вы бы запускали rm -rf /некоторые/путь
команда. Это кажется самым безопасным способом.