
我只是想向一些 Linux 命令添加確認提示,例如chmod
和chown
。
我嘗試用谷歌搜尋這個,但找不到有關該主題的太多資訊。
在搜尋時我發現有一個rm
使用該-i
選項的解決方案,儘管可以使用-f
然而,safe-rm
您可以在伺服器上安裝一個軟體包,它將某些重要目錄列入黑名單,這是一個很好的解決方案,但遺憾的是沒有類似的軟體包chmod
和chown
。
所以我理想的解決方案是在哪裡chmod
有chown
確認提示,並且某些目錄被列入黑名單,以免被 chmod 編輯和 chown 編輯。
任何答案都非常感謝!
答案1
命令莊 (1)和修改 (1)本來就沒有這樣的選擇。如果您想添加該功能,那麼您可以:
- 必須更改來源並重新編譯。
- 或寫一個包裝器。
第一個選項是最乾淨的。第二個比較容易。如果你在寫這個問題時遇到困難,那麼你需要一個可能更適合[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.*