Como faço meu script pedir uma senha, como sudo?

6

Estou escrevendo um script que seria potencialmente perigoso se fosse executado de maneira errada. Como um recurso de segurança, quero que o script exija que o usuário insira novamente sua senha primeiro, assim como sudo faz.

Então, como faço isso? Em outras palavras, como faço para

a) insira a senha sem ecoar,

b) verifique a senha e

c) (para pontos de bônus) faça isso sem deixar a senha de texto simples em volta na memória para algum sujeito esperto sair de / proc ou algo assim?

Isso está em bash , mas qualquer outra variante padrão do shell do Linux estará ok se for mais fácil.

    
por spraff 20.09.2013 / 12:34

2 respostas

6

Tente:

su $USER -c true

E, em seguida, teste o valor de retorno em $ ?. Por exemplo:

echo "Really delete everything? Enter your password to confirm:"
su $USER -c true && rm -rf $HOME

O true está lá apenas como não operacional.

Para suprimir a saída do su, você pode redirecionar o stderr:

echo -n "Enter password for $USER:"
su $USER -c true 2>/dev/null  && echo -e "\nsuccess" || echo -e "\nfailure"

Você não pode omitir o parâmetro -c [command], pois isso criará uma nova instância interativa do bash (se você agrupá-lo em subshells ou não):

$ ((su $USER ) && echo ok) ; echo "exit status:$?"
Password: 
$ echo $SHLVL 
2
$ exit
ok
exit status:0
$ echo $SHLVL 
1

Então, o exemplo nos comentários abaixo:

((su $USER >/dev/null 2>&1) && echo ok) || echo no

não exibiu nada (a menos que a autenticação de segurança tenha falhado) porque com uma senha correta você está trabalhando em um shell aninhado (com toda a saída de tela redirecionada). Pressione CTRL-D (para sair do shell) e você verá "ok" ecoado.

    
por 20.09.2013 / 15:19
0

IMO A melhor prática aqui é exigir privilégios de administrador para executar o script, alterando as permissões / propriedade do arquivo. Dessa forma, você usa a implementação padrão em vez de reinventar a roda criando um recurso personalizado de verificação de senha (em outras palavras, é necessário que o usuário esteja logado como root, esteja na lista de sudoers e use sudo ou use su para se tornar root).

Clique com o botão direito do mouse no script, clique em Propriedades e, em seguida, na guia Permissões para alterar as permissões / propriedade. Ou use chmod / chown para fazer isso (veja as man pages para mais informações). Faça tudo isso como root.

    
por 20.09.2013 / 13:41