/ dev / hidraw: đọc quyền


8

Tôi cần làm gì để có quyền đọc trên / dev / hidraw *?

Tôi đang nhìn thấy những thứ về quy tắc của udev và thấy điều này trên mạng, nhưng thế giới của udev giống như một vùng đất xa lạ đối với tôi, và nếu có một giải pháp đơn giản hơn, nơi tôi chỉ cần thêm mình vào một nhóm sẽ trở nên bẩn thỉu ...

(Bản xem trước Ubuntu 13.10)

Vui lòng kiểm tra lại câu hỏi - Tôi không quá quan tâm đến những gì 'hidraw' chính xác diễn ra.

BIÊN TẬP:

Vì vậy, chỉ cần thêm một số thông tin để làm rõ vấn đề: Tôi thực sự bước qua mã được gọi là open()phương thức POSIX và nhận được các errnoquyền không đủ. Chạy cattrên tệp như một người dùng bình thường dẫn đến lỗi không đủ quyền, trong khi chạy dưới sukết quả trong một cathoạt động thành công (mặc dù vô nghĩa) .

EDIT EDIT:

Theo yêu cầu, tôi đang cung cấp mã có liên quan với cuộc gọi POSIX. Nó từ thư viện HIDAPI của Signal11 (chức năng hid_open_path). Tôi tin rằng mã này là chính xác, vì nó dường như đã được sử dụng từ khá lâu rồi. Tôi đã thêm một nhận xét ở nơi errnodiễn ra việc đọc có liên quan trong 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;
}

@Braiam Mã đoạn được thêm vào.
người dùng

Câu trả lời:


11

Tôi đã từ bỏ việc chạy xung quanh để cố gắng tìm ra một số phương tiện khác để thực hiện nó ngoài các quy tắc của udev, và thay vào đó chỉ học một chút về udev và viết một quy tắc của một flippin. Dòng sau được đặt trong một .rulestệp (tôi đặt tên là của tôi 99-hidraw-permissions.rules) nằm bên dưới /etc/udev/rules.d.

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"

Về cơ bản, việc này gán tất cả các thiết bị ra khỏi hệ thống con hidraw trong kernel cho nhóm plugdevvà đặt quyền cho r / wr / wr (đối với root [chủ sở hữu mặc định], plugdev và mọi người khác tương ứng). Với bản thân tôi được thêm vào nhóm plugdev, mọi thứ thật tồi tệ.

Không hoàn toàn như não tan chảy như tôi mong đợi. Udev quy tắc thực sự dường như khá đơn giản ... Ý tôi là, họ trông giống như họ có thể có được vô lý nếu bạn đang làm việc với ID sản phẩm cá nhân và không có điều gì, nhưng họ có vẻ đẹp, damn chế ngự cho những gì họ làm.


Điều này làm việc cho tôi vì tôi muốn sử dụng công cụ cấu hình Roccat và nó cần quyền root. Với điều này tôi có thể sử dụng công cụ với người dùng bình thường.
LnxSlck

5

Để hiểu một cái gì đó ... bắt đầu biết về nó.

Ok, trước hết, hãy xem ý hidrawnghĩa và những gì bao gồm:

  • hid (Thiết bị giao diện con người): Thiết bị giao diện người hoặc HID là một loại thiết bị máy tính tương tác trực tiếp và thường lấy đầu vào từ con người và có thể cung cấp đầu ra cho con người. nguồn wikipedia
  • raw: Điều này có nghĩa là thô , nhưng trong môi trường Linux, nó cũng có nghĩa là trực tiếp.

Từ đó chúng ta có thể suy ra đó hidrawlà một phương pháp thô / trực tiếp để truy cập vào ẩn . Bây giờ hãy xem hệ thống của chúng tôi nghĩ gì về điều này:

$ 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

Vậy, character specialcó nghĩa là gì? Ví dụ, các tệp đặc biệt hoặc thiết bị ký tự liên quan đến các thiết bị mà hệ thống truyền dữ liệu một ký tự tại một thời điểm, ví dụ , getchar. một lần nữa Wikipedia là bạn của chúng ta Tương tự như vậy ckhi bắt đầu ls -llệnh.

Tôi cần làm gì để có quyền đọc trên / dev / hidraw *?

Vì vậy, làm thế nào điều này giải quyết câu hỏi của bạn? Để truy cập, /dev/hidraw*bạn nên sử dụng triển khai C để đọc / ghi vào tệp này. Nhưng, nếu những gì bạn muốn là thông tin về HID được kết nối, bạn nên xem /sys/class/hidraw/hidraw*/. Thí dụ:

$ 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

Hãy xem xét rằng chỉ hạt nhân có quyền truy cập trực tiếp trong hầu hết các trường hợp vào thiết bị và bạn chỉ nên sử dụng các cuộc gọi được cung cấp trong không gian người dùng để liên lạc với các thiết bị này.

Tôi đang xem những thứ về quy tắc của udev và thấy điều này trên mạng, nhưng thế giới của udev giống như một vùng đất xa lạ với tôi

Trừ khi bạn đang phát triển trình điều khiển / thiết bị mới mà bạn không nên chơi quá nhiều udev, bạn có thể bị hỏng não vĩnh viễn.


Tôi thực sự bước qua mã được gọi là open()phương thức POSIX và nhận được các errnoquyền không đủ. Chạy cattrên tệp như một người dùng bình thường dẫn đến lỗi không đủ quyền, trong khi chạy dưới sukết quả trong một cathoạt động thành công (mặc dù vô nghĩa) . Mặc dù tôi đánh giá cao thông tin bổ sung, nhưng nó thực sự không giúp ích gì cho vấn đề thiếu quyền của tôi ... Ngoài ra, tôi đang làm việc với một HID thử nghiệm, vì vậy tôi hoàn toàn ổn khi khiến bộ não của mình bị tổn thương rất tốt udev thứ đó là cần thiết.
người dùng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.