是否有办法防止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来控制脚本/应用程序效果的范围。
标题>