Вызов Python в bash-скрипте

Вопрос или проблема

Я пытаюсь вызвать 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 по сравнению с обычной сессией пользователя.

Чтобы исправить эту проблему, вы можете выполнить следующие шаги:

  1. Измените ваше sudo правило. Добавьте SETENV к вашему правилу sudo в sudoers. Это позволит сохранить окружение и передать переменные среды, такие как PATH, при использовании sudo. Измените вашу запись в файле /etc/sudoers следующим образом:

    dnessett homelserv=(root) NOPASSWD:SETENV:/home/dnessett/.pyenv/versions/3.10.15/bin/python

    Это позволит команде sudo использовать ваше окружение, когда вы вызываете python.

  2. Измените ваш Bash-скрипт. В вашем скрипте python_on_root.sh вы должны использовать полный путь к Python. Кроме того, использование флага -E с sudo поможет сохранить вашу среду. Измените ваш скрипт следующим образом:

    #!/bin/bash
    sudo -E /home/dnessett/.pyenv/versions/3.10.15/bin/python "$@"
  3. Проверка. Убедитесь, что у вас правильно установлен интерпретатор Python и что он доступен по указанному пути. Вы можете проверить его, выполнив следующую команду в терминале:

    /home/dnessett/.pyenv/versions/3.10.15/bin/python --version
  4. Безопасность. Обратите внимание, что запуск Python с привилегиями root может иметь нежелательные последствия, так как переменные окружения, такие как HOME и PYTHONPATH, могут отличаться. Рассмотрите возможность исправления прав доступа к файлам или каталогам, чтобы избежать необходимости работы под root.

Эти шаги должны помочь вам успешно вызвать Python из вашего Bash-скрипта с использованием sudo.

Оцените материал
Добавить комментарий

Капча загружается...