Как сделать установленный модуль python пригодным для использования другим пользователем?

Я запускаю скрипт bash с php, который, в свою очередь, запускает скрипт python, но я получаю так много ошибок, потому что кажется, что www-data не может использовать пакеты python, которые я установил для своего собственного пользователя. Итак, как я могу сделать определенный пакет доступным для www-data, безопасно ли это сделать? также безопасно установить www-data как владельца определенного поддерева /var/www/html?

Вот ошибка, которую я получаю, когда я запускаю следующую команду:

sudo -u www-data ./bash_script_that_calls_runs_the_pythonscript.sh Traceback (most recent call last): File "./file.py", line 5, in <module> from bs4 import BeautifulSoup ImportError: No module named 'bs4'

Но если я запустил:

./bash_script_that_calls_runs_the_pythonscript.sh

Все будет хорошо.

А также:

~/.local/lib/python3.5/site-packages$ ll | grep bs4 drwxrwxr-x 5 me www-data 4096 Dec 2 15:37 bs4/ drwxrwxr-x 2 me www-data 4096 Dec 2 15:38 bs4-0.0.1.dist-info/

Обратите внимание, что я установил группу рекурсивно:

$ ll /home/me/.local/lib/python3.5/site-packages/bs4/ total 180 drwxrwxr-x 5 me www-data 4096 Dec 2 15:37 ./ drwx------ 51 me me 4096 Jan 16 04:33 ../ drwxrwxr-x 3 me www-data 4096 Dec 2 15:37 builder/ -rw-rw-r-- 1 me www-data 29910 Dec 2 15:38 dammit.py -rw-rw-r-- 1 me www-data 6773 Dec 2 15:38 diagnose.py -rw-rw-r-- 1 me www-data 68798 Dec 2 15:38 element.py -rw-rw-r-- 1 me www-data 20394 Dec 2 15:38 __init__.py drwxrwxr-x 2 me www-data 4096 Dec 2 15:37 __pycache__/ -rw-rw-r-- 1 me www-data 30800 Dec 2 15:38 testing.py drwxrwxr-x 3 me www-data 4096 Dec 2 15:37 tests/

То же самое касается bs4-0.0.1.dist-info/

2
задан 13 February 2018 в 02:20

2 ответа

Ответ:

Добавить параметр -H или -i в sudo:

sudo -i -u www-data ./bash_script_that_calls_runs_the_pythonscript.sh sudo -H -u www-data ./bash_script_that_calls_runs_the_pythonscript.sh

Ответ:

Вы можете использовать python -m site для проверки путей импорта. Например, на выходах sudo -u www-data python -m site USER_SITE не установлен ожидаемый каталог bs4.

sys.path = [ '/', '/usr/local/lib/python3.6.2/lib/python36.zip', '/usr/local/lib/python3.6.2/lib/python3.6', '/usr/local/lib/python3.6.2/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6.2/lib/python3.6/site-packages', ] USER_BASE: '/root/.local' (doesn't exist) USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist) ENABLE_USER_SITE: True

С помощью sudo -i или sudo -H вы можете переключать домашний каталог на пользователя www-data и найдите правильный USER_SITE. Выходы sudo -i -u www-data python -m site могут быть:

sys.path = [ '/home/www-data', '/usr/local/lib/python3.6.2/lib/python36.zip', '/usr/local/lib/python3.6.2/lib/python3.6', '/usr/local/lib/python3.6.2/lib/python3.6/lib-dynload', '/home/www-data/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6.2/lib/python3.6/site-packages', ] USER_BASE: '/home/www-data/.local' (exists) USER_SITE: '/home/www-data/.local/lib/python3.6/site-packages' (exists) ENABLE_USER_SITE: True
1
ответ дан 17 July 2018 в 20:57

Ответ:

Добавить параметр -H или -i в sudo:

sudo -i -u www-data ./bash_script_that_calls_runs_the_pythonscript.sh sudo -H -u www-data ./bash_script_that_calls_runs_the_pythonscript.sh

Ответ:

Вы можете использовать python -m site для проверки путей импорта. Например, на выходах sudo -u www-data python -m site USER_SITE не установлен ожидаемый каталог bs4.

sys.path = [ '/', '/usr/local/lib/python3.6.2/lib/python36.zip', '/usr/local/lib/python3.6.2/lib/python3.6', '/usr/local/lib/python3.6.2/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6.2/lib/python3.6/site-packages', ] USER_BASE: '/root/.local' (doesn't exist) USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist) ENABLE_USER_SITE: True

С помощью sudo -i или sudo -H вы можете переключать домашний каталог на пользователя www-data и найдите правильный USER_SITE. Выходы sudo -i -u www-data python -m site могут быть:

sys.path = [ '/home/www-data', '/usr/local/lib/python3.6.2/lib/python36.zip', '/usr/local/lib/python3.6.2/lib/python3.6', '/usr/local/lib/python3.6.2/lib/python3.6/lib-dynload', '/home/www-data/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6.2/lib/python3.6/site-packages', ] USER_BASE: '/home/www-data/.local' (exists) USER_SITE: '/home/www-data/.local/lib/python3.6/site-packages' (exists) ENABLE_USER_SITE: True
1
ответ дан 23 July 2018 в 21:38
  • 1
    Я не хочу запускать его из командной строки! Я хочу запустить из PHP-скрипта, который запускается запросом от пользователя. – yukashima huksay 21 February 2018 в 01:50
  • 2
    Когда php получил запрос, можете ли вы распечатать выходы python -m site в bash_script_that_calls_runs_the_pythonscript.sh? – Ping Chu Hung 21 February 2018 в 12:32

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

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