htpasswd setzt ein falsches Passwort, wenn das Passwort Sonderzeichen enthält

htpasswd setzt ein falsches Passwort, wenn das Passwort Sonderzeichen enthält

Das Problem
Ich versuche, die Passwörter für eine große Liste von Benutzern zu aktualisieren htpasswd. Ich verwende eine CSV-Datei, um die neuen Passwörter abzurufen. Wenn das Skript ausgeführt wird, scheint es die Benutzer erfolgreich zu aktualisieren. Benutzer können sich jedoch nicht mit ihren neuen Passwörtern anmelden. Hier ist das Skript:

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

Wenn ich das Skript mit einer Test-CSV-Datei ohne Sonderzeichen in den Passwörtern ausführe, funktioniert es.
Wenn ich es htpasswd -b /path/to/passwdFile username 'password'auf der Befehlszeile ausführe (Passwörter mit Sonderzeichen), funktioniert alles wie es soll.

Warum kann das Skript das Passwort nicht richtig festlegen?

Was ich versucht habe
Ich habe versucht, htpasswd auszuführen. eval Ich habe verschiedene Methoden ausprobiert, um $password in Anführungszeichen zu setzen, d. h. "'", "\'', "\'"

Antwort1

Ich poste in der Hoffnung, jemandem zu helfen.

Es stellte sich heraus, dass das Problem nicht beim Skript lag. Die CSV-Datei war nicht sauber.

Die CSV-Datei wurde aus Excel in einer Windows-Umgebung generiert. Die Datei hatte DOS-Zeilenenden - \r

Ich habe die folgende Zeile vor der Zeile hinzugefügt, die htpasswd aufruft.
password="${password/$'\r'/}"

Hier ist der funktionierende Code:

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

verwandte Informationen