以编程方式将Linux缓存作为非root用户删除

Phi*_*Bot 5 c++ linux permissions embedded-linux procfs

出于测试目的,我可以通过在procfs下写入Linux中的drop_caches文件来删除缓存内存.我只能以root身份执行此操作.这是在嵌入式Linux上,因此没有sudo.

sync; echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式在c ++中以编程方式写入文件 - > 如何在Linux系统上以编程方式清除C++中的文件系统内存缓存?

sync();
std::ofstream ofs("/proc/sys/vm/drop_caches");
ofs << "3" << std::endl;
Run Code Online (Sandbox Code Playgroud)

挑战是希望以非root用户身份运行应用程序时执行此操作.在重新启动时,权限如下所示:

# cd /proc/sys/vm/
# ls -lrt drop_caches 
-rw-r--r--    1 root     root             0 Feb 13 19:50 drop_caches
Run Code Online (Sandbox Code Playgroud)

你似乎无法改变这些权限 - 即使是root:

# chmod 777 drop_caches 
chmod: drop_caches: Operation not permitted
# chown user:user drop_caches 
chown: drop_caches: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Linux上实现这一目标?是否可以更改procfs文件的权限?如有必要,我可以完全自定义我的内核.谢谢 -

And*_*uel 3

您可以创建一个辅助可执行文件(要非常小心,这很危险),任何用户都可以使用 root 权限运行它。

这称为setuid

出于安全原因,您不能使用setuidshell 脚本。

从 wiki 中提取如何使用它:

setuid 和 setgid 位通常使用命令 chmod 通过将高位八进制数字设置为 4(对于 setuid)或 2(对于 setgid)来设置。“chmod 6711 file”将设置 setuid 和 setgid 位 (2+4=6)

更新

正如 @rici 所指出的,您仍然需要具有执行权限才能执行此过程,因此您可以从 中删除执行权限others并仅将其保留在 上group。因此,只有该组的成员才能执行它。

  • @AndyRoss我认为没有更好的方法来解决这个问题 (3认同)
  • 您还可以创建一个辅助可执行文件,只有特定用户(或组)才能使用 root 权限运行,这样危险性要小一些。 (2认同)