我只是想向一些 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.*