МЕНЮ

Командная оболочка Bash для начинающих. Циклы, переменные, операторЭх, помню время, когда всё взаимодействие с компьютером сводилось к работе в командной строке, а юзвери ещё не были избалованы красочными картиночками называемых графическим интерфейсом системы. Но так ли на самом деле хорош этот самый графический интерфейс? Почему все трушные программисты, сисадмины и безопасники по сей день продолжают работать в консоли, игнорируя графику? Zip File, мамкины хаЦкеры. Вы на канале самого душного IT-спеца всея интернета, меня зовут Денчик, и я тот самый сын подруги вашей мамули, который реально шарит за технологии. Нынче мы разберём, что из себя представляет командная оболочка bash shell, из чего состоят скрипты для этой истории, узнаем, как вводятся переменные, циклы и операторы, а также попутно взломаем пару компьютеров пентагона. Так, что если вам реально хочется провести время в компании такого лютого душнилы, как я, дабы получить без напряга порцию полезной инфы, тогда устраивайтесь по удобней, наливайте себе чайка по забористее, и будем начинать.

И начнём мы, как водится с базы. Если вы хотите что-то донести до компьютера, то независимо от операционной системы, установленной у него на борту, эффективней всего это будет сделать посредством использования командной строки.

Bash является самой популярной реализацией оболочки командной строки. Изначально bash создана для Unix-подобных Осей. В этой истории была заложена очень простая и понятная философия.

Все данные должны передаваться в виде текста. И точка. Т.е. все программы должны уметь читать текст и передавать его, вне зависимости от своих функций и назначения. 

При этом каждая программа должна выполнять только свою задачу, но делать это максимально достойно и качественно. Т.е. одна программа умеет вычленять из гор текста отдельные строки. И делает это лучше всего. 

Другая – умеет сортировать эти самые строки. Третья – эффективно удаляет все дубликаты. Короче суть в том, что одна прога – заточена под одну конкретную функцию.

Опираясь на эту философию, вы уже пишите в командной строке определённого рода команды и ожидаете вполне предсказуемый результат. Вообще оболочек существует достаточно много. Но bash, пожалуй, наиболее распространённая.

Так что научиться работать с ней – жизненно необходимо, если вы действительно хотите сколь бы то ни было продвинуться в сфере IT. Ладненько. Это всё лирика.

Для того, чтобы обмениваться данными в баше существует понятия потоков ввода и вывода. Визуально это можно представить в виде трёх труб. Через первую – данные входят в программу, и она может их оттуда прочесть. 

А две другие предназначены для вывода. Первая зовётся потоком стандартного вывода, а вторая потоком вывода для ошибок. Разница заключается в том, что в последнюю вы включаете только ероры.

В стандартный же пишется всё остальное. Hello World, анекдоты и другие всевозможные результаты.

Потом уже эти трубки вывода можно подключить к трубкам ввода для других программ и таким образом получить к конечному итогу действительно серьёзный продукт.

Обычно, многие новички пребывают в иллюзия, что баш — это просто командная строка. Однако на самом деле это не совсем так. Баш представляет собой интерпретатор команд.

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

К примеру, банальное echo (эко) является встроенной внутренней командой баша, которая отвечает за вывод в консоли какой-то инфы.

А вот ls, как мы помним из моих видео эта история нужна для просмотра содержимого по какому-либо пути, уже запускает программу написанию отдельными программистами.

Наверное, не совсем удачный пример. Если говорить ещё наглядней, то для того, чтобы взаимодействовать именно с программой echo, например, узнать её версию, вам понадобится ввести /usr/bin/echo --version.

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

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

С базой разобрались. Теперь касаемо команд ввода вывода. Знак меньше означает, что к программе sort (сортировка) мы подключаем файл list1 с каким то списком. Если мы хотим вывести результат работы команды sort мы используем значок больше. 

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

Однако это ещё не всё. Как я говорил ранее, результат одной команды, можно передавать другой. Делается это с помощью пайпов (тех самых труб). На практике это выглядит следующим образом.

В команду sort мы к потоку ввода подсоединяем файлик list1, потом результат вывода команды sort подсоединяем к потоку ввода следующей команды, пусть будет grep, которая находит в текстовой барахле строчки с нужным вам значением.

Отлично. Таким образом мы написали цепочку команд в которая одна другой что-то передаёт.

При желании мы можем перенаправить потоки вывода ошибок в стандартный поток. Просто добавляем циферку 2 и указываем файл аля errors.log для перенаправления этой истории.

