команда не знайдена при використанні sudo


52

На сайті є кілька запитань, які здаються пов'язаними з моєю проблемою, але я не зміг знайти рішення ні в одному з них.

Моя операційна система - 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успішно знайдено і команда вдається. Що тут відбувається?


Відповіді:


37

$PATH оцінюється вашою оболонкою, тому ваш чек не працює так, як ви очікували.

/etc/sudoersналаштовано на заміну вашого PATHза замовчуванням.

sudoне завантажує середовище оболонки для входу перед виконанням команди, тому використовується за замовчуванням PATHз /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.
izomorphius

FYI: Зауважте, оновлення моєї відповіді.
kriegaex

як виконувати виконання файлів бінарних файлів у поточному каталозі sudo: ./<some_binary>: command not found. Я використовую Arch Linux.
Necktwi

47

Надайте sudoпоточний за PATHдопомогою:

sudo env "PATH=$PATH" your_command

Прекрасна відповідь, яка не потребує зміни будь-яких налаштувань, дозволяючи абоненту робити все необхідне. Я б застосував цей -Eваріант на додачу, щоб зберегти решту навколишнього середовища. Насправді це так зручно, що його можна поставити в сценарій / псевдонім / функцію для зручного використання. Я додам це як окрему відповідь - але kudos to @opyate!
Том

Коли я намагаюся запустити цю команду, я отримую env: cmd: No such file or directory- Будь-які ідеї, чому це було б?
Енді

2
@Andy замініть cmd фактичною командою.
опіят

як виконувати виконання файлів бінарних файлів у поточному каталозі 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

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, а потім джерело його.


1
Я відредагував /root/.bashrc, але не можу його джерело: get sudo source /root/.bashrc: sudo: source: command not foundі без sudoотримання дозволу мені відмовлено (як очікувалося). Я вважаю, що запуск нового терміналу теоретично повинен робити те саме, що і джерело, але після запуску нового терміналу sudo mvn --versionвсе ще нічого не знаходить.
izomorphius

@izomorphius Ви не можете отримати доступ до джерела. Спочатку потрібно перейти на sudo за допомогою команди sudo su , після чого ви зможете отримати джерело відповідного файлу. Іншого способу це зробити не існує.
MariusMatutiae
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.