パスワードに特殊文字が含まれている場合、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'、すべて正常に機能します。

スクリプトがパスワードを正しく設定できないのはなぜですか?

私が試したこと
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

関連情報