以非root用户身份编程方式清空Linux缓存

5

为了测试目的,我可以通过在procfs下写入到drop_caches文件来清除Linux中的缓存内存。只有作为root用户才能执行此操作。由于这是在嵌入式Linux上进行的操作,因此没有sudo。

sync; echo 3 > /proc/sys/vm/drop_caches

我可以通过从 如何在Linux系统上使用C++程序清除文件系统内存缓存 的帖子中进行一些操作来以编程方式写入文件。

sync();
std::ofstream ofs("/proc/sys/vm/drop_caches");
ofs << "3" << std::endl;

挑战在于希望以非root用户身份运行应用程序时实现此操作。重启后,权限如下:
# cd /proc/sys/vm/
# ls -lrt drop_caches 
-rw-r--r--    1 root     root             0 Feb 13 19:50 drop_caches

而且即使作为root用户,您似乎也无法更改这些权限:

# chmod 777 drop_caches 
chmod: drop_caches: Operation not permitted
# chown user:user drop_caches 
chown: drop_caches: Operation not permitted

我该如何在Linux上完成这个任务?能否更改procfs文件的权限?如果必要,我可以完全自定义我的内核。谢谢 -


1
编辑 /etc/sudoers 文件以允许用户运行这些命令? - Fredrik Pihl
由于这是嵌入式Linux,所以没有sudo - 我已经编辑了帖子以反映这一点。 - PhilBot
1个回答

3
你可以创建一个辅助可执行文件(非常小心,这很危险),任何用户都可以使用root权限运行它。这被称为setuid。出于安全原因,您不能将setuid应用于shell脚本。从维基百科中提取如何使用它的信息:
引用: 设置setuid和setgid位通常使用chmod命令进行设置,通过将高阶八进制数字设置为4(对于setuid)或2(对于setgid)。"chmod 6711 file"将设置setuid和setgid位(2+4=6)
更新: 正如@rici指出的那样,您仍然需要具有执行权限才能执行此进程,因此您可以从其他人那里删除执行权限,并仅在组上保留它。因此,只有属于该组的人才能执行它。

2
您还可以创建一个辅助可执行文件,只有特定的用户(或组)可以以root权限运行,这样就会稍微安全一些。 - rici
1
这在技术上是正确的。但我认为“它很危险”的注释被严重低估了。完美地实现此实用程序——一个完全安全的setuid根二进制文件,仅清除VM缓存而没有副作用——对于许多(可能大多数)工作负载来说,这就是等待发生的拒绝服务攻击。如果您必须使用setuid助手,则应该这样做。但不要这样做。找到更好的方法来解决您的问题。 - Andy Ross
3
@AndyRoss 我认为没有比这更好的解决问题的方法了。 - André Puel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接