Passando a senha root com segurança em um script de shell

Passando a senha root com segurança em um script de shell

Eu sempre inicializo meu laptop GNU/Linux no modo console. Mas às vezes preciso ativar o modo GUI. sempre requer a inserção da senha root. Então escrevi o seguinte script "gogui.sh" e coloquei-o /usr/bin:

#!/bin/bash
echo "mypassword" | sudo service lightdm start

É uma ideia realmente estúpida, como se alguém lesse o arquivo pudesse ver facilmente minha senha.

É uma alternativa para isso?

Responder1

Passar uma senha para o sudo em um script é totalmente inútil. Em vez disso, adicione uma regra sudoadicionando o comando específico que você deseja executar com a NOPASSWDtag. Tome cuidado para que a NOPASSWDregra específica do comando venha depois de qualquer regra geral.

saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start

Mas isso provavelmente não é útil de qualquer maneira. lightdm startinicia um prompt de login, mas você só precisa disso se quiser permitir que outros usuários façam login graficamente. Você não precisa disso se tudo o que deseja é iniciar uma sessão GUI. Em vez disso, liguestartxpara iniciar uma sessão GUI a partir de sua sessão em modo texto. Isso não requer nenhum privilégio extra.

Pode ser necessário especificar explicitamente seu gerenciador de janelas ou ambiente de área de trabalho, pois startxpode não escolher o mesmo tipo de sessão padrão que o lightdm usa.

startx -- gnome-session

Responder2

Existem algumas opções, e uma delas é adicionar o comando específico usando visudoo flag NOPASSWD:

%wheel ALL=(ALL) NOPASSWD: /path/to/myscript

cat /path/to/myscript
#!/bin/bash
service lightdm start

Responder3

EDITAR
Acabei de notar em seus comentários que você mencionou o Unity, então parece que você está executando o Ubuntu. Minha resposta original foi voltada paraSysVinitsistemas, mas comandos comotelinitainda existem para compatibilidade e funcionarão em distros usandoSistemaouSubir na vida.

Maneira SysV

    telinit 5

Em sistemas Systemd modernos,telinité redirecionado parasystemctl.

Maneira do sistema

    systemctl isolate runlevel5.target

ou

    systemctl isolate graphical.target

Resposta original:
Em distros mais antigas que não sejam Systemd (RHEL/CentOS 6 e anteriores, por exemplo), a maneira mais fácil de alternar do modo console para GUI é com otelinitcomando. Nas distribuições RHEL/Centos, por exemplo, o modo multiusuário baseado em texto é executado no nível 3 e o modo GUI multiusuário é executado no nível 5. A mudança do modo console para o modo GUI seria feita assim: Por padrão, telinitrequer root privilégios. Para executar isso como um usuário normal sem senha, você precisará de uma sudoersentrada ou definir o sinalizador setuid definido no executável telinit. O sudométodo é a abordagem preferida, pois pode ser restrito apenas à sua conta.

Responder4

Como você está se referindo especificamente a sudo, sigaResposta de Gilles. No entanto, como o título da sua pergunta era apenas sobre como obter uma senha para um programa, stdintive uma situação semelhante recentemente:

echo $(read -sp "Password: " password; echo $password) | yourcommand

Provavelmente ganharei algumas críticas por isso, mas funcionou.

Falando nisso bash, você provavelmente também pode usar

yourcommand <$(read -sp "Password: " password; echo $password)

informação relacionada