Я запускаю скрипт 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/
Ответ:
Добавить параметр -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
Ответ:
Добавить параметр -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