Исполняемые выполнения без sudo, но не с sudo

Я установил 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
3
задан 11 April 2018 в 14:32

1 ответ

Почему 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"', но это - плохая идея, поскольку она сделала бы систему менее безопасной.

4
ответ дан 1 December 2019 в 15:57

Другие вопросы по тегам:

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