问题
我正在尝试使用 更新大量用户的密码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