it-swarm-es.tech

Usando el comando passwd desde 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 pedirme interactivamente la nueva contraseña. Mi código está abajo.

adduser $ 1 
 contraseña $ 1 
 $ 2 
 $ 2
56
Jared

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.

Asi que en tu caso

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

[ Actualización ] algunos problemas fueron mencionados en los comentarios:

Es posible que su comando passwd no tenga una opción --stdin: use la utilidad chpasswd en su lugar, como lo sugiere ashawley .

Si usa un Shell que no sea bash, "echo" podría no ser un comando integrado, y el Shell llamará /bin/echo. Esto es inseguro porque la contraseña se mostrará en la tabla de procesos y se puede ver con herramientas como ps.

En este caso, deberías 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
81
8jean

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: Cambio de contraseña a través de un script

47
Fernando Kosh

Lee las palabras sabias de:

Yo cito:

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

No obstante, recibimos hordas de usuarios que preguntan cómo pueden eludir los 35 años de seguridad de Unix.

Continúa explicando cómo puede configurar su shadow(5) contraseña correctamente, y le muestra el GNU -sólo me preocupo por la seguridad si no me hace pensar demasiado)- forma de abusar passwd(1).

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

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 con el más mínimo indicio de acceso a la caja puede estar monitoreando ps o similar y robar la contraseña. Incluso si crees que tu caja es segura; es algo que debe realmente tener el hábito de evitar a toda costa (sí, incluso el costo de hacer un poco más de dificultad para hacer el trabajo).

25
lhunath

Hoy en día:

echo "user:pass" | chpasswd

23
BlackNoxis

Podrías usar chpasswd

echo $1:$2 | chpasswd

1
bsmoo

Para aquellos que necesitan 'ejecutar como root' de forma remota a través de un script que ingresa a una cuenta de usuario en el archivo sudoers, encontré un hack horrible y horrible, que sin duda es muy inseguro:

sshpass -p 'userpass' ssh -T -p port [email protected] << EOSSH
Sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH
1
Raydude

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 (enviada en un Ubuntu 14.04).

Si alguno de ustedes experimenta lo mismo, puede solucionarlo como lo hice yo: usando el comando chpasswd así:

echo "<user>:<password>" | chpasswd

0
Mariano Anaya

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

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

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

0
rmeador

Esta es la respuesta definitiva para un administrador de nodo teradata.

Vaya a su archivo /etc/hosts y cree una lista de nombres de IP o de nodos en un archivo de texto.

SMP007-1
SMP007-2
SMP007-3

Pon el siguiente script en un archivo.

#set a password across all nodes
printf "User ID: "
read MYUSERID
printf "New Password: "
read MYPASS

while read -r i; do
    echo changing password on "$i"
    ssh [email protected]"$i" Sudo echo "$MYUSERID":"$MYPASS" | chpasswd
    echo password changed on "$i"
done< /usr/bin/setpwd.srvrs

Bien, sé que he roto una regla de seguridad cardinal con ssh y root, pero les dejo a ustedes que la gente de seguridad se ocupe de eso.

Ahora ponga esto en su subdirectorio /usr/bin junto con su archivo de configuración setpwd.srvrs.

Cuando ejecuta el comando, se le solicita una vez la ID de usuario y una vez para la contraseña. Luego, la secuencia de comandos atraviesa todos los nodos en el archivo setpwd.srvrs y realiza una ssh sin contraseña para cada nodo, luego establece la contraseña sin ninguna interacción del usuario o validación de contraseña secundaria.

0
JohnS

Probé esto en una imagen de CentOS VMWare que guardo para este tipo de cosas. Tenga en cuenta que probablemente desee evitar colocar contraseñas como argumentos de la línea de comandos, ya que cualquiera en toda la máquina puede leerlas en 'ps -ef'.

Dicho esto, esto funcionará:

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