При создании экземпляра ec2 я использую скрипт начальной загрузки. На экземпляре я устанавливаю и настраиваю веб-сервер nginx. Из соображений безопасности мне нужно создать нового пользователя (www-data).

Пользователь www-data создается с использованием:

sudo groupadd www-data
sudo adduser www-data -g www-data
sudo passwd -d www-data

Дополнительно я запускаю некоторые скрипты на этом компьютере. Для этого я использовал virtualenv. Я запускаю следующий поток:

su www-data
pip install --user virtualenv 
python -m virtualenv $VIRTUALENV_NAME
cd /path/to/bin
source activate
pip install `stuff`
deactivate

Моя проблема возникает после вышеуказанного потока, когда я хочу вернуться к ec2-пользователю. В терминале, набрав exit делает свою работу. Внутри скрипта начальной загрузки он выйдет из скрипта.

Я пытался с su ec2-user но он запрашивает пароль. У меня его нет.

Как вернуться к ec2-пользователю от другого пользователя? Или как обойти это

1 ответ1

1

Когда вы печатаете это

su www-data
whatever
something-else
exit

su запускает дополнительную оболочку как пользователь www-data . Затем вы вводите последовательные команды, они выполняются в этой оболочке, поэтому exit возвращает вас к старой оболочке.

Если эти команды находятся в скрипте, whatever , что не будет выполнено в дополнительной оболочке. Исходная оболочка будет ждать выхода su прежде чем перейти к whatever и дальше. Если вы запустите такой скрипт (файл как script.sh с соответствующим shebang) из терминала, вы попадете в интерактивную оболочку. Чтобы продолжить работу со сценарием, введите команду exit там.

Теперь внутри скрипта начальной загрузки нет прикрепленного TTY, su www-data не может запустить интерактивную оболочку и немедленно завершает работу. Остальная часть сценария выполняется (очевидно, не как пользователь www-data ); и если где-то есть exit , он выйдет из сценария.

Самый простой способ справиться с этим - вставить whatever то и something-else в отдельный вспомогательный скрипт, после чего вы можете вызвать его в своем основном скрипте.

su www-data -c "/path/to/the/helper/script"

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

Другой способ таков:

su www-data -c 'whatever; something-else'

или эквивалентно

su www-data -c '
whatever
something-else
'

Последний подход может быть проблематичным, если команды нуждаются в цитировании. С дополнительным скриптом такой проблемы нет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .