如何授予可执行文件访问 /dev/console 的权限?

如何授予可执行文件访问 /dev/console 的权限?

我编写了一个小型 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”。

相关内容