Как я могу работать от имени другого пользователя?


20

Это код bash, который должен быть запущен. Итак, сначала он заменяет пользователя на openproject, а затем запускает весь код:

su openproject -c "bash -l" 
cd ~/openproject
git checkout Gemfile.lock
git pull

bundle install
RAILS_ENV="production" bundle exec rake db:migrate
RAILS_ENV="production" bundle exec rake db:seed
RAILS_ENV="production" bundle exec rake assets:precompile

Я попытался изменить приведенный выше сценарий на это:

su - openproject -c "cd ~openproject/openproject"

su - openproject -c "git checkout stable"

su - openproject -c "git checkout Gemfile.lock"
su - openproject -c "git pull"

su - openproject -c "bundle install"

su - openproject -c "RAILS_ENV="production" bundle exec rake db:migrate"
su - openproject -c "RAILS_ENV="production" bundle exec rake db:seed"
su - openproject -c "RAILS_ENV="production" bundle exec rake assets:precompile"

но это не работает должным образом и на каждом этапе запрашивает пароль. Как улучшить переведенный скрипт, чтобы он работал?

ОБНОВЛЕНИЕ 1:

После получения предположений об этом я перехожу к следующему коду:

cd ~openproject/openproject

sudo -u openproject git checkout stable

sudo -u openproject git checkout Gemfile.lock
sudo -u openproject git pull

# the output is good thill here
sudo -u openproject bundle install

sudo -u openproject RAILS_ENV="production" bundle exec rake db:migrate
sudo -u openproject RAILS_ENV="production" bundle exec rake db:seed
sudo -u openproject RAILS_ENV="production" bundle exec rake assets:precompile

Вывод в порядке до строки, которая так утверждает в коде. Оттуда я получаю 4 ошибки

Команда sudo: bundle: не найдена

ОБНОВЛЕНИЕ 2:

Попробовав предложение Дмитрия Васильянова, я обнаружил, что, если я вставлю -i, он будет симулироваться как логин пользователя. Однако это не последний способ сделать это.

Если я запускаюсь echo $PATHпосле входа в систему как openproject, вывод/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Если я бегу echo $PATHпосле su openproject -c "bash -l"выхода/home/openproject/.rvm/gems/ruby-2.1.0/bin:/home/openproject/.rvm/gems/ruby-2.1.0@global/bin:/home/openproject/.rvm/rubies/ruby-2.1.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin


Вы хотите sudo, нет su.
Дауд

Вы также не можете (многозначительно) sudo cd, поскольку это встроенная оболочка.
MadHatter поддерживает Монику

Но sudo не заменяет root? Я являюсь пользователем root и хочу запустить скрипт как пользователь openproject, с точными эффектами, как если бы я вошел в систему как пользователь openproject и начал со второй команды (cd ~ / openproject)

1
Нет, sudoиспользуется для запуска от имени другого пользователя. По rootумолчанию, если ничего не указано, вы можете прекрасно выполнить sudo -u openproject bundle install.
Дауд

Я думаю , вы получаете сообщение об bundle: command not foundошибке , потому что вы установили PATHили GEM_PATHв вашем .bash_profileили .bashrcони не выполняются без входа / неинтерактивный оболочек, поэтому вам нужно пройти , -iчтобы sudoдля имитации входа в систему , как это:sudo -iu openproject bundle install
Дмитрий Vasilyanov

Ответы:


19

Почему бы вам не создать сценарий оболочки и сделать

su - openproject -c "your_shell_script"

Будьте в курсе - до openproject. Это установит переменные окружения openproject вместо ваших переменных окружения пользователя.


Мне нужно было добавить sudoв начале, иначе он попросил у меня пароль.
IanVaughan

sudoтакже будет запрашивать пароль в первый раз , когда вы запускаете его, следовательно , советование класть свои вещи в скрипт и работает , что либо suилиsudo
YoMismo

8

Если вы используете Bash, вы можете сделать здесь-док

$ su - user -s/bin/bash -c <<EOF
export X=1
echo $X
EOF

Таким образом, вы можете выполнять много команд и сохранять состояние внутри скрипта.

То же самое с sudo

sudo -u user bash <<EOF
your
script
here
EOF

Ни то, ни другое не работает для меня. Можете ли вы действительно передавать команды от стандартного ввода к su / sudo?
Sparhawk

1
@ Sparhawk, спасибо за проверку. Во втором примере я забыл добавить «bash» (уже обновленный пример) - работает. Первый пример не полностью работает, как вы упомянули, я печатал из долгосрочного кэша, поэтому мог ошибиться, но определенно у меня была su, работающая со stdin (я использовал java для запуска подпроцесса для этой задачи), я постараюсь проверить это больше, чтобы найти правильный путь.
спин

1
Мне нужно было создать команду, зависящую от различных переменных, и запустить ее от имени другого пользователя. Так что предложение от YoMismo не было вариантом в моем случае. Я боролся с этим в течение часа, и единственное, что я нахожу работающим, - это подход EOF (второй пример). Благодарность!
Джетт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.