Скрипты запускаются от имени пользователя, который их запускает;владелец файла и / или каталога, в котором он находится, не имеет значения (за исключением того, что пользователю необходимо разрешение на чтение и выполнение для файла и каталога).У двоичных исполняемых файлов может быть установлен бит setuid, чтобы они всегда выполнялись как владелец файла.Старые unixes допускали это и для сценариев, но это приводило к дыре в безопасности, поэтому setuid игнорируется в сценариях в современных unixes / Linuxes.
Если вам нужно разрешить обычным пользователям запускать сценарий от имени пользователя root, есть парадругих способов сделать это.Одним из них является добавление сценария в файл / etc / sudoers, чтобы пользователи могли использовать sudo
для запуска его от имени пользователя root.ВНИМАНИЕ: если вы испортили свой файл / etc / sudoers, может быть сложно восстановить доступ, чтобы очистить его и вернуться в нормальное состояние.Сначала сделайте резервную копию, не редактируйте ее ни с чем, кроме visudo
, и я рекомендую открыть корневую оболочку, поэтому, если что-то пойдет не так, у вас будет доступ с правами root, вам нужно исправить это без необходимости продвигать по sudo
,Строка, которую вам нужно добавить, будет выглядеть примерно так:
%everyone ALL=NOPASSWD: /path/to/script
Если вы хотите сделать это автоматически, чтобы пользователям не приходилось явно использовать sudo
для запуска сценария, выможно запустить скрипт следующим образом:
#!/bin/bash
if [[ $EUID -ne 0 ]];
then
exec sudo "$BASH_SOURCE" "$@"
fi
РЕДАКТИРОВАТЬ: мне пришла в голову более простая версия;вместо того, чтобы заново запускать сценарий под sudo
, просто замените символическую ссылку на скрипт-заглушку, как этот:
#!/bin/bash
exec sudo /path/to/real/script "$@"
Обратите внимание, что с этой опцией запись / etc / sudoers должна ссылаться нареальный путь сценария, а не символическая ссылка.Также, если скрипт не принимает аргументы, вы можете оставить "$@"
выключенным.Или используйте его, это не принесет никакого вреда.
Если возиться с / etc / sudoers звучит слишком страшно, есть еще один вариант: вы можете «скомпилировать» скрипт с помощью shc
(который на самом деле просто создает двоичную исполняемую оболочку вокруг него) и делает этот setuid root (chmod 4755 /path/to/compiled-script; chown root /path/to/compiled-script
).Поскольку он находится в двоичной оболочке, setuid будет работать.