Как включить/выключить встроенную веб-камеру ноутбука из командной строки.

Вопрос или проблема

Сочетание клавиш 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.

Пример

  1. Отключение камеры через /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.

  2. Отключение порта 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 перестанут управлять камерой, пока она не будет повторно включена через те же системные команды. Это нужно учитывать при разработке и настройке автоматических скриптов, либо при управлении через командную строку.

Оцените материал
Добавить комментарий

Капча загружается...