Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 禁用终端命令_Linux_Bash_Ubuntu 12.04_Rm - Fatal编程技术网

Linux 禁用终端命令

Linux 禁用终端命令,linux,bash,ubuntu-12.04,rm,Linux,Bash,Ubuntu 12.04,Rm,我想禁用rm的使用,但在某些情况下除外。我在一个.sh文件中编写了一个名为remove的函数,在实际调用rm之前,它经过了我想要执行的某些检查。但是,用户仍然可以进入终端,只需调用rm函数,而不是使用remove。是否有办法禁用rm功能,除非由remove调用?我想让登录到终端的用户觉得rm功能“不存在”,而“存在”的只是删除功能 甚至可能更进一步,当用户调用rm时,它会在屏幕上打印一条语句,说明要使用remove 作为一个更广泛的问题,除了在某些情况下,是否有办法禁用终端命令?我知道我可以为r

我想禁用
rm
的使用,但在某些情况下除外。我在一个
.sh
文件中编写了一个名为
remove
的函数,在实际调用
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    
}

您可以覆盖
rm
(或任何其他命令);内置的
命令允许您在必要时访问原始命令

rm () {
    # Do something in addition to removing the file

    command rm "$@"
}

命令
禁用外壳函数查找。

您可以覆盖
rm
(或任何其他命令);内置的
命令允许您在必要时访问原始命令

rm () {
    # Do something in addition to removing the file

    command rm "$@"
}
命令
禁用外壳函数查找。

您可以使用它在系统上安装不同的
rm

有关使用shell脚本的示例,请参见本文。

您可以使用它在系统上安装不同的
rm


另请参阅本文,了解使用shell脚本的示例。

这里有一个解决方案,它有点奇怪,但工作方式完全符合您的需要

在主文件夹中创建一个
目录

$~mkdir~/myrm

$~cd~/myrm

创建一个符号链接
rm
到您的
remove
二进制文件

$~ln-s/path/to/remove rm

现在,上面的命令将创建一个链接
rm
,该链接指向
remove
,基本上您是通过调用
rm
来调用
remove
。确保在
rm
else use上授予可执行权限

$~chmod 0777 rm

现在是将路径放入
$path
变量的时候了

$~PATH=~/myrm/:$PATH


确保其
~/myrm:$PATH
不是
$PATH:myrm
。因此,无论何时调用
rm
,它都会在
~/myrm
目录中搜索
rm
,并调用它。

这里有一个解决方案,它有点奇怪,但工作方式正是您想要的

在主文件夹中创建一个
目录

$~mkdir~/myrm

$~cd~/myrm

创建一个符号链接
rm
到您的
remove
二进制文件

$~ln-s/path/to/remove rm

现在,上面的命令将创建一个链接
rm
,该链接指向
remove
,基本上您是通过调用
rm
来调用
remove
。确保在
rm
else use上授予可执行权限

$~chmod 0777 rm

现在是将路径放入
$path
变量的时候了

$~PATH=~/myrm/:$PATH


确保其
~/myrm:$PATH
不是
$PATH:myrm
。因此,无论何时调用
rm
,它都会在
~/myrm
目录中搜索
rm
,并调用它。

如果您想捕获
rm
的所有用法,那么有一种方法。然而,我必须指出,这是一种肮脏的、不推荐的方式

mv /bin/rm /bin/rm.bak
cp my_rm_script /bin/rm
我的rm脚本应该包含对/bin/rm.bak的调用,而不是对/bin/rm的调用

这将捕获对command
rm
的所有调用


但是,这在busybox类型的体系结构上不起作用,因为二进制文件的名称也很重要。

如果您想捕获
rm
的所有用法,那么有一种方法。然而,我必须指出,这是一种肮脏的、不推荐的方式

mv /bin/rm /bin/rm.bak
cp my_rm_script /bin/rm
我的rm脚本应该包含对/bin/rm.bak的调用,而不是对/bin/rm的调用

这将捕获对command
rm
的所有调用


但是,这在busybox类型的体系结构上不起作用,二进制文件的名称也很重要。

我会担心所有那些你不知道的使用
rm
-来自
cron
init*
等的脚本。你能不能先改变路径让
rm
使用
/bin/rm
,但它不会阻止人们使用
/bin/rm
rm
是一个可执行文件,不是shell命令或函数。请记住,除了
bash
,还有其他shell。例如,运行
zsh
,可以绕过您试图创建的任何基于shell的障碍。问题是我无法命名我的函数
rm
,因为它进入递归状态。这就是为什么我必须给它取个名字,特别是
删除
。我想这样做的原因不是出于安全原因或诸如此类的原因,更多的是为了知道能够这样做。为了防止我不小心使用
rm
哈哈。在清理缩进时,我注意到你的脚本中似乎缺少了一个
fi
。我会担心那些你不知道使用
rm
-从
cron
init*
等的脚本。你能不能先改变路径让你的
rm
,但这不会阻止人们做
/bin/rm
rm
可执行文件,而不是shell命令或函数。请记住,除了
bash
,还有其他shell。例如,运行
zsh
,可以绕过您试图创建的任何基于shell的障碍。问题是我无法命名我的函数
rm
,因为它进入递归状态。这就是为什么我