`sudo` не использует правильный двоичный файл, даже если $ PATH правильно передан

Я пытаюсь запустить экземпляр Python Pipenv от имени пользователя root. Когда не запускается с правами root:

(myenv) $ python script.py

питон Pipenv используется правильно. Однако при запуске с правами root с sudo:

(myenv) $ sudo python script.py

вместо этого используется системный питон по умолчанию в /usr/bin/python. После некоторых поисков я нашел опцию -E для sudo. Однако, с

(myenv) $ sudo -E python script.py

он все еще использует /usr/bin/python, хотя sudo -E echo $PATH дает то же самое, что и echo $PATH, поэтому опция -E работает нормально; однако sudo -E which python продолжает давать /usr/bin/python! Это не проблема прав доступа или доступа, потому что полный путь к питону Pipenv работает нормально. Почему используется неправильный двоичный файл, хотя $PATH установлен правильно?

3
задан 7 September 2019 в 23:21

1 ответ

Хорошо, вот проблема. Когда я диагностировал, я хотел найти значение $PATH внутри sudo. Однако с sudo -E echo $PATH, мой пользователь (non-sudo) оболочка разворачивал его автоматически, таким образом, sudo просто видел

echo /home/user/.local/share/virtualenvs/environment-_Sko9eTd/bin:/usr/bin/:......

Попытка sudo -E env рассказывает нам реальную историю:

LANGUAGE=en_GB:en
# more environment variables ...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ^^ doesn't include my Pipenv path

таким образом, на самом деле, sudo -E не было передающим $PATH. Для фиксации этого, можно затем видеть этот ответ по подобному вопросу. По существу Вы просто добавляете

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

в Ваш sudoers файл с visudo.

2
ответ дан 1 December 2019 в 16:49

Другие вопросы по тегам:

Похожие вопросы: