我有一个小型 C++ 应用程序,用于打开和关闭在 Debian 9.2 上运行的 BeagleBone Black 开发板的灯。
它通过更新文本文件来做到这一点。
// Turn light on
fs.open("/sys/class/leds/beaglebone:green:usr0", std::fstream::out);
fs << "1";
fs.close();
如果我以标准用户身份运行该程序,它可以正常运行,但所有指示灯都没有变化。
如果我使用 sudo
运行程序,一切正常,灯亮。
我猜这是因为这些文件需要更高的访问权限。
我对 Linux 权限不是很熟悉,但有没有办法允许您的程序访问用户无法访问的文件?
最佳答案
仔细阅读setuid关于credentials(7) (和 execve(2) 是程序的启动方式)。但要小心 vulnerabilities .
阅读Advanced Linux Programming (可免费下载,但有点旧)或一些关于 Linux 编程的新书。阅读intro(2)和 syscalls(2) .
您还可以阅读 Operating Systems: Three Easy Pieces (可免费下载)以了解有关操作系统的更多信息。
您可以使您的可执行文件 setuid(在适当的 chown
之后使用 chmod u+s
)并调用 小心 setreuid(2)在适当的地方。这就是 sudo
或 su
等程序的工作方式(它们都是 setuid)。有时您可以只使用组权限(因此仅限 setgid)。
但要小心,此类程序中的错误可能会打开一个巨大的安全漏洞。因此,保持 setuid 程序非常小并让其他人审查它们的代码是明智的。一种可能的方法是编写一个非常小的 setuid 可执行文件来做你奇怪的事情(例如只闪烁 LED)并与越来越大的普通程序(例如提供图形用户界面)。
也许您可以通过创建组 led
并授予组对 /sys/class/leds/beaglebone:green:usr0
的写入权限来配置您的系统,并且仅使用 setgid技术。
关于c++ - 赋予可执行文件比运行用户更多的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446847/