Ändern Sie den Benutzer und laden Sie die gesamte Umgebung in ein Shell-Skript

8

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 someusergeachtet, das -lFlag 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 suoder 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 -cund 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 Ausgabe
  • su -l webuser -c which bundle # => keine Ausgabe
  • sudo su - webuser -c which bundle # => keine Ausgabe

Aber ssh'd als Webuser

  • which bundle # => / opt / ruby ​​/ bin / bundle
Daniel Upton
quelle
1
Hast du es versucht su - user -c?
Karlson
Um welche Verteilung handelt es sich?
artistoex
Hängt Ihr Skript von den pro Benutzer installierten Ruby-Modulen ab?
Keith
@ Artistoex es ist Ubuntu :)
Daniel Upton
1
Ich würde sicherstellen, dass es sich wirklich um ein PATH-Problem handelt (sichern Sie die Variable im Skript). Dann vergleichen Sie die Wege und Blick auf /etc/profile ~/.bash_profile ~/.bash_loginund ~/.profile. Bei Login-Shells wertet bash diese in der angegebenen Reihenfolge aus.
artistoex

Antworten:

9

Mit sudo su - user -cwird es so gemacht, als ob Sie sich als die Person angemeldet hätten, die ihren Pfad geerbt hat. Deshalb su userist anders als su - user.

Wenn Sie jedoch den Pfad in einer .bashrcDatei festlegen, wird er nur für interaktive Sitzungen wirksam (dh als dieser Benutzer einschalten).

Sie sollten stattdessen .bash_profileoder verwenden /etc/profile, sehen Sie dies .

Nate
quelle
3
Sie sollten das beachten su -und su -lsind auch.
Jordanm
3
und sollte wahrscheinlich --loginzur besseren Lesbarkeit empfehlen .
3

Verwenden Sie für den Anmeldekontext entweder:

  • sudo -i -u USER COMMAND
  • su -l USER -c COMMAND
H.-Dirk Schmitt
quelle