¿Puedo cambiar una contraseña de usuario en Linux desde la línea de comandos sin interactividad?

15

Tengo un caso de uso específico en el que realmente me gustaría poder cambiar la contraseña de un usuario con un solo comando sin interactividad. Esto se está haciendo de manera segura (a través de SSH y en un sistema con un solo usuario que puede iniciar sesión), por lo que está bien exponer la nueva contraseña (e incluso la antigua, si es necesario) en la línea de comandos. FWIW, es un sistema Ubuntu.

Solo quiero evitar tener que agregar algo similar a lo esperado a este sistema solo para esta tarea.

Paul Hoffman
fuente
3
Para aquellos que quieran hacer esto en FreeBSD:echo "newpassword" | pw usermod theusername -h 0
Paul Hoffman

Respuestas:

25

Podrías usar chpasswd .

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

Puede usar usermodcon la -popción para proporcionar un hash de contraseña (no la contraseña real). Puede generar el hash de contraseña usando algo como mkpasswd -m sha-256omkpasswd -m md5

estofado
fuente
1
... Pero mi sistema AIX no tiene usermod: '(
Arreglaré
3

Seguro.

  1. Hash la contraseña en su sistema local.
  2. Conéctese a la máquina remota (donde desea cambiar la contraseña)
  3. Alimentar el hash de la contraseña y el nombre de usuario para un creador sedscript que actualiza archivos por contraseña del sistema ( /etc/shadow, /etc/master.passwd, sea lo que pasa a ser).
voretaq7
fuente
1

La passwdutilidad tiene una opción --stdin que establece:

Esta opción se utiliza para indicar que passwd debería leer la nueva contraseña de la entrada estándar, que puede ser una tubería.

Sintaxis:

echo "newpass" | passwd --stdin user1

Aunque mencionaste que no te importa, puedes poner la contraseña en un archivo de texto y luego hacerlo en cat pass.txtlugar del comando echo, de esa manera no aparece en el historial de bash.

Safado
fuente
Ese es. echo VerySecret | passwd --stdin username
MadHatter
55
Mi sistema Ubuntu no tiene --stdinuna opción para passwd.
Jeff Ferland
Tienes razón, no lo hace. Comprobé tanto en un sistema CentOS como en una Mac y tienen la opción --stdin, por lo que su eliminación debe ser algo de Ubuntu.
Safado
1
@RyanM. FreeBSD (y AFAIK NetBSD y OpenBSD, AIX, HP-UX y Solaris la última vez que revisé) tampoco son compatibles --stdin, principalmente porque es un gran agujero de seguridad gigante que espera suceder :-)
voretaq7
1
@quanta: O comienza la echo "newpass" | passwd --stdin user1línea con un espacio; de esa manera no irá a la historia de bash en absoluto.
Janne Pikkarainen
1

Si la --stdinopción no funciona, básicamente podemos usar dos opciones:

  1. Utilice otra utilidad llamada chpaswden su script.
  2. O usar echo "current_password\nnew_password\nnew_password" | passwd user_name
Sanjay s.
fuente