
Проблема
Я пытаюсь обновить пароли для большого списка пользователей, используя 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