Alterar senha programaticamente

11

Na versão atual do Raspian, eu sei que é possível alterar a senha do usuário conectado atual na linha de comando da seguinte maneira:

sudo passwd

que solicitará ao usuário que digite uma nova senha duas vezes. Isso produzirá saída da seguinte forma:

Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Eu queria saber se existe uma maneira possível de alterar uma senha programaticamente, como em um script de shell.

Estou tentando criar um script de configuração para implantar nos meus Raspberry Pis e não quero digitar manualmente novas senhas para eles.

James Taylor
fonte
1
Para alterar a senha do usuário atual, você não precisa prefixar sudo. Se você usar sudo, poderá forçar uma nova senha para qualquer usuário sem precisar saber a senha atual do usuário.
roaima
expect(1)poderia ajudar também.
SailorCire
Lembre-se de considerar as implicações de segurança ao alterar programaticamente senhas.
Josh Habdas

Respostas:

18

Você está procurando o chpasswdcomando. Você faria algo assim:

echo 'pi:newpassword' | chpasswd # change user pi password to newpassword

Observe que ele precisa ser executado como root, pelo menos com a configuração padrão do PAM. Mas, presumivelmente, executar como root não é um problema para um script de implantação do sistema.

Além disso, você pode fazer vários usuários ao mesmo tempo, alimentando várias linhas de entrada.

derobert
fonte
9

Outra alternativa é usar o yescomando no seu script.

yes newpassword | passwd youruser

Isto irá enviar newpasswordpara o passwdcomando para youruser.

Deve-se mencionar que definir / modificar senhas de usuários por meio de scripts pode apresentar riscos à segurança e deve ser evitado sempre que possível.

EDITAR:

Esta resposta requer acesso root. Desculpas por não mencionar isso anteriormente. É um método que eu uso ao executar tarefas de administração que exigem acesso root.

Timothy Martin
fonte
Você já tentou isso?
roaima
Sim. Eu tenho usado esse método há anos. Eu testei antes de postar minha resposta e novamente agora.
Timothy Martin
Mesmo assumindo a passwdleitura em stdinvez de um terminal (teclado), como isso funciona quando passwdsolicita primeiro a senha antiga do usuário e depois solicita a nova?
roaima
@roaima possivelmente Timothy o executa como root (o que explicaria por que ele precisa youruserno final). Pode funcionar em algum lugar ...
derobert
1
@roaima O passwdcomando dos utilitários de sombra do Linux aceita entrada redirecionada (diferente de, por exemplo, o OpenSSH ssh). Usar yesnão é uma boa ideia: ela expõe a senha aos bisbilhoteiros que olham a lista de processos na hora errada. O uso echonão teria esse defeito porque é um shell embutido.
Gilles 'SO- stop be evil'