Например, допустим, что мы добавляем нового пользователя joe с паролем knife. В результате этого действия веб-сервер передаст сценарию следующее значение в переменной QUERY_STRING:
a=A&u=joe&p=knife
Сценарий развернет эту строку, запишет в переменную action символ A, в переменную user имя joe и в переменную pass строку knife. Затем убедится, в строке , что пароль содержит только допустимые алфавитные символы.
В заключение, если все прошло успешно, будет вызвана программа htpasswd, чтобы зашифровать пароль и добавить его в файл .htpasswd . Также этот сценарий создает HTML-таблицу, в которой перечисляются все пользователи из .htpasswd вместе со ссылками [delete].
После вывода трех строк с заголовком HTML-таблицы сценарий продолжает выполнение со строки . Этот цикл while читает пары имя/пароль из файла .htpasswd, используя трюк с изменением разделителя входных полей (Input Field Separator, IFS) на двоеточие и восстановлением по завершении.
Сценарий полагается на присутствие HTML-файла с именем apm-footer.html, содержащего строки −myname- и −options- , которые в процессе вывода файла в stdout замещаются текущим именем CGI-сценария и списком пользователей соответственно.
Переменная $myname определяется механизмом CGI, который сохраняет в ней фактическое имя сценария. Сам сценарий конструирует переменную $optionstring из пар имя/пароль, хранящихся в файле .htpasswd .
HTML-файл с нижним колонтитулом, представленный в листинге 9.8, дает возможность выполнить операцию добавления пользователя, изменить пароль и удалить пользователя.
Листинг 9.8. Файл apm-footer.html добавляющий раздел с полями ввода для выполнения операций
<! — нижний колонтитул с информацией для системы APM. ->
<div style='margin-top: 10px;'>
<table border='1' cellpadding='2' cellspacing='0' width="80 %"
······ style="border:2px solid #666;border-radius:5px;" >
··<tr><th colspan='4' bgcolor='#cccccc'>Password Manager Actions</th></tr>
··<tr><td>
····<form method="get" action="-myname-">
······<table border='0'>
········<tr><td><input type='hidden' name="a" value="A">
··········add user:</td><td><input type='text' name='u' size='15'>
········</td></tr><tr><td>
··········password: </td><td> <input type='text' name='p' size='15'>
········</td></tr><tr><td colspan="2" align="center">
··········<input type='submit' value='add' style="background-color:#ccf;">
········</td></tr>
······</table></form>
··</td><td>
····<form method="get" action="-myname-">
······<table border='0'>
········<tr><td><input type='hidden' name="a" value="U">
··········update</td><td><select name='u'>-options-</select>
········</td></tr><tr><td>
··········password: </td><td><input type='text' name='p' size='10'>
········</td></tr><tr><td colspan="2" align="center">
··········<input type='submit' value='update' style="background-color:#ccf;">
········</td></tr>
······</table></form>
··</td><td>
····<form method="get" action="-myname-"><input type='hidden'
······name="a" value="D">delete <select name='u'> −options- </select>
······<br /><br /><center>
········<input type='submit' value='delete' style="background-color:#ccf;"></
······center></form>
····</td></tr>
··</table>
</div>
<h5 style='background:#ccf;border-radius:3px;border:1px solid
#99c;padding:3px;'>
From the book <a href="http://www.intuitive.com/wicked/">Wicked Cool Shell
Scripts</a>
</h5>
</body></html>
Запуск сценария
Вы почти наверняка пожелаете сохранить сценарий в том же каталоге, который требуется защитить паролем, однако можно предпочесть и каталог cgi-bin, как это сделали мы. В любом случае убедитесь, что переменные htpasswd и basedir получают правильные значения в начале сценария. Вам также понадобится файл .htaccess, определяющий права доступа, и файл .htpasswd, доступный для записи пользователю, с привилегиями которого выполняется веб-сервер Apache в вашей системе.