Есть ли способ заставить часть скрипта работать от имени другого пользователя (не root)? Если это помогает, часть, которая будет запущена от имени другого пользователя, появляется в конце скрипта
Редактировать :
ОС -> Ubuntu 9.04
Используйте команду sudo в скрипте.
В виде:
sudo -u username command
команда sudo запускает команду как имя пользователя.
Если скрипт запускается с правами root, я не думаю, что он запросит пароль. Иначе, в этой статье обсуждается, как использовать sudo с паролем в одной командной строке?, а в этой статье обсуждается, как использовать sudo без пароля?
Этот ответ хорош, но совет по поводу серверной ошибки немного опасен - он позволяет любому запускать что-либо от имени пользователя 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 много подробностей
# Я = нравится:
#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
Для сонаркуба:
sudo -u sonar /usr/bin/sonar start
где sonar
- имя пользователя, использованное для запуска команды /usr/bin/sonar start
не уверен в этом, но если вы хотите, чтобы ТОЛЬКО конец этого скрипта запускался от имени другого пользователя, вы можете добавить 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