perl скрипты для администраторов
Perl и CGI-программы – особенности использования
Разработчики сайтов и администраторы нередко сталкиваются со скриптами CGI (микросценариями обработки текстовых данных). Они применяются при создании интерактивных страниц, содержание которых зависит от действий пользователя. Например, это могут быть формы регистрации или отправки комментариев. Также есть «невидимая» область применения – сбор и обработка информации о посетителях при помощи файлов cookies.
Что такое CGI и PERL
Важно понимать, что CGI – не язык программирования, а протокол передачи данных веб-серверу через stdin и их прием из stdout. В качестве обработчика команд используется любая программа с поддержкой функций потокового ввода-вывода. Например, написанная на языке Perl. Главное, что от скрипта требуется «умение» заполнять таблицы в базе данных и получать данные из них путем подачи запроса, чего никогда не сделать средствами HTML.
Особенности применения языка Perl:
В качестве альтернативы Perl все чаще применяется язык программирования Python, но администраторы «старой закалки» продолжают придерживаться классики создания CGI-скриптов, так как поддержка Perl «по умолчанию» имеется в большинстве дистрибутивов Linux. Поэтому программы на нем начинают работать без предварительной подготовки сервера. Формально же скрипты можно писать на чем угодно – хоть на C/C++, Pascal, Java или Visual Basic.
Использование готовых скриптов
Если CGI-скрипт уже готов (используется стандартный модуль), перед использованием его нужно скопировать на сервер хостинга. Выполняется процедура при помощи файлового менеджера в панели управления или через FTP-доступ, например программой FileZilla. Выбор расположения остается на усмотрение пользователя; к программе можно обращаться независимо от имени каталога или подкаталога, но рекомендуется придерживаться определенных стандартов.
Так, внутри скриптов обязательно указывается путь к интерпретатору используемой платформы для программирования:
Если здесь допустить ошибку, программный код исполнятся не будет. То же происходит, если в ПО предусмотрено обращение к базе данных MySQL – пользователю понадобится внести в программу путь к ней, логин и пароль доступа. При изменении последнего корректировка CGI-скрипта обязательна, иначе он перестанет работать. Местоположение файлов в популярных CMS выясняется в службе технической поддержки или в служебной документации.
Написание простейшего CGI-скрипта
При работе в среде операционной системы Windows для написания кода понадобится специальная программа. Например, подойдет специализированный текстовый редактор Notepad++ (стандартный Блокнот для таких целей не подходит). Сам код строится вокруг переменных окружения и потоков ввода-вывода информации. По сути, CGI-скрипты являются обработчиками отдельных команд и не являются «полноценной» программой.
Главное, избегать использования SHELL, который снижает безопасность сайта. В качестве примера простейшего CGI-скрипта приведем код для вывода текущей даты и команду HTML, при помощи которой будет происходить обращение к программе (из любой части страницы, хоть в нескольких местах одновременно).
При помощи специального виджета, установленного в CMS, или путем ручного редактирования шаблона в нужный участок HTML вставляется код:
В приведенном примере решена типовая ошибка новичков. Она заключается в отсутствии метки о типе выводимого результата (строка Content-type: text/html). После нее располагается пустая строка для указания, что следом идет непосредственно программный код.
Просмотр установленных модулей PERL
Проверить ранее подключенные PERL-модули можно командой vim. Перед ее вводом необходимо подключиться к серверу хостинга по защищенному каналу SSH. После авторизации нужно ввести в консоли:
В результате будет создан файл с указанным названием. Следующий шаг – открыть его в текстовом редакторе и изменить содержимое на следующий код:
Perl — особенный язык программирования
Он может связать два любых проекта в одно целое.
Есть такой язык программирования — Perl. Если вы заинтересовались информационными технологиями в эпоху Python и JavaScript, вы, вероятно, даже не знаете, что он существует — а он есть и его много. Если представить, что наши ИТ-проекты — это красивые квартиры с евроремонтом, то Perl можно представить как старые магистральные трубы, по которым вода приходит в квартиру.
Ещё Perl называют «скотчем для интернета», потому что он может соединять какие угодно проекты, написанные на любых языках:
Perl хорошо умеет запускать системные команды в операционной системе. Благодаря этому Perl может взять результат работы одной программы, преобразовать их как нужно и отдать в другую.
✅ Суперсила Perl — в работе с регулярными выражениями, полная поддержка которых уже встроена в язык. Perl может взять любые данные, обработать их по нужным правилам и очень быстро выдать результат в удобном для пользователя виде.
❌ Слабое место Perl — его сложность для новичков, если выбрать его своим первым языком для изучения. В нём всё не так просто с ООП, слишком вольная трактовка операторов сравнения и огромные комбинации спецсимволов, в которых сложно разобраться на старте. Поэтому Perl лучше не выбирать как первый язык, а вернуться к нему, когда возникнет практическая необходимость.
Если у вас MacOS или Linux — у вас уже есть Perl
Интерпретатор Perl встроен почти во все UNIX-подобные операционные системы, поэтому его можно использовать в любой момент без установки. Единственное, что нужно проверить — что в системных настройках правильно указан путь к интерпретатору.
Если у вас Windows, то всё сложнее — нужно будет использовать отдельный интерпретатор, написанный специально для вашей версии Windows. Дополнительный минус — так как это не родная среда для Perl, часть команд в таком режиме совместимости работать не будет.
Синтаксис
Синтаксис Perl похож одновременно на два языка:
Переменные. Начинаются со специальных символов:
$ — число, строка или ссылка на что-то
$thecode = «Привет, это журнал Код!»
& — функция (в Perl это тоже переменная), которая получает аргументы и возвращает значение
Условный оператор. Почти такой же как в C:
$a = shift;
if($a > 10) <
print «a > 10\n»;
>
Ещё есть unless — то же самое, что ЕСЛИ, только наоборот:
unless($a == 0) <
# «выполняется, только если a не равно нулю»
>
Циклы. То же самое, как и везде:
Или можно сделать как в PHP:
Циклы с пред- и постусловием. Если вы знаете хотя бы Pascal, то вы знаете и циклы на Perl:
Операторы присваивания и математические операторы. В этом плане Perl очень похож на любой C-подобный язык и использует те же самые команды:
Применение на практике
Perl — мощный язык для работы с текстом и любыми символьными данными. На нём легко писать программы, которые автоматизируют работу с компьютером, выполняют рутинные операции или преобразуют одни данные в другие.
Например, эта команда
заменит все упоминания слова Java на слово Perl в файле resume.txt, и одновременно сделает резервную копию оригинального файла.
А эта — удаляет все повторяющиеся элементы массива:
Если нужно очистить файл от всех HTML-команд, можно использовать такой код:
use strict;
use utf8;
use HTML::Entities;
# исходим из того, что мы уже получили содержимое HTML-файла и можем с ним работать
utf8::decode($_);
s/ ]*>//g;
decode_entities($_);
utf8::encode($_);
Иногда это всё-таки сложно
Иногда готовый код на Perl сложно понять и прочитать. Это из-за того, что Perl — очень гибкий язык программирования с полной поддержкой регулярных выражений. Чтобы понять, что делают некоторые программы и функции, недостаточно просто посмотреть на них — нужно понимать правила преобразования регулярных выражений и знать, как одни команды в регулярках влияют на другие.
Самый популярный пример такого кода:
❌❌❌ И этот код тоже не запускайте — можно легко стереть все свои данные и повредить файловую систему.
Не все программы на Perl выглядят как эта, но без понимания того, как работают регулярные выражения, понять код бывает очень сложно.
Вывод: регулярные выражения — это сила. Убедились в этом в очередной раз. Если ещё не убедились — почитайте, как с их помощью можно настроить автозамену нецензурной лексики на благопристойные выражения.
Что пишут на Perl
Если коротко: всё, где нужно автоматизировать работу компьютера или преобразование данных, можно написать на Perl.
Системное программирование. Сюда можно отнести работу с учётными записями пользователей в сетях любой сложности и конфигурации, администрирование сетей и пользователей в организации. Ещё Perl используют для автоматизации рутины — наладить резервное копирование по расписанию, отправку писем с ежедневными отчётами, сбор, обработку и анализ разных данных.
CGI-скрипты — любые скрипты для обмена данными между сервером и клиентом. Для Perl неважно, в каком виде данные выходят и поступают обратно, — он переведёт их в нужный вид и отправит из одного сервиса в другой.
Объединение сервисов или программ. Если у вас есть две программы, одна из которых выдаёт готовый результат в одном формате, а другой он требуется в другом формате, то Perl поможет вам их соединить. Работает это так: вы пишете скрипт, который запускает первую программу, получает оттуда данные, преобразует их в нужный вид и отправляет во вторую программу. В итоге всё это работает как одно целое.
Востребован ли Perl сейчас
Perl востребован, потому что в мире накопилось много старого кода, который нужно поддерживать. Дело в том, что программы на Perl работают стабильно, предсказуемо и без сбоёв, а с 1987 года их написано очень много.
Но порог входа в этот язык довольно высок — нужно обладать навыками хотя бы на уровне мидла, чтобы быть востребованным специалистом.
С чего начать
Почитать: учебник по Perl для новичков. Перевод иногда хромает, но это лучший вариант для тех, кто только начинает изучение языка.
Если знаете английский — начните с официальной страницы языка.
Посмотреть: Perl Tutorial или Great Perl Tutorial For Begginers. Тут уже всё на английском, зато более наглядно.
Бумажная книга: Изучаем Perl Рэндала Шварца и Тома Феникса. Для тех, кто любит основательно подойти к процессу и не любит читать с экрана.
Сисадмину: Пишем скрипты на все случаи жизни
Каждый, кто работал сисадмином UNIX-систем, рано или поздно начинает автоматизировать свою работу с помощью скриптов.
Написаны они могут быть на чём угодно — от bash’а до tcl. Важен подход.
В этой статье я попробую вкратце описать приемы скриптовой автоматизации.
Когда нужно писать скрипты?
1. Когда это приведет к экономии времени.
Если нужно однотипно настроить 1000 свитчей, разослать спам приглашения на конференцию или собрать базу MAC-адресов — скрипты наши лучшие друзья.
2. Когда некие действия выполняются регулярно.
Архивирования резервных копий, очистка mysql-базы от мусора или сбор статистики — те самые случаи.
3. Когда нужно создать что-то сложное, но лениво делать это «по серьёзному».
Примеры — микробиллинги, счетчики трафика и системы блокировки должников.
Это нужно писать на C/C++. Но начальство сказало: «Сделать сегодня!». И снова скрипты — и мысль «когда-нибудь перепишу». 🙂
Когда не нужно писать скрипт?
Всегда, когда это не нужно согласно трём первым пунктам.
Хотя если хотите — пишите. Время ваше. 🙂
Несколько примеров из личной жизни
1. Скрипт починки всех таблиц mysql. Ставил на хостинг по крону — сразу пропали звонки абонентов на тему неработающих сайтов на mysql. [bash]
2. Массовое выполнение команд на свитчах AT-8000S. [perl]
iplist.txt — список свитчей в формате ip:login:password
command.txt — список команд.
3. Проверка работы демона — полезно при наличии падучих программ.
Можно убрать while и запихнуть в кронтаб.
Заключение
Скрипты можно писать. Скрипты нужно писать. Удачи. 🙂
Go для системных администраторов. Практические примеры. Часть 0
Здравствуйте, меня зовут Виталий и я обезьяна практик — для меня лучше один раз увидеть и скопировать, чем сто раз прочитать абстрактные руководства. Долгое время я был обычным системным администратором — писал скрипты на CMD/BAT, и даже на sh (при помощи busybox для Windows). Но однажды обычного shell мне стало не хватать, и я решил для себя написать собственный RPC-сервер, но так, чтобы он работал при минимуме системных компонентов, и был понятным, и был многопоточным и содержал минимум строк кода. Java и прочее ООП я отмел, так как для профессионалов, и слишком абстрактно, и надо ставить среду для выполнения на целевой компьютер, и мне же, как админу, её обновлять. Долгое время приглядывался к perl, но я боюсь динамической типизации. В статье я расскажу, как человеку мало знакомому с программированием решить некоторые задачи системного администрирования при помощи Go.
Я предполагаю, что вы осилили «Быстрый старт – программируем на Go под Windows — настройка Environment», имеете опыт написания простейших скриптов. А еще я соврал. На целевой машине может потребоваться Microsoft Visual C++.
Для начала мы попробуем превратить простой скрипт в приложение на Go. Для примера возьмем test.bat:
Минутка любви к Microsoft. Если я хочу проверить, скачался ли файл из второго источника, то я должен использовать GOTO, т. к. внутри IF и FOR %errorlevel% и %time% остаются такими же как перед вызовом IF и FOR.
Примерно так будет выглядеть наш скрипт на Go:
Запустить мы запустили, но для отладки неплохо было бы увидеть, что выдает curl в stderr/stdout. Кстати, curl все выдает в stderr:
При ошибке функция start_curl() возвращает что-то вроде «exit code 7». А нам бы хотелось получить код возврата в виде числа. Мы можем отрезать строку «exit_code » и и преобразовать строку «7» в число7. Для этого придется импортировать пакеты «strings» и «strconv». Но есть более простой, и менее понятный способ:
На сегодня все. Компилятор соберет нам готовый exe-файл. Бояться большого размера (несколько мегабайт) не нужно. В этот файл будут собраны минимальная среда исполнения и все необходимые пакеты. Потребление памяти приложением на Go раза в два меньше чем у perl или python(если мы конечно говорим о небольших приложениях). Если статья кого-то заинтересовала, в комментариях укажите, какую из тем хотелось бы рассмотреть:
Функциональное программирование на Perl в примерах
В данной статье будет рассмотрено функциональное программирование на примере скрипта поиска битых ссылок с использованием AnyEvent::HTTP. Будут рассмотрены следующие темы:
Анонимные подпрограммы
Анонимная подпрограмма объявляется также, как и обычная, но между ключевым словом sub и открывающей скобкой блока программного кода нет имени. Кроме того, такая форма записи расценивается как часть выражения, поэтому объявление анонимной подпрограммы должно завершаться точкой с запятой или иным разделителем выражения, как и в большинстве случаев:
Например, реализуем подпрограмму, утраивающую переданное ей значение:
Основное преимущество анонимных подпрограмм — использование «кода как данных». Другими словами, мы сохраняем код в переменную (например, передаем в функцию в случае колбеков) для дальнейшего исполнения.
Пример использования рекурсии в сочетании с колбеками будет показан ниже при рассмотрении задачи поиска битых ссылок.
Замыкания (Closures)
Как сказано в википедии
Замыкание — это функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся ее параметрами.
По сути, замыкание — это аналог класса в ООП: предоставляет функциональность и данные связанные и упакованные вместе. Рассмотрим пример замыкания в Perl и класса в C++:
Проведем анализ приведенного кода:
объявление приватной переменной:
объявляем переменную multiplier типа int после маркера доступа private ;
инициализирование приватной переменной:
при создании переменной инициализируем переданным значением;
перегружаем конструктор, чтобы он принимал число и в списке инициализации инициализируем переменную multiplier ;
создание подпрограммы, перемножающей переданное ей значение с ранее инициализированной переменной:
Для использования замыкания в Perl и класса в C++, их нужно определить, т.е. создать объект:
Аналогом функции-замыкания из примера на Perl, в C++ является использование лямбд, как показано в коде. В примере на Perl функция-замыкание, передаваемая в функцию, также называется колбеком, или функцией обратного вызова.
Функции обратного вызова (Callback)
По сути, функция обратного вызова является аналогом полиморфизма функций, а именно, позволяет создавать функции более общего назначения вместо того, чтобы создавать серию функций, одинаковых по структуре, но отличающихся лишь в отдельных местах исполняемыми подзадачами. Рассмотрим пример задачи чтения из файла и записи в файл. Для этого с помощью Perl создадим две функции reader и writer (за основу был взят пример с презентации Михаила Озерова Ленивые итераторы для разбора разнородных данных), а с помощью C++ мы создадим классы Reader_base, Writer_base, ReaderWriter.
Компилировать следующим образом:
Проведем анализ кода:
работа с созданными функциями в Perl и классами в C++:
Далее рассмотрим комплексную практическую задачу поиска битых ссылок с помощью AnyEvent::HTTP, в котором будут использоваться вышеописанные темы — анонимные подпрограммы, замыкания и функции обратного вызова.
Задача поиска битых ссылок
Для того, чтобы решить задачу поиска битых ссылок (ссылок с кодами ответа 4xx и 5xx), необходимо понять, как реализовать обход сайта. По сути, сайт представляет из себя граф ссылок, т.е. урлы могут ссылаться как на внешние страницы, так и на внутренние. Для обхода сайта будем использовать следующий алгоритм:
Затем создаем функцию scan_website, в которую передаем ограничение на максимальное количество урлов на скачивание и колбек.
Далее создаем анонимную функцию и выполняем её. Запись вида
или удаления циклической ссылки:
Структура хэша %urls следующая:
В функции process_page мы сохраняем полученный хэш и колбек.
После чего мы в цикле проходимся по хэшу урлов, получая пару (parent_url => current_urls) и далее проходимся по списку текущих урлов (current_urls)
Прежде, чем приступить к рассмотрению получения данных со страниц сделаем небольшое отступление. Базовый алгоритм парсинга страницы и получения с нее урлов предпоолагает один HTTP-метод GET, вне зависимости, внутренний этот урл или внешний. В данной реализации было использовано два вызова HEAD и GET для уменьшения нагрузки на сервера следующим образом:
Итак, сначала мы выполняем функцию http_head модуля AnyEvent::HTTP, передавая ему текущий урл, параметры запроса и колбек.
В колбеке мы получаем заголовки (HTTP headers)
из которых получаем реальный урл (урл после редиректов)
Далее, если произошла ошибка (коды статуса 4xx и 5xx), то выводим ошибку в лог и сохраняем заголовок в хэш для дальнейшего использования
Иначе, если сайт внутренний и это веб-страница,
В колбеке функции http_get получаем заголовки и тело страницы, декодируем страницу.
С помощью модуля Web::Query выполняем парсинг страницы и получение урлов.
На каждой итерации метода each мы получаем в колбеке ссылку
и преобразовываем ее
Далее мы проверяем — если в графе нет такой ссылки
то получаем корневой домен ссылки (либо ставим его в ‘fails’)
т.е. в данном случае, и родительской, и текущей страницей была стартовая страница (в остальных случаях данные страницы различаются).
Конструирование данной структуры происходит следующим образом — если сайт внутренний, то мы создаем структуру
иначе, если сайт внутренний, то структуру
Если мы не попали ни в один из вариантов (ошибка или парсинг внутренней страницы), т.е. сайт внешний и без ошибок, то выполняем колбек
Иначе, если есть урлы для проверки,
то рекурсивно вызываем анонимную подпрограмму
В качестве бонуса, в скрипте реализован вывод графа с помощью GraphViz в разные форматы — svg, png и т.д. Примеры запуска скрипта:
Также имется возможность управлять выводом логов с помощью переменной окружения PERL_ANYEVENT_VERBOSE, а именно
Заключение
В данной статье было рассмотрено функциональное программирование на Perl, в частности, были рассмотрены такие темы — анонимные подпрограммы, замыкания и функции обратного вызова. Было проведено сравнение замыканий в Perl и классов в C++, функций обратного вызова (callbacks) в Perl и перегрузку функций-членов в C++. Также был расмотрен практический пример поиска битых ссылок с использованием AnyEvent::HTTP, в котором были использованы все вышеописанные возможности функционального программирования.