c - 如果我想清空目录,是否有任何理由不应该删除它并重新创建它?

标签 c linux rm

我已经看过这两个清空目录的线程:
Removing a non empty directory programmatically in C or C++
Delete folder and all files/subdirectories
但是,清空作为这些线程的答案给出的目录的函数非常复杂,一个答案可能会遇到堆栈溢出。
当我想删除和添加目录时,我想用c语言在linux平台上完成。不过,如果你还想在windows上解释这背后的原因,我也会很感激的。
这是我要实现的代码:

system( "rm -rf /some/directory" )
mkdir("/some/directory", 0700);

这看起来简单多了。我为什么不使用它?它的效率远低于它看起来的吗?

最佳答案

rm -fr /some/directory命令必须为您执行递归工作。使用该命令比编写自己的代码来完成相同的工作要简单得多——它体现了懒惰的优点,并利用了程序规模上的代码重用。(除非目录已为空,否则不能对其使用rmdir()系统调用。)所以这并非完全不合理。
一个问题是安全性:是否可以在您的路径上放置系统rm命令的替代选项?在unix上,路径中的/bin/usr/bin是第一位的,还是其他目录是第一位的?
如果您认为使用/bin/rm(或/usr/bin/rm)足够安全,那么这可能是比未经修饰的rm更好的选择,但总的来说,这还不算太糟。
另一个问题是安全性的另一个方面-您真的可以删除并创建目录吗?你能在/some里写吗?如果删除并重新创建,您是否应该保留/some/directory的当前所有者、组和权限?在这些操作之后,目录将由进程的有效uid拥有;if将属于具有进程的有效gid的组(除非在/some目录上设置了一个粘性位-或者除非您在macos上);并且权限将被0777的当前设置修改。
如果这些问题不重要,或者是可以避免的,那么删除并重新创建是可行的。
对以上评论进行扩展:
当你在评论中提到umask()电话时,我不知道你在说什么。
system()函数执行通过命令解释器作为参数传递的字符串。当你写代码的时候,你必须考虑当有人试图让你运行它的时候,它会怎么出错。当您编写system()时,您依赖于shell查找normal"rm -fr /some/directory"命令并正常工作。但是,如果您的rm有一个类似于PATH的值(这样您自己的私有$HOME/bin:/bin:/usr/bin目录中的命令优先于系统提供的命令使用),那么如果用户可以将自己的脚本安装为bin,则他们可以使用您的特权执行任意代码-这可能允许他们在以后保留你所有的特权。他们甚至可以清理(大部分)曾经有过脚本的证据。
避免此类问题的一种方法是请求$HOME/bin/rm(当然,除非$HOME/bin/rm"/bin/rm -fr /some/directory"而不是rm)。这可以说是更安全的。以前有一些攻击可以通过/usr/bin环境变量进行;这些攻击是由现代shell进行的,这些shell不使用/bin的任何继承值。
注意,一个问题是解释IFS命令是否成功。IFS选项意味着它在几乎所有情况下都会报告成功,但是如果目录没有消失,那么您的rm调用将失败。
至于-fr的安全性,我对您所说的理解是,可能选择了错误的目录。我无法想象会发生什么。
假设您确实拥有修改mkdir("/some/directory", 0777)目录的权限(您需要能够删除/some/directory),并且您可以修改旧版本/some的所有子目录,那么您可以从用户/some/directory拥有的/some/directory开始,使用组/some/directory和权限775,然而,在命令和系统调用(注意victim是函数而不是系统调用;witless是系统调用)成功之后,该目录可能由用户system()、组mkdir()拥有并具有0777权限。这可能不太理想。如果您不想破坏这样的权限设置,那么您可能不想使用“删除并重新创建”技术,或者,也不想使用本例所示的这种头脑简单的技术。然后,您必须更加努力地删除目录的内容,而不修改这些属性。您可以扫描目录(victormischiefopendir()并对每个名称或名称集调用readdir(),以彻底清除目录,而不必删除目录本身。这是混合复杂性。它比简单的删除和重新创建更为烦琐,但远没有处理多个级别上的完全递归删除那么烦琐。
如我之前所说,你必须决定这些问题是否重要。重要的是你意识到问题的存在,并且你对是否处理这些问题做出了有意识的(明智的)决定,以及如何处理这些问题。
请记住,如果您的程序可能是以root(管理员)权限运行的,那么更重要的是要小心—但即使只有普通的普通用户才会运行该程序,这仍然很重要。

关于c - 如果我想清空目录,是否有任何理由不应该删除它并重新创建它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048215/

相关文章:

linux - date -d 在 Mac 上不工作

linux - 如何从 Shell 脚本的配置文件中检索值(不知道 key )

docker - 如何更正 makefile 中的 docker,它需要至少 1 个参数才能删除所有容器命令

ubuntu - 如何打开 rm 命令的警告?

c - 使用命名管道的进程间通信

c - 为什么 WaitForSingleObject 会错过一个信号?

c - 尝试将字符串插入数组以检查字符串是否描述函数

c - 使用 printf 打印字符数组

java - 为什么Linux不执行Java有执行权限的bash脚本?