Wenn ich diese Befehle ausführe, wird die folgende Ausgabe ausgegeben: /root
$ sudo -u someuser -i "echo $HOME"
/root
$ runuser -l someuser -c "echo $HOME"
/root
$ su - someuser -c "echo $HOME"
/root
Was ich erwartet hatte war
/home/someuser
Wenn ich den Befehl „env“ ausführe, um die Umgebung zu überprüfen, wird die HOME-Variable korrekt gemeldet.
$ su - someuser -c "env"
...
HOME=/home/someuser
...
$ sudo -u someuser -i "env"
...
HOME=/home/someuser
...
$ runuser -l someuser -c "env"
...
HOME=/home/someuser
...
Ich möchte Skripte im Home-Verzeichnis des Benutzers ausführen. /home/someuser/scripts.
als ${HOME}/scripts/somescript.sh
$ sudo -u someuser ${HOME}/scripts/somescript.sh
sudo: /root/scripts/somescript.sh: command not found
Was ich erwartet hatte war:
$ sudo -u someuser ${HOME}/scripts/somescript.sh
...
script output.
...
Antwort1
Tangential verwandt:
sudo -u someuser -i "echo $HOME"
funktioniert bei mir überhaupt nicht. Da steht:
-bash: echo $HOME: command not found
Auf den Punkt gebracht: Wenn Sie den Befehl ausführen
sudo -u someuser -i echo $HOME
die Variable $HOME
wird von der Shell erweitert, bevor sudo überhaupt ausgeführt wird.
Um dieses Problem zu lösen, können Sie einen Befehl wie diesen verwenden:
sudo -u someuser -i bash -c 'echo $HOME'
In diesem Befehl echo $HOME
wird nach dem Wechseln der UID buchstäblich an Bash gesendet.
Das Ergebnis ist wie erwartet:
/home/someuser
Antwort2
Wenn Sie das tun
su - someuser -c "echo $HOME"
DeraktuellShell erweitert $HOMEErste, dann wird das Ergebnis an den Befehl ( su
in diesem Fall) und von dort an einen Shell-Prozess weitergegeben, der als neuer Benutzer ausgeführt wird.
Versuchen Sie, die Variable mit einfachen Anführungszeichen zu schützen
su - someuser -c 'echo $HOME'