Lo que me gustaría lograr es un programa interactivo que se ejecute antes o después de pedirle al usuario la contraseña, pero no controlará el acceso a la computadora a menos que salga con éxito. Para hacerlo algo más comprensible, aquí hay un ejemplo:
Me gustaría obtener acceso a mi computadora, primero escribiendo mi nombre de usuario, luego mi contraseña, y luego respondiendo correctamente una simple pregunta matemática generada al azar.
Para que esto funcione, utilizo el siguiente archivo de autenticación del sistema:
auth required pam_unix.so try_first_pass nullok nodelay
auth optional pam_faildelay.so delay=600000
auth optional pam_exec.so stdout /home/math
auth optional pam_permit.so
auth required pam_env.so
El problema es que el programa llamado matemática no puede manejar las entradas del usuario, ya que lee automáticamente un EOF de PAM, lo que esencialmente lo vuelve inútil. También probé la siguiente variante de la línea cuestionable, en cuyo caso se lee en la contraseña, que tampoco es lo que quiero:
auth optional pam_exec.so stdout expose_authtok /home/math
fuente
Respuestas:
No hay stdout / stdin allí en la etapa PAM. Debe llamar a
pam_conv(3)
través depam_get_item(3)
para realizar E / S.Buen ejemplo en ben.akrin.com que incluye el ejemplo relevante de fuente C.
fuente