Когда речь идет о Linux и терминале, нельзя обойти стороной написание скриптов на Bash. Навыки написания сценариев на Bash будут полезными для тех, кто всерьез занимается ИБ. С их помощью можно автоматизировать различные задачи. В статье поговорим о работе со скриптами Bash в Linux.
Еще по теме: Лучшие hex-редакторы для Kali Linux
Написание и работа со скриптами Bash в Kali Linux
Bash (GNU Bourne-Again Shell ) — это отличный инструмент для написания сценариев. Далее покажу, как писать скрипты Bash и рассмотрю практические примеры. Предполагается, что вы уже знаете, как работать с файлами в Linux (см. Основы работы и команды в терминале Kali Linux).
Bash — один из самых популярных и распространенных интерпретаторов командной оболочки в мире Unix-подобных систем. Он является расширением стандартной оболочки Unix (Bourne shell) и включает множество дополнительных функций, улучшений и возможностей.
Интерпретатор Bash обладает множеством функций, которые делают его мощным инструментом для работы с командной строкой и автоматизации различных задач на Unix-подобных системах.
Введение
Сценарий на Bash — это текстовый файл, содержащий серию команд, которые выполняются так, как если бы они были введены в окне терминала. Обычно сценариям на Bash присваивается расширение .sh (но их можно выполнять и без расширения), они начинаются с #!/bin/bash и должны иметь соответствующие права доступа на выполнение.
Давайте напишем простой скрипт Hello World! (Привет, мир!) с помощью любого текстового редактора.
Назовите файл hello-world.sh, и запишите в него следующее:
1 2 3 4 5 |
#!/bin/bash # Hello World on Bash Script. echo "Hello World!" |
Сохраните и закройте файл. В приведенном выше сценарии мы использовали несколько компонентов:
- Строка 1: #! — интерпретатор Bash игнорирует. Вторая часть, /bin/bash, представляет собой абсолютный путь к интерпретатору, который используется для выполнения скрипта. Это позволяет определить, что это скрипт на Bash. Существует различные типы оболочек (zsh, C Shell и другие).
- Строка 2: # — используется для добавления комментария. Символ # будет игнорироваться интерпретатором. Комментарии позволяют делать заметки касаемо сценариев.
- Строка 3: echo "Hello World!" — использует команду echo Linux для вывода заданной строки в терминал, в данном случае «Hello World!».
Теперь нужно сделать этот сценарий исполняемым:
1 |
chmod +x hello-world.sh |
Теперь можно запустить скрипт:
1 |
bash hello-world.sh |
Мы видим, что скрипт выводит «Hello World!»:
Команда chmod с параметром +x используется для присвоения прав доступа на выполнение скрипта Bash. Затем для выполнения используется команда bash вместе с именем файла сценария scriptname.sh. Для запуска сценария можно также использовать ./scriptname.sh.
Это был наш первый скрипт на Bash. Давайте подробнее рассмотрим возможности Bash.
Переменные
Переменные используются для временного хранения данных. Можно объявить переменную для присвоения ей значения или считать переменную, которая будет «раскрываться» до своего сохраненного значения.
Можно объявлять переменные разными способами. Самый простой метод — установить значение напрямую с помощью простой декларации вида name=value.
Следует помнить, что между знаком = и именем переменной не должно быть пробелов.
В терминале можно выполнить следующую команду:
1 |
name=Kali |
Затем мы выполняем еще одну команду:
1 |
surname=Linux |
Объявление переменной бессмысленно, если мы не можем ее использовать или обратиться к ней. Для этого перед именем переменной ставим символ $. Когда Bash встречает в команде синтаксис $, он, перед выполнением команды, заменяет имя переменной на ее значение. Давайте посмотрим на пример вывода обеих переменных:
1 |
echo $name $surname |
На следующем скрине мы видим результат со значениями переменных:
Имена переменных могут быть в верхнем, нижнем регистре или комбинированными. Bash чувствителен к регистру, поэтому мы должны быть последовательными при объявлении и использовании переменных. Хорошей практикой является использование описательных имен переменных, что делает сценарий более понятным и удобным для других.
Bash интерпретирует определенные символы определенным образом. Например, следующее объявление демонстрирует неправильное многозначное объявление переменной:
1 |
hello=Hello World |
Это было не совсем то, чего мы ожидали. Чтобы исправить этот тип ошибки, для выделения текста, используются одинарные кавычки ' или двойные кавычки ".
Bash обрабатывает одинарные и двойные кавычки по-разному. Когда Bash встречает одинарные кавычки, он интерпретирует каждый заключенный символ буквально. Когда текст заключен в двойные кавычки, все символы рассматриваются буквально, за исключением «$» и «\», что означает, что переменные будут разворачиваться в начальный проход замены в заключенном тексте.
В случае вышеуказанного сценария следующее поможет прояснить:
1 |
hello='Hello World' |
Теперь можно вывести эту переменную с помощью команды echo:
В приведенном выше примере мы использовали одинарные кавычки ' для переменной. Но когда мы используем переменную hello с чем-то другим, нам нужно использовать двойные кавычки ". Для понимания взгляните на скрине ниже:
1 |
hello2="Hi, $hello" |
Теперь мы видим вывод echo новой переменной $hello2:
Также можно установить значение переменной в результат выполнения команды или сценария. Это также известно как подстановка команды, что позволяет взять вывод команды (то, что обычно выводится на экран) и сохранить его как значение переменной.
Для этого помещаем имя переменной в скобки (), символом $:
1 2 3 |
user=$(whoami) echo $user |
Здесь мы присвоили вывод команды whoami переменной user. Затем отобразили ее значение с помощью echo:
Альтернативный синтаксис для подстановки команды использует обратные кавычки ``:
1 2 3 |
user2=`whoami` echo $user2 |
Метод с использованием обратных кавычек устарел и обычно не рекомендуется, так как есть различия в том, как работают два метода подстановки команды. Также важно отметить, что подстановка команды выполняется в подоболочке (subshell), и изменения переменных в подоболочке не повлияют на переменные в основном процессе.
Аргументы
Не все сценарии на Bash требуют аргументов. Однако чрезвычайно важно понимать, как они интерпретируются Bash, и как их использовать. Мы уже выполняли команды Linux с аргументами. Для примера, когда мы выполняем команду ls -l /var/log, и -l, и /var/log — это аргументы для команды ls.
Скрипты на Bash также могут принимать аргументы командной строки и использовать их в своих сценариях:
На скрине выше, мы создали простой скрипт на Bash, назначили ему права на выполнение и затем запустили его с двумя аргументами. Переменные $1 и $2 представляют первый и второй аргументы, переданные в сценарий.
Давайте рассмотрим несколько специальных переменных на Bash:
Переменная | Описание |
---|---|
$0 | Имя сценария на Bash |
$1 — $9 | Первые 9 аргументов сценария на Bash |
$# | Количество аргументов, переданных сценарию на Bash |
$@ | Все аргументы, переданные сценарию на Bash |
$? | Статус завершения последнего выполненного процесса |
$$ | Идентификатор процесса текущего сценария |
$USER | Имя пользователя, запустившего сценарий |
$HOSTNME | Имя хоста |
$RANDOM | Случайное число |
$LINENO | Текущий номер строки в сценарии |
Некоторые из этих специальных переменных могут быть полезны при отладке скрипта. Например, мы можем получить статус завершения команды, чтобы определить, была ли она успешно выполнена или нет.
Чтение пользовательского ввода
Аргументы командной строки — это форма пользовательского ввода, но мы также можем захватывать интерактивный пользовательский ввод во время выполнения сценария с помощью команды read. Попробуем использовать read для захвата пользовательского ввода и присваивания его переменной:
Можно изменить поведение команды read различными параметрами. Два часто используемые параметра - -p, который позволяет указать приглашение, и -s, который делает пользовательский ввод без звука/невидимым (может быть полезным для учетных данных).
Условные операторы If Else Elif
Условные операторы If, Else, Elif If, Else, Elif считаются наиболее распространенными условными операторами, которые позволяют выполнять различные действия в зависимости от разных условий.
Условный оператор if довольно прост. Он проверяет, верно ли условие, но требует очень специфичного синтаксиса. Вы должны обратить особое внимание на этот синтаксис, особенно на использование необходимых пробелов.
На приведенном выше скрине, если «некоторое утверждение» истинно, сценарий выполнит «некоторое действие», которое может быть любой командой между then и fi. Рассмотрим реальный пример.
Пример вышеуказанного кода, использующего оператор if, проверяет возраст, введенный пользователем. Если возраст пользователя меньше 12 ( -lt) , сценарий отобразит предупреждение.
Некоторые из часто используемых операторов:
- -n VAR — истина, если длина VAR больше нуля.
- -z VAR — истина, если VAR пуст.
- STRING1 = STRING2 — истина, если STRING1 и STRING2 равны.
- STRING1 != STRING2 — истина, если STRING1 и STRING2 не равны.
- INTEGER1 -eq INTEGER2 — истина, если INTEGER1 и INTEGER2 равны.
- INTEGER1 -gt INTEGER2 — истина, если INTEGER1 больше INTEGER2.
- INTEGER1 -lt INTEGER2 — истина, если INTEGER1 меньше INTEGER2.
- INTEGER1 -ge INTEGER2 — истина, если INTEGER1 равно или больше INTEGER2.
- INTEGER1 -le INTEGER2 — истина, если INTEGER1 равно или меньше INTEGER2.
- -h FILE — истина, если FILE существует и является символической ссылкой.
- -r FILE — истина, если FILE существует и доступен для чтения.
- -w FILE — истина, если FILE существует и доступен для записи.
- -x FILE — истина, если FILE существует и доступен для выполнения.
- -d FILE — истина, если FILE существует и является директорией.
- -e FILE — истина, если FILE существует и является файлом, независимо от типа (узел, директория, сокет и т. д.).
- -f FILE — истина, если FILE существует и является обычным файлом (не директорией или устройством).
Мы использовали эти операторы в примере оператора if выше и убрали квадратные скобки, используя строку test. Но квадратные скобки делают код более читаемым.
Также можно выполнять определенный набор действий, если утверждение истинно, и другое действие, если утверждение ложно. Для этого можно использовать оператор else, с синтаксисом, как показано ниже:
Давайте расширим наш предыдущий пример с возрастом, добавив оператор else:
Оператор else был выполнен, когда введенный возраст был не менее 12.
Можно добавить больше аргументов к утверждениям с помощью оператора elif:
Расширим наш предыдущий пример с возрастом, используя оператор elif:
На приведенном примере видно, что код немного сложнее по сравнению с операторами if и else. В данном случае, когда пользователь вводит возраст больше 60, будет выполнен оператор elif и выведено приветствие.
Заключение
Мы рассмотрели базовые концепции написания сценариев на Bash, включая создание и выполнение сценариев, использование переменных, аргументов, условных операторов If, Else и Elif. Однако это только начало. Сценарии на Bash могут выполнять множество других операций, включая циклы, обработку строк, обработку файлов и многое другое.
Помимо этого, для выполнения разнообразных задач, вы можете использовать команды, доступные в Linux. Благодаря автоматизации, которую предоставляют сценарии на Bash, вы можете значительно упростить и ускорить свою работу, особенно в области информационной безопасности.
- Безопасность и защита Kali Linux
- Команды для работы с сетью в Kali Linux
- Установка и использование Python в Kali Linux