Либо же, можно с помощью значка амперсанта подсоединить поток вывода ошибок к стандартному потоку. Тогда всё будет идти по одной трубе.

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

К примеру, существует виртуальное устройство dev/null и если вы попытаетесь из него что-то прочесть, то получите нули. Т.е. ничто. Поэтому стандартный способ погасить любую программу – просто отправить её в dev/null.

Для рандомных данных есть urandom. Можете попробовать, если не боитесь сломать консоль.

Теперь касаемо программ, выполняемых в фоновом режиме. Очевидно, если вы начинаете выполнять какую-то команду, то пока она не прервётся вы не сможете дальше работать.

Однако, любую команду можно прокинуть в фон. Для этого добавляем к команде амперсанд и выводим результаты её работы в отдельный файл. 

Таким образом мы можем продолжить работу в консоли и при желании посмотреть результат того, что у нас происходит в фоне просто открыв этот файл.

Для того, чтобы достать процесс выполнения из фона, скажем для завершения, необходимо набрать fg (т.е. for ground) и указать номер джоба. Перенести в for ground джоб №1. Теперь можно спокойно её завершить.

Таким образом вы можете в одной консоли запустить несколько разных команд, которые будут на длительном промежутке творить движ, а сами при этом параллельно продолжить работать, задавая команды.

Наборы команд можно формировать в целые файлы-сценарии с большими серьёзными циклами. Такие сценарии, как вы уже наверняка догадались зовутся скриптами.

Баш скрипты, как правило, начинаются с шабланка. Т.е. последовательности из решётки, восклицательного знака и пути к интерпретатору. Для bash это bin/bash. Для Питона языков – usr/bin/python.

Т.е. мы говорим компьютеру, что хотим запустить файл, написанный на определённом языке программирования. Соответственно сценарии, написанные на Баше, будут иметь расширение .sh. 

Переменные и параметры Bash

Баш не был бы таким полезным, не будь в нём таких понятий, как переменные и параметры. Переменная – это некое слово, символ, с определённым значением.

Таким образом мы можем оперировать в Баше переменной, за которой скрывается это значение вместо того, чтобы из раза в раз писать его ручками. Соответственно значение переменной можно всегда поменять и тогда оно изменится во всём коде.

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

Символ доллара в Баше означает символ подстановки. В данном случае мы после него вставляем непосредственно переменную.

Помимо этого, переменной можно присвоить значение целой команды или даже последовательности команд.

Окей. С этой историей в целом думаю всё понятно. Ещё один особый вид переменных – это так называемые параметры. Они же аргументы. Дополнительные аргументы существуют абсолютно у каждой программы и у каждой команды.

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

Условный оператор Bash

Как вы знаете, Баш – это, по сути, язык программирования, а значит в нём должны быть какие-то способы менять исполнение программы в зависимости от условий. Для этого то и существуют специальные условные операторы.

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

Во-первых, у вас всегда есть условие. Условие – это команда, позволяющая передать управление в другую часть скрипта при выполнении определенного условия.

Пишется это условие следующим образом. If, что-то, например cmd, then, какие-то команды, else, какие то команды, и в конце fi. Типа IF задом наперёд. Забавно, хотя и не понятно, почему нельзя было сделать скажем end. 

Ладно. В качестве что-то, помимо показанного cmd, может быть абсолютно любая команда. Например, Ls, выводящая список файлов.

Это работает потому, что у всех команд и программ в Unix-подобных Осях существует такая штука, как код возврата или exit код.

Т.е. когда команда или программа завершает свою работу, она передаёт в систему число, сигнализирующее о том, насколько успешно завершилась программа.

Если прога отработала и всё ок – это ноль, а если были какие-то косяки, то соответственно любое другое, кроме нуля.

Поэтому условие работает следующим образом. Если команда, cmd или ls выполнилась успешно, то исполняются команды находящаяся после Then

Если же условие не было выполнено, т.е. команда завершилась с ошибкой, то в дело вступает Else. 

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

Главное не забудьте в конце Fi указать. А то Баш, ничего не исполнит, пока конструкция не будет завершена. С рандомными командами думаю всё понятно. Но на самом деле условный оператор нужен малясь не для этого.

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

Квадратные скобки в Баше – это отдельная программа, которая проверяет условия. В данном случае консоль выдаст нам информацию о том, существует ли указанный каталог. Для -d’шки существует довольно много ключей, если интересно, можете на досуге покурить мануалы. 

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

