入力デバイスを無効にする方法は?

入力デバイスを無効にする方法は?

私のラップトップに内蔵されているキーボードが壊れています(Shiftボタンが時々押される)。外付けキーボードのみ使用するのに内蔵キーボードが干渉しますね。 (デバイスを取り外すことはできません。)

無効を使用できますが、xinput再び有効になります(参照キーボードを永久に無効にする)。

デバイスを認識しました。 (lsinputたとえば、インストールする必要がありますapt install input-utils。)

sudo lsinput

/dev/input/event0
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43841
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

どうやって無効にしますか?

答え1

ブラックリストに載せることは一つの選択肢になります。同様に、atkbdモジュールが渡されていて他のモジュールにも特定のモジュールが必要ない場合は、そのモジュールをブラックリストに追加してください。

それ以外の場合はunbindオプションになる可能性があります。

テストするノートブックがないため、余分なマウスをシステムに接続してから無効にしました。

これはマウスです:

I: Bus=0003 Vendor=04f3 Product=0235 Version=0111
N: Name="OM"
P: Phys=usb-0000:00:14.0-10.1/input0
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10.1/2-10.1:1.0/0003:04F3:0235.0004/input/input12
U: Uniq=
H: Handlers=event12 mouse1 
B: PROP=0
B: EV=17
B: KEY=70000 0 0 0 0
B: REL=903
B: MSC=10

現在経験していること/sys/bus/hid/...

# head /sys/bus/hid/drivers/*/*/*/*/name
==> /sys/bus/hid/drivers/hid-generic/0003:046A:010D.0001/input/input3/name <==
HID 046a:010d

==> /sys/bus/hid/drivers/hid-generic/0003:046A:010D.0002/input/input4/name <==
HID 046a:010d

==> /sys/bus/hid/drivers/hid-generic/0003:046D:C077.0003/input/input5/name <==
Logitech USB Optical Mouse

==> /sys/bus/hid/drivers/hid-generic/0003:04F3:0235.0004/input/input12/name <==
OM

わかりました、ここにエクスポートしましょう。

# echo 0003:04F3:0235.0004 > /sys/bus/hid/drivers/hid-generic/unbind

それは消えます。マウスカーソルが移動しなくなりました。入力デバイスとして表示されなくなりました。本当に消えた。

したがって、ingを使用してこのようなことを行うことができ、unbind使用するドライバによってブラックリストに載せることもできます。主な問題は、バインドを解除する正しい名前と場所を見つけて、カスタムudevルールを使用して自動化することです。それ以外の場合は、プラグを抜いて再接続すると再び表示されます。

答え2

USBレベルを見ても修正可能な項目が表示されない場合は、次の2つのことは、入力レイヤーレベルでUSBレベルを「キャッチ」したり、Xレベルでアクティブにしたりするのを防ぐことです。

一等のために、

evtest --grab /dev/input/event0 > /dev/null

または同様の方法でトリックを実行する必要があります。スクレイピングは、スクレイピングアプリケーションのみがイベントを受信することを保証します。言い換えれば、Xはいかなるイベントも受け取りません。

2番目の項目の場合は、次の行に沿ってInputClassセクションを追加してください。xorg.conf

Section "InputClass"
    Identifier "BrokenKeyboard"
    MatchDevicePath "/dev/input/by-path/platform-i8042-serio-0-event-kb"
    Option "Ignore" "true"
EndSection

パスが実際にキーボードに接続されているパスであるとします。ここでは背中を使用しないでください/dev/input/event0。クロスブートの一貫性を保証しません。

答え3

遅くともAppleユーザーのために上記の答えを少し説明したかったです。内部キーボードが故障したMBPを持っていますが、入力を受け取りevtestに送信しますが、/dev/nullこれが最も一般的なアドバイスのようです。この回避策の問題は、カーネルを更新するとイベント番号が変わり、ブート時に実行されるスクリプトがある場合は、すべてのカーネル更新で番号を手動で更新する必要があることです。これはusingが必要な部分unbindであり、上記の答えがどのように私が最終的に放棄するようにインスピレーションを与えたかについて、evtest私はこの作業を完璧にするように見える簡単な行を思い出しました。

完全なコマンドは次のとおりです。

head /sys/bus/hid/drivers/*/*/*/*/name | grep "apple" | sed -E 's/[^0-9A-F:.]*//g' | awk '{ print substr( $0, 1, length($0)-2 ) }' > /sys/bus/hid/drivers/apple/unbind

最初の部分が何をしているのかを知っているので、sedandの必要性を説明しますawkheadaで実行すると、grep次のような内容が出力されます。

/sys/bus/hid/drivers/apple/0003:046D:C077.0003/input/input18/name

これで、sed16進文字以外のすべてを削除するために使用します。

0003:046D:C077.000318

入力番号も末尾に含まれていますが、必要ではないので、それを使用してawk文字列の最後の2文字を削除します。

0003:046D:C077.0003

もちろん、この文字列をに送信する出力方向があります/sys/bus/hid/drivers/apple/unbind。これを起動時に実行できるスクリプトに入れると、作業は完了です。hid-genericデバイスに合わせて変更する必要があります。 Appleにはこれをより簡単にする独自の入力ドライバディレクトリがあるので、grep「apple」だけを使用すれば十分です。

編集者:これがクラウドソーシング情報の美しさです。このソリューションを提供してくれた以下のStephen Kittに感謝します。私よりもはるかにエレガントで、入力デバイス番号を正しく考慮してください。

for name in /sys/bus/hid/drivers/apple/*/*/*/name; do device=$(cut -d/ -f7 <<<"$name"); [ "$device" != "*" ] && printf "%s" "$device" > /sys/bus/hid/drivers/apple/unbind; done

関連情報