Назад | Перейти на главную страницу

BASH Scripting, su на www-data для одной команды

Я работаю над автоматизацией создания репозиториев Subversion и связанных веб-сайтов, как описано в это сообщение в блоге я написал. Я сталкиваюсь с проблемами прямо в той части, где я обращаюсь к пользователю www-data с просьбой выполнить следующую команду:

svnadmin create /svn/repository

В начале скрипта есть проверка, которая проверяет, запущен ли он как root или sudo, и все, что после этой команды, необходимо запускать как root. Есть ли хороший способ запустить эту команду как www-data, а затем вернуться к root, чтобы закончить?

С su, вероятно, запрашивается пароль, а www-data не имеет пароля. Рекомендую команду sudo:

 sudo -u www-data command

Условие состоит в том, что ваш пользователь должен быть root или настроен в файле sudoers

Просто используйте su - www-data -c 'svnadmin create /svn/repository' в вашем скрипте запускается root. Так что только эту команду выполняет пользователь www-data.


Обновление для будущих зрителей:

Если вы получите "This account is currently not available" ошибка, рассмотрите возможность использования:

su - www-data -s /bin/bash -c 'svnadmin create /svn/repository'

(Ценное упоминание @Petr о -s флаг для размещения www-data политика отсутствия входа пользователя)

2 Возможные подходы:


1) sudo команда:

В большинстве случаев у вас будет доступ к sudo команда, поэтому решение простое:

sudo -u target_user target_command


2) su команда (если sudo не установлен. Ex. alpine-linux images):

su - target_user -c 'target_command'

Если вы получите "Эта учетная запись в настоящее время недоступна" ошибка, у пользователя действует политика отсутствия входа в систему (доступа к оболочке). Если да, рассмотрите возможность использования:

su - target_user -s /bin/bash -c 'target_command'

(На основе ценного комментария @Petr о -s флаг для размещения www-data политика отсутствия входа пользователя)

Использовать su:

   su [options] [username]

   The options which apply to the su command are:

   -c, --command COMMAND
       Specify a command that will be invoked by the shell using its -c.