linux - resueltos - Usar el comando passwd desde dentro de un script de shell
scripts linux ejercicios resueltos (12)
¿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).
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
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
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.
Hoy en día:
echo "user:pass" | chpasswd
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 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, 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).
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 "<user>:<password>" | chpasswd
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
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
Puede usar la utilidad de expect
para controlar todos los programas 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.
Puedes usar chpasswd
echo $1:$2 | chpasswd
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