Можно ли сделать так, чтобы скрипт всегда выполнялся от имени пользователя root?
Как заставить скрипт выполняться от имени пользователя root, независимо от того, кто его выполняет?
Я читал о setuid, но я не уверен, как это сделать.
Я использую Linux, Ubuntu 12.04 LTS.
3 ответа
Будьте очень осторожны: сценарии в сочетании с setuid опасны!
Во-первых, пожалуйста, посмотрите на этот вопрос / ответы, особенно на этот ответ и предупреждение безопасности.
Если вы все еще хотите выполнить свой скрипт с setuid
установить, тогда вы можете написать короткую программу на C в качестве оболочки и установить setuid
бит на скомпилированном двоичном файле.
Пример Wrapper:
int main(void) {
setuid(0);
clearenv();
system("/absolute/path/to/your/script.sh");
}
Другое решение с использованием sudo
(упомянуто здесь):
От имени пользователя root запретите запись (и, возможно, другое) в ваш скрипт:
chown root /absolute/path/to/your/script.sh chmod 700 /absolute/path/to/your/script.sh
Убедитесь, что никто, кроме root, не может заменить скрипт, например, изменив права доступа родительской папки:
chown root / absolute / path / to / your / CHMOD 755 / абсолютный / путь / к / ваш /
Изменить права доступа sudo в
/etc/sudoers
сvisudo
:ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
Более подробную информацию о настройках (например, ограничение доступа для определенных пользователей или групп) можно найти на странице руководства sudoers.
После этого все пользователи могут запускать скрипт от имени пользователя root без пароля:
sudo /absolute/path/to/your/script.sh
Это похоже на использование решения обертки / setuid выше.
Самый простой и безопасный способ - использовать биты SETUID в правах доступа к файлу. таким образом, права доступа к команде будут повышены до разрешений владельца файла.
чтобы не допустить сценария из редакции, не устанавливайте запись для всех битов.
Я не знаю, может ли это быть полезным, но, чтобы скрипт работал только как root, вы можете использовать этот shebang в первой строке скрипта:
#!/bin/su root
Я наткнулся на этот вопрос, когда искал такой фрагмент:
[ "$(id -u)" != 0 ] && exec sudo "$0"
Если добавить это в начало скрипта, перед ним будет стоять sudo, и он всегда будет запускаться от имени пользователя root, что позволит нам запускать наш скрипт как
./hello.sh
. Конечно, sudo все равно будет запрашивать пароль, но принятый ответ поможет этого избежать.