Я создаю небольшую программу-роутер (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 сохранял пароль в связке ключей или что-то в этом роде и не беспокоил пользователя каждый раз?
Не уверен насчет этого, но, вероятно, вам нужно отключить опцию "tty_tickets" в /etc/sudoers
. Обычно «льготный период» sudo
, не запрашивающий пароль повторно, привязан к tty, см. Руководство .
В основном вы должны добавить к опции
Defaults !tty_tickets
в ваших /etc/sudoers
файлах (вы знаете, как это сделать, иначе лучше этого не делать). Много информации можно найти в arch linux wiki . Обратите внимание, что после этого, в течение льготного периода, все пользовательские приложения могут получить привилегии без запроса пароля ...
Другая стратегия состоит в том, чтобы запросить весь сценарий для запуска в sudo
. Если вы беспокоитесь о том, чтобы все время работать с привилегиями root, вы можете удалить их и использовать их только при необходимости, используя os.seteuid()
.
Интересные ссылки здесь и здесь .
Другая стратегия - сделать setuid программы (для этого нужно использовать хитрость , см. Ссылки в ответе - это для bash, то же самое для python) и затем используйте, например, группы, если вы хотите ограничить доступ к пользователю (или отменить привилегии, а затем повторно включить его после запроса пароля).