Могу ли я остановить 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> 
  • Debian Jessie initramfs - инструмент странного поведения
  • Предотвращение постоянной зарядки аккумулятора в Ultrabook
  • Как запустить mod_mono в Debian Jessie (пакет libapache2-mod-mono отсутствует)?
  • Как восстановить повреждение файловой системы?
  • Как узнать, когда был установлен пакет?
  • Как установить Uglify на Debian Sid
  • Поддержка 802.11ac USB-ключа в Linux
  • Как использовать цветовую палитру (FBIOPUTCMAP)?
  • Есть ли дополнительная опция для отображения скрытой команды на терминале?
  • Защита от кражи конфигурации на Debian
  • Не удается загрузить Debian с установленными окнами
  • Interesting Posts

    Как проверить скорость сети прямо сейчас?

    Только подкаталоги rsync и контент

    Что такое общий сокет и как он относится к сетевому устройству?

    Как я `avconv` каждый m4a в каталоге в mp3?

    Как загружать среду рабочего стола из командной строки без диспетчера дисплеев или Wi-Fi?

    Одновременные точки доступа wlan0 и wlan1 (через hostapd)

    Используя rsync для инкрементного резервного копирования, что происходит, когда оригинальная полная резервная копия должна быть удалена?

    В чем разница между этими способами доступа к оболочке?

    Как обнаружить RAID 0 с компакт-диска Ubuntu Live?

    Как автоматически ввести льготный период sudo при входе в CLI?

    Установка TFTP-сервера без Интернета

    Каковы общие права для / tmp? Я unintentionnally все это рекурсивно

    Почему SSH-ключ вводит меня каждый раз, когда спрашивает пароль?

    Как переместить окно в другое рабочее пространство, используя его идентификатор, в bash?

    Безопасно удалить CUPS?

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