Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 461
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Глава 1. Работа с командной строкой 29
4.. Напишите.команду,.которая.создает.список.каталогов.(
ls
),.находящихся.в.кор- невом.каталоге,.и.направляет.вывод.в.команду.
more
5.. Напишите.команду,.которая.исполняет.
mytask.sh
.и.отправляет.его.в.фоновый.
режим.
6.. Основываясь.на.следующем.списке.заданий,.напишите.команду,.которая.выво- дит.задание.по.пингу.Amazon.в.приоритет:
[1] Running ping www.google.com > /dev/null &
[2]- Running ping www.amazon.com > /dev/null &
[3]+ Running ping www.oreilly.com > /dev/null &
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
2
Основы работы с bash
Bash.—.это.больше.чем.просто.интерфейс.командной.строки.для.запуска.программ..
Это.сам.по.себе.язык.программирования..По.умолчанию.он.запускает.другие.про- граммы..Как.мы.уже.говорили.ранее,.когда.несколько.слов.введены.в.командную.
строку,.bash.предполагает,.что.первое.слово.—.это.имя.программы,.которую.нужно.
запустить,.а.остальные.слова.—.аргументы,.которые.нужно.передать.этой.программе.
Но,.как.язык.программирования.bash,.также.имеет.функции.для.поддержки.ввода.
и.вывода.и.управления.структурами:.
if
,.
while
,.
for
,.
case
.и.др..Его.основной.тип.
данных.—.строки.(например,.имена.файлов.и.пути),.но.он.поддерживает.и.целые.
числа..Поскольку.основное.внимание.уделяется.сценариям.и.запуску.программ,.
а.не.вычислениям,.bash.не.поддерживает.напрямую.числа.с.плавающей.точкой..
Для.этого.можно.использовать.другие.команды..Далее.мы.приводим.краткий.обзор.
отдельных.функций,.которые.делают.bash.мощным.языком.программирования,.
особенно.при.написании.сценариев.
Вывод
Как.и.любой.другой.язык.программирования,.bash.имеет.возможность.выводить.
информацию.на.экран..Вывод.можно.успешно.выполнить.с.помощью.команды.
echo
:
$ echo "Hello World"
Hello World
Вы.также.можете.использовать.встроенную.команду.
printf
,.которая.позволяет.
добавить.дополнительное.форматирование:
$ printf "Hello World\n"
Hello World
Глава 2. Основы работы с bash
1 2 3 4 5 6 7 8 9 ... 23
31
Вы.уже.видели.в.предыдущей.главе,.как.перенаправить.этот.вывод.в.файлы,.
stderr.либо.другую.команду..Больше.этих.команд.и.их.опций.мы.рассмотрим.
далее.
Переменные
Переменные.bash.начинаются.с.буквенного.символа.или.символа.подчеркивания,.
за.которым.следуют.алфавитно-цифровые.символы..Они.являются.строковыми,.
если.не.указано.иное..Чтобы.присвоить.значение.переменной,.вы.пишете.что-то.
вроде.этого:
MYVAR=textforavalue
Чтобы.извлечь.значение.этой.переменной.(например,.вывести.на.экран.с.помощью.
команды.
echo
),.вы.задаете.
$
.перед.именем.переменной:
echo $MYVAR
Если.вы.хотите.присвоить.переменной.последовательность.слов,.то.есть.сохранить.
все.пробелы,.то.заключите.значение.в.кавычки,.как.показано.ниже:
MYVAR='here is a longer set of words'
OTHRV="either double or single quotes will work"
Использование.двойных.кавычек.позволит.выполнять.другие.замены.внутри.
строки..Например:
firstvar=beginning secondvr="this is just the $firstvar"
echo $secondvr
В.результате.мы.получаем.на.выходе.такое.значение.переменной.
firstvar
:
this is just the beginning
При.извлечении.значения.переменной.вы.можете.выполнить.множество.под- становок..Мы.покажем.эти.подстановки.так,.как.они.будут.использованы.в.по- следующих.сценариях.
Помните, что при использовании двойных кавычек (") любые замены, начина- ющиеся с $, все равно выполняются, а если значение находится внутри одинарных кавычек ('), никаких замен не будет.
32 Часть I • Основы
Вы.также.можете.сохранить.вывод,.полученный.командой.оболочки,.с.помощью.
символов.
$(
)
,.как.показано.ниже:
CMDOUT=$(pwd)
Здесь.команда.
pwd
.выполняется.в.подоболочке,.и.вместо.того,.чтобы.печатать.
результат.в.stdout,.мы.сохраняем.вывод.команды.в.переменной.
CMDOUT
..Вы.также.
можете.передать.вместе.несколько.команд.внутри.
$(
)
Позиционные параметры..Обычно.при.использовании.инструментов.командной.
строки.для.передачи.данных.в.команды.применяются.аргументы.или.параметры..
Каждый.параметр.отделяется.пробелом.и.доступен.внутри.bash.с.помощью.спе- циального.набора.идентификаторов..В.скрипте.bash.доступ.к.первому.параметру,.
переданному.в.скрипт,.можно.получить.с.помощью.
$1
,.ко.второму.—.с.
$2
.и.т..д..
$0
.—.это.специальный.параметр,.который.содержит.имя.скрипта,.а.
$#
.возвращает.
общее.количество.параметров..Взгляните.на.скрипт.в.примере.2.1.
Пример 2.1. echoparams.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# echoparams.sh
#
# Описание:
# Демонстрация доступа к параметрам в bash
#
# Использование:
# ./echoparms.sh
#
echo $#
echo $0
echo $1
echo $2
echo $3
Этот.сценарий.сначала.выводит.на.экран.количество.параметров.(
$#
),.затем.имя.
сценария.(
$0
),.а.потом.первые.три.параметра..Вот.вывод:
$ ./echoparams.sh bash is fun
3
./echoparams.sh bash is fun
Глава 2. Основы работы с bash 33
Ввод
Пользовательский.ввод.можно.получить.в.bash.с.помощью.команды.
read
..Она.из- влекает.пользовательский.ввод.из.stdin.и.сохраняет.его.в.указанной.переменной..
Следующий.скрипт.читает.пользовательский.ввод.в.переменную.
MYVAR
.и.затем.
выводит.его.на.экран:
read MYVAR
echo "$MYVAR"
Вы.уже.видели,.как.перенаправить.этот.ввод.из.файлов..Далее.в.главе.вы.найдете.
гораздо.больше.информации.о.
read
.и.ее.параметрах,.а.также.об.этом.перенаправ- лении.
Условия
В.bash.предусмотрен.богатый.выбор.условных.конструкций..Многие.условия.на- чинаются.с.ключевого.слова.
if
..Любая.команда.или.программа,.вызываемая.в.bash,.
может.выполнить.вывод,.но.она.также.всегда.возвращает.значение,.определяющее.
успешное.или.неудачное.выполнение..В.оболочке.это.значение.можно.найти.
в.переменной.
$?
.сразу.после.запуска.команды..Возвращаемое.значение.
0
.считается.
success.или.true;.любое.ненулевое.значение.считается.error.или.false..В.простейшем.
виде.в.выражении.
if
.используются.именно.эти.значения.
if cmd then some cmds else other cmds fi
Использование 0 для true и ненулевого значения для false кардинально отлича- ет bash от многих языков программирования (C++, Java, Python и др.). Но для bash это имеет смысл, потому что при неудачном выполнении программы нужно вернуть код ошибки (чтобы объяснить, как она вышла из строя), тогда как при успешном завершении кода ошибки не будет, то есть мы получим 0. Это отра- жает тот факт, что многие вызовы операционной системы возвращают 0, если все прошло успешно, или –1 (или другое ненулевое значение), если случилась ошибка. Но в bash есть исключение из этого правила для значений в двойных скобках (подробнее об этом — позже).
34 Часть I • Основы
Например,.следующий.скрипт.пытается.изменить.каталоги.в.
/tmp
..Если.эта.коман- да.выполнена.успешно.(возвращает.
0
),.тело.инструкции.
if
.будет.выполнено.
if cd /tmp then echo "here is what is in /tmp:"
ls -l fi
Bash.таким.же.образом.может.обрабатывать.конвейер.команд:
if ls | grep pdf then echo "found one or more pdf files here"
else echo "no pdf files found"
fi
В.случае.конвейера.при.проверке.на.успех/неудачу.именно.последняя.команда.
определяет,.будет.ли.выбрана.true-ветвь..Вот.пример,.где.этот.факт.имеет.зна- чение:
ls | grep pdf | wc
Эта.серия.команд.будет.«истинной»,.даже.если.команда.
grep
.не.найдет.строку.
Так.происходит.потому,.что.команда.
wc
.будет.успешно.выполнена.и.выведет.сле- дующее:
0 0 0
Этот.вывод.показывает.нулевые.строки,.нулевые.слова.и.нулевые.байты.(симво- лы),.когда.от.команды.
grep
.нет.вывода.данных..Это.успешный.(и,.следовательно,.
верный).результат.для.
wc
,.а.не.ошибка.или.сбой..Получено.столько.строк,.сколько.
было.дано,.даже.если.для.подсчета.было.предоставлено.ноль.строк.
В.более.типичной.форме.команды.
if
,.используемой.для.сравнения,.применяется.
составная.команда.
[[
,.встроенная.команда.оболочки.
[
.или.тест..Укажите.их.для.
проверки.атрибутов.файла.или.сравнения.значений.
Чтобы.проверить,.существует.ли.файл.в.файловой.системе,.выполните.следующую.
команду:
if [[ -e $FILENAME ]]
then echo $FILENAME exists fi
Глава 2. Основы работы с bash 35
В.табл..2.1.перечислены.дополнительные.тесты,.которые.можно.выполнить.в.от- ношении.файлов.с.помощью.
if
Таблица 2.1. Операторы проверки файлов
Оператор проверки файлов Использование
-d
Проверка,.существует.ли.каталог
-e
Проверка,.существует.ли.файл
-r
Проверка,.существует.ли.файл.и.доступен.ли.он.для.чтения
-w
Проверка,.существует.ли.файл.и.доступен.ли.он.для.записи
-x
Проверка,.существует.ли.файл.и.является.ли.он.
исполняемым
Для.проверки.того,.что.переменная.
$VAL
.меньше.переменной.
$MIN
,.введите.следу- ющее:
if [[ $VAL -lt $MIN ]]
then echo "value is too small"
fi
В.табл..2.2.перечислены.дополнительные.числовые.тесты,.которые.можно.выпол- нить.с.помощью.
if
Таблица 2.2. Числовые тестовые операторы
Числовой тестовый оператор Использование
-eq
Тест.на.равенство.между.числами
-gt
Проверка,.больше.ли.одно.число,.чем.другое
-lt
Проверка,.меньше.ли.одно.число,.чем.другое
Будьте осторожны с использованием символа <. Рассмотрим следующий код:
if [[ $VAL < $OTHR ]]
В этом контексте оператор «меньше» использует лексическое (алфавитное) упорядочение. Это означает, что 12 меньше 2, потому что они сортируются в ал- фавитном порядке (так же, как a < b и 1 < 2, но также и 12 < 2).
36 Часть I • Основы
Если.вы.хотите.выполнить.численное.сравнение.со.знаком.«меньше»,.исполь- зуйте.конструкцию.с.двойными.скобками..Предполагается,.что.все.переменные.
являются.числовыми,.поэтому.они.так.и.будут.оцениваться..Пустые.или.не- установленные.переменные.оцениваются.как.0..Внутри.скобок.вам.не.нужен.
оператор.
$
.для.получения.значения,.за.исключением.позиционных.параметров,.
таких.как.
$1
.и.
$2
.(чтобы.не.путать.их.с.константами.
1
.и.
2
)..Например:
if (( VAL < 12 ))
then echo "value $VAL is too small"
fi
В двойных скобках воспроизводится числовая (C/Java/Python) логика повышенного уровня. Любое ненулевое значение считается истинным, и только ноль — обратное значение всем остальным операторам if в bash — ложным. Например:
if (( $? )) ; then echo "previous command failed" ; fi сделает то, что вы хотите/ожидаете, — если предыдущая команда завершилась неудачно, то $? будет содержать ненулевое значение; внутри (( )) ненулевое значение будет истинным и ветвь then будет выполнена.
В.bash.вы.можете.даже.принимать.решения.о.ветвлении.без.явной.конструк- ции.
if
/
then
..Команды.обычно.разделяются.новой.строкой,.то.есть.вводятся.по.
одной.команде.на.строку..Можно.достичь.того.же.эффекта,.разделяя.их.точкой.
с.запятой..Если.вы.пишете.
cd
$DIR
;
ls
,.bash.сначала.выполнит.команду.
cd
,.а.за- тем.команду.
ls
Две.команды.также.могут.быть.разделены.символами.
&&
.или.
||
..Если.вы.напишете.
cd
$DIR
&&
ls
,.команда.
ls
.будет.выполняться.только.в.случае.успешного.выполне- ния.команды.
cd
..Аналогично,.если.вы.введете.
cd
$DIR
||
echo cd failed
,.сообщение.
будет.напечатано.только.в.случае.сбоя.команды.
cd
Вы.можете.использовать.синтаксис.
[[
.для.выполнения.различных.тестов,.даже.без.
задания.в.явном.виде.
if
:
[[ -d $DIR ]] && ls "$DIR"
Это.работает.так.же,.как.если.бы.вы.написали.следующее:
if [[ -d $DIR ]]
then ls "$DIR"
fi
Глава 2. Основы работы с bash 37
При использовании символов && или || вам нужно сгруппировать несколько опера- торов, если в ветви then вы хотите выполнить более одного действия. Например:
[[ -d $DIR ]] || echo "error: no such directory: $DIR" ; exit
Эта команда всегда будет завершаться, независимо от того, является $DIR ката- логом или нет, так как последней командой стоит exit.
Вероятно, вы хотите написать так:
[[ -d $DIR ]] || { echo "error: no such directory: $DIR" ; exit ; }
Здесь скобки сгруппируют оба оператора вместе.
Циклы
Цикл.с.оператором.
while
.по.структуре.похож.на.
if
.в.том.смысле,.что.для.принятия.
решения.он.может.принимать.одну.команду.или.конвейер.команд,.выдающих.
true или.
false
..В.нем.также.можно.использовать.квадратные.или.круглые.скобки,.как.
в.предыдущих.примерах.
В.некоторых.языках.программирования.фигурные.скобки.(символы.
{}
).пред- назначены.для.группировки.операторов,.которые.находятся.в.теле.цикла.
while
В.таких.языках.программирования,.как.Python,.тело.цикла.и.его.операторы.опре- деляются.отступом..В.bash.операторы.сгруппированы.между.двумя.ключевыми.
словами:.
do
.и.
done
Вот.простой.цикл.
while
:
i=0
while (( i < 1000 ))
do echo $i let i++
done
Предыдущий.цикл.будет.выполняться,.пока.значение.переменной.
i
.меньше.1000..
При.каждом.выполнении.тела.цикла.на.экран.будет.выводиться.текущее.значение.
переменной.
i
..После.того.как.значение.переменной.
i
.отобразится.на.экране,.цикл.
использует.команду.
let
.для.выполнения.
i++
.в.качестве.арифметического.выраже- ния,.увеличивая.каждый.раз.значение.
i
.на.1.
Вот.более.сложный.цикл.
while
,.который.выполняет.команды.как.часть.своего.условия:
while ls | grep -q pdf do echo -n 'there is a file with pdf in its name here:'
38 Часть I • Основы pwd cd ..
done
Цикл.
for
.также.доступен.в.bash,.причем.в.трех.вариантах.
Организовать.простой.числовой.цикл.можно.с.использованием.двойных.скобок..
Он.очень.похож.на.цикл.
for
.в.C.или.Java,.но.с.двойными.скобками.и.с.
do
.и.
done вместо.фигурных.скобок:
for ((i=0; i < 100; i++))
do echo $i done
Цикл.
for
.другого.вида.используется.для.перебора.всех.параметров,.которые.пере- даются.сценарию.оболочки.(или.функции.в.сценарии),.то.есть.
$1
,.
$2
,.
$3
.и.т..д..
Обратите.внимание,.что.
ARG
.в.
args.sh
.можно.заменить.любым.именем.переменной.
по.вашему.выбору.
Пример 2.2. args.sh for ARG
do echo here is an argument: $ARG
done
Вот.вывод.для.примера.2.2,.когда.передается.три.параметра:
$ ./args.sh bash is fun here is an argument: bash here is an argument: is here is an argument: fun
Наконец,.для.произвольного.списка.значений.используйте.аналогичную.форму.
оператора.
for
.и.просто.назовите.каждое.из.значений.для.каждой.итерации.цикла..
Этот.список.может.быть.задан.явно,.например,.так:
for VAL in 20 3 dog peach 7 vanilla do echo $VAL
done
Значения,.указанные.в.цикле.
for
,.также.можно.генерировать,.вызывая.другие.про- граммы.или.используя.другие.функции.оболочки:
for VAL in $(ls | grep pdf) {0..5}
do