¡Estaba creando una aplicación GUI para administrar usuarios y grupos en Linux!
Terminé con la parte donde crea un nuevo usuario, pero me quedé con la parte donde le da al usuario recién creado una nueva contraseña. Lo que mi aplicación simplemente hace es tomar la entrada requerida (nombre de usuario, lista de grupos y contraseña) a través de una GUI y ejecuta un script que pasa esta información como argumento. Digamos que tenemos una cuenta de usuario, xyz. Si quiero cambiar la contraseña de esta cuenta, todo lo que necesito hacer es simplemente ejecutar el comando:
passwd xyz
Esto le pedirá una nueva contraseña. Ahora puedo crear una nueva cuenta usando scripts porque toda la información requerida se pasa en la línea de comando.
useradd -m -G users -g "groups" -s /bin/bash "UserName"
Puedo ejecutar un script a través de la aplicación Qt y crear el usuario, pero en passwd cmd
, la entrada se solicita en la otra línea. ¿Cómo se aborda eso?
Respuesta1
Creo que la respuesta correcta aquí es:no utilices una herramienta de línea de comandos: usa una llamada a la biblioteca. Esto le permitirá manejar mejor los errores y evitará el riesgo de pasar la contraseña en una línea de comando.
Una biblioteca que puedes usar eslibusero, que es relativamente simple y tiene enlaces de C y Python.
Respuesta2
Como root, puedes establecer sistemáticamente la contraseña de un usuario mediante un script utilizando este método:
$ echo -n "$passwd" | passwd "$uname" --stdin
Generando contraseñas
Me gusta usar la herramienta de línea de comando.pwgen
para generar contraseñas.
$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"
$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]
Options supported by pwgen:
-c or --capitalize
Include at least one capital letter in the password
-A or --no-capitalize
Don't include capital letters in the password
-n or --numerals
Include at least one number in the password
-0 or --no-numerals
Don't include numbers in the password
-y or --symbols
Include at least one special symbol in the password
-s or --secure
Generate completely random passwords
-B or --ambiguous
Don't include ambiguous characters in the password
-h or --help
Print a help message
-H or --sha1=path/to/file[#seed]
Use sha1 hash of given file as a (not so) random generator
-C
Print the generated passwords in columns
-1
Don't print the generated passwords in columns
-v or --no-vowels
Do not use any vowels so as to avoid accidental nasty words
¿Pero no es esto inseguro?
No. La contraseña se pasa a través de STDIN, por passwd
lo que, aunque es posible que alguien espíe los procesos a través de ps
, incluso eso no debería permitir que un usuario vea los procesos de root, la entrega de la contraseña está passwd
bloqueada.
Ejemplo
Digamos que ejecuto este comando en una terminal como root:
$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989
Luego ejecuto ps
en otra terminal:
$ ps -AOcmd | grep pass
14046 passwd samtest --stdin R pts/11 00:00:00 passwd samtest --stdin
Después de cambiar la contraseña en la primera terminal:
[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.
¿Qué pasa con el eco para pasar?
Incluso esto no filtra la contraseña. Aquí hay otra prueba que lo demuestra. Primero iniciamos este comando en una terminal secundaria. Esto recopilará la salida de ps
.
$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt
Luego ejecutamos nuestro comando de configuración de contraseña:
$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.
[1]+ Done echo "supersecret" | passwd "samtest" --stdin
Verificar el contenido de ps.txt
muestra que la contraseña no se ha filtrado:
$ grep supersecret ps.txt
$
Cambiar el ps
comando que usamos ps -eaf
tampoco lo filtra.
Respuesta3
passwd --help
en mi cuadro indica que root
puedo ejecutarlo para --stdin
alimentarlo con la nueva contraseña en stdin.
Respuesta4
El comando chpasswd lee una lista de pares de nombre de usuario/contraseña de la línea de comando para actualizar un grupo de usuarios existentes. Cada línea tiene el formato
user_name:password
Este comando está pensado para utilizarse en entornos de sistemas grandes donde se crean muchas cuentas a la vez. Para leer sobre más opciones de este comando, escriba
man chpasswd