即使在 rm -f 之后也防止文件被删除

即使在 rm -f 之后也防止文件被删除

我通常留在 StackOverflow,但我认为在这个主题上你们是更专家。

所以今天的练习很奇怪,我必须写一个script.sh,并在其中尽我所能防止test.txt被删除,但问题是最后一行成为

rm -f test.txt

我对 shell 不太了解(我通常使用 c/objective-c),所以我拿起一本书,还没读完,但仍然不知道如何做到这一点。

我考虑过权限,但测试时脚本将被授予所有权限,因此它不是一个选项...(我不知道这是否重要,但脚本将在 OS X 上运行)。

答案1

在 Linux 上,您可以使用不可变标志chattr来实现文件系统级别的只读(但需要适当的权限)。我不使用 OS X,也不知道它是否有类似的东西,但你可以test.txt使用以下方法实现“脚本运行后,仍然存在”:

#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT

rm -f test.txt

该脚本将重命名test.txttest.bak,并在脚本退出时将其重命名回来(在 后rm -f test.txt)。这不是真正的只读,但除非您kill -KILL使用脚本,否则它至少应该保留您的数据。

另一种想法是,如果你坚持要在其中添加那条线,为什么不早点退出呢?

#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.

rm -f test.txt

rm变成一个不执行任何操作的函数的替代方案:

#!/bin/sh
# do your thing
rm() {
    # this function does absolutely nothing
    : # ... but it has to contain something
}

rm -f test.txt

与上面的函数方法类似,但使用不推荐使用的alias命令来别名rmtrue不执行任何操作的内置命令(但返回真正的退出代码):

#!/bin/sh
# do your thing
alias rm=true

rm -f test.txt

从环境中删除的替代方案rm(假设没有rm内置):

#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha

# gives error: bash: rm: No such file or directory
rm -f test.txt

另一种$PATH通过使用存根rm程序(用作/tmp搜索路径)进行更改:

#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp

rm -f test.txt

有关内置函数的更多信息,请运行help <built-in>以获取详细信息。例如:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

对于其他命令,请使用man rm或查看手册页man bash

答案2

删除文件需要对包含该文件的目录具有写权限。

$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied

您可能应该在为此目的创建的临时目录中执行此操作;例如,您不想删除主目录的写权限,尽管使用以下命令很容易恢复chmod +w .

相关内容