当密码包含特殊字符时,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 是在 Windows 环境中从 Excel 生成的。该文件有 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

相关内容