一个巨大的应用程序需要在某个特定时间对需要 root 权限的文件执行少量写入。它不是真正的文件,而是作为文件暴露给 Linux 的硬件接口。
为了避免为整个应用程序授予 root 权限,我编写了一个 bash 脚本来执行关键任务。例如,以下脚本将启用硬件接口的端口 17 作为输出:
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
Run Code Online (Sandbox Code Playgroud)
但是,由于suid
我系统上的 bash 脚本被禁用,我想知道实现这一目标的最佳方法是什么。
使用此处介绍的一些解决方法
sudo
从主应用程序调用脚本,并相应地编辑 sudoers 列表,以避免在调用脚本时需要密码。授予 sudo 权限让我有点不舒服echo
。
只需编写一个 C 程序,使用fprintf
,并将其设置为 suid root。对字符串和文件名进行硬编码,并确保只有 root 可以编辑它。或者从文本文件中读取字符串,同样确保没有人可以编辑该文件。
我没有想到的其他一些解决方案比上面介绍的更安全或更简单?
我有一个 Thinkpad,想使用 ThinkLight(屏幕上方的白色闪光灯,用于点亮键盘)来接收有关传入 Jabber 消息的通知。
很容易实现,只需将其更改/sys/class/leds/tpacpi::thinklight/brightness
为 255。我将使用一个简单的 Bash 脚本来实现,该脚本将让灯闪烁 3 次。
但是为了能够做到这一点,我需要更改权限,不仅 root 可以更改此文件。
而且我不想sudo chmod o+w /sys/class/leds/tpacpi::thinklight/brightness
每次开机后都这样。
我认为,最好的解决方案是udev
为此使用。但是,我以前从未使用udev
过,并且对我在网上找到的教程感到很困惑。
我试过这个udev
规则:
KERNEL=="tpacpi::thinklight", MODE="0666"
Run Code Online (Sandbox Code Playgroud)
也
KERNEL="thinklight", MODE="0666"
Run Code Online (Sandbox Code Playgroud)
但它不起作用。虽然我在运行时没有收到错误udevadm test /class/leds
感谢您的帮助和点击。或者也许是其他解决方案。
这是在树莓派上。
这是 sudo ls -lL /sys/class/gpio/gpio18 的输出:
-rwxrwx--- 1 root gpio 4096 Mar 8 10:50 active_low
-rwxrwx--- 1 root gpio 4096 Mar 8 10:52 direction
-rwxrwx--- 1 cameron cameron 4096 Mar 8 10:50 edge
drwxrwx--- 2 root gpio 0 Mar 8 10:50 power
drwxrwx--- 2 root gpio 0 Mar 8 10:50 subsystem
-rwxrwx--- 1 root gpio 4096 Mar 8 10:50 uevent
-rwxrwx--- 1 cameron cameron 4096 Mar 8 10:50 value
Run Code Online (Sandbox Code Playgroud)
所以看起来我现在应该可以使用价值了,太好了。然而:
cameron@raspberrypi~ $ echo 1 > /sys/class/gpio/gpio18/value
-bash: /sys/class/gpio/gpio18/value: Permission …
Run Code Online (Sandbox Code Playgroud)