Если требуемая команда находится за пределами блока (например, циклическая или условная), то вы можете разделить скрипт на три части: предыдущие команды выполняются как 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
( конечно, из запутанных данных); в противном случае он запрашивает пароль как обычно и выводит ответ пользователя.
Так что да, это можно делать то , что вы хотите, но может включать в себя достаточное количество работ, в зависимости от уровня безопасности , вам требуется.