2014-10-21 3 views
0

У нас есть скрипт настройки python, который запускался от имени root, в настоящее время мы хотим запустить его из пользователя sudoer с набором привилегий. Проблема заключается в том, что наш код полон os.makedirs и открытого (имя файла) и т.д.Запускать вызовы python как sudo

open(filename) as sudo ? 
os.makedirs as sudo ? 
... as sudo ? 

Решения, которые не подходят для нас:

  1. Выполнить все настройки сценария как «Судо python script.py " Это проблема безопасности для нас. Нам нужно избегать этого.

  2. Popen ([ "Суд", "..."]) Это плохо для не-Unix систем поддержки, и требует, чтобы весь код переписать.

+0

IIRC это все или ничего. Если для одной части вашего скрипта требуется sudo, для этого нужен весь скрипт. Не могли бы вы дать пользователю, чтобы это выполнялось с разрешения сделать каталоги в родительской папке? Если пользователь, у которого работает этот скрипт, имеет разрешение на создание папок там, где они вам нужны, то вещь sudo становится не-проблемой, если в вашем скрипте нет чего-то другого, что потребует этого доступа. –

ответ

0

У меня говядина с требованием №2. Как вам нужно sudo, но вам также нужно быть агностиком платформы? Если это действительно то, что вы хотите, вы должны пересмотреть требование № 1, или определить, на какой ОС вы находитесь, и префикс ваших команд с помощью sudo, если вы находитесь на * nix. Кроме того, помимо запуска всего скрипта с использованием sudo, вам придется менять код, так что часть # 2 является точкой без звука. Однако использование команд sudo в Popen является бессмысленным. Вам нужно будет включить sudo без пароля для тех конкретных команд, которые вы должны запустить, а IMO - это скорее риск, чем просто запуск всего скрипта с UID 0. Однако кажется, что вы только взаимодействуете с файловой системой, что, как кто-то прокомментировал поднимает вопрос о том, можете ли вы просто дать своему пользователю разрешение на доступ к файлам, которые ему нужны?

Tl, д-р Дайте пользователю запуска программы разрешений на доступ к этим файлам, или шаг назад и спросить себя, почему вы с этой проблемой, и это действительно лучшее решение вашей проблемы

0

В общем, когда небольшая часть вашего кода должна выполняться с повышенными привилегиями, но небезопасно запускать все остальное, вы делаете что-то вроде этого:

Вы запускаете свой основной скрипт как root. Но при запуске он развивает или порождает дочерний процесс (который все еще является корневым), а затем сразу же снижает привилегии. Когда вам нужно сделать что-то как root, вы используете достаточно безопасный механизм IPC (socketpair может быть или не быть достаточно безопасным, в зависимости от остальной части вашего дизайна ...), чтобы попросить ребенка сделать это от вашего имени и отправить назад ответ. Детали немного отличаются для Windows, но одна и та же основная идея может быть использована для работы.


Есть альтернативы этому, однако, в том числе:

  • Создание УИП программ, и запускать их, как дети из некорня родителя. Это не работает в Windows, и может быть неуместно в Unix, когда вы имеете дело с дочерними скриптами.
  • Редизайн вашего приложения в демона/службы, который управляется отдельно (как правило, с помощью демона/диспетчера службы вашей системы) и работает от имени пользователя root, а главное приложение - к демону через IPC.
  • Хранить учетные данные, которые могут использоваться для выдачи себя за корень по мере необходимости (в идеале только на непродолжительном дочернем процессе или потоке). Это отлично работает в Windows, но не работает так хорошо в Unix.

Однако, в этом случае, есть гораздо более простое решение: Единственное, что вам кажется, нужны привилегии для, чтобы прочитать (и, возможно, писать?) Файлы, которые установлены в принадлежащих другому пользователю , Просто сделайте эти файлы доступными для групп (и, возможно, -writable), и запустите скрипт как пользователь с ограниченными правами, который является членом этой группы.