Jak mogę uruchomić jako inny użytkownik?


20

To jest kod bash, który powinien zostać uruchomiony. Więc najpierw zastępuje użytkownika openproject, a następnie uruchamia cały kod:

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

Próbowałem zmienić powyższy skrypt w ten sposób:

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"

ale to nie działa poprawnie i na każdym kroku prosi o hasło. Jak poprawić przetłumaczony skrypt, aby działał?

AKTUALIZACJA 1:

Po otrzymaniu sugestii na ten temat jestem punktem, w którym kod został zmodyfikowany w:

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

Dane wyjściowe są w porządku, dopóki wiersz nie podaje tego w kodzie. Stamtąd otrzymuję błąd 4

sudo: bundle: nie znaleziono polecenia

AKTUALIZACJA 2:

Po wypróbowaniu sugestii Dmitrija Wasiljanowa odkryłem, że jeśli wstawię -i, będzie to symulowane jako logowanie użytkownika. Jednak nie jest to ostatni sposób na zrobienie tego.

Jeśli uruchomię się echo $PATHpo zalogowaniu jako openproject, wyjście będzie/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Jeśli uruchomię echo $PATHpo su openproject -c "bash -l"wyjściu jest/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


Chcesz sudonie su.
dawud

Nie możesz także (znacząco) sudo cd, ponieważ jest to wbudowana powłoka.
MadHatter obsługuje Monikę

Ale sudo nie zastępuje roota? Jestem rootem i chcę uruchomić skrypt jako użytkownik openproject, z dokładnymi efektami, jak gdybym zalogował się jako użytkownik openproject i zaczął od drugiej komendy (cd ~ / openproject)

1
Nie, sudosłuży do uruchamiania jako inny użytkownik, ponieważ rootdomyślnie, jeśli nic nie zostanie określone, można doskonale wykonać sudo -u openproject bundle install.
dawud

Chyba otrzymujesz bundle: command not foundbłąd, ponieważ można ustawić PATHalbo GEM_PATHw twojej .bash_profilelub .bashrcnie są one wykonywane bez logowania / non-interactive muszle, więc trzeba przejść -ido sudodo symulacji logowania, na przykład:sudo -iu openproject bundle install
Dmitry Vasilyanov

Odpowiedzi:


19

Dlaczego nie utworzysz skryptu powłoki i nie wykonasz

su - openproject -c "your_shell_script"

Bądź świadomy - przed otwartym projektem. To ustawi zmienne środowiskowe openproject zamiast zmiennych środowiskowych użytkownika.


Musiałem dodać sudona początku, inaczej poprosiłoby mnie o hasło.
IanVaughan

sudobędzie również prosić o hasło przy pierwszym uruchomieniu, stąd doradzić o oddanie rzeczy w skrypcie powłoki i działa, że z jednej sulubsudo
YoMismo

8

Jeśli używasz bash, możesz zrobić tutaj-doc

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

W ten sposób możesz wykonywać wiele poleceń i utrzymywać stan w skrypcie.

To samo dotyczy sudo

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

Żadne z nich nie działa dla mnie. Czy naprawdę potrafisz przekazywać polecenia ze standardowego na su / sudo?
Sparhawk

1
@Sparhawk, dzięki za sprawdzenie. W drugim przykładzie zapomniałem dodać „bash” (już zaktualizowałem przykład) - działa. Pierwszy przykład nie działa w pełni, jak wspomniałeś, pisałem z długoterminowej pamięci podręcznej, więc mogłem popełnić błąd, ale na pewno miałem już do czynienia ze stdin (korzystałem z Java do uruchomienia podprocesu do tego zadania). Spróbuję przetestuj więcej, aby znaleźć właściwą drogę.
spinus

1
Musiałem utworzyć polecenie zależne od różnych zmiennych i uruchomić je jako inny użytkownik. Tak więc sugestia YoMismo nie była opcją w moim przypadku. Walczyłem z tym przez godzinę, jedyne, co uważam za skuteczne, to podejście EOF (drugi przykład). Dzięki!
Jette
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.