Что происходит с окружением, когда вы запускаете "su -c"?

6548
ttsiodras

Что происходит с окружением, когда вы запускаете "su -c"?

Я спрашиваю причину этого загадочного поведения:

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 

Есть идеи?

4
Я предполагаю, что firefox в $ PATH отражен первой командой? Nifle 14 лет назад 0

2 ответа на вопрос

7
grawity

Когда su -или su -lиспользуется, он эмулирует сеанс входа в систему, который включает в себя сброс среды в чистое состояние.

В Arch Linux su -использует жестко закодированную строку /usr/ucb:/bin:/usr/bin:/etcкак новую $PATH. В других системах, он может прочитать ENV_SUPATHиз /etc/login.defs, или полагаться на РАМ создать среду.

su ... "echo $PATH"ложь, потому что $PATHчасть расширяется вашей текущей оболочкой, задолго до suзапуска. Используйте su ... 'echo $PATH'вместо этого (обратите внимание на одинарные кавычки) или su - -c env(печатает всю среду).

3
DigitalRoss

То, что вы видите, это тот факт, что $PATHон раскрывается в оболочке первых пользователей во время обработки аргументов перед запуском su(1)команды, так что похоже, что это происходит всегда. Если вы используете жесткие кавычки ( 'echo $PATH'), вы должны увидеть что-то другое или просто сделать \$.

Это сохранит $PATHсинтаксис до запуска su(1)команды. Хотя обычно он не взаимодействует со средой, он запускает новую оболочку, поэтому вам следует проверить наличие PATH=строк в различных сценариях запуска оболочки.

У вас su(1)есть -cвозможность, так что вы, похоже, находитесь на Linux. На Mac или BSD PATHвместо логина вы получите упрощенный логин, PATHно у вас все равно будет «когда я расширил PATH?» вопрос.

Похожие вопросы