
問題
を使用して、多数のユーザーのパスワードを更新しようとしています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'
、すべて正常に機能します。
スクリプトがパスワードを正しく設定できないのはなぜですか?
私が試したことeval
私は $password を引用符で囲むさまざまな方法 ("'", '\'', "\'") を使用して htpasswd を実行しようとしました。
答え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