····exit 1
··elif [! -w $passwdfile]; then
····echo "Error: can't write to password file: can't update."
····exit 1
··fi
··echo "
"
··echo "Apache Password Manager"
··action="$(echo $QUERY_STRING | cut −c3)"
··user="$(echo $QUERY_STRING|cut −d\& −f2|cut −d= −f2 |\
··tr '[: upper: ]' '[: lower: ]')"
··case "$action" in
····A) echo "
Adding New User $user
"
········if [! -z "$(grep −E "^${user}:" $passwdfile)"]; then
··········echo "Error: user $user already appears in the file."
········else
··········pass="$(echo $QUERY_STRING|cut −d\& −f3|cut −d= −f2)"
··········if [! -z "$(echo $pass|tr −d '[[: upper: ][:lower: ][:digit: ]]')"];
··········then
············echo "Error: passwords can only contain a-z A-Z 0–9 ($pass)"
··········else
············$htpasswd $passwdfile "$user" "$pass"
············echo "Added!
"
··········fi
········fi
········;;
····U) echo "
Updating Password for user $user
"
········if [-z "$(grep −E "^${user}:" $passwdfile)"]; then
··········echo "Error: user $user isn't in the password file?"
··········echo "searched for "^${user}:" in $passwdfile"
········else
··········pass="$(echo $QUERY_STRING|cut −d\& −f3|cut −d= −f2)"
··········if [! -z "$(echo $pass|tr −d '[[: upper: ][:lower: ][:digit: ]]')"];
··········then
············echo "Error: passwords can only contain a-z A-Z 0–9 ($pass)"
··········else
············grep −vE "^${user}:" $passwdfile | tee $passwdfile > /dev/null
············$htpasswd $passwdfile "$user" "$pass"
············echo "Updated!
"
··········fi
········fi
········;;
····D) echo "
Deleting User $user
"
········if [-z "$(grep −E "^${user}:" $passwdfile)"]; then
··········echo "Error: user $user isn't in the password file?"
········elif ["$user" = "admin"]; then
··········echo "Error: you can't delete the 'admin' account."
········else
··········grep −vE "^${user}:" $passwdfile | tee $passwdfile >/dev/null
··········echo "Deleted!
"
········fi
········;;
··esac
··# Всегда перечислять текущих пользователей в файле паролей…
··echo "
"
··echo "
"
··oldIFS=$IFS; IFS=":" # Изменить разделитель слов…
··while read acct pw; do
····echo "
"
··done < $passwdfile
··echo "
List "
··echo "of all current users
|
$acct |
"
····echo "[delete]
|
"
··IFS=$oldIFS·········· #…и восстановить его.
··# Собрать строку выбора со всеми учетными записями…
··optionstring="$(cut −d: −f1 $passwdfile | sed 's/^/
/'|tr '\n' ' ')"
··if [! -r $footer]; then
····echo "Warning: can't read $footer"
··else
····#…и вывести нижний колонтитул.
····sed −e "s/-myname-/$myname/g" −e "s/-options-/$optionstring/g" < $footer
··fi
··exit 0
Для нормальной работы этого сценария требуется очень многое. Необходимо правильно настроить не только конфигурацию веб-сервера Apache (или эквивалентного ему), но и содержимое файла .htaccess , и в файле .htpasswd должна иметься хотя бы запись для пользователя admin.
Сам сценарий извлекает в htpasswd имя файла с паролями из файла .htaccess и выполняет разные проверки, чтобы исключить наиболее типичные ошибки при работе с htpasswd, в том числе и ошибку недоступности файла для записи. Все это делает инструкция case перед основным блоком сценария.
Операции с файлом. htpasswd
Инструкция case
определяет, какая из трех возможных операций запрошена −A (добавить пользователя), U (изменить запись с информацией о пользователе) или D (удалить пользователя), — и выполняет соответствующий фрагмент кода. Код операции и имя пользователя хранятся в переменной QUERY_STRING. Значение для этой переменной посылается на сервер веб-браузером в составе URL, в виде a=X&u= Y , где X — буквенный код операции, а Y — имя пользователя. Когда запрашивается операция изменения пароля или добавления пользователя, должен передаваться третий аргумент, p, с паролем.
Например, допустим, что мы добавляем нового пользователя joe с паролем knife. В результате этого действия веб-сервер передаст сценарию следующее значение в переменной QUERY_STRING:
Читать дальше