Как отключить USB-устройства на основе идентификатора поставщика в среде Linux?
11
Я хочу отключить USB-устройства на основе идентификатора поставщика в среде Linux. Я хочу разрешить только определенные USB-устройства на основе идентификатора производителя.
У меня есть один конкретный поставщик: идентификатор устройства, для которого я хочу отключить cdc_acm. С тех пор я превратил это в отдельный вопрос .
Мирабилось
Ответы:
10
Вы можете создать правило udev, которое по умолчанию отключает устройства, но включает определенные по идентификатору производителя. Создайте файл /etc/udev/rules.d/01-usblockdown.rules, содержащий правило для отключения устройств:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh -c 'for host in /sys/bus/usb/devices/usb*; do echo 0 > $host/authorized_default; done'"
И затем правила для включения устройств, которые вы хотите разрешить (вы можете использовать, ATTR{idVendor}чтобы получить по ID поставщика):
Достаточно ли приведенной выше команды, или мы должны выполнить любой триггер udevadm, чтобы получить эффект этого.
Subbarao
Привет Стефан, мы должны добавить оба правила, чтобы разрешить определенный Pendrive?
Subbarao
@subbarao Да, вы должны добавить оба правила, первое блокирует все по умолчанию, второе разрешает определенные устройства.
DBX12
Это работает, когда вы подключаете, скажем, клавиатуру, после загрузки системы. Но если клавиатура подключена и вы перезагружаетесь, клавиатура работает после перезагрузки ОС. Отключите клавиатуру, а затем снова подключите, клавиатура не работает должным образом. Есть ли область более низкого уровня, на которой это правило может быть выполнено до активации загрузочных устройств?
ScottN
3
(это могло бы быть лучше в качестве комментария, но мне не хватает баллов, поэтому развернул его в ответ)
Я пришел сюда в поисках того, как разрешить все USB-устройства, кроме отключения конкретного устройства по поставщику и идентификатору продукта. Как отключить звуковое устройство usb с помощью udev отвечает на пример 0d8c: 000c.
Создать /etc/udev/rules.d/disable-usb-device.rules:
Существует несоответствие между ответом и комментарием ниже с « RUN=против» RUN+=, я попробовал первый, и он работал нормально.
Я ожидал, что dmesg или lusb сообщат по-разному, но они оба показывают, что неавторизованное устройство перечисляется так же, как и раньше, но другие процессы / модули, которые запускались автоматически, похоже, не работают, что было желаемым эффектом. cat /sys/bus/usb/devices/1-2.2.1.1.4/authorized(1-2.2 ... например, который можно найти в dmesg) показывает, что 0 был помещен в правильном месте.
Я не знаю, были ли какие-то промежуточные изменения в udev, но в настоящее время атрибуты именуются ATTRS(во множественном числе), а не ATTRкогда я запрашиваю устройства udevadm.
Ответы:
Вы можете создать правило udev, которое по умолчанию отключает устройства, но включает определенные по идентификатору производителя. Создайте файл
/etc/udev/rules.d/01-usblockdown.rules
, содержащий правило для отключения устройств:И затем правила для включения устройств, которые вы хотите разрешить (вы можете использовать,
ATTR{idVendor}
чтобы получить по ID поставщика):Смотрите "Блокировка Linux с помощью UDEV" для получения дополнительной информации.
источник
(это могло бы быть лучше в качестве комментария, но мне не хватает баллов, поэтому развернул его в ответ)
Я пришел сюда в поисках того, как разрешить все USB-устройства, кроме отключения конкретного устройства по поставщику и идентификатору продукта. Как отключить звуковое устройство usb с помощью udev отвечает на пример 0d8c: 000c.
Создать
/etc/udev/rules.d/disable-usb-device.rules
:Существует несоответствие между ответом и комментарием ниже с «
RUN=
против»RUN+=
, я попробовал первый, и он работал нормально.Я ожидал, что dmesg или lusb сообщат по-разному, но они оба показывают, что неавторизованное устройство перечисляется так же, как и раньше, но другие процессы / модули, которые запускались автоматически, похоже, не работают, что было желаемым эффектом.
cat /sys/bus/usb/devices/1-2.2.1.1.4/authorized
(1-2.2 ... например, который можно найти в dmesg) показывает, что 0 был помещен в правильном месте.источник
ATTRS
(во множественном числе), а неATTR
когда я запрашиваю устройстваudevadm
.