bash:如何避免命令被使用和运行



是否有办法防止bash或zsh终端运行特定的命令?

假设我想防止在目录~/foo上错误地运行rm。所以我想阻止下面的命令被运行:

rm -r ~/foo

另一个更广泛的例子:

mycustomcommand -param1 foo

在上面的例子中,foo可以改变,但是每次尝试运行时:

mycustomcommand -param1 anything

它应该阻塞并失败。

因此,如果我在本地终端(或服务器等)运行上述命令,该命令将被阻塞(甚至更好的是错误/警告消息)。

我们如何实现这样的行为?

Linux权限

Linux有用户、组、文件权限和文件属性来限制对每个文件的操作,这是简单可靠的方法。

。当文件不能被删除时,甚至不能被root删除(不重置属性),设置:

$ sudo chattr +i cannot_delete_me.txt
$ rm cannot_delete_me.txt
rm: cannot remove 'cannot_delete_me.txt': Operation not permitted

要禁止非root帐户不加疑问地删除文件,设置正确的文件权限就足够了:

$ chmod a-w cannot_delete_me.txt
$ rm cannot_delete_me.txt
rm: remove write-protected regular empty file 'cannot_delete_me.txt'?
# Now it is possible to delete it when typing y + enter

禁止非root用户在不改变权限的情况下删除文件,修改父目录写权限:

$ mkdir foo && cd foo
$ touch cannot_delete_me.txt
$ chmod a-w .
$ rm cannot_delete_me.txt
rm: cannot remove 'cannot_delete_me.txt': Permission denied

遮蔽命令名

任何命令都可以通过多种方式,不同的路径调用,所以它是而不是Secure to shadow命令名:

$ function rm { echo "I am dummy rm function. I will not remove: $1"; }
$ export -f rm
$ rm foo
I am dummy rm function. I will not remove: foo
/bin/rm foo # It will delete foo
<标题>使用码头工人h1> 你不相信你正在调用的脚本时,在Docker容器中调用它。它允许从主机系统绑定目录,例如只有读权限,所以你可以确定给定的脚本将访问你允许的东西。

在Docker镜像中,您还可以替换不需要的Linux命令。让我们看看这个例子:

$ mkdir my_script_environment_image && cd my_script_environment_image

my_script_environment_image目录下创建Dockerfile:

FROM debian:latest
RUN echo '#/bin/bash n
echo "This is a dummy rm. I will not remove: $1" n
' > /bin/rm

用定义的名称构建图像:

sudo docker build --tag my_script_environment .

调用一个临时的(--rm)容器来运行shell或者你的脚本。

sudo docker run -it --rm my_script_environment /bin/bash
root@f6d62a754b38:/# touch my_file.txt
root@f6d62a754b38:/# rm my_file.txt 
This is a dummy rm. I will not remove: my_file.txt

所以你的命令已经被自定义命令和整个Docker环境所取代。

在实践中,我使用Docker来控制脚本/应用程序效果的范围。

最新更新