PHP exec / passthru добавляет переменные среды - PullRequest
0 голосов
/ 16 мая 2019

Я запускаю php-fpm с clear_env = yes (по умолчанию).

И действительно

echo getenv('PATH');

ничего не выводит.

Однако,

passthru('set');

вывод:

HOME='/'
HOSTNAME='pod-ed3f8236c1-g3ksb'
IFS='     
'
LINENO=''
OPTIND='1'
PATH='/sbin:/usr/sbin:/bin:/usr/bin'
PPID='203'
PS1='\w \$ '
PS2='> '
PS4='+ '
PWD='/app/www'
SHLVL='1'
USER='nobody'

Откуда берутся эти переменные окружения?

Я поставил свою настоящую проблему в другой вопрос .Я надеялся, что этот вопрос поможет мне понять, что там происходит.

1 Ответ

0 голосов
/ 18 мая 2019

Отложите, на данный момент, участие PHP в вашем вопросе. Открыть окно терминала; т.е. интерактивная оболочка. Введите env, чтобы отобразить все экспортированные, то есть переменные среды. Теперь введите env -i env, чтобы запустить ту же команду с пустым окружением. Первый env должен показать все ожидаемые переменные env; например, PATH и HOME. Второй должен выводить ничего, показывая, что env -i фактически удалил все переменные env. Теперь наберите env -i bash -c set. Вау! Что это за вары и откуда они взялись?

Часть ответа заключается в том, что команда оболочки set не показывает только env vars. Он показывает все переменные, определенные в контексте выполнения оболочки. Теперь сделайте env -i bash -c env. Это покажет только переменные env, созданные оболочкой. Обратите внимание, что список намного короче. В частности, обратите внимание, что bash -c set перечислены переменные, такие как PATH, но bash -c env нет. Это потому, что, хотя оболочка определила стандартную переменную PATH, чтобы она была минимально функциональной, она не экспортировала автоматически эту переменную.

Когда вы выполняете passthru('set');, вы более или менее делаете то же самое, что и набираете bash -c set в приглашении оболочки. И это не просто показывает env vars. Я сказал «более или менее», потому что в действительности php, вероятно, делает sh -c set «под капотом», и поведение sh будет слегка отличаться от других оболочек, таких как bash, ksh или zsh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...