Wie kann ich als anderer Benutzer ausgeführt werden?

18

Dies ist der Bash-Code, der ausgeführt werden sollte. Zuerst ersetzt es den Benutzer durch openproject und führt dann den gesamten Code aus

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

Ich habe versucht, das obige Skript wie folgt zu schreiben:

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"

Dies funktioniert jedoch nicht ordnungsgemäß und fordert Sie bei jedem Schritt zur Eingabe eines Kennworts auf. Wie kann das übersetzte Skript verbessert werden, damit es funktioniert?

UPDATE 1:

Nachdem ich Vorschläge dazu erhalten habe, bin ich der Punkt, an dem der Code geändert wurde in:

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

Die Ausgabe ist in Ordnung bis zu der Zeile, die dies im Code angibt. Von dort bekomme ich 4 fehler

sudo: bundle: befehl nicht gefunden

UPDATE 2:

Nachdem ich den Vorschlag von Dmitry Vasilyanov ausprobiert hatte, stellte ich fest, dass, wenn ich das -i einfüge, dies als Benutzeranmeldung simuliert wird. Dies ist jedoch nicht der letzte Weg, dies zu tun.

Wenn ich echo $PATHnach dem Einloggen als openproject laufe ist die Ausgabe/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Wenn ich laufe echo $PATHnach su openproject -c "bash -l"dem Ausgang/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
quelle
Du willst sudonicht su.
Dawud
Sie können auch nicht (sinnvoll) sudo cd, da es eine eingebaute Shell ist.
MadHatter unterstützt Monica
Aber sudo ersetzt nicht root? Ich bin root und möchte ein Skript als openproject-Benutzer ausführen, mit genau den Auswirkungen, als würde ich mich als openproject-Benutzer anmelden und mit dem zweiten Befehl beginnen (cd ~ / openproject)
1
Nein, sudowird verwendet, um als anderer Benutzer rootausgeführt zu werden sudo -u openproject bundle install. Wenn nichts angegeben ist, können Sie dies standardmäßig perfekt ausführen .
Dawud
Ich denke , Sie werden immer bundle: command not foundFehler , weil Sie setzen PATHoder GEM_PATHin Ihrem .bash_profileoder .bashrcwerden sie in nicht-Login / nicht-interaktive Shell nicht ausgeführt, so dass Sie übergeben müssen , -ium sudozu simulieren , Login, wie folgt aus :sudo -iu openproject bundle install
Dmitry Vasilyanov

Antworten:

19

Warum erstellen Sie nicht ein Shell-Skript und machen ein

su - openproject -c "your_shell_script"

Beachten Sie das - vor openproject. Dadurch werden die Umgebungsvariablen von openproject anstelle Ihrer Benutzerumgebungsvariablen festgelegt.

YoMismo
quelle
Ich musste zu sudoBeginn hinzufügen, da ich sonst nach meinem Passwort gefragt wurde.
IanVaughan
sudosusudo
Wenn
7

Wenn Sie Bash verwenden, können Sie dies hier-doc tun

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

Auf diese Weise können Sie viele Befehle ausführen und den Status in einem Skript beibehalten.

Das selbe mit sudo

sudo -u user bash <<EOF
your
script
here
EOF
Spinus
quelle
Beides funktioniert bei mir nicht. Können Sie wirklich Befehle von stdin an su / sudo übergeben?
Sparhawk
1
@ Sparhawk, danke für die Prüfung. Im zweiten Beispiel habe ich vergessen, "bash" hinzuzufügen (das Beispiel wurde bereits aktualisiert) - funktioniert. Das erste Beispiel funktioniert, wie Sie bereits erwähnt haben, nicht vollständig. Ich habe über den Langzeit-Cache getippt, um einen Fehler zu machen, aber definitiv hatte ich su bei der Arbeit mit stdin (ich habe Java verwendet, um den Subprozess für diese Aufgabe auszuführen). Ich werde es versuchen Teste es mehr, um den richtigen Weg zu finden.
Spinus,