
문제
을(를) 사용하여 대규모 사용자 목록의 비밀번호를 업데이트하려고 합니다 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