
問題
我正在嘗試使用 更新大量用戶的密碼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'
在命令列上運行(帶有特殊字元的密碼),一切都會按預期運行。
為什麼腳本無法正確設定密碼?
我嘗試過的
我嘗試使用運行 htpasswdeval
我嘗試過引用 $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