Вопрос или проблема
Я пытаюсь вызвать Python из скрипта bash, но скрипт не может его найти. Я не занимался программированием на bash более 30 лет, так что сейчас не очень умею отлаживать скрипты bash. Я использую pyenv, чтобы выбрать версию Python для использования в определённой директории. Вот настройки, которые я использую:
dnessett@homelserv:~/SaltSource/scripts$ ls
python_on_root.sh
dnessett@homelserv:~/SaltSource/scripts$ cat python_on_root.sh
#!/bin/bash
sudo python "$@"
dnessett@homelserv:~/SaltSource/scripts$ pyenv local 3.10.15
dnessett@homelserv:~/SaltSource/scripts$ python --version
Python 3.10.15
dnessett@homelserv:~/SaltSource/scripts$ ./python_on_root.sh
sudo: python: command not found
Поскольку я использую sudo в скрипте для вызова Python, вот запись в /etc/sudoers, которая, как я надеялся, позволит sudo запускать локальный интерпретатор Python:
#добавить python в список sudo
dnessett homelserv=(root)NOPASSWD:/home/dnessett/.pyenv/versions/3.10.15/bin/python
dnessett — это имя пользователя, а homelserv — имя машины. Путь, следующий за NOPASSWD, это место, где находится версия Python 3.10.15.
Суть этого в том, чтобы использовать скрипт python_on_root.sh как интерпретатор для проекта Eclipse/PyDev (см. тему на Stack Overflow).
Как видно из приведённого выше вывода, sudo не может найти Python, даже несмотря на то что я установил его в качестве локального интерпретатора Python в ~/SaltSource/scripts. Я предполагаю, что есть какое-то взаимодействие между скриптом и sudo, которое мешает последнему найти целевой интерпретатор Python.
Может кто-то увидеть проблему и подсказать, как её исправить?
PATH
, который унаследует sudo, будет отличаться от вашего и, вероятно, не будет включать местоположение установки Python. Вы можете вызвать его по полному пути в своём скрипте, то есть:
#!/bin/bash
sudo /home/dnessett/.pyenv/versions/3.10.15/bin/python "$@"
Тем не менее, могут быть и другие нежелательные проблемы с запуском Python от имени root, такие как различия в переменных окружения HOME
и PYTHONPATH
, поэтому вам, возможно, стоит использовать sudo -E
, но вы всё равно должны указывать полный путь к Python.
Наконец, вы, вероятно, не должны запускать Python от имени root вообще. Скорее всего, то, что вы пытаетесь сделать, можно решить другим, более правильным способом, например, изменив разрешения на файлы/каталоги, чтобы позволить вашему пользователю выполнять необходимые задачи.
В дополнение к предыдущему ответу, изменения, которые мне нужно было внести, заключались в следующем:
-
Добавить Python в список sudo
dnessett homelserv=(root)NOPASSWD:SETENV:/home/dnessett/.pyenv/versions/3.10.15/bin/python
Дополнительный
SETENV:
послеNOPASSWD:
отменяет запрет на сохранение окружения. Я нашёл это здесь: пост на Stack Exchange Superuser -
Затем, как указал jesse_b в предыдущем ответе, скрипт был изменён на:
sudo -E /home/dnessett/.pyenv/versions/3.10.15/bin/python "$@"
Ответ или решение
Ваша проблема заключается в том, что команда sudo
не может найти интерпретатор Python, установленный через pyenv
. Это связано с тем, что sudo
использует другой PATH
по сравнению с обычной сессией пользователя.
Чтобы исправить эту проблему, вы можете выполнить следующие шаги:
-
Измените ваше sudo правило. Добавьте
SETENV
к вашему правилу sudo вsudoers
. Это позволит сохранить окружение и передать переменные среды, такие какPATH
, при использованииsudo
. Измените вашу запись в файле/etc/sudoers
следующим образом:dnessett homelserv=(root) NOPASSWD:SETENV:/home/dnessett/.pyenv/versions/3.10.15/bin/python
Это позволит команде
sudo
использовать ваше окружение, когда вы вызываетеpython
. -
Измените ваш Bash-скрипт. В вашем скрипте
python_on_root.sh
вы должны использовать полный путь к Python. Кроме того, использование флага-E
сsudo
поможет сохранить вашу среду. Измените ваш скрипт следующим образом:#!/bin/bash sudo -E /home/dnessett/.pyenv/versions/3.10.15/bin/python "$@"
-
Проверка. Убедитесь, что у вас правильно установлен интерпретатор Python и что он доступен по указанному пути. Вы можете проверить его, выполнив следующую команду в терминале:
/home/dnessett/.pyenv/versions/3.10.15/bin/python --version
-
Безопасность. Обратите внимание, что запуск Python с привилегиями
root
может иметь нежелательные последствия, так как переменные окружения, такие какHOME
иPYTHONPATH
, могут отличаться. Рассмотрите возможность исправления прав доступа к файлам или каталогам, чтобы избежать необходимости работы подroot
.
Эти шаги должны помочь вам успешно вызвать Python из вашего Bash-скрипта с использованием sudo
.