Що відбувається з навколишнім середовищем, коли ви запускаєте "su -c"?


4

Що відбувається з оточенням, коли ви запускаєте "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

Будь-які ідеї?


Я припускаю, що firefox знаходиться в $ PATH, що перегукується першою командою?
Nifle

Відповіді:


3

Те, що ви бачите, це факт, який $PATHрозгортається в оболонці перших користувачів під час обробки аргументів, перш ніж su(1)команда запускається, так що схоже, що це завжди робиться. Якщо ви використовуєте жорсткі цитати ( 'echo $PATH'), ви повинні побачити щось інше або просто зробити \$.

Це збереже $PATHсинтаксис до тих пір, поки su(1)команда не запуститься. Хоча він зазвичай не співпадає з середовищем, він запускає нову оболонку, і тому вам слід перевірити наявність PATH=рядків у різних сценаріях запуску оболонки.

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


7

Коли su -або su -lвикористовується, він імітує сеанс входу, що передбачає повернення середовища до чистого стану.

В Arch Linux su -використовує жорстко кодований рядок /usr/ucb:/bin:/usr/bin:/etcяк новий $PATH. В інших системах він може читати ENV_SUPATHз /etc/login.defsPAM або покладатися на нього, щоб створити середовище.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.