Вопрос или проблема
Сочетание клавиш Fn
+F6
включает/выключает встроенную веб-камеру моего ноутбука. Посмотрев вывод dmesg
, похоже, что веб-камера (USB устройство) подключается/отключается к/от USB-шины виртуально:
usb 1-5: new high-speed USB device number 9 using ehci_hcd
usb 1-5: New USB device found, idVendor=5986, idProduct=0203
usb 1-5: New USB device strings: Mfr=3, Product=1, SerialNumber=0
usb 1-5: Product: BisonCam, NB Pro
usb 1-5: Manufacturer: Bison Electronics Inc.
uvcvideo: Found UVC 1.00 device BisonCam, NB Pro (5986:0203)
input: BisonCam, NB Pro as /devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/input/input14
usb 1-5: USB disconnect, device number 9
Первые семь строк следуют после события “подключения”, а последняя строка — после события “отключения”. Метки времени dmesg
удалены для ясности.
showkey
, выполненный с консоли tty, вернул код клавиши 214, xev
из KDE вернул код клавиши 220 и также XF86WebCam
. Вот часть вывода xev
, связанная с нажатием Fn
+F6
:
KeyPress event, serial 40, synthetic NO, window 0x3600001,
root 0xac, subw 0x0, time 78270130, (346,354), root:(348,377),
state 0x0, keycode 220 (keysym 0x1008ff8f, XF86WebCam), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
Я уже попробовал отправить код клавиши комбинации Fn
+F6
(214, 220 или XF86WebCam) с помощью xdotool
, xvkbd
и xmacro
, но безуспешно.
Вероятно, правильный способ сделать это – не использовать коды клавиш вообще.
Запустите эту команду с правами root:
echo 0 > /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/authorized
Путь взят из вывода dmesg
:
input: BisonCam, NB Pro as /devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/input/input14
Это запретит системе доступ к вашему устройству без деактивации всей шины или драйвера uvc, и перезагрузка не нужна.
Для повторной активации выполните echo 1 > /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/authorized
(снова с правами root).
Примечание: Я использую Archlinux с Linux 4.17
Вы можете сделать это с помощью modprobe
интерактивно в командной строке. Вы можете поместить его в черный список и затем перезагрузиться или провести ресурсы в /etc/modprobe.d/blacklist.conf
Я только что нашел этот пост на AskUbuntu, который может предоставить больше деталей, так как у меня сейчас нет системы с веб-камерой передо мной.
Кратко Выполните следующую команду: echo 1 | sudo tee $(readlink -f $(readlink -f /sys/class/video4linux/video0/device)/../port)/disable
У меня была похожая проблема, и я нашел немного другое решение, чем ilspinoza. Вместо отзыва разрешения на использование USB-порта я смог отключить USB-порт, к которому подключена веб-камера (спасибо ответу Роберта Зимер на Unix StackExchange). Я предпочитаю это решение, поскольку оно также скрывает отключенную веб-камеру от системы (например, lsusb
).
Сначала нам нужно найти sys-путь, представляющий USB-порт. Все камеры системы представлены в дереве /sys/class/video4linux
. Оттуда мы можем получить путь USB-порта, разрешив две симв. ссылки. Вот пример для первой камеры системы (video0
):
$ readlink -f $(readlink -f /sys/class/video4linux/video0/device)/../port
Это возвращает путь sys, к которому подключена веб-камера. В моем случае это:
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-0:1.0/usb3-port8
Теперь мы можем просто включить и выключить USB-порт с помощью следующих команд:
$ USBPATH=$(readlink -f $(readlink -f /sys/class/video4linux/video0/device)/../port)
$ echo 1 | sudo tee $USBPATH/disable # отключить порт веб-камеры
$ echo 0 | sudo tee $USBPATH/disable # снова включить порт
Изменения будут потеряны после перезагрузки, но вы можете добавить команду отключения в простой скрипт и запустить его при загрузке. Я использую следующий сервис systemd:
[Unit]
Description=Отключить встроенную камеру.
[Service]
Type=oneshot
Environment="USBPATH=/sys/devices/pci0000:00/0000:00:14.0/usb3/3-0:1.0/usb3-port8"
RemainAfterExit=true
ExecStart=/bin/bash -c "echo 1 > $USBPATH/disable"
ExecStop=/bin/bash -c "echo 0 > $USBPATH/disable"
[Install]
WantedBy=default.target
Не забудьте адаптировать USBPATH
к вашей системе, копируя сервис.
Имейте в виду, что fn-клавиша не сможет повторно включить камеру, если она была отключена через указанную выше команду. Она должна быть включена через sys-tree снова.
.
Ответ или решение
Включение и отключение встроенной веб-камеры ноутбука через командную оболочку является задачей, которая требует определенного понимания работы USB-устройств на уровне операционной системы. В данной ситуации кажется, что встроенная веб-камера вашего ноутбука виртуально подключается и отключается от USB-шины при комбинации клавиш Fn
+F6
. Анализируя вывод команд dmesg
и xev
, можно сделать вывод, что система распознает подключение и отключение устройства, а также назначает ему соответствующие идентификаторы.
Теория
Виртуальное подключение и отключение веб-камеры через USB-шину определяется через механизм авторизации устройства в системном /sys
древе. Когда устройство авторизировано, оно доступно для работы, в противном случае — нет. В вашей системе все USB-устройства имеют свои шлейки в каталоге /sys/bus/usb/devices
, и доступ к ним осуществляется через изменение файлов параметров. Операции с ними требуют привилегий суперпользователя.
Также возможно управление посредством включения или отключения модуля ядра UVC (USB Video Class), который отвечает за работу USB-камер. В зависимости от дистрибутива и версии ядра Linux, вы можете контролировать загрузку и выгрузку этих модулей с помощью утилиты modprobe
.
Пример
-
Отключение камеры через /sys древо:
Чтобы запретить доступ к веб-камере, можно использовать следующий метод:
echo 0 > /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/authorized
Для повторного включения камеры:
echo 1 > /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/authorized
Здесь путь
/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/authorized
следует изменить в соответствии с информацией изdmesg
. -
Отключение порта USB:
Для отключения USB-порта, используемого веб-камерой:
USBPATH=$(readlink -f $(readlink -f /sys/class/video4linux/video0/device)/../port) echo 1 | sudo tee $USBPATH/disable
Для его активации:
echo 0 | sudo tee $USBPATH/disable
Это решение предпочтительно в том случае, если нужно временно скрыть камеру от системы и интерфейсов вроде
lsusb
.
Применение
Реализация решения требует следования пошаговым инструкциям и внимательности в определении системных параметров. Используя данный подход, можно интегрировать управление веб-камерой в автоматизированные процессы, например, стартовые скрипты, используя systemd:
[Unit]
Description=Disable the built-in camera.
[Service]
Type=oneshot
Environment="USBPATH=/sys/devices/pci0000:00/0000:00:14.0/usb3/3-0:1.0/usb3-port8"
RemainAfterExit=true
ExecStart=/bin/bash -c "echo 1 > $USBPATH/disable"
ExecStop=/bin/bash -c "echo 0 > $USBPATH/disable"
[Install]
WantedBy=default.target
Не забудьте адаптировать переменную USBPATH
к вашему системному пути.
Важное замечание заключается в том, что при отключении камеры с помощью этих методов функциональные клавиши Fn
+F6
перестанут управлять камерой, пока она не будет повторно включена через те же системные команды. Это нужно учитывать при разработке и настройке автоматических скриптов, либо при управлении через командную строку.