Данная история активно используется, когда мы хотим поработать со строчками. Также в Баше есть круглые скобки. Двойные круглые применяются для арифметических выражений, а одинарные для вызовов subshell типа.

По сути, тоже самое что и вызов без скобочек. Бывает нужно, когда вы собираетесь запустить несколько команд в одной строчке. Ls, echo, ls. Результат последней команды будет использоваться для вычисления условия.

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

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

Циклы Bash

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

Для этой истории у Баша, как ни странно, есть соответствующий оператор For. И первый способ обозначения цикла выглядит следующим образом.

Ставится For, т.е. «Для», далее указывается переменная, её имя, и обозначается в каком списке это будет происходить.

В случае с математическими выражениями применяется численный цикл. В нём после For, как мы уже знаем ставятся двойные круглые скобки, а внутри последовательно указывается начальное условие, т.е. то что выполняется при первом проходе цикла.

Конечное условие, как правило — это ограничение переменной. И счетчик. Т.е. то что исполняется в конце каждого цикла. 

Затем скобки закрываются и ниже указывается конструкция do...done. Если на данном этапе не втыкаете в смысл – не страшно. Циклы – это более продвинутый уровень и начинающим на них уж точно не стоит замахиваться.

Ну а те кто считает себя матёрым, наверняка напишут в комментах, Денчик где же примеры? Хотим примеров. Получите и распишитесь, ребятушки. Их у меня на любой вкус и цвет.

Для генерации имён можно использовать следующую конструкцию. Переменная F, фигурные скобки, так называемая макро-подстановка. Указываем диапазон. И ниже, что мы хотим вывести по итогу.

Теперь давайте чутка усложним и введём размер шага 2. Результат изменения будет соответствующий. Для бесконечного цикла можно также сделать конструкцию с двойными скобками, не указывая параметров.

Это называется Ктулху цикл. И этот самый Ктулху не завершится, пока вы его намеренно не прибьёте. Ну а если вы хотите сделать что-то с результатом команды. Например, обработать каждый файл в текущей директории.

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

Чуть не забыл. Для выхода из цикла используется оператор Break. Его обычно комбинируют с условным оператором. Вот вам конструкция с наглядным примером. Поставьте на паузу и рассмотрите, дабы я не размусоливал видосик на 3 часа.

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

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

Узнали, что из себя представляют переменные и параметры, зачем нужны условия, как строятся конструкции циклов. Разобрали базовые нюансы работы с кавычками и прочие полезные вещи.

Надеюсь, вы понимаете, что это только верхушка айсберга и если вы хотите научиться профессионально работать с таким инструментом, как Баш, не стоит ограничиваться просмотром нескольких роликов на ютубе.

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

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

Ну а чаще всего я юзаю небольшой скриптик, который пингует все активные хосты в заданной подсети. Эдакий аналог Radmin’овского Advanced IP Scanner’а, только для бедных.

Можете перебить этот код и тоже использовать его в своей повседневной работе, если конечно имеете такую потребность. Также, не забудьте сделать домашку к данному видео. 

Для тех, кто не в теме, напоминаю, что для каждого ролика из серии «Информационная безопасность с нуля до Джуна» я разработал практические задания, выполняя которые вы сможете закрепить полученные знания и набить руку на реальных проектах.

Ссылку на эту историю, само собой прикреплю в описании. Также под роликом есть ссылка на мои авторские курсы на всевозможные IT-темы. От администрирования серверов на Windows и Linux до практического материала по работе с распределённой системой Git.

Специально для тех, кто досмотрел ролик до этой минуты, я заготовил скидочный промокод. Введёте его при покупке курса «GIT – это просто!» и снизите стоимость на целых 15%. Искренне буду рад видеть вас в числе студентов академии матёрых IT-спецов.

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

Учитесь писать BASH-скрипты. Автоматизируйте по возможности все однотипные и унылые процессы в работе и непременно пользуйтесь командой man bash, чтобы сделать своё обучение супербыстрым и продуктивным. 

Главное сильно уж не душните. Помните главный принцип, технологии – это весело. Так веселитесь по полной в процессе кодинга, а не будьте унылой какашкой. До новых встреч, мои кайфные друже. Всем пока.

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

telegram chanel

Хочешь больше контента? Подписывайся на YouTube-канал!

Курс «Диплом за неделю»

Пособие «Библия вардрайвинга»

Курс Cisco «CCNA: Introduction to Networks»

© 2022. IT-спец. Денис Курец.