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

관련 정보