htpasswd establece una contraseña incorrecta cuando la contraseña tiene caracteres especiales

htpasswd establece una contraseña incorrecta cuando la contraseña tiene caracteres especiales

El problema
Estoy intentando actualizar las contraseñas de una lista grande de usuarios que utilizan htpasswd. Estoy usando un archivo csv para ingresar las nuevas contraseñas. Cuando se ejecuta el script, parece actualizar correctamente a los usuarios. Sin embargo, los usuarios no pueden iniciar sesión con sus nuevas contraseñas. aquí está el guión:

#!/bin/bash

# Bash to update passwords from csv
CSV=intranet_users.csv
OLDIFS=$IFS
IFS=','
[ ! -f $CSV ] && { echo "$CSV file not found"; exit 99; }
  while read name dept username password
   do
     if [ "${username}" != '#N/A' ] && [ "${username}" != 0 ]; then
        echo "Resetting password for $username to: ${password}"
        htpasswd -b /path/to/passwdFile $username '${password}'
     fi
   done < $CSV
IFS=$OLDIFS

Si ejecuto el script en un csv de prueba sin caracteres especiales en las contraseñas, funciona.
Si ejecuto htpasswd -b /path/to/passwdFile username 'password'en la línea de comando (contraseñas con caracteres especiales), todo funciona como debería.

¿Por qué el script no establece la contraseña correctamente?

lo que he probado
Intenté ejecutar htpasswd usando eval He probado varios métodos para citar $contraseña, es decir, "'", '\'', "\'"

Respuesta1

Publicar con la esperanza de ayudar a alguien.

Resulta que el problema no estaba en el guión. El archivo csv no estaba limpio.

El csv se generó desde Excel en entorno Windows. El archivo tenía dos finales de línea - \r

Agregué la línea siguiente antes de la línea que llama a htpasswd.
password="${password/$'\r'/}"

Aquí está el código de trabajo:

CSV=intranet_users.csv
OLDIFS=$IFS
IFS=','
[ ! -f $CSV ] && { echo "$CSV file not found"; exit 99; }
while read name dept username password
do
    if [ "${username}" != '#N/A' ] && [ "${username}" != 0 ]; then
       password="${password/$'\r'/}"
       echo "Resetting password for $username to: $password"
       htpasswd -b /path/to/passwdFile $username ${password}
    fi
done < $CSV
IFS=$OLDIFS

información relacionada