Сценарий запуска вычислительного движка не может выполняться от имени пользователя без полномочий root
Чтобы свести мою проблему к простейшему случаю, я использую Compute Engine со следующим скриптом запуска:
#! /bin/bash
sudo useradd -m drupal
su drupal
cd /home/drupal
touch test.txt
После этой команды я могу подтвердить, что пользователь drupal существует, как и тестовый файл. Однако я ожидаю, что владельцем тестового файла будет "drupal" (отсюда и su). Однако, когда я использую это в качестве сценария запуска, я все еще могу подтвердить, что ROOT является владельцем файла:
имея в виду мой
su drupal
не работал. sudo su drupal также не имеет никакого значения. Я использую Google Container OS, но то же самое происходит на образе Debian 8.
2 ответа
sudo su
не команда запускается внутри оболочки - она запускает новую оболочку.
Эта новая оболочка больше не запускает ваш сценарий, и старая оболочка, в которой выполняется сценарий, ожидает выхода новой, прежде чем продолжить.
sudo su
Команда запустит новую оболочку. Старая оболочка ожидает выхода старой и продолжает выполнение остальной части кода. Ваш скрипт выполняется в "старой" оболочке, что означает следующие команды:
cd /home/drupal
touch test.txt
все еще выполняются от имени пользователя root, и, следовательно, владельцем этих файлов также является пользователь root.
Вы можете изменить свой скрипт на это:
#! /bin/bash
sudo useradd -m drupal
sudo -u drupal bash -c 'cd ~/; touch text2.txt'
и это должно работать. -u
flag выполняет команду как указано пользователем, в этом случае drupal
Я написал некоторые вещи внизу - но похоже, что это должно работать: как запустить скрипт от имени другого пользователя без пароля
Другой вариант заключается в том, чтобы использовать ssh на вашем компьютере как другой пользователь, вы можете использовать sshpass для отправки пароля или получить свой собственный открытый ключ.
Когда я тестирую аналогичный скрипт:
su [my username]
touch test.txt
На самом деле он входит в систему как я, и не заканчивается, пока я не нажму Ctrl-D
Дальнейшее тестирование показывает, что единственный способ владеть файлом - это вызвать скрипт из оболочки, то есть:
su me
touch test.txt
./test2.sh
test2.sh: коснитесь test2.txt
дает оба файла в корень, даже если у меня есть оба сценария. Отсюда следует, что все, что ВЫ делаете, принадлежит вам, вы не можете сделать что-то для кого-то другого.