除了某些情况外,我想禁用rm
。我在remove
文件中编写了一个名为.sh
的函数,它通过了我想在实际调用rm
之前强加的某些检查。但是,仍然可以进入终端并简单地调用rm
函数而不是使用remove
。有没有办法禁用rm
功能,除非remove
调用?我希望它好像rm
函数对于登录终端的用户“不存在”,所有“存在”都是删除函数。
甚至可能更进一步,当用户拨打rm
时,它会在屏幕上显示一条说明使用remove
的声明。
作为一个更广泛的问题,有没有办法在某些情况下禁用终端命令?我知道我可以为rm
创建一个别名来要求root,但这是简单易行的方法。
#!/bin/bash
function rm {
if [ $# -le 0 ]; then
echo "Error: no arguments specified."
else
hasDir=0
for arg in "$@"; do
if [ -d "$arg" ]; then hasDir=1; fi
done
ac="Action canceled."
resp=("y" "n" "e")
sure=" "
while [ "$sure" != "y" ] && [ "$sure" != "n" ]; do
read -p "PERMANENT ACTION. Are you sure? (y/n): " sure
done
if [ "$sure" == "n" ]; then echo "$ac"; return; fi
if [ $hasDir -eq 1 ]; then
direc=" "
validResp=0
while [ $validResp -eq 0 ]; do
read -p "Remove all sub-directories? (y/n/e): " direc
for ans in "${resp[@]}"; do
if [ "$direc" == "$ans" ]; then validResp=1; fi
done
done
if [ "$direc" == "e" ]; then echo "$ac"; return; fi
else
direc="n"
fi
check=" "
validResp=0
while [ $validResp -eq 0 ]; do
read -p "Verify removal of each file? (y/n): " check
for ans in "${resp[@]}"; do
if [ "$check" == "$ans" ]; then validResp=1; fi
done
done
if [ "$check" == "e" ]; then echo "$ac"; return; fi
if [ "$direc" == "n" ]; then
if [ "$check" == "n" ]; then
for file in "$@"; do
if [ ! -d "$file" ]; then command rm -f "$file"; fi
done
else
for file in "$@"; do
if [ ! -d "$file" ]; then command rm -i "$file"; fi
done
fi
else
if [ "$check" == "n" ]; then
command rm -rf "$@"
else
command rm -ir "$@"
fi
fi
fi
}
答案 0 :(得分:5)
您可以覆盖rm
(或任何其他命令); command
内置允许您在必要时访问原始命令。
rm () {
# Do something in addition to removing the file
command rm "$@"
}
command
禁用shell函数查找。
答案 1 :(得分:1)
如果您想捕获rm
的所有用途,那么有一种方法。但是,我必须提到它是一种肮脏的,不推荐的方式。
mv /bin/rm /bin/rm.bak
cp my_rm_script /bin/rm
my_rm_script应该包含对/bin/rm.bak的调用,而不是/ bin / rm。
这将捕获对命令rm
的所有调用。
但是,这不适用于busybox类型架构,其中二进制文件的NAME也很重要。
答案 2 :(得分:0)
您可以使用dpkg-divert
在系统上安装其他rm
。
有关使用shell脚本的示例,请参阅本文Replacing binaries with dpkg-divert。
答案 3 :(得分:0)
这是一个解决方案,它有点奇怪,但可以按照你想要的方式工作。
在您的主文件夹中创建directory
$~ mkdir ~/myrm
$~ cd ~/myrm
为您的rm
二进制文件
remove
$~ ln -s /path/to/remove rm
现在,上面的命令会创建一个链接rm
,指向remove
,基本上您通过调用remove
来调用rm
。确保在rm
上使用
$~ chmod 0777 rm
现在是时候将路径放在$PATH
变量中了。
$~ PATH=~/myrm/:$PATH
确保其~/myrm:$PATH
不是$PATH:myrm
。所以现在每当你致电rm
时,它都会在rm
目录中搜索~/myrm
并调用它。