Могу ли я остановить Linux от прослушивания USB-устройства ввода в качестве клавиатуры, но все-таки захватить события программой?

У меня есть сканер штрих-кода USB на /dev/input/event0 ( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd ), и сканирование штрих-кода заставляет его отправлять события нажатия клавиш. Я записываю эти нажатия клавиш, используя библиотеку Ruby, которая отлично работает. Проблема заключается в том, что каждый штрих-код также вводится как имя пользователя, а затем пароль на малине Pi, вызывая множество неудачных попыток входа в систему. (Малина Pi будет без головы и внутри микроволновой печи).

Как я могу остановить Linux от просмотра сканера штрих-кода в качестве устройства ввода, и чтобы моя программа была единственным потребителем событий? Или есть другое, лучшее решение?

2 Solutions collect form web for “Могу ли я остановить Linux от прослушивания USB-устройства ввода в качестве клавиатуры, но все-таки захватить события программой?”

Я узнал, что мне нужно отправить EVIOCGRAB ioctl на устройство, которое захватывает его для исключительного использования .

Вот как это сделать в Ruby:

 #!/usr/bin/env ruby BARCODE_SCANNER = "/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd" require 'rubygems' require 'libdevinput' require 'ffi' require 'ffi/tools/const_generator' # We need access to the file DevInput.class_eval { attr_reader :dev } # Look up value of EVIOCGRAB constant cg = FFI::ConstGenerator.new('input') do |gen| gen.include('linux/input.h') gen.const(:EVIOCGRAB, '%u', '(unsigned)') end EVIOCGRAB = cg['EVIOCGRAB'].to_i scanner = DevInput.new(BARCODE_SCANNER) # Send EVIOCGRAB to scanner, which grabs it for exclusive use by our process scanner.dev.ioctl(EVIOCGRAB, 1) puts "Waiting for events..." scanner.each do |event| # Ignore everything except key press events next unless event.type == 1 && event.value == 1 puts "Key: #{event.code_str}" end 

Примечание . Вам нужно будет установить libdevinput gem, libdevinput и Linux. Если вы используете версию Linux от 3.2.0 до 3.6.11 , вы можете заменить часть FFI::ConstGenerator на EVIOCGRAB = 1074021776 , а затем вам не нужны заголовки EVIOCGRAB = 1074021776 или Linux.

Звучит как-то похоже на эту проблему , поэтому я бы попробовал это решение : если я правильно понял вашу проблему, сканер штрих-кода должен отображаться как подчиненный указатель «Виртуальная клавиатура», когда вы это делаете

 xinput --list 

Тогда, возможно, получить его идентификатор и заставить его плавать может помочь:

 xinput float <id> 
  • Как установить системное соединение через прокси-сервер
  • Вывести визуальное (ASCII) дерево зависимостей Debian на терминал?
  • Получение веб-камеры для работы в малине Pi
  • Как упаковать README.md в репозиторий источника git Debian?
  • systemd share cifs "ошибка монтирования (13): разрешение отклонено"
  • Как найти ответственный сценарий с результатами поиска?
  • Как установить LXDM вместо GDM3?
  • ЛУКС шифрует полный диск, сколько ОЗУ?
  • В чем недостаток наличия многих инодов?
  • Мой Debian замораживает
  • Переустановите man-страницы и исправьте человека
  • Interesting Posts

    Как использовать встроенный bash для замены вывода подоболочки или функции

    Владелец файла NFS (uid) = 4294967294, не может многое сделать с моим монтированием, как это исправить?

    Предотвращение выполнения скриптов и загрузки файлов в каталог?

    xrandr: откуда берется выход VIRTUAL1?

    Изменение макета клавиатуры по умолчанию на Lubuntu 16.04

    Ошибка компиляции ZoneMinder: «Отсутствует двоичный оператор перед токеном» («"

    В чем разница между многими вкусами OpenSUSE?

    Как обрабатывать ряд парных файлов

    Когда использовать grep, less, awk, sed

    Идеи для обеспечения безопасности OpenVPN на маршрутизаторе OpenWrt

    Установите переменную окружения автоматически после входа в систему SSH (без доступа root)

    Терминология для команды в Command $ (…)

    Что делает строка `set – $ args` и почему она ведет себя по-разному между Zsh и Bash?

    inotifywait скрипт для просмотра файла на неопределенный срок, а перезапуск процесса требует совета

    Linux не выполняет синхронизацию при перезагрузке

    Linux и Unix - лучшая ОС в мире.