команда не найдена при использовании sudo

53

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

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

Изоморфия Поддержи Монику
источник

Ответы:

38

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

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

sudoне загружает среду оболочки входа в систему до выполнения команды, поэтому используется значение по умолчанию PATHfrom /etc/sudoers. su -открывает оболочку входа в систему, которая включает в себя загрузку /etc/profile. Смотрите man bash, раздел ПРИЗНАНИЕ .

Просто удалите 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"
Даниэль Бек
источник
Спасибо за ответ. Это решает проблему, но я предпочитаю предложение решения в двух других ответах, поскольку оно выполняет изменение только для maven, а не для всех команд в моем PATH.
Изоморфус Поддержи Монику
К вашему сведению: обратите внимание, мой ответ обновляется.
kriegaex
Как sudo выполнять двоичные файлы в текущем каталоге sudo: ./<some_binary>: command not found. Я использую Arch Linux.
Necktwi
47

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

sudo env "PATH=$PATH" your_command
opyate
источник
Отличный ответ, который не требует изменения каких-либо настроек, позволяя абоненту делать все, что необходимо. Я хотел бы использовать -Eопцию в дополнение, чтобы сохранить остальную часть окружающей среды. На самом деле, это настолько удобно, что может быть помещено в скрипт / псевдоним / функцию для удобства использования. Я добавлю это как отдельный ответ - но слава @opyate!
Том
Когда я пытаюсь запустить эту команду, я получаю ... env: cmd: No such file or directoryЕсть идеи, почему это будет?
Энди
2
@ Andy замените cmd вашей фактической командой.
Опять
Как sudo выполнять двоичные файлы в текущем каталоге sudo: ./<some_binary>: command not found. Я использую Arch Linux.
Necktwi
12

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

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

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

Том
источник
Это гораздо лучшее решение для тех, кто не хочет редактировать существующие файлы.
Qaisjp
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
mikemaccana
источник
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, а затем добавьте его в исходный код.

MariusMatutiae
источник
1
Я отредактировал /root/.bashrc, но не могу его найти : sudo source /root/.bashrcgets: sudo: source: command not foundи без sudoразрешения я получаю отказ (как и ожидалось). Я считаю, что запуск нового терминала теоретически должен делать то же самое, что и исходный код, но после запуска нового терминала sudo mvn --versionвсе равно ничего не находит.
Изоморфус Поддержи Монику
@izomorphius Вы не можете использовать sudo source. Сначала вы должны переключиться на sudo с помощью команды sudo su , затем вы можете получить исходный файл. Нет другого способа сделать это.
MariusMatutiae