chmod、chown 的確認提示

chmod、chown 的確認提示

我只是想向一些 Linux 命令添加確認提示,例如chmodchown

我嘗試用​​谷歌搜尋這個,但找不到有關該主題的太多資訊。

在搜尋時我發現有一個rm使用該-i選項的解決方案,儘管可以使用-f

然而,safe-rm您可以在伺服器上安裝一個軟體包,它將某些重要目錄列入黑名單,這是一個很好的解決方案,但遺憾的是沒有類似的軟體包chmodchown

所以我理想的解決方案是在哪裡chmodchown確認提示,並且某些目錄被列入黑名單,以免被 chmod 編輯和 chown 編輯。

任何答案都非常感謝!

答案1

命令莊 (1)修改 (1)本來就沒有這樣的選擇。如果您想添加該功能,那麼您可以:

  1. 必須更改來源並重新編譯。
  2. 或寫一個包裝器。

第一個選項是最乾淨的。第二個比較容易。如果你在寫這個問題時遇到困難,那麼你需要一個可能更適合[SO]的新問題,但簡單地說:

1)將 chmod 移到其他地方。例如mv /bin/chmod /bin/chmold.therealthing

2) 建立一個名為 chmod 的可執行腳本,它可以執行您想要的操作(並且呼叫真正的 chmod)。

未經非 shell 腳本人員(又稱我:)的測試

#!/usr/bin/env bash
echo "/bin/chmod (Shell script) called with these arguments:"
echo $@

read -p "Are you sure you want to do this? (y/n) " RESPONSE
if [ "$RESPONSE" = "y" ]; then
    exec /bin/chmod.therealthing $@        
else
    echo "OK, aborting."
fi

如果您想要更精細的控制,那麼腳本很快就會變得更加複雜。儘管如此,您還是希望能夠解析輸入並為每個檔案執行 chmod(在檢查有效語法之後)。

答案2

bash 中的一個解決方案是使用 shell 函數和別名。如果您只想將它們用於特定用戶,您可以將它們放在 /etc/bashrc 或 ~/.bashrc 中。這裡有一些函數和別名定義,您可以使用它來執行您所要求的操作。

DANGERLIST=/etc/dangerous.paths

_dangerouspath() {
        file=$(readlink -e "$1")
        [ -z "${file}" ] && return 1

        while read pattern
        do
                [[ "${file}" =~ ^${pattern}$ ]] && return 0
        done < ${DANGERLIST}

        return 1
}

_checkpaths() {
        shift
        while [ -n "$1" ]
        do
                [[ "X$1" =~ ^X[^-].* ]] && _dangerouspath $1 && return 0
                shift
        done

        return 1
}

_saferun() {
        p="$1"
        shift
        if _checkpaths $*
        then
                read -p "Are you sure you want to do this? (y/n) " r && [ "$r" = "y" ]  && $p $*
        else
                $p $*
        fi
}

alias chown="_saferun /bin/chown"
alias chgrp="_saferun /bin/chgrp"
alias chmod="_saferun /bin/chmod"

您需要在「$DANGERLIST」(/etc/dangerous.paths)中建立要保護的路徑列表,如下所示

/
/home
/etc.*
/usr/bin.*
/bin.*

相關內容