Usar el comando passwd desde dentro de un script de shell

Estoy escribiendo un script de shell para agregar automáticamente un nuevo usuario y actualizar su contraseña. No sé cómo obtener una contraseña para leer desde el script de shell en lugar de solicitar de manera interactiva la nueva contraseña. Mi código está abajo.

  adduser $ 1
 passwd $ 1
 $ 2
 $ 2 

de ” man 1 passwd “:

  --stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe. 

Entonces en tu caso

 adduser "$1" echo "$2" | passwd "$1" --stdin 

[ Actualización ] se mencionaron algunos problemas en los comentarios:

Su comando passwd puede no tener una opción --stdin : use la utilidad chpasswd lugar, como lo sugiere ashawley .

Si utiliza un shell que no sea bash, “echo” podría no ser un comando incorporado, y el shell llamará a /bin/echo . Esto es inseguro porque la contraseña aparecerá en la tabla de procesos y se puede ver con herramientas como ps .

En este caso, debe usar otro lenguaje de scripting. Aquí hay un ejemplo en Perl:

 #!/usr/bin/perl -w open my $pipe, '|chpasswd' or die "can't open pipe: $!"; print {$pipe} "$username:$password"; close $pipe 

La única solución funciona en Ubuntu 12.04:

 echo -e "new_password\nnew_password" | (passwd user) 

Pero la segunda opción solo funciona cuando cambio de:

 echo "password:name" | chpasswd 

A:

 echo "user:password" | chpasswd 

Ver explicaciones en la publicación original: Cambiar la contraseña a través de una secuencia de comandos

Lee las sabias palabras de:

Yo cito:

Nada de lo que puedas hacer en bash puede funcionar. passwd (1) no lee de la entrada estándar. Esto es intencional. Es para tu protección. Las contraseñas nunca fueron pensadas para ser puestas en progtwigs o generadas por progtwigs. Estaban destinados a ser ingresados ​​solo por los dedos de un ser humano real, con un cerebro funcional, y nunca, jamás escritos en ningún lado.

No obstante, tenemos muchos usuarios que preguntan cómo pueden eludir 35 años de seguridad de Unix.

Continúa explicando cómo puede establecer su contraseña shadow(5) correctamente, y le muestra el GNU -I-only-care-about-security-si-no-does-make-me-me-think-too-much vía de abuso passwd(1) .

Por último, si va a utilizar la estúpida extensión GNU passwd (1) --stdin , no pase la contraseña poniéndola en la línea de comando.

 echo $mypassword | passwd --stdin # Eternal Sin. echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE. passwd --stdin < << "$mypassword" # A little less insecure, still pretty insecure, though. passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure. 

Lo último es lo mejor que puedes hacer con GNU passwd . Aunque todavía no lo recomendaría.

Poner la contraseña en la línea de comando significa que cualquier persona que tenga la más remota pista de acceso a la caja puede estar monitoreando ps o algo así y robar la contraseña. Incluso si crees que tu caja es segura; es algo que realmente debe tener el hábito de evitar a toda costa (sí, incluso el costo de hacer un poco más problemas para hacer el trabajo).

Hoy en día:

echo "user:pass" | chpasswd

Puedes usar chpasswd

echo $1:$2 | chpasswd

¿Has mirado la opción -p de adduser (que AFAIK es solo otro nombre para useradd )? También puede mirar la opción -P de luseradd que toma una contraseña de texto plano, pero no sé si luseradd es un comando estándar (puede ser parte de SE Linux o tal vez solo una rareza de Fedora).

Probé esto en una imagen de CentOS VMWare que guardo para este tipo de cosas. Tenga en cuenta que probablemente quiera evitar poner contraseñas como argumentos de línea de comandos, porque cualquiera en toda la máquina puede leerlos desde ‘ps -ef’.

Dicho eso, esto funcionará:

 user="$1" password="$2" adduser $user echo $password | passwd --stdin $user 

Me encontré con el mismo problema y por alguna razón la opción “–stdin” no estaba disponible en la versión de passwd que estaba usando (incluida en Ubuntu 14.04).

Si alguno de ustedes experimenta lo mismo, puede chpasswd como lo hice: usando el comando chpasswd esta manera:

echo ":" | chpasswd

Esta es la respuesta definitiva para un administrador de nodo teradata

1: vaya a su archivo / etc / hosts y cree una lista de direcciones IP o nombres de nodos en un archivo de texto

—————— el archivo de configuración para los servidores comienza ————
SMP007-1
SMP007-2
SMP007-3
—— archivo final omita estos comentarios del archivo cfg —

ahora el guion

establecer una contraseña en todos los nodos

printf “ID de usuario:”
leer MYUSERID
printf “Nueva contraseña:”
leer MYPASS

para i en ` cat / usr/bin/setpwd.srvrs`
hacer
echo cambiando la contraseña en $ i
ssh root @ $ i sudo echo “$ MYUSERID”: “$ MYPASS” | chpasswd
la contraseña de eco cambió en $ i
hecho

de acuerdo, sé que he infringido una regla de seguridad cardinal con ssh y root, pero les dejaré que la gente de seguridad se ocupe de ello

_________________________________
pon esto en tu / usr / bin subdir junto con tu archivo de configuración setpwd.srvrs

cuando ejecuta el comando, le solicita una vez la ID de usuario
luego una vez para la contraseña. Entonces el script atraviesa todos los nodos
en el archivo setpwd.srvrs hace un ssh sin contraseña para cada nodo
luego establece la contraseña sin ninguna interacción del usuario o secundaria
validación de contraseña. Ahora, ¿cuántas veces has querido hacer esto?
pero no sabia como? Con gran necesidad, viene una gran innovación.

Piensa en lo útil que es algo como esto para un administrador con cientos
de servidores.

Para aquellos que necesitan ‘ejecutar como root’ de forma remota a través de un script que inicia sesión en una cuenta de usuario en el archivo sudoers, encontré un truco malvado, que sin duda es muy inseguro:

 sshpass -p 'userpass' ssh -T -p port user@server < < EOSSH sudo -S su - << RROOT userpass echo "" echo "*** Got Root ***" echo "" #[root commands go here] useradd -m newuser echo "newuser:newpass" | chpasswd RROOT EOSSH 

Puede usar la utilidad de expect para controlar todos los progtwigs que leen desde un tty (a diferencia de stdin, que es lo que hace passwd). Esperar viene con ejemplos listos para ejecutar para todo tipo de problemas interactivos, como la entrada de contraseña.

Algunas veces es útil establecer una contraseña que nadie conoce. Esto parece funcionar:

 tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user