htpasswd define senha incorreta quando a senha possui caracteres especiais

htpasswd define senha incorreta quando a senha possui caracteres especiais

O problema
Estou tentando atualizar senhas para uma grande lista de usuários que usam o htpasswd. Estou usando um arquivo csv para obter as novas senhas. Quando o script é executado, parece que os usuários foram atualizados com êxito. No entanto, os usuários não conseguem fazer login usando suas novas senhas. aqui está o roteiro:

#!/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

Se eu executar o script em um csv de teste sem caracteres especiais nas senhas, ele funcionará.
Se eu executar htpasswd -b /path/to/passwdFile username 'password'na linha de comando (senhas com caracteres especiais), tudo funcionará como deveria.

Por que o script não consegue definir a senha corretamente?

O que eu tentei
Eu tentei executar o htpasswd usando eval vários métodos de citar $ senha, ou seja, "'", '\'', "\'"

Responder1

Postando na esperança de ajudar alguém.

Acontece que o problema não estava no script. O arquivo csv não estava limpo.

O csv foi gerado a partir do Excel em ambiente Windows. O arquivo tinha finais de linha dos - \r

Adicionei a linha abaixo antes da linha que chama htpasswd.
password="${password/$'\r'/}"

Aqui está o código funcional:

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

informação relacionada