web-dev-qa-db-fra.com

Comment rendre un module python installé utilisable par un autre utilisateur?

J'exécute un script bash avec php qui exécutera à son tour un script python, mais je reçois tellement d'erreurs car il semble que www-data ne puisse pas utiliser le python paquets que j'ai installés pour mon propre utilisateur. Alors, comment puis-je rendre un paquet spécifique disponible pour www-data est-il sécuritaire de le faire? est-il également sûr de définir www-data en tant que propriétaire d'un sous-arbre spécifique de /var/www/html?

Voici l'erreur que je reçois lorsque j'exécute la commande suivante:

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'

Mais si je cours:

./bash_script_that_calls_runs_the_pythonscript.sh

Tout ira bien.

Et aussi:

~/.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/

Veuillez noter que j'ai défini le groupe de manière récursive:

$ 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/

Il en va de même pour bs4-0.0.1.dist-info/

2
yukashima huksay

Réponse:

Ajoutez l’option -H ou -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

expliquer:

Vous pouvez utiliser python -m site pour vérifier les chemins d'importation. Par exemple, dans les sorties de Sudo -u www-data python -m site, USER_SITE n'est pas le répertoire attendu bs4 installé.

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

Avec Sudo -i ou Sudo -H, vous pouvez changer le répertoire de base en utilisateur www-data et trouver le bon USER_SITE. Les sorties de Sudo -i -u www-data python -m site peuvent être:

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
Ping Chu Hung