Став корень из питона


Для того, чтобы избежать пользователь, имеющий явно префикс сценарий с судо или Су --команда, я написал следующее:

import sys
import os

if os.getuid():
    root = "/usr/bin/sudo"
    if not os.path.exists("/usr/bin/sudo"):
        root = "/bin/su --command"
    command = "{} {}".format(root, sys.argv[0])
    command = command.split()
    retcode = subprocess.call(command)
    if retcode:
        print("something wrong happened")
else:
    action_that_needs_admin_rights()

Это похоже на хак для меня, поэтому я с нетерпением жду лучшего подходов.



3846
7
задан 3 мая 2011 в 01:05 Источник Поделиться
Комментарии
1 ответ

В последний раз я проверил (которые правда уже давно) всех основных дистрибутивов Linux, кроме Ubuntu в есть установки по умолчанию, в котором установлен судо, но не настроен, чтобы иметь возможность запуска произвольных приложений. Поэтому на тех, ваш скрипт не будет выполнена.

Кроме того, я думаю, что это плохая идея, чтобы использовать сплит такой. Этот сломается, если файл Python (или путь к нему, если он был вызван с пути) содержит пробелы. Я бы сделал это вместо такой:

if sudo:
root = ["/usr/bin/sudo"]
else:
root = ["/bin/su", "--command"]
command = root + [ sys.argv[0] ]

Еще одна проблема заключается в том, что вы требующую скрипт должен быть помечен как исполняемый. Я думаю, было бы лучше использовать представление sys.исполняемый получить интерпретатор Python и вызывать его.

5
ответ дан 3 мая 2011 в 02:05 Источник Поделиться