«Sudoing» стратегия для сценария Python в Ubuntu

Я создаю небольшую программу-роутер (GTK-интерфейс) на python для некоторых из наших пользователей, не очень разбирающихся в CLI. Я разработал интерфейс поляны и смог соединить различные сигналы. Теперь я столкнулся только с одной проблемой - созданием интерфейса sudo.

По некоторым причинам мы не хотим, чтобы пользователь запускал программу с помощью gksu, а вместо этого предоставляем ему диалоговое окно пароля, которое впоследствии сохраняется в программе (аналогично тому, что происходит с менеджером пакетов synaptic).

Проблема в том, что скрипт работает нормально, когда я тестировал на рабочем столе GNOME 3, где я его разработал, но в ubuntu команда gksu ничего не сохраняет в связку ключей. Вместо этого он запрашивает пароль для каждой команды! Вот функция в программе, которая вызывает gksu:

def execute(command,errorstring='', wait = True, shellexec = True):
    try:
        print 'command=' + command
        p=subprocess.Popen("gksu '" + command + "'", shell=shellexec,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        if wait:
            p.wait()
            result=get_stdout(p)
            return result
        else:
            print 'not waiting'
            return p
    except subprocess.CalledProcessError as e:
        print 'error occured:' + errorstring
        return errorstring

А вот пример того, как я вызываю функцию execute в некоторых частях моей программы:

#stop hostapd if already running.
if is_process_running('hostapd')>0:
    writelog('stopping hostapd')
    **execute('killall hostapd')**

#enable forwarding in sysctl.
writelog('enabling forward in sysctl.')
set_sysctl('net.ipv4.ip_forward','1')

Как сделать Я делаю так, чтобы вызов gksu сохранял пароль в связке ключей или что-то в этом роде и не беспокоил пользователя каждый раз?

1
задан 14 January 2014 в 21:09

1 ответ

Не уверен насчет этого, но, вероятно, вам нужно отключить опцию "tty_tickets" в /etc/sudoers. Обычно «льготный период» sudo, не запрашивающий пароль повторно, привязан к tty, см. Руководство .

Предупреждение --- это может быть угрозой безопасности.

В основном вы должны добавить к опции

Defaults   !tty_tickets

в ваших /etc/sudoers файлах (вы знаете, как это сделать, иначе лучше этого не делать). Много информации можно найти в arch linux wiki . Обратите внимание, что после этого, в течение льготного периода, все пользовательские приложения могут получить привилегии без запроса пароля ...

Другая стратегия состоит в том, чтобы запросить весь сценарий для запуска в sudo. Если вы беспокоитесь о том, чтобы все время работать с привилегиями root, вы можете удалить их и использовать их только при необходимости, используя os.seteuid().

Интересные ссылки здесь и здесь .

Другая стратегия - сделать setuid программы (для этого нужно использовать хитрость , см. Ссылки в ответе - это для bash, то же самое для python) и затем используйте, например, группы, если вы хотите ограничить доступ к пользователю (или отменить привилегии, а затем повторно включить его после запроса пароля).

0
ответ дан 14 January 2014 в 21:09

Другие вопросы по тегам:

Похожие вопросы: