su user -l und su user -l -c "cmd" führen nicht zum gleichen Ergebnis

su user -l und su user -l -c "cmd" führen nicht zum gleichen Ergebnis

Ich muss den Befehl vom rootBenutzer, aber auf gameservicedem Benutzer ausführen. Leider PATHist das nicht mit NVMdem Bin-Verzeichnis verknüpft und daher nodekein Befehl.

Ich habe es geschafft, es zum Laufen zu bringen, indem ich es PATHdirekt im Befehl exportiert habe, aber es ist hässlich.

su gameservice -l -c "export PATH='$PATH:/home/gameservice/.nvm/versions/node/v13.7.0/bin/' && cd universalgame-server && ./node_modules/.bin/babel src -d dist --source-maps"

Aber wenn ich versuche, mit Sachen zu spielen, kann ich beweisen, dass sowohl meine .profileals auch meine .bashrcDateien ausgeführt werden.

rootWenn ich mich einfach als Benutzer von mit su gameservice -lund anmelde echo $PATH, befindet sich das NVM-Bin-Verzeichnis darin.

Ich glaube, mir fehlen einfach einige grundlegende Kenntnisse zur Funktionsweise von Bash. Kann bitte jemand meinen Fehler finden?

Antwort1

Das Problem hierbei ist, dass bashes als nicht interaktive Shell aufgerufen wird. Laut Manpage bash:

Eine interaktive Shell wird ohne Argumente ohne Optionen (es sei denn, -s ist angegeben) und ohne die Option -c gestartet, deren Standardeingabe und -fehler beide mit Terminals verbunden sind (wie von isatty(3) bestimmt), oder mit der Option -i gestartet. PS1 ist gesetzt und $- enthält i, wenn Bash interaktiv ist, sodass ein Shell-Skript oder eine Startdatei diesen Status testen kann.

Unter Ubuntu .bashrcbeginnt der Standard mit diesen Zeilen:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

wird also .bashrcausgeführt, beschließt aber, sofort zu beenden. Wenn Sie diese Zeilen entfernen, PATHwird die Variable auf den Inhalt der .bashrcDatei gesetzt und Sie können den nodeBefehl ausführen.

Ein besserer Ansatz ist meiner Meinung nach, ein Skript zu schreiben, in dem Sie die gesamte erforderliche Umgebung einrichten, den benötigten Befehl ausführen und das Skript dann im Namen des Benutzers ausführen. Dies funktioniert in jedem Fall und Sie sind nicht von Startdateien im Verzeichnis des Benutzers abhängig.

verwandte Informationen