sudo -u userX python3 испортить python PYTHONPATH - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть сценарий оболочки для запуска некоторых сценариев Python. Мне нужно запустить скрипт python с другим пользователем, поэтому я проверяю пользователя с помощью sudo -u userX, но каким-то образом это утверждение портит PYTHONPATH. Запуск только одного скрипта Python работает, но когда я пытаюсь импортировать скрипты из того же каталога, они не найдены.

Сценарий оболочки:

cd $1
sudo -u userX PYTHONPATH=. python3 $2

Как видите, я попытался добавить текущий каталог вручную к PYTHONPATH, но все равно ошибка.

Мой скрипт на питоне:

import sys
print(sys.path)

from second import calc

#output of the script:
# $ ['', '/var/www/html/assignments_rest/EvaluationServer/sandbox/proc_0/1', ...]
# $ Traceback (most recent call last): File "first.py", line 4, in <module> from second import calc 
# $ ImportError: No module named 'second'

Когда я добавляю путь в скрипт Python, он работает нормально:

sys.path.append(".")
print(sys.path)

from second import calc

# $ ['', '/var/www/html/assignments_rest/EvaluationServer/sandbox/proc_0/1', ...]
# $ doing stuff no erros

Что меня действительно смущает, так это то, что швы sys.path такие же, но импорт работает только после sys.path.append("."). Но для моей цели добавить dir в сам скрипт python не вариант. Поэтому я должен добавить это перед запуском самого скрипта python.

Есть идеи, как это решить?


Редактировать 1:

Я работаю на сервере, где студенты могут загружать свои скрипты Python. Сценарии выполняются, а затем оцениваются. По соображениям безопасности я создал «песочницу» (../sandbox/proc_0/..), я скопировал все сценарии туда, а затем выполнил их с другим пользователем userX, который имеет права только на чтение / запись / выполнение для этого каталога и больше нигде. Сценарии оболочки, которые я вызываю из моего бэкэнда (см. Выше), расположены вне песочницы.

Пользователь userX является минимальным пользователем без home каталога или пароля.


Редактировать 2: Вот пример, когда я выполняю сценарии непосредственно из оболочки, я изменил директорию на ../sandbox/proc_0/1/. Вот как выглядит каталог:

|--first.py
|--second.py

Отлично работает следующее:

$ mb@assignments:../sandbox/proc_0/1$ python3 first.py
$ Geben Sie eine Zßhl ein: 3
$ Das Ergebniss ist 2.3 für a = 3

Запуск такой же, но с изменением пользователя:

$ mb@assignments:../sandbox/proc_0/1$ sudo -u eval python3 first.py
$ Traceback (most recent call last):
$   File "first.py", line 1, in <module>
$     from second import calc
$ ImportError: No module named 'second'

Добавление PYTHONPATH:

$ mb@assignments:../sandbox/proc_0/1$ sudo -u eval PYTHONPATH=/var/www/html/assignments_rest/EvaluationServer/sandbox/proc_0/1 python3 first.py
$ Traceback (most recent call last):
$   File "first.py", line 1, in <module>
$     from second import calc
$ ImportError: No module named 'second'

Когда я добавляю буксирные линии sys.path.append("."); print(sys.path) к first.py, это работает в каждом случае.

...