Я установил xampp в своей системе в месте /opt/lampp
. После этого я добавил php местоположение к своему использованию переменной пути
export PATH=$PATH:/opt/lampp/bin
Таким образом, когда я работаю php -v
использование терминала я получаю ожидаемый вывод.
PHP 5.6.8 (cli) (built: Apr 20 2015 18:37:47)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
Но когда я работаю sudo php -v
Я получаю это:
sudo: php: command not found
Я не знаю, почему это происходит. Я делаю что-то не так при добавлении его для соединения каналом переменной?
Править:
Этим вопросом не является дубликат Переменных среды, когда выполнено с 'sudo', потому что в том вопросе zetah спросил, как передать произвольные переменные команде Python. Они могут выполниться python
использование sudo
, но я не могу выполниться php
использование sudo
.
После этого ответа я добавил ПУТЬ к sudo
использование следующей команды:
sudo PATH=$PATH:/opt/lampp/bin php -v
но я получаю вывод как прежде:
sudo: php: command not found
После этого ответа добавил я -E
кому: sudo
, но я получаю тот же результат:
$ sudo -E php -v
sudo: php: command not found
sudo
не использует Ваш ПУТЬПричина sudo
игнорирует Вашу переменную ПУТИ, то, что она имеет свое собственное secure_path
, и это справедливо полно решимости использовать его.
Если Вы sudo cat /etc/sudoers
или просто sudo grep secure /etc/sudoers
, Вы будете видеть то, что этот путь находится в Вашей системе. У меня есть эта строка:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Цель sudo
secure_path
должен попытаться сделать его менее вероятно что пользователь с sudo
полномочие (случайно) выполнит опасный код как корень после того, как их путь будет изменен, возможно, для включения локальных каталогов.
Возможно избежать sudo
использование secure_path
в целом путем изменения /etc/sudoers
чтобы прокомментировать ту строку, но это было бы плохой идеей, потому что она удаляет меры безопасности, и это является также ненужным, потому что можно легко работать вокруг этого различными предпочтительными способами.
sudo
использовать Ваш ПУТЬПереопределять secure_path
и сделайте sudo
используйте свой ПУТЬ, так же в настоящее время определяемый, как muru прокомментировал, можно использовать:
sudo env PATH="$PATH" command
Обратите внимание что -E
флаг или просто присвоение переменной не работают (над Ubuntu, по крайней мере).
$ mkdir junk # create a test directory to add to PATH
$ echo "echo foo" > junk/useless # create a harmless program
$ chmod u+x junk/useless # make it executable
$ PATH="$PATH":~/junk # add directory to PATH
При добавлении к ПУТИ используйте полный путь (оболочка расширится ~
прежде, чем присвоить переменную). Я не должен export
(и выполнение так не помогает), потому что ПУТЬ уже экспортирован, и изменение его значения заставит дочерние процессы наследовать изменение также.
$ useless
foo
$ sudo useless
sudo: useless: command not found
$ sudo -E useless
sudo: useless: command not found
Часто ожидается, что это будет работать... man sudo
говорит:
-E, --preserve-env
Indicates to the security policy that the user wishes to
preserve their existing environment variables.
Но это не работает. -E
флаг не имеет никакого эффекта на secure_path
, который является возможно ошибкой.
$ sudo PATH="$PATH" useless
sudo: useless: command not found
Это не влияет sudo
собственная среда, которая была установлена согласно политике безопасности, настроенной /etc/sudoers
. Это включает env_reset
и secure_path
как значения по умолчанию на Ubuntu, заставляя минимальную среду быть загруженным и ПУТЬ, который будет установлен на то, что находится в secure_path
.
Если sudo
смогли найти команду названной useless
в одном из его собственных каталогов пути и выполненный это, это передало бы PATH=$PATH
в его среду, как продемонстрировано здесь. Но это не будет самостоятельно использовать данное значение ПУТИ. Решение состоит в том, чтобы работать:
$ sudo env PATH="$PATH" useless
foo
Это обходное решение использует env
управляйте для устанавливания ПУТИ. В отличие от этого, sudo
, env
использует данные переменные для установки среды, затем ищет аргумент команды и выполняет команду с измененной средой. Как info (coreutils) env invocation
говорит:
Модификации к
PATH
вступите в силу до поиска команды.
Когда Вы заменили свою переменную ПУТИ для включения каталога /opt/lampp/bin
, Вы использовали эту команду:
export PATH=$PATH:/opt/lampp/bin
Это было бы эффективно для текущей оболочки и дочерних процессов всей текущей оболочки, таково как оболочки, названные от этой оболочки. О том, когда Вы вышли из этой оболочки, и все ее дети вышли, который изменил переменную ПУТИ, полностью забыли, и когда Вы откроете новую оболочку, Вы найдете старую переменную ПУТИ, которая не включает /opt/lampp/bin
. По этой причине, полная команда, предложенная muru,
sudo env PATH="$PATH:/opt/lampp/bin" php -v
было бы необходимо, если Вы все еще не использовали оболочку, где Вы уже добавили /opt/lampp/bin
.
Для изменения пути постоянно необходимо было бы отредактировать некоторый конфигурационный файл, который изменяет пользовательскую среду или читается оболочками, когда они запускают. Можно добавить строку для присвоения переменных среды в Вашем ~/.profile
, например:
PATH="$PATH:/opt/lampp/bin"
Затем после того, чтобы выходить из системы и въезжают задним ходом (или выполнение source ~/.profile
сразу видеть эффект), Вы всегда могли бы работать
php -v
или
sudo env PATH="$PATH" php -v
не корректируя Ваш ПУТЬ сначала.
Более удобное обходное решение могло быть должно сделать символьную ссылку на исполняемый файл в месте, которое находится в secure_path
и ПУТЬ по умолчанию, например:
sudo ln -s /opt/lampp/bin/php /usr/local/bin/php
Вы не должны будете затем делать ничего специального при вызове команды с sudo
, и при этом Вы никогда не должны будете делать шаги для корректировки ПУТИ, постоянно или временно.
Если программа, которую Вы устанавливаете, имеет имя, которое совпадает с названием другой программы, которую системные процессы могут попытаться назвать, затем дать символьной ссылке другое имя, чтобы не путать те процессы. Можно проверить, что имя, которое Вы хотите использовать, уже не является названием некоторой другой команды с помощью type
команда:
$ type php
bash: type: php: not found
Таким образом в этой системе я могу создать команду php
без страха перед чем-либо идущим не так, как надо, в данный момент. Если я устанавливаю другие программы, которые обеспечивают a php
команда в будущем, мне, возможно, придется заново продумать мою конфигурацию.
Вы могли также сделать псевдоним для команды и добавить его к Вашему ~/.bashrc
, например:
alias sudo-php='sudo env PATH="$PATH:/opt/lampp/bin/php"'
Вы могли затем (после того, как выполнение source .bashrc
или открытие новой оболочки) выполненный
sudo-php
вместо sudo php
запускать эту программу как корень, и sudo
не будет утверждать, что был незнаком с его местоположением.
Этот псевдоним только был бы доступен в интерактивных оболочках, таким образом, он не перепутает другие программы.
Конечно, возможно сделать псевдоним для просто sudo
заставить его всегда использовать Ваш ПУТЬ, с alias sudo='sudo env PATH="$PATH"'
, но это - плохая идея, поскольку она сделала бы систему менее безопасной.