Скрипты Python против Bash — 2 или Tips & Tricks
Довольно давно я написал статью, в которой приводил примеры основ работы с системой с помощью Python-скриптов. Из-за мельком оброненной фразы (достаточно взглянуть на название топика) статья получила довольно много комментариев холиварного и не очень характера. Кому-то, возможно, захотелось воспользоваться возможностями Python для администрирования (сейчас подобного рода тулзы на питоне как раз набирают популярность). Так почему бы не завлечь в свой стан еще немного единомышленников? 🙂 Встречайте — небольшая подборка простых приемов для тех или иных целей.
Файлы и кое-что еще
Итак, сразу с места в карьер! Для начала возьмем банальную процедуру — копирование файла. До сих пор помню этот ужас, который приходилось писать на голом Си — считывание файла построчно в переменную и перезапись его по другому адресу… Но ведь вполне можно воспользоваться и более простыми методами! 🙂 Первый способ, который придет в голову линуксоиду — это, скорее всего, что-то вроде
- import subprocess
- subprocess.Popen( ‘cp /usr/share/file.txt /home/user/file.txt’ , shell=True)
Только вот подобный способ будет работать только при наличии bash или подобного ему интерпретатора (ну или потребует прописания алиасов). Зачем? Ведь можно воспользоваться методом отличного модуля shutil:
Удалить файл можно, соответственно, с помощью os.remove().
Для записи данных в файл можно использовать как питоновый write(), так и «поточный» вариант (сиплюсплюсники, привет вам):
- myfile = open( «/home/user/testfile.txt» , «w» )
- print >>myfile, «I want to drink some beer with Guido»
- myfile.close()
upd: Более современный метод от юзернейма bioroot (включен по умолчанию только начиная с версии 2.6, в 2.5 его можно взять из __future__:
>> from __future__ import with_statement ):
- with open( «/home/user/testfile.txt» , «w» ) as myfile:
- print >>myfile, «I want to drink some beer with Guido»
Иногда (например, при чтении логов) вам может понадобиться читать файл построчно, начиная с конца. Делается это элементарно:
А чтобы прочесть строку под определенным номером — можно воспользоваться как стандартным чтением файла в лист, так и использовать модуль linecache:
- line = linecache.getline( «C:\\test.txt» , 2 )
- print line
- # or
- line = open( «C:\\test.txt» ).readlines()[ 1 ]
- print line
- pic = open( «C:\\Pictures\\V4erashnaya_pyanka.bmp» , «rb» )
- buf = pic.read( 5 ) # считываем первые 5 байт
- print buf
Если, например, мы пишем программу с поддержкой плагинов — нам может понадобиться перебор файлов в определенном каталоге:
- print os.path.dirname( «/home/user/test.txt» ) #имя каталога
- print os.path.basename( «/home/user/test.txt» ) #имя файла
Открываем адрес или локальный файл в браузере по умолчанию (например, при создании ссылок в about-окошках):
- import webbrowser
- webbrowser.open( ‘http://www.habrahabr.ru/’ )
- webbrowser.open(u ‘file://home/user/mysite.html’ )
- webbrowser.open(u ‘mailto:foo@bar.com?subject=Feedback%20message’ )
Для определения кодировки строки или файла можно воспользоваться удобным модулем chardet, причем возвращается не только кодировка, но и «уверенность» в том, что она определена правильно, в красивом словарике:
- import chardet
- str = open( «/home/user/myfile.txt» , «r» ).readline()
- enc = chardet.detect(str)
- print enc[ ‘confidence’ ]
- print enc[ ‘encoding’ ]
Очень удобная вещь когда нужно, например, заюникодить строку с заранее неизвестной кодировкой. Правда, я столкнулся с проблемой определения mac-кодировок (всегда возвращается простой ascii, но на то он и мак, что часть символов кодируется не как обычно). В любом случае, линуксоидам легче — у нас есть enca и iconv 🙂
Ну что, пока хватит? Если тенденция понравится — попробую продолжить описание применения Python для администрирования системы и напишем пару рабочих примеров. И да, огромное спасибо такой вещи, как Python Cookbook!
Автоматизируем рутину: Bash vs Python
Теги: postgresql, python, awk, mysql, ssh, shell, bash (bourne again shell), gnu/linux, условные операторы, операторы цикла, script_name.sh, cron, telnet, бэкап файлов, дампинг, sed, freebsd, windows, macos, unix, symbian, android, парсинг лога, oracle, sybase, конвертация .ini-файлов, configparser, md5
Любой системный администратор ежедневно решает большое количество разнообразных задач, призванных «облегчить жизнь» как ему самому, так и пользователям. Это мониторинг серверов или отдельных процессов, резервное копирование баз данных, просмотр логов с последующей выборкой необходимой информации, настройка и совершенствование системы информационной безопасности, заведение и редактирование пользовательских учетных записей и т.д.
Чтобы написать скрипты, которые помогут автоматизировать большую часть рутинной работы, можно использовать как Bash, так и Python. Что же выбрать?
Bash (Bourne Again Shell)
Наиболее часто используемая командная оболочка по умолчанию в операционных системах GNU/Linux. Она включает в себя простой язык программирования, который позволяет при помощи условных операторов и операторов цикла использовать утилиты и программы операционной системы для написания как простых, так и сложных скриптов.
В этом плане Bash, несомненно, обладает некоторыми преимуществами, в частности, универсальностью и доступностью. Для того, чтобы написать скрипт на Bash, установка дополнительных пакетов не требуется. Достаточно создать файл вида script_name.sh с последовательно исполняемыми операциями и запустить его, либо добавить в качестве задачи планировщика cron.
Вот далеко не полный список задач, которые можно решить с использованием bash-скрипта: – вывод нескольких последних строк лога или поиск и выборка ключевых слов с последующим сохранением в отдельный файл; – архивирование каталога с данными с последующей отправкой архива на удаленный компьютер по ssh или telnet; – настройка системы бэкапа файлов базы данных с использованием дампинга; – запрос информации о конфигурации нескольких компьютеров в сети и отправка файла с результатами по e-mail; – поиск дубликатов файлов на диске с последующим выводом списка имен и запросом на удаление; – рекурсивная замена владельцев отдельных файлов и каталогов на диске.
Стоит отметить, что возможности командного интерпретатора зачастую используются не полностью. Многие администраторы выбирают Bash для написания простых или средних по сложности скриптов. В крупных проектах, где есть специфические задачи и требуется работа с разнообразными входными данными, многомерными массивами и сокетами больше доверяют Perl, Python или Ruby.
Отчасти это связано с проблемами переносимости bash-скриптов на другие платформы, (например, Windows), отчасти с тем, что Bash воспринимается скорее как средство автоматизации работы с файлами и утилитами, чем полноценный скриптовый язык, даже несмотря на наличие в арсенале sed и awk. Ещё одним минусом Bash является то, что при выполнении скрипта каждая запущенная с его помощью утилита создаёт свой процесс, что отражается на скорости выполнения и уровне использования ресурсов системы.
Python
В отличие от Bash, Python является полноценным объектно-ориентированным языком программирования. Он входит в состав большинства распространенных дистрибутивов GNU/Linux, что позволяет использовать его в качестве альтернативной основы для написания скриптов, решающих задачи системного администрирования. Вот лишь несколько причин, по которым выбор нередко падает на Python:
Удобочитаемость и компактность кода Благодаря соблюдению чётких синтаксических правил, скрипт, написанный на Python, будет понятен любому IT-специалисту, знакомому с программированием, даже если он видит этот код впервые. В то же время, при внесении изменений следует обращать внимание на правильную расстановку отступов – в Python они используются в качестве разграничителей блоков кода.
Наличие (даже в стандартной комплектации) большого количества модулей, подключаемых с помощью оператора import Каждый из модулей состоит из набора функций и методов, которые поддерживают основные системные протоколы и форматы и легко используются при написании собственного кода. Таким образом, экономится время, а скрипт будет выглядеть более структурированным. Возможности Python также позволяют написать и подключить собственный модуль, если поставленная задача отличается специфичностью решения;
Кроссплатформенность Скрипты Python работают и в среде Windows, и в MacOS, и в UNIX, включая FreeBSD и GNU/Linux. Этот язык широко используется и на мобильных платформах, таких как Symbian, Android. В этом преимущество Python. Bash такими возможностями не обладает и является «встроенным» инструментарием только для семейств _NIX, _BSD и GNU/Linux. Скрипт, однажды написанный на Python, с большой долей вероятности будет работать на разных платформах, решая схожие задачи, при условии, что код не будет содержать специфических для конкретной операционной системы функций.
Python является подходящим инструментарием для решения следующих задач администрирования: – парсинг лога или конфигурационного файла с использованием регулярных выражений; – разработка приложений, в том числе нестандартных, для работы с базами данных MySQL, Oracle, PostgreSQL, Sybase и др.; – сбор и анализ статистики интернет-трафика с нескольких IP-адресов; – преобразование данных в различные форматы, например, конвертация .ini-файлов в текст при помощи модуля ConfigParser; – работа с файлами сервера при помощи FTP-клиента; – поднятие простого прокси-сервера; – мониторинг работоспособности сервиса, запущенного на сервере, с отправкой предупреждений на e-mail администратора в случае сбоя; – поднятие ppp-соединения с использованием программы автодозвона; – поиск дубликатов с запросом на удаление или перемещение в каталоге с большим количеством файлов; – проверка целостности архивов бэкапа при помощи алгоритма md5; – и т.д.
Вывод
Python – удобный инструмент для решения задач системного администрирования, как повседневных, так и более специфических. Он одинаково подходит для создания как скриптов, так и более сложных приложений, в особенности сетевых, а также может служить заменой стандартному shell в Linux.
Так как Python является полноценным скриптовым языком, предпочтение в его использовании отдаётся специфическим задачам или тем, для решения которых возможностей Bash недостаточно. В решении же повседневных задач выбор нередко падает на Bash по причине его универсальности и доступности. Однако преимущество Python в его удобстве и большей функциональности.
Безусловно, для опытного системного администратора написать 300 строк на Bash – не проблема. Особенно, если он потом не будет их читать. Но для специалиста, которому необходимо быстро понять и исправить проблему, это настоящая головная боль.
Есть вопрос? Напишите в комментариях!
Что лучше использовать: питон или баш?
Для системных скриптов, скриптов бекапа и прочего. Обычно строк на 20-100. Много видел тут сообщений о том, что лучше питон чтобы не стрелять себе в ногу башем, но не знаю… как то куча сабпроцесов для вызова системных утилит намекает на то, что инструмент все же не тот. Как считаете? Имеется ввиду если нужно обернуть имеджмэджик, рсинк или еще что то с подготовкой в виде создания папок, проверками на существование, изменение имени по маске или поиск и прочее.
На баше очень муторно писать всякие проверки и всё такое
Лучше баш, ибо пистон каждый год ломают всё больше.
Будешь только и делать, что переписывать скрипты и обновлять пистон.
Novator ★★★★★ ( 15.11.19 15:18:32 MSK )
Последнее исправление: Novator 15.11.19 15:20:00 MSK (всего исправлений: 3)
Проверки, о которых пишет ТС, что на баше, что на питоне представляют собой однострочники вида
И это если не сокращать баш до && и || в одной строке.K
А проверки завершения вызываемых утилит?
if [ $? -ne 0 ] then echo ВСЁ ПРОПАЛО fi
проверки завершения вызываемых утилит
Путь первый. Выучиваешь Bash по тому же Advanced Bash Scripting Guide. Устаешь молотить данные сторонними утилитами с бесконечным ворохом разнородных параметров. Идешь учить Python.
Путь второй. Выучиваешь Python по паре-тройке онлайн-курсов. Устаешь дергать разнородные библиотеки или сочинять громоздкие вызовы внешних утилит для примитивнейших операций. Идешь учить Bash.
Конечный итог. Ты знаешь Bash и Python и выбираешь инструмент под задачу вместо «я тебя слепила из того, что было».
Пользуйся чем хочешь. Только для bash не забывай использовать shellcheck.