Перейти к содержимому

Уведомления о подключении USB

Личная безопасность: если кто-то воткнул флешку в ваш компьютер (или вы сами подключили не тот накопитель), приятно узнать об этом мгновенно — с моделью, производителем и серийным номером устройства. На Linux это делается штатным udev, без сторонних демонов.

Скрипт, который udev вызовет при подключении накопителя, кладём в /usr/local/bin/notifly-usb:

#!/usr/bin/env bash
# /usr/local/bin/notifly-usb — вызывается из udev при add
set -eu
set -a; source /etc/notifly.env; set +a
# Атрибуты приходят из udev как переменные окружения.
VENDOR="${ID_VENDOR:-неизвестно}"
MODEL="${ID_MODEL:-неизвестно}"
SERIAL="${ID_SERIAL_SHORT:-нет}"
DEV="${DEVNAME:-?}"
curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \
-H "Content-Type: application/json" \
--data "$(jq -n \
--arg t "🔌 USB подключён: $VENDOR $MODEL" \
--arg m "Устройство: $DEV
Серийный №: $SERIAL
Хост: $(hostname)" \
--argjson p 7 \
'{title:$t, message:$m, priority:$p}')" >/dev/null
Окно терминала
sudo chmod 755 /usr/local/bin/notifly-usb

Само правило — /etc/udev/rules.d/99-notifly-usb.rules. Реагируем только на появление (add) USB-накопителей (block-устройства на шине usb):

ACTION=="add", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", ENV{DEVTYPE}=="disk", \
RUN+="/usr/local/bin/notifly-usb"

Перечитываем правила — новое сработает при следующем подключении:

Окно терминала
sudo udevadm control --reload-rules

Чтобы посмотреть, что udev знает об устройстве (и подстроить сообщение):

Окно терминала
udevadm info --query=property --name=/dev/sdb

Реагировать вообще на любое USB-устройство

Заголовок раздела «Реагировать вообще на любое USB-устройство»

Если нужны не только накопители, а мыши/клавиатуры/телефоны — правило по подсистеме usb:

ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR}!="", \
RUN+="/usr/local/bin/notifly-usb"

В Windows подключение накопителя фиксируется в журнале и в WMI. Проще всего — Task Scheduler на событие: источник Microsoft-Windows-Kernel-PnP, Event ID 2003 (устройство сконфигурировано). Предполагается настроенная функция Send-Notifly.

Скрипт-обработчик:

C:\scripts\Notifly-Usb.ps1
. $env:USERPROFILE\Documents\WindowsPowerShell\Notifly.ps1
# Берём последний подключённый USB-накопитель.
$disk = Get-CimInstance Win32_DiskDrive |
Where-Object { $_.InterfaceType -eq "USB" } |
Sort-Object -Property Index -Descending | Select-Object -First 1
$model = if ($disk) { $disk.Model } else { "неизвестно" }
$serial = if ($disk) { $disk.SerialNumber } else { "нет" }
Send-Notifly -Title "🔌 USB подключён: $model" `
-Message "Серийный №: $serial`nХост: $env:COMPUTERNAME" -Priority 7

Привязываем к событию (одноразово, из PowerShell от администратора):

Окно терминала
$Trigger = New-CimInstance -CimClass (Get-CimClass MSFT_TaskEventTrigger `
-Namespace Root/Microsoft/Windows/TaskScheduler) -ClientOnly
$Trigger.Subscription =
"<QueryList><Query Id='0'><Select Path='Microsoft-Windows-Kernel-PnP/Configuration'>" +
"*[System[EventID=2003]]</Select></Query></QueryList>"
$Trigger.Enabled = $true
$Action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\scripts\Notifly-Usb.ps1"
Register-ScheduledTask -TaskName "Notifly USB Alert" -Action $Action -Trigger $Trigger

Альтернатива без планировщика — постоянно висящая WMI-подписка через Register-CimIndicationEvent на Win32_VolumeChangeEvent (тип 2 = прибытие).

  • Физическая безопасность. Узнаёте о чужой флешке, даже если вас нет рядом.
  • Серийник в кармане. По ID_SERIAL_SHORT отличаете свою флешку от чужой.
  • Аудит. Каждый push — запись в истории: когда и что подключали к машине.
  • Вести белый список серийников — свои устройства слать тихо (приоритет 2), чужие громко (приоритет 8).
  • На remove слать «USB отключён» — видно, сколько устройство было воткнуто.
  • Для рабочих станций — централизовать через мониторинг.