Сценарий запуска вычислительного движка не может выполняться от имени пользователя без полномочий root

Чтобы свести мою проблему к простейшему случаю, я использую Compute Engine со следующим скриптом запуска:

#! /bin/bash
sudo useradd -m drupal
su drupal
cd /home/drupal
touch test.txt

После этой команды я могу подтвердить, что пользователь drupal существует, как и тестовый файл. Однако я ожидаю, что владельцем тестового файла будет "drupal" (отсюда и su). Однако, когда я использую это в качестве сценария запуска, я все еще могу подтвердить, что ROOT является владельцем файла:

ls -l результат

имея в виду мой

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

дает оба файла в корень, даже если у меня есть оба сценария. Отсюда следует, что все, что ВЫ делаете, принадлежит вам, вы не можете сделать что-то для кого-то другого.

Другие вопросы по тегам