chmod、chown 的确认提示

chmod、chown 的确认提示

我只是想向一些 Linux 命令(如chmod和)添加确认提示chown

我尝试用谷歌搜索这个问题,但没有找到太多关于这个主题的信息。

在搜索时,我发现有一个rm使用该-i选项的解决方案,尽管可以用以下方法覆盖-f

然而,safe-rm你可以在服务器上安装一个软件包,将某些重要目录列入黑名单,这是一个很好的解决方案,但遗憾的是没有类似的chmod软件包chown

所以我的理想解决方案是在哪里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.*

相关内容