Welche Dateien werden bei der Verwendung von su -c als Quelle verwendet?

Welche Dateien werden bei der Verwendung von su -c als Quelle verwendet?

Kontext

Sie arbeiten mit Ubuntu LTS 14.04. Sie sind als Root-Benutzer angemeldet. Sie führen den folgenden Befehl aus:

exec su simple_user -c "/bin/bash /etc/init.d/simple_user_service"

Damit wird der „simple_user_service“ mit „simple_user“-Berechtigungen und nicht mit Root-Berechtigungen gestartet.

Frage

Es scheint, dass "exec su simple_user -c" weder .bashrc noch .profile noch eine andere normal bezogene Datei für das neue interaktive Shell-Terminal als Quelle verwendet. Ich habe dies bestätigt, indem ich diese Zeile in die simple_user .bashrc-Datei eingefügt habe:

export TEST="Hello"

Dann in meinem Init-Skript „simple_user_service“:

#!/bin/bash
### BEGIN INIT INFO
# Provides:             test_script
# X-Interactive:        true
# Short-Description:    Test script
### END INIT INFO

echo $TEST

Wenn ich das Skript ausführe, wird nichts gedruckt, aber wenn ich die folgenden Befehle ausführe:

su simple_user
echo $TEST
> Hello

Die TEST-Variable wird korrekt gesetzt und ausgedruckt.

Daher habe ich mich gefragt: Erstellt der Befehl „exec su simple_user -c“ irgendwelche simple_user-Profil-/Bashrc-Dateien? Wenn ja, gibt es eine Möglichkeit herauszufinden, welche?

Vielen Dank für Ihre Hilfe!

[Bearbeiten - 2 Stunden später]

Dank der Antwort, die ich erhalten habe, habe ich die „Man Bash“-Anweisungen genauer verstanden. Ich habe Folgendes gefunden:

   When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it  appears  there,  and
   uses the expanded value as the name of a file to read and execute.  Bash behaves as if the following command were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
   but the value of the PATH variable is not used to search for the file name.

Es ist wirklich interessant, da Sie BASH_ENV auf eine Datei setzen können, die jedes Mal, wenn Sie „su simple_user -c“ verwenden, bestimmte Befehle ausführt, ohne dass die vollständige interaktive Logik geladen werden muss.

su simple_user -cSie können vor der Ausführung also einfach Folgendes tun:

export BASH_ENV=~/.bash_script

Und legen Sie Dinge in Ihrer simple_user .bash_script-Datei fest, wie:

export TEST="Hello"

Wenn ich dann das Skript „simple_user_service“ ausführe, wird „Hallo“ korrekt gedruckt.

Das war für mich wirklich nützlich, da ich es brauchte, um die gesamte „RVM“-Umgebung (Ruby) zu laden und ein bestimmtes Skript auszuführen.

Möchten Sie mehr erfahren?

Warum dieser ganze Ärger?

Weil ich Ruby God installiert habe:http://godrb.com/um dieses spezielle Skript (ein verzögertes Job-Skript) zu überwachen.

Und ich verwende „rvm“, um verschiedene Rubine zu verwalten.

Und das Skript gibt bei Bedarf automatisch die Berechtigungen auf, indem esexec su application_user -c "/bin/bash application_script"

Da God mit Root-Rechten ausgeführt werden muss und RVM nur in .bashrc/.profile-Dateien geladen wird, brauchte ich eine Möglichkeit, die RVM-Umgebung in meinem Skript richtig zu laden. Ich könnte einfach den Befehl „RVM Load“ in das Skript einfügen, aber dann wäre mein Skript umgebungsabhängig gewesen und das war nicht akzeptabel.

Daher habe ich dies in mein Skript eingefügt, bevor die Berechtigungen aufgehoben werden:

if [ -e "config/BASH_ENV" ]; then
  export BASH_ENV=$(cat config/BASH_ENV)
fi

Dank dessen kann ich rvm in die Datei laden, die ich in der Datei config/BASH_ENV festgelegt habe. Das könnte zum Beispiel sein:

# In config/BASH_ENV file of your rails app:
export BASH_ENV="~/.bash_script"

# In /home/simple_user/.bash_script 
[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function

Dann funktionieren mein Skript und Gott wie erwartet.

Ich habe all diese Dinge nicht erklärt, bevor ich Antworten erhielt, damit sich die Leser auf die eigentliche Frage konzentrieren konnten.

Da ich aber eine gute Antwort erhalten und dadurch eine gute Lösung gefunden habe, habe ich diese Bearbeitung geschrieben, damit sie für andere nützlich sein kann.

Danke noch einmal!

Antwort1

Wenn Sie das tun:

su some_user -c 'some_command'    

Der some_commandWille wird wie folgt ausgeführt:

bash -c 'some_command'

Angenommen, die Shell bashist in definiert .some_user/etc/passwd

Wenn Sie das tun, bash -c 'some_command'erzeugen Sie im Grunde genommen einnicht interaktiv(und natürlichNicht-Login) Sitzung von bash. Da im nicht-interaktiven Modus keine Datei von der Shell bezogen wird, wird erwartungsgemäß keine Datei gelesen.

Beachten Sie, dass ~/.profiledie Quelle in einer interaktiven Sitzung mit Anmeldung von bashund ~/.bashrcdie Quelle in einer interaktiven Sitzung ohne Anmeldung von ist bash. Beachten Sie auch, dass Ubuntu ~/.bashrcvon bezieht ~/.profile.

Sehen Sie sich den INVOCATIONAbschnitt an, man bashum weitere Informationen zu erhalten.

verwandte Informationen