31

Есть ли способ заставить часть скрипта работать от имени другого пользователя (не root)? Если это помогает, часть, которая будет запущена от имени другого пользователя, появляется в конце скрипта

Редактировать :
ОС -> Ubuntu 9.04

6 ответов6

35

Используйте команду sudo в скрипте.

В виде:

sudo -u username command

команда sudo запускает команду как имя пользователя.

Если скрипт запускается с правами root, я не думаю, что он запросит пароль. Иначе, в этой статье обсуждается, как использовать sudo с паролем в одной командной строке?, а в этой статье обсуждается, как использовать sudo без пароля?

6

Этот ответ хорош, но совет по поводу серверной ошибки немного опасен - он позволяет любому запускать что-либо от имени пользователя 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 много подробностей

5

# Я = нравится:

#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
4

Для сонаркуба:

sudo -u sonar /usr/bin/sonar start

где sonar - имя пользователя, использованное для запуска команды /usr/bin/sonar start

2

не уверен в этом, но если вы хотите, чтобы ТОЛЬКО конец этого скрипта запускался от имени другого пользователя, вы можете добавить su someuser до конца скрипта.

Я что-то пропустил?

Надеюсь, это поможет,

С уважением

1

Таким образом, конец скрипта будет выполняться другим пользователем (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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .