Я записал сценарий, который берет как аргумент, строка, которая является конкатенацией имени пользователя и проекта. Сценарий, как предполагается, переключается (su) на имя пользователя, CD к определенному каталогу, основанному на строке проекта.
Я в основном хочу сделать:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Проблема состоит в том, что, после того как я делаю su..., он просто ожидает там. Который имеет смысл, так как поток выполнения передал переключению на пользователя. После того как я выхожу, затем остальная часть вещей выполняется, но она не работает, как желаемый.
Я предварительно ожидал su к команде svn, но команда перестала работать (т.е. это не обновило svn в желаемом каталоге).
Как я пишу сценарий, который позволяет пользователю переключать пользователя и вызывать svn (среди прочего)?
Хитрость в том, чтобы использовать команду "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
Вы должны выполнять все команды различных пользователей как свой собственный скрипт. Если это одна или несколько команд, то должен работать встроенный скрипт. Если это много команд, то, вероятно, лучше переместить их в их собственный файл.
su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME"
В скрипте оболочки невозможно изменить пользователя. Обходные пути с использованием 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');
Используйте 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
Вас могут попросить ввести пароль этого пользователя, но только один раз.