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