Я установил две версии Python.

  • Python 2.7.14 в /usr/local/bin
  • Python 2.7.5 в /usr/bin .

Когда я печатаю # python , он использует версию 2.7.14 но когда я печатаю sudo python , он использует версию 2.7.5 . Как сделать так, чтобы sudo python указывал на версию 2.7.14?

В выводе sudo env | grep PATH , /usr/local/bin появляется перед /usr/bin но все же выбирает Python из /usr/bin .

PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Когда я sudo su для входа в корневую оболочку, он дает мне python 2.7.14 но в том же сеансе, если я набираю sudo python , он дает мне python 2.7.5 .

Я прошел этот вопрос, но принятый ответ не дает ответа на вопрос, как убедиться, что sudo использует правильный путь.

Вот как выглядит безопасный путь:

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

1 ответ1

0

Это определенно вопрос sudo и GNU/Linux , а не вопрос Python . Когда вы запускаете sudo foo arg1 arg2 система сначала запускает оболочку (установленную для root, а не вы), которая запускается от имени root а затем "запускает" foo arg1 arg2 . Это не то же самое, что войти в систему с root и ввести foo arg1 arg2 в командной строке, но закрыть. Существуют исполняемые файлы, которые не позволяют пользователю sudo работать или выполнять какие-то действия, а также некоторые дополнительные переменные среды, которые вы можете увидеть, если вы запустите sudo env . Вы увидите что-то вроде:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=%%
PS2=cont>
MAIL=/var/mail/root
LOGNAME=root
USER=root
USERNAME=root
HOME=/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_USER=my_user
SUDO_USER=spt
SUDO_UID=1000
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/env

И если оболочкой является bash, подоболочка, скорее всего, прочитала содержимое /root/.bashrc если оно существует. Кроме того, оболочка my_user bash будет выполнять расширение псевдонима для первого элемента (т.е. sudo в sudo foo arg1 arg2), а не для второго (foo). Поэтому, если foo также является псевдонимом, он не будет раскрыт, и поэтому подоболочка, выполняемая от имени пользователя root будет пытаться запустить foo как литерал, а не как foo как псевдоним, созданный вами в my_user . Есть несколько способов "исправить" вашу проблему. Определите псевдоним для sudo с завершающим пробелом:

alias='sudo '

Как объясняется здесь, это приведет к тому, что то, что придет после sodo будет также расширено псевдонимом перед отправкой его в подоболочку для запуска.

Другой вариант - отредактировать файл /root/.bashrc или эквивалентный файл и выполнить одно из следующих действий:

  1. Предварительно добавьте местоположение нужного питона к $PATH используя что-то вроде export PATH=/path/to/foo:$PATH
  2. Определите псевдоним (ы), который вы хотите там

Или вы можете сделать что-то (мягко) рискованно и лениво, но очень эффективно и просто запустить sudo (cd /root && ln -s /home/my_user/.bashrc) и root всегда будет просто исходить из файла my_user/.bashrc .

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