estratégia “sudoing” para script python no Ubuntu

1

Estou criando um programa de roteador pequeno (frontend do GTK) em Python para alguns de nossos usuários menos experientes em CLI. Eu desenvolvi o front-end glade e capaz de conectar os vários sinais. Agora, estou enfrentando apenas um problema que é criar a interface 'sudo'.

Por alguns motivos, não queremos que o usuário inicie o programa usando o gksu, mas forneça a ele uma caixa de diálogo de senha que será posteriormente armazenada no programa (semelhante ao que acontece com o gerenciador de pacotes synaptic).

O problema é que o script funciona bem quando eu testei no desktop GNOME 3 onde o desenvolvi, mas no ubuntu o comando gksu não está salvando nada no keyring. Em vez disso, pede senha para cada comando! Aqui está a função no programa que chama 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

E aqui está um exemplo de como eu chamo a função de execução em algumas partes do meu programa:

#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')

Como faço para que o gksu chame armazena a senha no chaveiro ou algo assim e não incomoda o usuário toda vez?

    
por Prahlad Yeri 14.01.2014 / 18:09

1 resposta

3

Não tenho certeza sobre isso, mas provavelmente será necessário desativar a opção "tty_tickets" em /etc/sudoers . Normalmente, o "período de tolerância" de sudo que não pede uma senha novamente é vinculado ao tty. Consulte o manual .

Aviso --- isso pode ser uma ameaça à segurança.

Basicamente, você deve adicionar à opção

Defaults   !tty_tickets

em seus arquivos /etc/sudoers (você sabe como fazê-lo, caso contrário, melhor não fazê-lo). Muitas informações são encontradas no wiki do arch linux . Observe que, depois disso, durante o período de tolerância, todos os aplicativos do usuário podem obter privilégios sem solicitar uma senha ...

A outra estratégia é solicitar que todo o script seja executado em sudo . Se você estiver preocupado em executar todos os tempos com privilégios de root, poderá soltá-los e usá-los somente quando necessário usando os.seteuid() .

Links interessantes aqui e aqui .

Outra estratégia é tornar o programa setuid (você tem que usar algum truque para fazer isso , veja os links na resposta - é para bash, o mesmo para python), e então use por exemplo grupos se você quiser restringir o acesso ao usuário (ou descartar privilégios e reative-o depois de solicitar uma senha).

    
por Rmano 14.01.2014 / 18:39