/dev/hidraw*에 대한 읽기 액세스 권한을 얻으려면 어떻게 해야 합니까?
나는 udev 규칙에 관해 뭔가를 보고 있었는데,이것온라인이지만 udev의 세계는 나에게 외국처럼 느껴집니다. 그룹에 자신을 추가하는 더 쉬운 솔루션이 있다면 좋을 것 같습니다...
(우분투 13.10 미리보기)
이 질문에 자유롭게 태그를 다시 지정해 주세요. 저는 "hidraw"가 정확히 무엇인지 별로 관심이 없습니다.
편집하다:
좋아요, 질문을 명확히 하기 위해 조금 더 정보를 드리겠습니다. open()
POSIX 메서드를 호출하는 코드를 그대로 실행했는데 errno
권한이 부족하다는 메시지가 표시되었습니다. 일반 사용자로 파일을 실행하면 cat
권한 부족 오류가 발생하지만 일반 사용자로 실행하면 su
(의미는 없더라도) 작업이 성공합니다 cat
.
편집됨:
요청 시 POSIX 호출에 대한 관련 코드를 제공했습니다. 이는 Signal11의 HIDAPI 라이브러리(함수 hid_open_path
)에서 제공됩니다. 나는 이 코드가 꽤 오랫동안 사용되어 왔기 때문에 정확하다고 생각합니다. 나는 errno
그것에 대해 읽은 GDB에 메모를 추가했습니다.
hid_device *dev = NULL;
hid_init();
dev = new_hid_device();
if (kernel_version == 0) {
struct utsname name;
int major, minor, release;
int ret;
uname(&name);
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 3) {
kernel_version = major << 16 | minor << 8 | release;
//printf("Kernel Version: %d\n", kernel_version);
}
else {
printf("Couldn't sscanf() version string %s\n", name.release);
}
}
/* OPEN HERE */
dev->device_handle = open(path, O_RDWR);
// errno at this location is 13: insufficient permissions
/* If we have a good handle, return it. */
if (dev->device_handle > 0) {
/* Get the report descriptor */
int res, desc_size = 0;
struct hidraw_report_descriptor rpt_desc;
memset(&rpt_desc, 0x0, sizeof(rpt_desc));
/* Get Report Descriptor Size */
res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0)
perror("HIDIOCGRDESCSIZE");
/* Get Report Descriptor */
rpt_desc.size = desc_size;
res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc);
if (res < 0) {
perror("HIDIOCGRDESC");
} else {
/* Determine if this device uses numbered reports. */
dev->uses_numbered_reports =
uses_numbered_reports(rpt_desc.value,
rpt_desc.size);
}
return dev;
}
else {
/* Unable to open any devices. */
free(dev);
return NULL;
}
답변1
나는 udev 규칙이 아닌 다른 것을 찾는 것을 포기하고 udev에 대해 조금 배우고 간단한 규칙을 작성했습니다. 다음 줄은 .rules
아래에 있는 파일(내가 이름을 지정함)에 배치됩니다.99-hidraw-permissions.rules
/etc/udev/rules.d
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev"
기본적으로 이는 커널의 hidraw 하위 시스템에서 나오는 모든 장치를 이 그룹에 할당 plugdev
하고 권한을 r/wr/wr(루트 [기본 소유자], Plugdev 및 기타 모든 사람에 대해 각각)로 설정합니다. 나는 Plugdev 그룹에 직접 합류했고 모든 것이 순조롭게 진행되었습니다.
생각보다 뇌가 녹는 정도는 아니었어요. Udev 규칙은 실제로 매우 간단해 보입니다. 내 말은, 그들은 다음과 같습니다.할 수 있는별도의 제품 ID 등을 다루는 경우 이는 우스꽝스러울 수 있지만 그 효과는 매우 양호한 것 같습니다.
답변2
무언가를 이해하려면... 그것을 이해하기 시작하세요.
hidraw
좋습니다. 먼저 이것이 무엇을 의미하고 무엇으로 구성되어 있는지 살펴보겠습니다 .
- hid(휴먼 인터페이스 장치): 휴먼 인터페이스 장치 또는 HID는 인간과 직접 상호 작용하고 일반적으로 인간으로부터 입력을 받아 인간에게 출력을 전달할 수 있는 컴퓨터 장치입니다.소스 위키피디아
- raw: 이 뜻은조잡한, 그러나 Linux 환경에서는 직접적인 의미도 있습니다.
이것으로부터 우리는 이것이 hidraw
하나라는 것을 추론할 수 있다.원유/직접액세스 방법숨다. 이제 우리 시스템이 이에 대해 어떻게 생각하는지 살펴보겠습니다.
$ ls -l /dev/hidraw*
crw------- 1 root root 251, 0 Aug 3 2013 /dev/hidraw0
crw------- 1 root root 251, 1 Aug 3 2013 /dev/hidraw1
crw------- 1 root root 251, 2 Aug 3 2013 /dev/hidraw2
$ file /dev/hidraw*
/dev/hidraw0: character special
/dev/hidraw1: character special
/dev/hidraw2: character special
그렇다면 character special
그것은 무엇을 의미합니까? 캐릭터 특수 파일 또는 캐릭터 장치에는 시스템이 데이터를 전송하는 장치(예: 한 번에 한 캐릭터씩)가 포함됩니다 getchar
.Wikipedia는 다시 우리의 친구입니다c
명령 시작 부분의 내용도 마찬가지입니다 ls -l
.
/dev/hidraw*에 대한 읽기 액세스 권한을 얻으려면 어떻게 해야 합니까?
그렇다면 이것이 어떻게 문제를 해결합니까? 파일에 액세스하려면 /dev/hidraw*
C 구현을 사용하여 파일을 읽고 써야 합니다. 그러나 원하는 것이 연결된 HID에 대한 정보라면 다음을 살펴봐야 합니다 /sys/class/hidraw/hidraw*/
.
$ cat /sys/class/hidraw/hidraw2/device/uevent
DRIVER=hid-generic
HID_ID=0003:000015D9:00000A4C
HID_NAME= USB OPTICAL MOUSE
HID_PHYS=usb-0000:00:1d.1-2/input0
HID_UNIQ=
MODALIAS=hid:b0003g0001v000015D9p00000A4C
대부분의 경우 커널만이 장치에 직접 액세스할 수 있으므로 이러한 장치와 통신하려면 사용자 공간에서 제공되는 호출만 사용해야 합니다.
온라인에서 udev 규칙에 대해 읽었지만 udev의 세계는 나에게 외국처럼 느껴집니다.
새로운 드라이버/장치를 개발하는 것이 아니라면 너무 많이 플레이하지 마십시오. udev
그렇지 않으면 두뇌가 영구적으로 손상될 수 있습니다.