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


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.