Як я можу запуститись як інший користувач?


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після входу в систему як відкритий проект, вихід є/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.
dawud

Ви також не можете (значущо) судо cd, оскільки це вбудована оболонка.
MadHatter підтримує Моніку

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

1
Ні, sudoвикористовується для запуску як іншого користувача, тому що rootза замовчуванням, якщо нічого не вказано, ви можете ідеально виконати sudo -u openproject bundle install.
dawud

Я думаю , ви отримуєте повідомлення про 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 замість змінних вашого середовища користувача.


Мені потрібно було додати sudoна початку, інакше він попросив мене пароль.
IanVaughan

sudoВи також запитаєте пароль при першому запуску, отже, радимо ввести свої речі до сценарію оболонки та запустити його з будь-яким suабоsudo
YoMismo

8

Якщо ви використовуєте bash, ви можете зробити тут-док

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

Таким чином ви можете виконати багато команд і зберегти стан всередині сценарію.

Те саме з судо

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

Ні для мене не працює. Ви дійсно можете передавати команди від stdin до su / sudo?
Sparhawk

1
@Sparhawk, дякую за перевірку. У другому прикладі я забув додати "bash" (вже оновлений приклад) - працює. Перший приклад не працює в повній мірі, як ви згадали, я друкував з довготривалого кешу, щоб я міг помилитися, але, безумовно, я працював зі stdin (я використовував Java для запуску підпроцесу для цього завдання), я спробую перевірити його більше, щоб знайти правильний шлях.
спінус

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