Почему я не могу отдать некоторые команды? (например, vim)

16

У меня есть доступ sudo на моем сервере друзей, работающем с centos-6.3, но когда я пытаюсь запустить некоторые команды, например, sudo vim /var/www/html/index.htmlполучаю сообщение об ошибке, sudo: vim: command not foundя могу, однако, запустить sudo suи затем, vim /var/www/html/index.htmlи все работает как положено.

echo $PATHи sudo echo $PATHоба дают:

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jared/bin

sudo which vim однако дает:

which: no vim in (/sbin:/bin:/usr/sbin:/usr/bin)

Я пытался добавить

export PATH=$PATH:/usr/local/bin

к /root/.bashrcкоторой, как исправить проблему при использовании, sudo suно не только sudo <command>.

Как мне добраться sudo <command>до работы?

JaredMcAteer
источник
Вы уже добавили этого пользователя в sudoers в ОС Centos?
AAlvz

Ответы:

18

Во время работы sudoмногие системы настраиваются для очистки среды от всех значений, не входящих в белый список, и для сброса переменной PATH в очищенное значение.

Вы найдете первый, как Defaults env_resetи несколько Defaults env_keep += "SOME_VARIABLE_NAME"в /etc/sudoers. Последнее «безопасное» PATHпереопределение указывается как Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin- удалите эту строку, чтобы удалить это поведение при использовании sudo.


Как обрабатывается переменная окружения, печатается при запуске  sudo -Vот имени root.


Если вы не хотите избавляться от этих значений по умолчанию, вы всегда можете указать программы, используя их полный путь ( sudo /usr/local/bin/vim).

Кроме того, вы можете разрешить свою учетную запись SETENVв sudoersфайле, например:

%wheel  ALL=(ALL)       SETENV: ALL

Это позволяет вам переопределить параметры среды по умолчанию следующим образом: sudo PATH=$PATH which vimпеременная интерпретируется вашей оболочкой до выполнения команды, что приводит к наследованию PATH(которое, вероятно, не будет включать /sbinи т. Д.).

Даниэль Бек
источник
Благодарю. Я буду использовать работу Денниса до тех пор, пока не найду владельца, чтобы исправить файл sudoers.
JaredMcAteer
6
sudo echo $PATH

не делает то, что ты думаешь. $PATHзаменяется (вашей) оболочкой перед выполнением команды.

Чтобы достичь желаемого поведения, вы можете использовать sudo -i.

От человека Судо :

-i [команда]

Опция -i ( имитировать начальный вход в систему ) запускает оболочку, указанную в записи passwd (5) целевого пользователя, в качестве оболочки входа в систему. Это означает, что специфичные для входа в систему файлы ресурсов, такие как .profileили .loginбудут читаться оболочкой. Если указана команда, она передается в оболочку для выполнения.

Деннис
источник
1
Это подходящий обходной путь, пока я не смогу заставить владельца настроить файл sudoers.
JaredMcAteer
1

Как мне добраться sudo <command>до работы?

Пока вы не решите проблему с путями, используйте полный путь

  sudo /usr/local/bin/vim /var/www/html/index.html
RedGrittyBrick
источник
5
Я не собираюсь downvote вас, но я никогда не любил просто работать вокруг проблемы , а не получать право на точку выясняя их и фиксируя их.
Николь Гамильтон