Was passiert mit der Umgebung, wenn Sie "su -c" ausführen?

6639
ttsiodras

Was passiert mit der Umgebung, wenn Sie "su -c" ausführen?

Der Grund, warum ich frage, ist dieses mysteriöse Verhalten:

bash$ which firefox /usr/local/bin/firefox bash$ su - user -c "echo $PATH" bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:...  bash$ su - user -c "firefox ..." -bash: firefox: command not found 

Irgendwelche Ideen?

4
Ich gehe davon aus, dass Firefox im $ PATH vom ersten Befehl zurückgegeben wird? Nifle vor 14 Jahren 0

2 Antworten auf die Frage

7
grawity

Wenn su -oder su -lverwendet wird, wird eine Anmeldesitzung emuliert, bei der die Umgebung in einen sauberen Zustand versetzt wird.

su -Verwendet unter Arch Linux die fest codierte Zeichenfolge /usr/ucb:/bin:/usr/bin:/etcals neue $PATH. Bei anderen Systemen kann es lesen ENV_SUPATHvon /etc/login.defsoder auf PAM verlassen Umgebung einzurichten.

su ... "echo $PATH"Lügen, weil das $PATHTeil schon vor dem suStart von Ihrer aktuellen Shell erweitert wird. Verwenden Sie su ... 'echo $PATH'stattdessen (beachten Sie die einfachen Anführungszeichen) oder su - -c env(druckt die gesamte Umgebung).

3
DigitalRoss

Was Sie sehen, ist die Tatsache, dass $PATHder su(1)Befehl während der Argumentverarbeitung in der ersten Benutzer-Shell erweitert wird, bevor der Befehl ausgeführt wird. Es sieht also so aus, als würde er es immer tun. Wenn Sie harte Anführungszeichen ( 'echo $PATH') verwenden, sollten Sie etwas anderes sehen oder einfach tun \$.

Dadurch bleibt die $PATHSyntax erhalten, bis der su(1)Befehl ausgeführt wird. Während es normalerweise nicht mit der Umgebung übereinstimmt, startet es eine neue Shell. Daher sollten Sie PATH=in den verschiedenen Shell-Startskripten nach Zeilen suchen.

Ihr su(1)hat eine -cOption, also scheinen Sie unter Linux zu sein. Auf einem Mac oder einer BSD würden Sie PATHanstelle des Login ein vereinfachtes Element erhalten PATH, hätten aber immer noch das gleiche "Wann habe ich PATH erweitert?" Problem.