Запустить часть скрипта bash от имени другого пользователя

33

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

Изменить:
ОС -> Ubuntu 9.04

Маниш Матхай
источник

Ответы:

42

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

В виде:

sudo -u username command

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

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

pcapademic
источник
5
Это приятно и легко, но есть ли способ сделать это для группы команд вместо одной за раз?
Андрей
написать скрипт bash, сделать его исполняемым, chmod +x script.shа затем простоsudo -u username script.sh
NiCU
@ Андрей , я задавался этим сам и следующие работал для меня: Судо -u IC ш -c «cmd1 && cmd2»
Karussell
Также i
включите
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 много подробностей

DaveParillo
источник
Будет ли это работать для команды, доступной только для конкретного пользователя?
Маниш Матхай
Вы можете указать, что только определенные пользователи могут запускать команду (в приведенных выше примерах замените usernameимя пользователя, которое должно быть в состоянии выполнить команду). Если исполняемый файл, который вы хотите запустить, исполняется только одним конкретным пользователем, это тоже нормально - просто передайте это имя пользователя в sudo -u username commandlineстроке скрипта.
Джеймс Полли
@Manish. Да. Файл sudoers говорит: «Разрешите этому имени пользователя на этом хосте запускать command1 без необходимости
ввода
6

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

#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
AX Labs
источник
10
Не могли бы вы добавить пояснительный текст?
Казарк,
4

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

sudo -u sonar /usr/bin/sonar start

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

burtsevyg
источник
2

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

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

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

С уважением

dag729
источник
1
Я думаю, что это наиболее подходящий ответ, имея все другие ответы, предполагающие sudo, который часто не устанавливается по умолчанию в некоторых минимальных установках Linux.
Тим
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
dparalen
источник