··exit 1
fi
fname="$(echo $1 | sed 's/http: \/\///g' | tr '/?&' '…')"
baseurl="$(echo $1 | cut −d/ −f1-3)/"
# Загрузить копию веб-страницы и поместить в файл архива. Обратите
#·· внимание, что изменения определяются по чистому содержимому
#·· (используется флаг −dump, а не −source), поэтому можно не заниматься
#·· парсингом разметки HTML….
lynx −dump "$1" | uniq > $sitearchive/${fname}.new
if [-f "$sitearchive/$fname"]; then
··# Этот сайт просматривался прежде, так что сравним старую и новую
··#·· копии с помощью diff.
··diff $sitearchive/$fname $sitearchive/${fname}.new > $tmpchanges
··if [-s $tmpchanges]; then
····echo "Status: Site $1 has changed since our last check."
··else
····echo "Status: No changes for site $1 since last check."
····rm −f $sitearchive/${fname}.new··# Ничего нового…
····exit 0·························· # Изменений нет, выйти.
··fi
else
··echo "Status: first visit to $1. Copy archived for future analysis."
··mv $sitearchive/${fname}.new $sitearchive/$fname
··chmod $fileperm $sitearchive/$fname
··exit 0
fi
# Сюда сценарий попадает, когда обнаружены изменения и нужно послать
#·· пользователю содержимое файла. new и заменить им старую копию
#·· для следующего вызова сценария.
if ["$2"!= "-"]; then
··(echo "Content-type: text/html"
····echo "From: $fromaddr (Web Site Change Tracker)"
····echo "Subject: Web Site $1 Has Changed"
····echo "To: $2"
····echo ""
····lynx −s — dump $1 | \
····sed −e "s|src=\"|SRC=\"$baseurl|gi" \
········-e "s|href=\"|HREF=\"$baseurl|gi" \
········-e "s|$baseurl\/http:|http:|g"
··) | $sendmail −t
else
··# Вывод различий на экран не кажется хорошим решением.
··#·· Сможете предложить что-то получше?
··diff $sitearchive/$fname $sitearchive/${fname}.new
fi
# Обновить сохраненную копию веб-сайта.
mv $sitearchive/${fname}.new $sitearchive/$fname
chmod 755 $sitearchive/$fname
exit 0
Получив URL и адрес электронной почты, этот сценарий извлекает содержимое веб-страницы и сравнивает его с содержимым сайта, сохраненным при предыдущей проверке. Если сайт изменился, новая страница отправляется по электронной почте указанному адресату после небольших изменений, цель которых — обеспечить работоспособность ссылок на изображения и в атрибутах href. Остановимся подробнее на этих изменениях, начиная со строки
.
Команда lynx извлекает исходный код веб-страницы
, после чего команда sed вносит в него три разных изменения. Во-первых, все фрагменты SRC=" замещаются фрагментами SRC="baseurl/
, чтобы заменить все относительные пути вида SRC="logo.gif" абсолютными путями, включающими доменное имя, и тем самым обеспечить их работоспособность. Для сайта с доменным именем http://www.intuitive.com/упомянутая выше ссылка примет вид SRC="http://www.intuitive.com/logo.gif". Аналогично изменяются атрибуты href
. Затем, чтобы гарантировать целостность всех ссылок, измененных на предыдущих этапах, выполняется третье изменение, в рамках которого из исходного кода HTML удаляются строки baseurl, если они были добавлены по ошибке
. Например, ссылка HREF="http://www.intuitive.com/http://www.somewhereelse.com/link" явно недействительная, и ее следует исправить.
Обратите также внимание, что адрес получателя указан в команде echo
(echo "To: $2"), а не передается команде sendmail как аргумент. Это простая предохранительная мера: передавая адрес команде sendmail во входном потоке (которая знает, что должна извлечь адрес получателя из потока благодаря флагу −t), мы избавляем себя от необходимости беспокоиться о пользователях, любящих поиграть с такими адресами, как "joe;cat /etc/passwd|mail larry". Этот прием демонстрирует безопасный способ вызова sendmail из сценариев командной оболочки.
Данный сценарий требует два параметра: URL сайта (для правильной работы сценария должны использоваться полные адреса URL, начинающиеся с http://) и адрес электронной почты (или список адресов, разделенных запятыми), куда следует послать измененную веб-страницу. Или, если хотите, вместо адреса электронной почты можно просто использовать — (дефис), чтобы только вывести на экран результаты сравнения командой diff.
Читать дальше