我编写了一个小型 C 应用程序来利用 PC 的内部扬声器。为了实现这一点,我与 对话,/dev/console
然后扬声器发出哔哔声。
但是,我编译的可执行文件只有以 身份运行时才有效root
。我知道我应该将运行可执行文件的用户添加到适当的组,但我不知道也无法找出哪些组具有所需的权限。
以我当前尝试以 ( apache
) 身份运行的用户身份运行可执行文件会给我Permission denied
。
请问有什么帮助吗?
答案1
您控制对设备的访问的方式与控制对文件的访问的方式相同:通过查看权限和所有权,并以具有访问权限的用户或具有访问权限的组的成员身份执行程序。
然而,至少在我的系统上,
$ 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
都可以写入该设备,这比以 身份运行它更安全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
答案2
只要您对安全隐患感到满意,您就可以使用“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”。