Ich habe einige Probleme mit einem unserer Upstart-Skripte, die den Benutzer wechseln und einige Ruby-Daemon-Prozesse starten.
In der Vergangenheit habe ich einfach darauf bash -c "do the business" -l someuser
geachtet, das -l
Flag zu verwenden, um ein Login zu emulieren.
Dies hat bis jetzt sehr gut funktioniert. Unser Ruby-Prozess hat den folgenden Fehler ausgelöst: require: no such file to load -- rubygems (LoadError)
Nach einigen Untersuchungen stellte ich fest, dass dieser Fehler nur auftritt, wenn ich das Skript als Root-Benutzer ausführe, dh (wenn ich sudo su
oder wenn ich von upstart ausgeführt werde).
Ich denke, dies ist ein PATH-Problem, da das Problem behoben wird, wenn ich den Pfad zuerst manuell einstelle.
Gibt es eine Möglichkeit, den Benutzer zu wechseln und die gesamte Umgebung zu laden ?
Ich habe es auch versucht su user -c
und sudo
.
Um das Testen zu vereinfachen, "roote" ich ( sudo su
) und laufe which bundle
(Bundle ist eine rubinrote Sache).
Folgendes bekomme ich:
sudo -i -u webuser which bundle
# => keine Ausgabesu -l webuser -c which bundle
# => keine Ausgabesudo su - webuser -c which bundle
# => keine Ausgabe
Aber ssh'd als Webuser
which bundle
# => / opt / ruby / bin / bundle
quelle
su - user -c
?/etc/profile
~/.bash_profile
~/.bash_login
und~/.profile
. Bei Login-Shells wertet bash diese in der angegebenen Reihenfolge aus.Antworten:
Mit
sudo su - user -c
wird es so gemacht, als ob Sie sich als die Person angemeldet hätten, die ihren Pfad geerbt hat. Deshalbsu user
ist anders alssu - user
.Wenn Sie jedoch den Pfad in einer
.bashrc
Datei festlegen, wird er nur für interaktive Sitzungen wirksam (dh als dieser Benutzer einschalten).Sie sollten stattdessen
.bash_profile
oder verwenden/etc/profile
, sehen Sie dies .quelle
su -
undsu -l
sind auch.--login
zur besseren Lesbarkeit empfehlen .Verwenden Sie für den Anmeldekontext entweder:
sudo -i -u USER COMMAND
su -l USER -c COMMAND
quelle