![linux: 외부 키보드가 노트북에 연결되어 있는지 감지](https://linux55.com/image/85087/linux%3A%20%EC%99%B8%EB%B6%80%20%ED%82%A4%EB%B3%B4%EB%93%9C%EA%B0%80%20%EB%85%B8%ED%8A%B8%EB%B6%81%EC%97%90%20%EC%97%B0%EA%B2%B0%EB%90%98%EC%96%B4%20%EC%9E%88%EB%8A%94%EC%A7%80%20%EA%B0%90%EC%A7%80.png)
저는 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의 출력과 일치하는 두 값을 확인합니다 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
(AFAIK ENV
는 플러그인 규칙에도 작동하지만 ATTRS
삭제는 실패함).
ACTION=="remove", ENV{ID_MODEL_ID}=="00a4", RUN+="/path/to/removal_script.sh"
추가 및 제거 규칙은 작업당 한 줄로 구성된 파일일 수 있습니다.
3. 스크립트
스크립트는 항상 에 의해 실행되므로 root
a) root
(보안상의 이유로)만이 작성할 수 있고 b) 사용자가 명령을 실행해야 하는 경우 sudo -u user1 command
스크립트에서 해당 스크립트를 사용하십시오. 물론 실행 가능해야 합니다. 명령을 직접 실행하려는 경우(즉, 스크립트를 사용하지 않고) 해당 명령에 대한 절대 경로를 사용하십시오.
행운을 빌어요.