Posso alterar uma senha de usuário no Linux na linha de comando sem interatividade?

15

Eu tenho um caso de uso específico em que realmente gostaria de poder alterar a senha de um usuário com um único comando sem interatividade. Isso está sendo feito de maneira segura (através do SSH e em um sistema com apenas um usuário apto a efetuar login), portanto, é bom expor a nova senha (e até a antiga, se necessário) na linha de comando. FWIW, é um sistema Ubuntu.

Eu só quero evitar ter que adicionar algo esperado no sistema para essa tarefa.

Paul Hoffman
fonte
3
Para aqueles que querem fazer isso no FreeBSD:echo "newpassword" | pw usermod theusername -h 0
Paul Hoffman

Respostas:

25

Você poderia usar chpasswd .

echo user:pass | /usr/sbin/chpasswd
xofer
fonte
5

Você pode usar usermodcom a -popção para fornecer um hash de senha (não a senha real). Você pode gerar o hash da senha usando algo como mkpasswd -m sha-256oumkpasswd -m md5

ensopado
fonte
1
... Mas meu sistema AIX não tem usermod: "(- Vou consertar as tags sobre a questão.
voretaq7
3

Certo.

  1. Hash a senha no seu sistema local.
  2. Conecte-se à máquina remota (onde deseja alterar a senha)
  3. Alimente o hash de senha e nome de usuário para um criativo sedroteiro que atualiza arquivo de senhas do seu sistema ( /etc/shadow, /etc/master.passwd, seja o que passa a ser).
voretaq7
fonte
1

O passwdutilitário possui uma opção --stdin que afirma:

Esta opção é usada para indicar que o passwd deve ler a nova senha da entrada padrão, que pode ser um canal.

Sintaxe:

echo "newpass" | passwd --stdin user1

Mesmo que você tenha mencionado que não se importa, você pode colocar a senha em um arquivo de texto e, em seguida, em cat pass.txtvez do comando echo, para que não apareça no histórico do bash.

Safado
fonte
Esse é esse. echo VerySecret | passwd --stdin username
precisa
5
Meu sistema Ubuntu não tem --stdincomo opção passwd.
Jeff Ferland
Você está certo, não. Eu verifiquei no sistema CentOS e no Mac e eles têm a opção --stdin, portanto a remoção deve ser uma coisa do Ubuntu.
Safado
1
@RyanM. FreeBSD (e AFAIK NetBSD e OpenBSD, AIX, HP-UX e Solaris passado eu Checke) não suportam --stdintanto - principalmente porque é uma falha de segurança gigante grande esperando para acontecer :-)
voretaq7
1
@quanta: Ou comece a echo "newpass" | passwd --stdin user1linha com um espaço; dessa forma, não vai estragar a história.
Janne Pikkarainen
1

Se a --stdinopção não estiver funcionando, podemos basicamente usar duas opções:

  1. Ou use outro utilitário chamado chpaswdem seu script.
  2. OU use echo "current_password\nnew_password\nnew_password" | passwd user_name
Sanjay s.
fonte