Cambiar la contraseña de usuario a través de la aplicación GUI

Cambiar la contraseña de usuario a través de la aplicación GUI

¡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.pwgenpara 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 passwdlo 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á passwdbloqueada.

Ejemplo

Digamos que ejecuto este comando en una terminal como root:

$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989

Luego ejecuto psen 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.txtmuestra que la contraseña no se ha filtrado:

$ grep supersecret ps.txt
$

Cambiar el pscomando que usamos ps -eaftampoco lo filtra.

Respuesta3

passwd --helpen mi cuadro indica que rootpuedo ejecutarlo para --stdinalimentarlo 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

información relacionada