Как я использую su для выполнения остальной части сценария удара как тот пользователь?

Я записал сценарий, который берет как аргумент, строка, которая является конкатенацией имени пользователя и проекта. Сценарий, как предполагается, переключается (su) на имя пользователя, CD к определенному каталогу, основанному на строке проекта.

Я в основном хочу сделать:

su $USERNAME;  
cd /home/$USERNAME/$PROJECT;  
svn update;  

Проблема состоит в том, что, после того как я делаю su..., он просто ожидает там. Который имеет смысл, так как поток выполнения передал переключению на пользователя. После того как я выхожу, затем остальная часть вещей выполняется, но она не работает, как желаемый.

Я предварительно ожидал su к команде svn, но команда перестала работать (т.е. это не обновило svn в желаемом каталоге).

Как я пишу сценарий, который позволяет пользователю переключать пользователя и вызывать svn (среди прочего)?

116
задан Mateusz Piotrowski 15 January 2018 в 19:24
поделиться

4 ответа

Хитрость в том, чтобы использовать команду "sudo" вместо "su"

Вам может понадобиться добавить это

username1 ALL=(username2) NOPASSWD: /path/to/svn

в ваш файл /etc/sudoers

и изменить ваш скрипт на:

sudo -u username2 -H sh -c "cd /home/$USERNAME/$PROJECT; svn update" 

Где имя пользователя2 - это пользователь, от имени которого вы хотите запустить команду SVN, а имя пользователя1 - это пользователь, запустивший скрипт.

Если вам нужно несколько пользователей для запуска этого сценария, используйте %groupname вместо имени пользователя1

.
83
ответ дан 24 November 2019 в 02:12
поделиться

Вы должны выполнять все команды различных пользователей как свой собственный скрипт. Если это одна или несколько команд, то должен работать встроенный скрипт. Если это много команд, то, вероятно, лучше переместить их в их собственный файл.

su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME" 
45
ответ дан 24 November 2019 в 02:12
поделиться

В скрипте оболочки невозможно изменить пользователя. Обходные пути с использованием sudo, описанные в других ответах, вероятно, лучший вариант.

Если вы достаточно злы, чтобы запускать perl-скрипты как root, вы можете сделать это с помощью $< $( $> $) переменных, которые содержат real/effective uid/gid, например:

#!/usr/bin/perl -w
$user = shift;
if (!$<) {
    $> = getpwnam $user;
    $) = getgrnam $user;
} else {
    die 'must be root to change uid';
}
system('whoami');
6
ответ дан 24 November 2019 в 02:12
поделиться

Используйте sudo вместо

EDIT: Как указал Дуглас, нельзя использовать cd в sudo, так как это не внешняя команда . Чтобы cd заработал, необходимо запустить команды в подоболочке.

sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"

sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update

Вас могут попросить ввести пароль этого пользователя, но только один раз.

7
ответ дан 24 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

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