題 如何將access / dev / console授予可執行文件?


我寫了一個小的C應用程序來使用內部PC的揚聲器。要做到這一點,我正在談論 /dev/console 然後從揚聲器發出嗶嗶聲。

但是,我編譯的可執行文件僅在我運行時才有效 root。我知道我應該將運行可執行文件的用戶添加到正確的組,但我不知道,也無法找出哪些組具有所需的權限。

以我正在嘗試運行的用戶身份運行可執行文件(apache) 給我 Permission denied

有什麼幫助嗎?


5
2017-11-28 22:18


起源




答案:


您可以像控制對文件的訪問權限一樣控制對設備的訪問:查看權限和所有權,以及具有訪問權限的用戶或具有訪問權限的組成員執行程序。

但是,至少在我的系統中,

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

權限 /dev/console 僅限root用戶(可能有充分理由),因此您需要以root身份運行它,或者修改 udev 要創建的規則 /dev/console 使用不同的組,然後將該程序作為該組的成員運行(使用setgid位或其他方式)。

但是有更好的方式來訪問PC揚聲器(鮮為人知):揚聲器顯示為輸入事件設備,通過以正確的格式寫入,您可以直接控制揚聲器(包括頻率)。系統獨立的符號鏈接就是

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

如果你按照符號鏈接,你應該看到類似的東西

$ 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

所以任何成員 input group可以寫入此設備,這比運行它更安全 root

輸入系統使用的事件格式如下所述 /usr/src/linux/Documentation/input/input.txt 和包含文件。歸結為

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

有一種類型 EV_SND (“聲音”),即 0x12。只需將這樣的結構寫入文件即可。你甚至不需要C,命令行的perl會這樣做,例如:

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

並關閉嗶嗶聲

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

5
2017-11-29 07:26



感謝您對許可如何運作的解釋,以及詳細的解決方案 pcspkr 作為輸入設備機制。我實施了第二種方法,因為它是優越的方法。 - DRS David Soft


只要您熟悉安全隱患,就可以使用'setuid'標誌允許用戶以root身份運行您的可執行文件。

首先將可執行文件的所有權更改為root用戶和組。

# chown root:root /path/to/your_executable

然後啟用其setuid標誌。

# chmod u+s /path/to/your_executable

現在,當任何用戶運行您的可執行文件時,“有效用戶”將是root用戶,允許訪問您的/ dev / console。

您可以通過檢查輸出來確認setuid標誌:

$ ls -l /path/to/your_executable

輸出應該是這樣的:

-rwsr-xr-x

注意第一個八位字節中的's'。


4
2017-11-29 06:17



@DRSDavidSoft您覺得這些答案有用嗎? - diametralpitch
是的 - 我確實發現這兩種解決方案都很有用!該 setuid 事實上,旗幟暫時被使用,直到我實施@dirkt的答案。 - DRS David Soft