На сайте есть несколько вопросов, которые, кажется, связаны с моей проблемой, но я не смог найти решение ни в одном из них.
Моя операционная система - Ubuntu 12.04. Я mvn
установил в /tools/noarch/apache-maven-3.1.1
и добавил следующие строки в конце моего /etc/profile
:
export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH
После этого я выполняю source /etc/profile
.
Теперь моя проблема: когда я бегу mvn --version
команда успешно и mvn
исполняемый файл найден, в то время как , если я исполню: sudo mvn --version
Я получаю результат: sudo: mvn: command not found
. Я знаю, что это PATH
может отличаться, когда я выполняю команду с, sudo
и именно поэтому я попытался это:
$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...
Еще одна вещь, которую я пытался это выполнить, sudo su -
а затем набрать mvn --version
. В этом случае mvn
успешно найден и команда выполнена успешно. Что здесь происходит?
Ответы:
$PATH
оценивается вашей оболочкой, поэтому ваша проверка не работает так, как вы ожидаете./etc/sudoers
настроен для замены вашегоPATH
по умолчанию.sudo
не загружает среду оболочки входа в систему до выполнения команды, поэтому используется значение по умолчаниюPATH
from/etc/sudoers
.su -
открывает оболочку входа в систему, которая включает в себя загрузку/etc/profile
. Смотритеman bash
, раздел ПРИЗНАНИЕ .Просто удалите
PATH
сброс в/etc/sudoers
. Это, вероятно, называется правиломsecure_path
.CentOS
В CentOS вы можете добавить
PATH
вDefaults env_keep
раздел:источник
sudo: ./<some_binary>: command not found
. Я использую Arch Linux.Дайте
sudo
свой текущийPATH
с:источник
-E
опцию в дополнение, чтобы сохранить остальную часть окружающей среды. На самом деле, это настолько удобно, что может быть помещено в скрипт / псевдоним / функцию для удобства использования. Я добавлю это как отдельный ответ - но слава @opyate!env: cmd: No such file or directory
Есть идеи, почему это будет?sudo: ./<some_binary>: command not found
. Я использую Arch Linux.Разрабатывая ответ @ opyate, я использую следующий сценарий оболочки (который может быть назван
mysudo
, например):-E
говорит,sudo
чтобы сохранить окружающую среду.env "PATH=$PATH"
расширяется за пределыsudo
вызова, что делает внешнееPATH
доступным внутриsudo
тоже (это требуется в дополнение к тому,-E
чтоPATH
обычно получает специальную обработку в дополнение к обработке, которую получает вся среда)."$@"
передает аргументы, которые получает наш скрипт, вsudo
строку.Сохраните сценарий в файле в каталоге
PATH
, предоставьте ему+x
разрешения и так далее.источник
Поскольку текущие ответы немного расплывчаты, конкретная настройка при
/etc/sudoers
смене путиsecure_path
:Вы можете изменить его с помощью
sudo visudo
или, еще лучше, добавить нужные вам каталоги:источник
У меня была такая же проблема, когда я впервые установил Maven . Проблема была решена после того, как я добавил две строки,
до четырех файлов:
и для текущего пользователя (
mehran
это мое имя пользователя Ubuntu):источник
Вы должны изменить переменную PATH root точно так же, как вы это делали для себя, то есть , добавив эти две строки в профиль sudo, который находится в /root/.bashrc, а затем добавьте его в исходный код.
источник
sudo source /root/.bashrc
gets:sudo: source: command not found
и безsudo
разрешения я получаю отказ (как и ожидалось). Я считаю, что запуск нового терминала теоретически должен делать то же самое, что и исходный код, но после запуска нового терминалаsudo mvn --version
все равно ничего не находит.