Làm cách nào để tôi cấp quyền truy cập / dev / console cho tệp thực thi?


5

Tôi đã viết một ứng dụng C nhỏ để sử dụng loa của PC bên trong. Để đạt được điều này, tôi đang nói chuyện với /dev/consolenó để phát ra tiếng bíp từ loa.

Tuy nhiên, tệp thực thi được biên dịch của tôi chỉ hoạt động nếu tôi chạy như root. Tôi hiểu rằng tôi nên thêm người dùng đang chạy chương trình thực thi vào nhóm thích hợp, nhưng tôi không biết và không thể tìm ra nhóm nào có quyền yêu cầu.

Chạy chương trình thực thi với tư cách là người dùng mà tôi hiện đang cố gắng chạy vì ( apache) mang lại cho tôi Permission denied.

Có ai giúp đỡ không?

Câu trả lời:


5

Bạn kiểm soát quyền truy cập vào thiết bị giống như cách bạn kiểm soát quyền truy cập vào tệp: Bằng cách xem quyền và quyền sở hữu và thực thi chương trình với tư cách là người dùng có quyền truy cập hoặc là thành viên của nhóm có quyền truy cập.

Tuy nhiên, ít nhất là trên hệ thống của tôi,

$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console

các quyền /dev/consoleđược giới hạn chỉ dành cho root (có thể vì lý do chính đáng), vì vậy bạn cần chạy nó dưới quyền root hoặc sửa đổi các udevquy tắc để tạo /dev/consolevới một nhóm khác, sau đó chạy chương trình với tư cách là thành viên của nhóm này (với setgid bit, hoặc cách khác).

Nhưng có một cách tốt hơn để truy cập loa PC (điều ít được biết đến): Loa hiển thị dưới dạng thiết bị sự kiện đầu vào và bằng cách ghi vào loa ở định dạng chính xác, bạn có thể điều khiển trực tiếp loa (bao gồm cả tần số). Symlink độc lập hệ thống cho đó là

/dev/input/by-path/platform-pcspkr-event-spkr

và nếu bạn theo liên kết tượng trưng, ​​bạn sẽ thấy một cái gì đó tương tự như

$ ll /dev/input/by-path/platform-pcspkr-event-spkr
lrwxrwxrwx 1 root root 9 Nov 29 06:57 /dev/input/by-path/platform-pcspkr-event-spkr -> ../event5
$ ll /dev/input/event5
crw-rw---- 1 root input 13, 69 Nov 29 06:57 /dev/input/event5

Vì vậy, bất kỳ thành viên nào trong inputnhóm đều có thể ghi vào thiết bị này, an toàn hơn là chạy nó như root.

Định dạng của các sự kiện được sử dụng bởi hệ thống đầu vào được mô tả trong /usr/src/linux/Documentation/input/input.txtvà các tệp bao gồm. Nó đun sôi xuống

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
}

với một loại EV_SND("âm thanh"), nghĩa là , 0x12. Chỉ cần viết một cấu trúc như vậy vào tập tin. Bạn thậm chí không cần C cho việc này, perl từ dòng lệnh sẽ làm, ví dụ:

perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr

và tắt tiếng bíp

perl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr

Tôi đánh giá cao lời giải thích của bạn về cách thức hoạt động của quyền, cũng như giải pháp chi tiết giải thích pcspkrdưới dạng cơ chế thiết bị đầu vào. Tôi thực hiện cách tiếp cận thứ hai vì nó là phương pháp ưu việt.
David Refoua

3

Miễn là bạn cảm thấy thoải mái với các tác động bảo mật, bạn có thể sử dụng cờ 'setuid' để cho phép người dùng chạy tệp thực thi của bạn dưới quyền root.

Đầu tiên thay đổi quyền sở hữu của người thực thi và người dùng root.

# chown root:root /path/to/your_executable

Sau đó kích hoạt cờ setuid của nó.

# chmod u+s /path/to/your_executable

Bây giờ khi bất kỳ người dùng nào chạy chương trình thực thi của bạn, 'người dùng hiệu quả' sẽ được root, cho phép truy cập vào / dev / console của bạn.

Bạn có thể xác nhận cờ setuid bằng cách kiểm tra đầu ra của:

$ ls -l /path/to/your_executable

Đầu ra phải giống như:

-rwsr-xr-x

Lưu ý 's' trong octet đầu tiên.


@DRSDavidSoft bạn có thấy câu trả lời nào hữu ích không?
diametralpitch

Có - tôi đã tìm thấy cả hai giải pháp ở đây hữu ích! Các setuidlá cờ trên thực tế đã được sử dụng tạm thời cho đến khi tôi thực hiện @ câu trả lời dirkt của.
David Refoua
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.