45

На сайте есть несколько вопросов, которые, кажется, связаны с моей проблемой, но я не смог найти решение ни в одном из них.

Моя операционная система - 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 успешно найден и команда выполнена успешно. Что здесь происходит?

6 ответов6

39

Дайте sudo ваш текущий PATH с:

sudo env "PATH=$PATH" your_command
34

$PATH оценивается вашей оболочкой, поэтому ваша проверка не работает так, как вы ожидаете.

/etc/sudoers настроен для замены вашего PATH значением по умолчанию.

sudo не загружает среду оболочки входа в систему до выполнения команды, поэтому используется PATH по умолчанию из /etc/sudoers . su - открывает оболочку входа в систему, которая включает загрузку /etc/profile . Смотрите man bash , раздел INVOCATION .

Просто удалите сброс PATH в /etc/sudoers . Вероятно, это правило называется secure_path .


CentOS

В CentOS вы можете добавить PATH в раздел Defaults env_keep по умолчанию :

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"
11

Разрабатывая ответ @ opyate, я использую следующий сценарий оболочки (который может называться, например, mysudo ):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -E говорит sudo чтобы сохранить окружающую среду.
  • env "PATH=$PATH" раскрывается вне вызова sudo , что делает внешний PATH доступным и внутри sudo (это требуется в дополнение к -E поскольку PATH обычно получает специальную обработку в дополнение к обработке, которую получает вся среда),
  • "$@" передает аргументы, которые получает наш скрипт, в строку sudo .

Сохраните сценарий в файле в каталоге в PATH , дайте ему +x разрешений и т.д.

4

Поскольку текущие ответы немного расплывчаты, конкретный параметр в /etc/sudoers изменяющий ваш путь, - secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Вы можете изменить его с помощью sudo visudo или, что еще лучше, добавить нужные каталоги:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
2

У меня была такая же проблема, когда я впервые установил Maven. Проблема была решена после того, как я добавил две строки,

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

до четырех файлов:

/root/.bashrc
/root/.profile

и для текущего пользователя (mehran - мое имя пользователя в Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile
1

Вы должны изменить переменную PATH root точно так же, как вы это делали для себя, то есть , добавив эти две строки в профиль sudo, который находится в /root/.bashrc, а затем добавьте его в исходный код.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .