Linux (как и многие другие варианты Unix) поддерживает передачу только одного аргумента интерпретатору скрипта. (Интерпретатором является программа в строке shebang.) Сценарий, начинающийся с #!/usr/bin/sudo -u bob -- /bin/bash
, выполняется вызовом /usr/bin/sudo
с аргументами -u bob -- /bin/bash
и /home/alice/script.sh
.
Одно из решений - использовать скрипт-обертку: сделать /home/alice/script.sh
contain
#!/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
вместо того, чтобы запускать сценарий напрямую. Вы можете предоставить псевдонимы оболочки, .desktop
файлы и т.д.
Вот как это можно сделать:
cat query.bin | socat -x - UDP:8.8.8.8:53 > result.bin