即使在 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 .

相關內容