htpasswd устанавливает неверный пароль, если в пароле есть специальные символы

htpasswd устанавливает неверный пароль, если в пароле есть специальные символы

Проблема
Я пытаюсь обновить пароли для большого списка пользователей, используя htpasswd. Я использую файл csv для извлечения новых паролей. Когда скрипт запускается, он, кажется, успешно обновляет пользователей. Однако пользователи не могут войти в систему, используя свои новые пароли. Вот скрипт:

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

Если запустить скрипт на тестовом csv без спецсимволов в паролях, то он работает.
Если запустить htpasswd -b /path/to/passwdFile username 'password'в командной строке (пароли со спецсимволами), то все работает как надо.

Почему скрипт не устанавливает правильный пароль?

Что я пробовал
Я пробовал запустить htpasswd, используя eval различные методы заключения $password в кавычки, например "'", '\'', "\'"

решение1

Публикую в надежде кому-то помочь.

Оказалось, проблема была не в скрипте. Файл csv был не чистый.

CSV был сгенерирован из Excel в среде Windows. Файл имел окончания строк dos - \r

Я добавил строку ниже перед строкой, вызывающей htpasswd.
password="${password/$'\r'/}"

Вот рабочий код:

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

Связанный контент