1

Так что как root (в /etc/rc.local) я хочу запустить скрипт без привилегий root, скажем, используя su

su - myuser -c myscript

но в myscript я хочу запустить команду с sudo без ввода пароля. Однако я не хочу, чтобы myuser запускал эту команду без пароля, в противном случае (например, я не хочу добавлять в sudoers и т.д.)

Это вообще возможно?

1 ответ1

1

Если требуемая команда находится за пределами блока (например, циклическая или условная), то вы можете разделить скрипт на три части: предыдущие команды выполняются как myuser , защищенная команда запускается с помощью sudo (которая не запрашивает, когда уже root) и остальные команды также запускаются как myuser: -

su - myuser -c myscript-preamble
sudo myscript-protected-command
su - myuser -c myscript-postamble

В более общем смысле, есть хитрость, которую вы можете использовать с sudo , используя сохраненные учетные данные:-

sudo -u myuser sudo -S true <<< password 2>/dev/null
su - myuser -c myscript
sudo -u myuser sudo -k

Есть ряд соображений - это первое, что приходит на ум:

  • Сценарий (или, по крайней мере, первая строка) должен выполняться в защищенном от чтения файле (-rwx------) или в защищенном от выполнения каталоге (drwx------), оба из которых принадлежат пользователю root .
  • Уловка требует, чтобы учетные данные sudo запоминались в течение определенного времени (обычное значение по умолчанию), и что sudo в myscript запускается в течение этого времени.
  • Если myuser запускает myscript а root одновременно запускает его, запомненные учетные данные будут использованы, если команда sudo будет достигнута до того, как root выполнит sudo -k .

Как видите, это не идеальное решение с точки зрения безопасности, но оно может быть работоспособным в вашей среде.

В противном случае вам нужно будет использовать sudo -A , как описано в этом отрывке из руководства sudo :

 -A, --askpass
             Normally, if sudo requires a password, it will read it from the user's
             terminal.  If the -A (askpass) option is specified, a (possibly graphical)
             helper program is executed to read the user's password and output the password
             to the standard output.  If the SUDO_ASKPASS environment variable is set, it
             specifies the path to the helper program.  Otherwise, if sudo.conf(5) contains
             a line specifying the askpass program, that value will be used.  For example:

                 # Path to askpass helper program
                 Path askpass /usr/X11R6/bin/ssh-askpass

             If no askpass program is available, sudo will exit with an error.

Чтобы реализовать это, вам нужно написать программу, которая проверяет, работает ли она от имени root: если это так, она выводит пароль для myuser ( конечно, из запутанных данных); в противном случае он запрашивает пароль как обычно и выводит ответ пользователя.

Так что да, это можно делать то , что вы хотите, но может включать в себя достаточное количество работ, в зависимости от уровня безопасности , вам требуется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .