Учебники

Linux Admin — Сценарии оболочки

Как и разновидности GNU Linux, оболочки имеют множество разновидностей и различаются по совместимости. Оболочка по умолчанию в CentOS называется Bash или Bourne Again Shell. Оболочка Bash — это современная модифицированная версия Bourne Shell, разработанная Стивеном Борном. Bash был прямой заменой оригинальной оболочки Thompson Shell в операционной системе Unix, разработанной в Bell Labs Кеном Томпсоном и Деннисом Ричи (Стивен Борн также работал в Bell Labs)

У каждого есть любимая оболочка, и у каждого есть свои сильные стороны и трудности. Но по большей части Bash станет оболочкой по умолчанию во всех дистрибутивах Linux и является наиболее доступной. С опытом, каждый захочет изучить и использовать оболочку, которая лучше всего подходит для них. Однако, в то же время, все также захотят освоить оболочку Bash.

Другие оболочки Linux включают в себя: Tcsh, Csh, Ksh, Zsh и Fish.

Развитие навыков использования любой оболочки Linux на экспертном уровне чрезвычайно важно для администратора CentOS. Как мы упоминали ранее, в отличие от Windows, Linux по своей сути является операционной системой командной строки. Оболочка — это просто пользовательский интерфейс, который позволяет администратору (или пользователю) выдавать команды операционной системе. Если бы системный администратор Linux был пилотом авиакомпании, использование оболочки было бы аналогично снятию самолета с автопилота и захвату ручного управления для более маневренного полета.

Оболочка Linux, как и Bash, в компьютерных науках известна как интерпретатор командной строки . В Microsoft Windows также есть два интерпретатора командной строки, называемые DOS (не путать с оригинальной операционной системой DOS) и PowerShell.

Большинство современных оболочек, таких как Bash, предоставляют конструкции, позволяющие более сложным сценариям оболочки автоматизировать как общие, так и сложные задачи.

Конструкции включают в себя —

  • Управление потоком скриптов (ifthen и else)
  • Операции логического сравнения (больше, меньше, чем равенство)
  • Loops
  • переменные
  • Параметры, определяющие работу (аналогично переключателям с командами)

Использование сценариев оболочки по сравнению с языком сценариев

Часто задумываясь о выполнении задачи, администраторы задаются вопросом: использовать ли сценарий оболочки или язык сценариев, такой как Perl, Ruby или Python?

Здесь нет установленных правил. Есть только типичные различия между оболочками и языками сценариев.

Ракушка

Shell позволяет использовать команды Linux, такие как sed , grep , tee , cat и все другие утилиты на основе командной строки в операционной системе Linux. Фактически, почти любая утилита Linux командной строки может быть написана в вашей оболочке.

Отличным примером использования оболочки будет быстрый скрипт для проверки списка хостов на предмет разрешения DNS.

Наш простой Bash Script для проверки DNS-имен —

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

небольшой список слов для проверки разрешения DNS на

dns 
www 
test 
dev 
mail 
rdp 
remote

Вывод по домену google.com —

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

Используя простые команды Linux в нашей оболочке, мы смогли создать простой 5-строчный скрипт для аудита имен DNS из списка слов. Это заняло бы значительное время в Perl, Python или Ruby даже при использовании красиво реализованной библиотеки DNS.

Язык сценариев

Язык сценариев даст больше контроля за пределами оболочки. Приведенный выше скрипт Bash использовал оболочку для команды хоста Linux. Что, если мы хотим сделать больше и сделать наше собственное приложение, например хост, взаимодействующим вне оболочки? Здесь мы будем использовать язык сценариев.

Кроме того, с хорошо поддерживаемым языком сценариев мы знаем, что наши действия будут работать в разных системах по большей части. Например, Python 3.5 будет работать на любой другой системе, на которой работает Python 3.5 с такими же установленными библиотеками. Не так, если мы хотим запустить наш BASH-скрипт на Linux и HP-UX.

Иногда границы между языком сценариев и мощной оболочкой могут быть размыты. Можно автоматизировать задачи администрирования CentOS Linux с помощью Python, Perl или Ruby. Это действительно обычное дело. Кроме того, богатые разработчики сценариев оболочки сделали простой, но в остальном функциональный демон веб-сервера в Bash.

Имея опыт работы с языками сценариев и автоматизации задач в оболочках, администратор CentOS сможет быстро определить, с чего начать при необходимости решения проблемы. Довольно часто начинать проект с помощью сценария оболочки. Затем переход к скриптовому (или скомпилированному) языку становится более сложным.

Кроме того, можно использовать как язык сценариев, так и сценарий оболочки для различных частей проекта. Примером может служить Perl-скрипт для очистки сайта. Затем используйте сценарий оболочки для анализа и форматирования с помощью sed , awk и egrep . Наконец, используйте PHP-скрипт для вставки отформатированных данных в базу данных MySQL с помощью веб-интерфейса.

Имея некоторую теорию, лежащую в основе оболочек, давайте начнем с основных строительных блоков для автоматизации задач из оболочки Bash в CentOS.

Ввод-вывод и перенаправление

Обработка stdout для другой команды —

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

Выше мы передали cat’sstoud в wc для обработки с символом pipe . Затем wc обработал вывод команды cat , распечатав количество строк файла output.txt на терминале. Думайте о символе канала как о «канале», передающем выходные данные одной команды для обработки следующей командой.

Ниже приведены ключевые понятия, которые следует помнить при работе с перенаправлением команд.

Число Файловый дескриптор символ
0 стандартный ввод <
1 стандартный вывод >
2 стандартная ошибка
добавить стандартный вывод >>
назначить перенаправление &
трубный ввод в стандартный ввод |

Мы представили это в первой главе, не говоря много о перенаправлении или назначении перенаправления. При открытии терминала в Linux ваша оболочка рассматривается как цель по умолчанию для —

  • стандартный ввод <0
  • стандартный вывод> 1
  • стандартная ошибка 2

Давайте посмотрим, как это работает —

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$  

/ dev / pts / 0 — это наш псевдо-терминал. CentOS Linux смотрит на это и думает о нашем приложении с открытым терминалом как о реальном терминале с клавиатурой и дисплеем, подключенным через последовательный интерфейс. Однако, как гипервизор абстрагирует аппаратное обеспечение от операционной системы / dev / pts абстрагирует наш терминал от приложений.

Из приведенной выше команды lsof мы видим под столбцом FD, что все три дескриптора файла установлены на нашем виртуальном терминале (0,1,2). Теперь мы можем отправлять команды, смотреть вывод команды, а также любые ошибки, связанные с командой.

Ниже приведены примеры для STDIN и STDOUT —

STDOUT

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

Также можно отправлять как stdout, так и stderr в отдельные файлы —

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

При поиске по всей файловой системе были обнаружены две ошибки. Каждый из них был отправлен в отдельный файл для последующего просмотра, а возвращенные результаты были помещены в отдельный текстовый файл.

Отправка stderr в текстовый файл может быть полезна при выполнении операций, которые выводят много данных в терминал, например при компиляции приложений. Это позволит просмотреть ошибки, которые могут быть потеряны из истории прокрутки терминала.

Одно примечание при передаче STDOUT в текстовый файл — это различия между >> и > . Двойное «>>» будет добавлено к файлу, в то время как форма единственного числа закроет файл и запишет новое содержимое (поэтому все предыдущие данные будут потеряны).

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

В приведенной выше команде текстовый файл stdin.txt был перенаправлен на команду cat, которая передала его содержимое в STDOUT .

Символ трубы «|»

Символ канала будет принимать выходные данные первой команды, передавая их в качестве входных данных следующей команде, что позволяет вторичной команде выполнять операции с выходными данными.

Теперь давайте «передадим» стандартный вывод cat другой команде —

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

Выше wc выполняет расчеты по выводу cat, который был передан из канала. Команда pipe особенно полезна при фильтрации вывода из grep или egrep

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

В приведенной выше команде мы передавали каждое четырехзначное число в wc из текстового файла, содержащего все числа из 65535, прошедшего через фильтр egrep .

Перенаправление вывода с помощью &

Вывод может быть перенаправлен с помощью символа & . Если мы хотим направить вывод как STDOUT, так и STDERR в один и тот же файл, это можно сделать следующим образом:

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

Перенаправление с использованием символа & работает следующим образом: сначала вывод перенаправляется в out.txt . Во-вторых, STDERR или файловый дескриптор 2 переназначается в то же место, что и STDOUT, в данном случае out.txt .

Перенаправление чрезвычайно полезно и полезно при решении проблем, возникающих при работе с большими текстовыми файлами, компиляции исходного кода, перенаправлении вывода в сценариях оболочки и выполнении сложных команд Linux.

Перенаправление может быть сложным для новых администраторов CentOS. Практика, исследования и случайные вопросы к форуму Linux (например, Stack Overflow Linux) помогут решить сложные проблемы.

Bash Shell Constructs

Теперь, когда у нас есть хорошее представление о том, как работает оболочка Bash , давайте изучим некоторые основные конструкции, обычно используемые для написания сценариев. В этом разделе мы рассмотрим —

BASH Советы по устранению неполадок

BASH может быть немного сложнее по сравнению со специальным языком сценариев. Некоторые из самых больших зависаний в скриптах BASH связаны с неправильным экранированием или не экранированием скриптовых операций, передаваемых в оболочку. Если вы несколько раз просматривали сценарий и он не работает должным образом, не расстраивайтесь. Это характерно даже для тех, кто ежедневно использует BASH для создания сложных сценариев.

Быстрый поиск Google или регистрация на экспертном форуме Linux, чтобы задать вопрос, приведет к быстрому решению. Очень вероятно, что кто-то сталкивался с точной проблемой, и она уже была решена.

Сценарии BASH — это отличный метод быстрого создания мощных сценариев для всего: от автоматизации задач администрирования до создания полезных инструментов. Чтобы стать разработчиком BASH-сценария на уровне экспертов, нужно время и практика. Следовательно, используйте BASH-скрипты всякий раз, когда это возможно, это отличный инструмент для вашей панели инструментов администрирования CentOS.