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

92352
Manish Mathai

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

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

29
возможный дубликат [Как переключить / изменить идентификатор пользователя в скрипте bash для выполнения команд в том же скрипте?] (http://superuser.com/questions/468161/howto-switch-chage-user-id-witin-a- баш-скрипт к выполняют-команд-в-же) Dan Dascalescu 9 лет назад 1

6 ответов на вопрос

33
pcapademic

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

В виде:

sudo -u username command 

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

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

Это приятно и легко, но есть ли способ сделать это для группы команд вместо одной за раз? Andrew 10 лет назад 2
написать скрипт bash, сделать его исполняемым `chmod + x script.sh`, а затем просто` sudo -u username script.sh` NiCU 9 лет назад 0
@ Андрей, мне самому было интересно, и у меня сработало следующее: sudo -u ic sh -c 'cmd1 && cmd2' Karussell 6 лет назад 0
Также включите опцию `i`, если вы хотите получить пользовательскую среду neoDev 6 лет назад 0
6
DaveParillo

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

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

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

#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 
Не могли бы вы добавить пояснительный текст? Kazark 11 лет назад 7
4
burtsevyg

For sonarqube:

sudo -u sonar /usr/bin/sonar start

where sonar - name of user witch run command /usr/bin/sonar start

2
dag729

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

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

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

С уважением

Я думаю, что это наиболее подходящий ответ, имея все другие ответы, предполагающие sudo, который часто не устанавливается по умолчанию на некоторых минимальных установках Linux. Tim 6 лет назад 1
1
dparalen

This way, end of a script will be executed by different user (root). Please note the $[LINENO+2] and exit $? calls. These are required to make the end of the script to execute just once and to preserve the exit code of the sudo call.

#!/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 

Похожие вопросы