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

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

codiac
источник
Вы хотите 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 вместо ваших переменных окружения пользователя.

YoMismo
источник
Мне нужно было добавить 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
Spinus
источник
Ни то, ни другое не работает для меня. Можете ли вы действительно передавать команды от стандартного ввода к su / sudo?
Sparhawk
1
@ Sparhawk, спасибо за проверку. Во втором примере я забыл добавить «bash» (уже обновленный пример) - работает. Первый пример не полностью работает, как вы упомянули, я печатал из долгосрочного кэша, поэтому мог ошибиться, но определенно у меня была su, работающая со stdin (я использовал java для запуска подпроцесса для этой задачи), я постараюсь проверить это больше, чтобы найти правильный путь.
спин
1
Мне нужно было создать команду, зависящую от различных переменных, и запустить ее от имени другого пользователя. Так что предложение от YoMismo не было вариантом в моем случае. Я боролся с этим в течение часа, и единственное, что я нахожу работающим, - это подход EOF (второй пример). Благодарность!
Джетт