Каждому системному администратору постоянно приходится решать множество проблем. Управление пользователями, свободным местом на дисках, процессами, устройствами и резервными копиями может стать для системного администратора причиной потери волос, чувства юмора или рассудка. В работе могут помочь shell-скрипты, но зачастую они имеют досадные ограничения. Именно в таких случаях полноценный язык скриптов, такой как Python, может сделать скучную работу легкой и даже, не побоюсь сказать, интересной.
Приведенные в этой статье примеры демонстрируют различные возможности Python, которые вы можете использовать на практике. Проработав эти примеры, вы получите представление о мощи Python.
Модуль – это важная концепция в Python. Его можно определить как ресурс, который вы импортируете для того, чтобы впоследствии использовать. Этот процесс можно сравнить с тем как кто-нибудь берет нужные документы из архива и кладет их на стол, готовясь к работе. Модули импортируют с помощью команды
import,
присутствующей в начале каждого нашего примера. Есть модули для работы с базами данных и сервисами операционной системы, сетевого программирования и сотен других полезных областей.
Принимаем Python на вооружение
Python – это полноценный и мощный язык программирования, предоставляющий множество возможностей. Изучить его полностью – это огромная работа. Однако следует помнить, что многие возможности Python, такие как средства создания GUI, не представляют серьёзной ценности для системных администраторов. Именно поэтому в этой статье используются специально подобранные примеры: в них демонстрируются навыки и приёмы, которыми вам нужно владеть, чтобы эффективно писать скрипты Python для управления системами.
- Код в каждом примере заключен между инструкциями
try:иexcept:.Это элементарная реализация обработки ошибок. В Python есть обширная поддержка обработка исключительных ситуаций всех типов, однако для целей наших примеров я оставил обработку ошибок простой. - Эти примеры запускались на Python версии 2.5 на Linux®-машине, однако они должны работать на любой UNIX®/Linux машине.
- Несомненно, вы будете задумываться о том, как можно улучшить эти скрипты. Это здорово! Скрипты Python можно легко изменять и подгонять под свои нужды без необходимости перекомпилировать код.
Пример 1. Поиск файлов и отображение прав доступа к ним в удобном для восприятия формате
Программа из первого примера (листинг 1) ищет файлы, имена которых удовлетворяют заданному шаблону, и
выводит их вместе с соответствующими правами доступа на экран. Сначала вы, возможно, подумаете, что эта программа
всего лишь выполняет команду
find;
однако здесь мы сами определяем форму вывода результата, причем возможности для настройки здесь поистине безграничны. В этом примере показано, как можно взять за основу какую-либо системную команду и сделать ее лучше (или хотя бы настроить ее так, как вам нравится).
Этот скрипт выполняет три задачи:
- запрашивает у пользователя шаблон для поиска;
- выполняет поиск;
- отображает пользователю результаты.
При написании скрипта постоянно задавайте себе вопрос: «Для какой задачи предназначен этот код?» Это может сделать вашу работу более сфокусированной и эффективной.
Листинг 1. Поиск файлов и отображение результата в виде имен файлов с правами доступа к ним
import stat, sys, os, string, commands
try:
#запрашиваем у пользователя шаблон для поиска
pattern = raw_input("Enter the file pattern to search for:\n")
#выполняем команду 'find' и заносим результат ее выполнения в переменную
commandString = "find " + pattern
commandOutput = commands.getoutput(commandString)
findResults = string.split(commandOutput, "\n")
#отображаем вывод команды find вместе с правами доступа
print "Files:"
print commandOutput
print "================================"
for file in findResults:
mode=stat.S_IMODE(os.lstat(file)[stat.ST_MODE])
print "\nPermissions for file ", file, ":"
for level in "USR", "GRP", "OTH":
for perm in "R", "W", "X":
if mode & getattr(stat,"S_I"+perm+level):
print level, " has ", perm, " permission"
else:
print level, " does NOT have ", perm, " permission"
except:
print "There was a problem - check the message above"
|
Программа выполняет следующие шаги:
- запрашивает у пользователя шаблон для поиска (строки 7—9);
- выводит список найденных файлов (строки 12—14);
- с помощью модуля
statполучает информацию о правах доступа к каждому найденному файлу и выводит их на экран (строки 15—23).
Как выглядит работающая программа, показано в листинге 2.
Листинг 2. Работа программы из первого примера
$ python example1.py
Enter the file pattern to search for:
j*.py
FILES FOUND FOR PATTERN j*.py :
jim.py
jim2.py
================================
Permissions for file jim.py :
USR R
USR W
USR X
GRP -
GRP -
GRP -
OTH -
OTH -
OTH -
Permissions for file jim2.py :
USR R
USR W
USR X
GRP R
GRP -
GRP X
OTH R
OTH -
OTH X |
Пример 2. Выполнение действий с tar-архивом на основе выбора из меню
В предыдущем примере программа запрашивала у пользователя, какой шаблон поиска следует использовать. Другим способом передачи информации от пользователя программе являются аргументы командной строки. Программа в листинге 3 иллюстрирует, как это можно сделать в Python. Программа принимает через аргумент командной строки имя tar-архива, а потом предлагает пользователю выбрать одно из действий.
В этом примере также показан новый способ выполнения нужных действий. В первом примере для выполнения команды
find
и чтения ее результата использовался модуль command. Такой подход иногда может быть неуклюжим, кроме того, он не совсем в стиле Python. В этом примере для открытия tar-архива используется модуль tarfile, который позволяет использовать атрибуты и методы Python при манипуляциях с файлом. Многие модули Python позволяют делать вещи, которые нельзя выполнить в командной строке.
Это хороший пример реализации меню в Python. В зависимости от вашего выбора программа выполняет различные действия:
- если нажать 1, программа предложит ввести имя файла из архива и извлечет его в текущую директорию;
- если нажать 2, программа предложит ввести имя файла, после чего выдаст информацию о нем;
- если нажать 3, программа выдаст список всех находящихся в архиве файлов.
Листинг 3. Выполнение действий с tar-архивом на основе выбора из меню
import tarfile, sys
try:
#открываем tar-файл
tar = tarfile.open(sys.argv[1], "r:tar")
#выводим меню и запрашиваем действие у пользователя
selection = raw_input("Enter\n\
1 to extract a file\n\
2 to display information on a file in the archive\n\
3 to list all the files in the archive\n\n")
#в соответствии с выбором пользователя выполняем действие
if selection == "1":
filename = raw_input("enter the filename to extract: ")
tar.extract(filename)
elif selection == "2":
filename = raw_input("enter the filename to inspect: ")
for tarinfo in tar:
if tarinfo.name == filename:
print "\n\
Filename:\t\t", tarinfo.name, "\n\
Size:\t\t", tarinfo.size, "bytes\n\
elif selection == "3":
print tar.list(verbose=True)
except:
print "There was a problem running the program" |
Программа выполняет следующие шаги:
- открывает tar-файл (строка 5);
- выводит меню и предлагает пользователю выбрать действие (строки 8—11);
- если нажать 1 (строки 14—16), то извлекается файл из архива;
- если нажать 2 (строки 17—23), то выводится информация о выбранном файле;
- если нажать 3 (строки 24—25), то выводится информация о всех файлах архива;
Работа программы показана в листинге 4.
Листинг 4. Пользовательское меню для второго примера
$ python example2.py jimstar.tar
Enter
1 to extract a file
2 to display information on a file in the archive
3 to list all the files in the archive |
Пример 3. Проверка запущенного процесса и вывод информации о нем в удобном для восприятия формате
Одной из самых важных обязанностей системного администратора является отслеживание выполняющихся процессов. Скрипт в
листинге 5
предлагает вам некоторые идеи для решения этой задачи. Программа пользуется возможностью UNIX обрабатывать командой
grep
вывод какой-либо другой команды, что позволяет автоматически сократить количество данных, которые Python должен проанализировать.
Также в программе используется модуль string. Познакомьтесь с ним поближе – вы будете часто его использовать.
Листинг 5. Вывод информации о запущенном процессе в удобном для восприятия формате
import commands, os, string
program = raw_input("Enter the name of the program to check: ")
try:
#выполняем команду ps и помещаем результат ее выполнения в список
output = commands.getoutput("ps -f|grep " + program)
proginfo = string.split(output)
#выводим результат
print "\n\
Full path:\t\t", proginfo[5], "\n\
Owner:\t\t\t", proginfo[0], "\n\
Process ID:\t\t", proginfo[1], "\n\
Parent process ID:\t", proginfo[2], "\n\
Time started:\t\t", proginfo[4]
except:
print "There was a problem with the program." |
Программа выполняет следующие шаги:
- запрашивает имя процесса для проверки и помещает его в переменную (строка 3);
- выполняет команду
psи помещает ее результат в список (строки 7—8); - выводит детальную информацию о процессе (строки 11—16).
Работа программы показана в листинге 6.
Листинг 6. Работа программы из третьего примера
$ python example3.py
Enter the name of the program to check: xterm
Full path: /usr/bin/xterm
Owner: knowltoj
Process ID: 3220
Parent process ID: 4308
Time started: 16:51:46 |
Пример 4. Проверка имен пользователей и паролей на соответствие правилам безопасности
Управление безопасностью – это очень важная часть работы любого системного администратора. Как будет показано в последнем примере, Python может сделать эту работу проще.
В программе, показанной в листинге 7, используется модуль pwd для доступа к базе данных паролей. Программа проверяет имена пользователей и пароли на соответствие правилам безопасности (в данном случае имя пользователя должно быть не короче шести символов, а пароль – не короче восьми символов).
Два предупреждения:
- эта программа будет работать только в том случае, если у вас есть полные права для работы с файлом /etc/passwd;
- скрипт не будет работать, если вы используете "теневые" пароли (однако на этот случай в Python 2.5 есть модуль spwd).
Листинг 7. Проверка имен пользователей и паролей на соответствие правилам безопасности
import pwd
#инициализируем счетчики
erroruser = []
errorpass = []
#запрашиваем базу данных паролей
passwd_db = pwd.getpwall()
try:
#проверяем каждое имя пользователя и пароль
for entry in passwd_db:
username = entry[0]
password = entry [1]
if len(username) < 6:
erroruser.append(username)
if len(password) < 8:
errorpass.append(username)
#выводим результаты на экран
print "The following users have an invalid userid (less than six characters):"
for item in erroruser:
print item
print "\nThe following users have invalid password(less than eight characters):"
for item in errorpass:
print item
except:
print "There was a problem running the script." |
Программа выполняет следующие шаги:
- инициализирует счетчики неправильных имен пользователей и паролей (строки 4—5);
- открывает базу данных паролей и записывает данные в список (строка 8);
- проверяет правильность имени пользователя и пароля (строки 12—18);
- выводит списки не прошедших проверку имен пользователей и паролей (строки 21—26).
Работа программы показана в листинге 8.
Листинг 8. Работа программы из четвертого примера
$ python example4.py
The following users have an invalid userid (less than six characters):
Guest
The following users have invalid password(less than eight characters):
Guest
johnsmith
joewilson
suejones
|
Другие области применения скриптов
Управлять системами с помощью Python можно различными способами. Полезно проанализировать свою работу, определить какие задачи вы выполняете постоянно и поискать модули Python, которые могут автоматизировать эти задачи. Почти наверняка вы найдете подходящий модуль Python.
Вот некоторые области, в которых Python может оказаться очень полезным:
- Управление серверами. Проверка установки патчей определенного приложения на группе серверов и автоматические обновления.
- Оповещение об ошибках. Автоматическая рассылка электронных писем при появлении в syslog-е ошибок определенного типа.
- Работа с сетью. Создание Telnet-соединения с сервером и отслеживание состояния соединения.
- Тестирование Web приложений. Использование бесплатных инструментов эмуляции Web-браузера для проверки функциональности и производительности Web-приложения.
Это всего лишь несколько примеров. Я уверен, что у вас возникнут и свои собственные идеи.
Обладая простым синтаксисом, возможностями для работы с файлами, процессами, строками и числами, а также практически бесчисленным количеством вспомогательных модулей, Python выглядит идеальным языком скриптов для системных администраторов. Он будет ценным инструментом в арсенале любого системного администратора.
Научиться
- Оригинал статьи:
Python for system administrators
-
The Python tutorial (EN): это руководство - отличный источник основной информации о языке.
-
Официальный Web сайт Python
: на этом сайте размешена различная информация о Python и множество ссылок для загрузки.
-
The Python Cookbook (EN): этот сайт поддерживается компанией
ActiveState и представляет собой сообщество, в котором пользователи предлагают для всеобщего доступа
скрипты практически на любую тематику программирования.
-
Planet Python (EN): на этом сайте рассказывается все о Python.
-
AIX и UNIX: в разделе AIX и UNIX на developerWorks
представлено огромное количество информации по всем аспектам администрирования систем AIX и расширения навыков в UNIX (EN).
- wiki-раздел AIX
6: среда совместной разработки технической документации AIX (EN).
- В
Python-разделе
книжного магазина Safari вы можете найти книги на эту и другие технические темы. (EN)
-
Книжный магазин Safari: в
этой электронной справочной библиотеке вы можете найти специализированные технические материалы (EN).
- Следите за новостями в разделе технических мероприятий и Web-трансляций (EN) developerWorks.
-
Подкасты: настраивайтесь на одну волну с техническими экспертами IBM и перенимайте их опыт (EN).
Получить продукты и технологии
- Разработайте ваш проект с помощью
ознакомительной версии ПО от IBM,
которое можно загрузить непосредственно с сайта developerWorks. (EN)
- Загрузите
самую свежую версию Python.(EN)
Обсудить
- Примите участие в обсуждении материала на форуме.
- Посетите блоги developerWorks и участвуйте в жизни сообщества developerWorks (EN).
- Также вы можете посетить Web-сайт автора:
www.jamesknowlton.com.(EN)

Джеймс Ноултон работает инженером по качеству ПО в Automated Data Processing (ADP), Inc. Он возглавляет работу по контролю качества в проектах ADP, связанных с сетевым видео и интеграцией компьютерной телефонии. Он обладает обширным опытом применения технологий с открытым исходным кодом, в том числе Python, Ruby, PHP, Apache и MySQL. Вы можете связаться с ним по адресу james@jamesknowlton.com.