Есть ли способ заставить часть скрипта работать от имени другого пользователя (не root)? Если это помогает, часть, которая будет запущена от имени другого пользователя, появляется в конце скрипта
Изменить:
ОС -> Ubuntu 9.04
Есть ли способ заставить часть скрипта работать от имени другого пользователя (не root)? Если это помогает, часть, которая будет запущена от имени другого пользователя, появляется в конце скрипта
Изменить:
ОС -> Ubuntu 9.04
Ответы:
Используйте команду sudo в скрипте.
В виде:
sudo -u username command
команда sudo запускает команду как имя пользователя .
Если скрипт запускается от имени пользователя root, я не думаю, что он запросит пароль. Иначе, в этой статье обсуждается, как использовать sudo с паролем в одной командной строке? , а в этой статье обсуждается, как использовать sudo без пароля?
chmod +x script.sh
а затем простоsudo -u username script.sh
i
Этот ответ хорош, но совет по поводу серверной ошибки немного опасен - он позволяет любому запускать что-либо от имени пользователя root! Поэтому я пишу здесь, потому что я не могу отформатировать комментарий.
Я бы порекомендовал использовать visudo, чтобы предоставить вам необходимые разрешения как можно точнее. Введите visudo
и добавьте строку, например:
username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2
Если вам нужно запустить эту же вещь на многих хостах, вы можете открыть ее с помощью:
username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2
Но я бы ** не * использовал либо:
username ALL=(ALL) NOPASSWD: ALL
или имя пользователя hostname = ALL
У man-страницы sudoer много подробностей
username
имя пользователя, которое должно быть в состоянии выполнить команду). Если исполняемый файл, который вы хотите запустить, исполняется только одним конкретным пользователем, это тоже нормально - просто передайте это имя пользователя в sudo -u username commandline
строке скрипта.
# Я = нравится:
#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"
echo 1: $USER
#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_
echo 3: $USER
# ./бег
1: root
2: nobody
3: root
не уверен в этом, но если вы хотите, чтобы ТОЛЬКО конец этого скрипта запускался от имени другого пользователя, вы можете добавить его su someuser
до конца скрипта.
Я что-то пропустил?
Надеюсь, это поможет,
С уважением
Таким образом, конец скрипта будет выполняться другим пользователем (root). Пожалуйста, обратите внимание $[LINENO+2]
и exit $?
звонки. Это необходимо для того, чтобы конец сценария выполнялся всего один раз и чтобы сохранить код завершения sudo
вызова.
#!/bin/bash
echo $USER
# pipe the rest of this script via a sudo call
tail -n +$[LINENO+2] $0 | exec sudo bash
exit $?
echo $USER
exit 1