linux:外部キーボードがラップトップに接続されているかどうかを検出する

linux:外部キーボードがラップトップに接続されているかどうかを検出する

私はUbuntu Virtualboxを実行しているOSXノートブックを持っています。オフィスにいるときに接続するノートブックキーボードまたは外部USBキーボードを使用して対話できます。

Ubuntu Virtualboxのキーマップがそれに応じて変更されるように外部キーボードが接続されていることを検出するために実行できるスクリプトはありますか?

現在このコマンドを実行するには、「mac」または「key」を手動で実行します。

setxkbmap -layout gb

または

xmodmap .Xmodmap

キーボードを接続または切断するときに自動的に同じことをしたいと思います。どんなアイデアがありますか?

答え1

udevこれには-ruleを使用できます。私の例ではワイヤレスマウス用のUSBアダプタを使用しているので、それに応じて調整する必要があります。

1. 識別子の取得

デバイスに固有のルールを付与するには、デバイスを正しく識別する必要があります。これを行うには、udevadm(USBキーボードがで表示される必要があります/dev/usb/<device>。デバイスを接続して取り外し、デバイスが表示されている(消える)ことを確認してください)の出力を使用します。ベンダーとデバイスIDは十分に一意である必要がありますが、一致するものが多いほど良いです。

udeadm info -a -n /dev/usb/hiddev0 | grep 'idVendor\|idProduct'
ATTRS{idVendor}=="0e8f"
ATTRS{idProduct}=="00a4"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"

IDの出力と一致する2つの値を確認しますlsusb(どのデバイスであるかを調べるには、キーボードの有無による違いをテストするか、出力で名前が一致lsubsするかどうかを確認します)。

lsusb
Bus 005 Device 004: ID 0e8f:00a4 GreenAsia Inc.

したがって、ベンダーIDと製品IDとしてそれぞれと0e8fを使用します。00a4

2. ルールの作成

ルール自体は、単に実行するアクションを一覧表示します。/etc/udev/rules.d/たとえば、保存しますkeyboard.rules.rulesサフィックスは必須です)。このファイルは、いくつかの属性、タスクを一致(==)し、スクリプトを実行します。

ACTION=="add", ATTRS{idVendor}=="0e8f", ATTRS{idProduct}=="00a4", RUN+="/full/path/to/script.sh"

このセクションに問題がある可能性がありますACTION=="remove"。お読みください。これ。問題は、削除時に一部の属性が削除されるため、udev削除ルールと一致しなくなることです。

私の場合は、udeadm monitor --environemntデバイスを使用してプラグを抜いた。私は選んだ

ID_MODEL_ID=00a4

そしてこれを唯一の要件として使用してください(良い一致を得るためにはここで試行錯誤を受ける必要があるかもしれませんが、キーマップだけを変更する場合は単一の一致がかなり良いです)。ENV代わりにルールを削除する必要がありますATTRS(AFAIKENVはプラグインルールでも機能しますが、ATTRS削除は失敗します)。

ACTION=="remove", ENV{ID_MODEL_ID}=="00a4", RUN+="/path/to/removal_script.sh"

追加ルールと削除ルールは、ジョブごとに1行のファイルにすることができます。

3. スクリプト

スクリプトは常にによって実行されるため、roota)root(セキュリティ上の理由から)のみが作成でき、b)ユーザーがコマンドを実行する必要がある場合は、スクリプトsudo -u user1 commandでそのスクリプトを使用してください。もちろん実行可能でなければなりません。コマンドを直接実行する場合(つまり、スクリプトを使用せずに)、そのコマンドへの絶対パスを使用してください。

頑張ってください。

関連情報