
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