This commit is contained in:
Sazonov Andrey 2026-01-14 10:20:44 +03:00
parent 8ef373349f
commit c75e7a6ea5
2 changed files with 164 additions and 0 deletions

View File

@ -0,0 +1,62 @@
# usbSearch
`usbSearch` — bash-скрипт для **поиска и анализа событий подключения USB-устройств** в системе Linux.
Работает **универсально**: автоматически определяет, используется ли `systemd (journalctl)` или классические лог-файлы `/var/log`.
Проект полезен для:
* forensic / incident response
* аудита подключаемых USB-устройств
* серверов и рабочих станций
* систем без GUI
---
## Использование
### Дать права на исполнение
```bash
sudo chmod +x usbSearch.sh
```
### Запуск от root (рекомендуется)
```bash
sudo ./usbSearch.sh
```
---
## Как это работает
1. Скрипт проверяет:
* доступен ли `journalctl`
* есть ли доступ к журналу systemd
2. Если **systemd доступен**:
* используется `journalctl -k`
3. Если **systemd недоступен**:
* анализируются файлы `/var/log/kern.log*`
4. Из логов извлекаются события:
* `New USB device found`
* `Product`
* `Manufacturer`
* `SerialNumber`
* `USB Mass Storage`
---
## Пример вывода
```
-----------------------------------------------------------
Дата: Sep 12 14:33:21 | VID:0781 PID:5567
Дата: Sep 12 14:33:21 | Manufacturer: SanDisk
Дата: Sep 12 14:33:21 | Product: Cruzer Blade
Дата: Sep 12 14:33:21 | SerialNumber: 4C530001230915117293
Дата: Sep 12 14:33:22 | USB Mass Storage device
```

102
usbsearch.sh Normal file
View File

@ -0,0 +1,102 @@
#!/bin/bash
PATTERN='New USB device found|Product:|Manufacturer:|SerialNumber:|USB Mass Storage'
clear
echo -e "\e[1;32m"
cat <<'EOF'
_ __ _
/\ /\ ___| |__ / _\ ___ __ _ _ __ ___| |__
/ / \ \/ __| '_ \\ \ / _ \/ _` | '__/ __| '_ \
\ \_/ /\__ \ |_) |\ \ __/ (_| | | | (__| | | |
\___/ |___/_.__/\__/\___|\__,_|_| \___|_| |_|
EOF
echo -e "\e[0m"
###############################################################################
# Определение источника логов
###############################################################################
if command -v journalctl >/dev/null 2>&1 && \
journalctl --no-pager -n 1 >/dev/null 2>&1
then
SOURCE="journalctl"
else
SOURCE="files"
fi
###############################################################################
# Функция парсинга (общая для всех источников)
###############################################################################
parse_usb() {
awk '
{
idx=1
while ($idx != "New" &&
$idx != "Product:" &&
$idx != "Manufacturer:" &&
$idx != "SerialNumber:" &&
$idx != "Mass" && idx != NF) {
idx++
}
if ($idx == "New") {
print("\033[35m-----------------------------------------------------------\033[0m")
}
if ($idx == "Mass") {
printf("\033[1;33m")
}
printf("Дата: %s %s %s | ", $1, $2, $3)
if ($idx == "New") {
printf("VID:%s PID:%s\n", substr($(idx + 4), 10, 4), substr($(idx + 5), 11, 4))
}
else if ($idx == "Mass") {
printf("USB Mass Storage device\n\033[0m")
}
else {
while ($(idx-1) != $NF) {
printf("%s ", $idx)
idx++
}
printf("\n")
}
}'
}
###############################################################################
# journalctl
###############################################################################
if [[ "$SOURCE" == "journalctl" ]]
then
echo -e "\e[1;34m--------------------- journalctl ---------------------\e[0m"
journalctl -k \
--no-pager \
--output=short \
| grep -E "$PATTERN" \
| parse_usb
###############################################################################
# Legacy logs (/var/log)
###############################################################################
else
LOG_PATH=/var/log
LOG_BASE="kern.log"
LOG_LIST=$(find "$LOG_PATH" -type f -name "$LOG_BASE*")
for doc in $LOG_LIST
do
echo -e "\e[1;34m--------------------- File $doc ---------------------\e[0m"
if [[ "${doc##*.}" == "gz" ]]
then
CMD=zgrep
else
CMD=grep
fi
$CMD -E "$PATTERN" "$doc" | parse_usb
done
fi