Script para usar o sudo em um terminal, gksudo caso contrário?

0

Gostaria de escrever um script que faça uma tarefa de administração e gostaria de poder executá-lo a partir de um terminal ou não. Se for executado em um terminal, até mesmo em um gráfico, eu gostaria que ele pedisse a senha usando o sudo. Se for executado de alguma outra forma (por exemplo, a caixa de diálogo Alt + F2), ele deverá usar o gksudo. Alguma solução?

Resposta

Com base no abaixo, é isso que eu criei:

#!/bin/sh

SUDO="/usr/bin/sudo"

if [ -t 1 ]; then
  "$SUDO" "$@";
else
  gksudo -- "$SUDO" "$@";
fi

O caso um pouco estranho para o gksudo é garantir que as opções sejam analisadas pelo sudo e não pelo gksudo, porque elas possuem diferentes opções de linha de comando.

    
por Ryan Thompson 05.08.2010 / 18:43

3 respostas

1

Examine a saída de env quando estiver executando o terminal e quando for lançado pelo gui. Meu palpite é que o Gnome (ou qualquer gerenciador de janelas que você esteja usando) está adicionando uma variável de ambiente ou duas.

Outra opção é verificar se há um tty associado a ele usando if [ -t 1 ] , conforme mostrado em esta resposta (note as ressalvas nos comentários).

    
por 05.08.2010 / 19:57
1

Eu acredito que o método mais comum é simplesmente afirmar que o script requer que o sudo seja executado, como em:

sudo ./script_name.sh

Desta forma, todo o script é executado com privilégios administrativos. Se você pensar sobre isso do ponto de vista do modelo de segurança, não há razão para que um script que precise de sudo por pelo menos parte dele, não seja executado com o sudo. Caso contrário, é apenas um incômodo.

No entanto, se você insistir em usar o sudo para apenas algumas partes, poderá colocar o sudo no seu script bash e ele solicitará a senha e aguardará a entrada até continuar a execução do script. Depois de obter pelo menos uma entrada de senha sudo, todos os sudos subsequentes manterão os privilégios elevados e não solicitarão a senha novamente. Ele também lhe deixará sessão de terminal inteira com privilégios elevados para futuro sudo não executado dentro do script.

Quanto ao gksudo, acho que uma opção é dizer ao indivíduo para usar o diálogo de execução alt-f2 e, em vez de digitar sudo script_name.sh, digite gksudo e clique no botão "Executar com arquivo" e faça com que eles naveguem para e selecione o arquivo de script que eles precisam executar. Eu sei que é complicado. Espero que alguém tenha uma solução mais elegante.

    
por 05.08.2010 / 18:52
0
if [ "$DISPLAY" ]; then
    gksudo foo
else
    sudo foo
fi

perto o suficiente.

    
por 05.08.2010 / 20:58