`sudo -u user` в строке shebang

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

Способ, которым я в настоящее время настроен, состоит в том, чтобы

alice ALL = (bob) NOPASSWD: /home/alice/script.sh 

в файле sudoers и

 alice@foo:~$ ls script.sh -rwxr-xr-x 1 root root ..... script.sh alice@foo:~$ lsattr script.sh ----i----------- script.sh alice@foo:~$ head -1 script.sh #!/bin/bash alice@foo:~$ sudo -u bob ./script.sh ok 

Есть ли способ, чтобы линия shebang была чем-то вроде

 #!/usr/bin/sudo -u bob -- /bin/bash 

так что Алиса могла просто бежать

 alice@foo:~$ ./script.sh ok 

?

Если я попробую это, я просто получу сообщение об ошибке

 sudo: unknown user: blog -- /bin/bash sudo: unable to initialize policy plugin 

Linux (как и многие другие варианты Unix) поддерживает только передачу одного аргумента интерпретатору скрипта. (Интерпретатор – это программа на линии shebang.) Сценарий, начинающийся с #!/usr/bin/sudo -u bob -- /bin/bash , выполняется путем вызова /usr/bin/sudo с аргументами -u bob -- /bin/bash и /home/alice/script.sh .

Одним из решений является использование сценария оболочки: make /home/alice/script.sh содержать

 #!/bin/sh exec sudo -u bob /home/alice/script.real 

и поместите код в /home/alice.script.real начиная с #!/bin/bash и сделайте правило sudo ссылкой на /home/alice.script.real .

Другое решение – заставить скрипт повторно выполнить сам. Вы должны быть осторожны, чтобы правильно определить желаемое состояние, иначе вы рискуете создать бесконечный цикл.

 #!/bin/bash if ((EUID != 123)); then exec sudo -u \#123 /home/alice/script.sh fi 

(где 123 – идентификатор пользователя bob )

Простое решение – sudo -u bob /home/alice/script.sh людей запускать sudo -u bob /home/alice/script.sh вместо запуска скрипта напрямую. Вы можете предоставить псевдонимы оболочки, файлы .desktop и т. Д.

Попробуйте использовать псевдоним:

 alias bobscript="sudo -u bob ./script.sh" 

и запустить:

 bobscript