如何对 shell 脚本进行“沙箱”处理?

如何对 shell 脚本进行“沙箱”处理?

我有一个像这样的 shell 脚本:

#/bin/sh
#do some stuff

但解释器sh不在/bin/另一个目录中。同样,该脚本在我没有写访问权限的目录中创建文件夹。我已经使用 sed 替换了目录sh,但是由于大量脚本相互依赖,我无法更改它们可能创建的所有可能的目录。

有什么方法可以模拟文件系统/读/写,以便脚本可以被沙箱化并且可以做它想做的事情,类似于 Windows 中的 Sandboxie 所做的事情?

答案1

您正在寻找的是,至少,chroot环境,即运行只能访问系统目录树的子树的程序。请注意,chroot 仅适用于文件系统访问,它不会以任何其他方式限制进程:chroot 中的进程仍然可以访问网络、调试 chroot 之外的程序等。

chroot 甚至通过符号链接来限制文件系统访问:如果您有一个指向 chroot 外部的符号链接,那么当从 chroot 进程访问时,绝对符号链接会从 chroot 的根开始,而相对符号链接则..不会比 chroot 的根更高。因此,要在不同位置组装包含文件的 chroot,您不能使用符号链接。您可以使用绑定挂载,复制文件(但这会占用空间并且不会自动更新),或使用硬链接(但这设置起来很不方便并且无法跨文件系统完成)。

chroot系统调用只能由 root 调用。作为非 root 用户,您可以使用假根反而。这只适用于动态链接的程序(其中大多数)。 Fakechroot 可以从多个位置组装目录树,因此通常您不需要使用绑定安装(但如果您确实需要绑定安装,则bindfs无需 root 权限即可使用)。

答案2

给自己一个工作 bin 目录,将脚本复制到其中,然后用代理项替换目录名称。

在你的 .profile 中

ORIGINAL_PATH=${ORIGINAL_PATH:=$PATH}
PATH=$HOME/bin:${ORIGINAL_PATH}
export ORIGINAL_PATH

保证你始终拥有一致的 PATH,

然后在命令行:

$ mkdir $HOME/bin
$ cp {the script you need} $HOME/bin
$ pushd $HOME/bin
$ vi {the script} 

将那些不可写目录的名称更改为您可以访问的名称。所以,你可能:

$ pushd      # might take you HOME, if not cd $HOME
$ mkdir sbox # your "sandbox"
$ pushd sbox 
$ mkdir -p a/path/to/a/previously/unwriteable/ ...

后者创建一个目录:

 $HOME/sbox/a/path/to/a/previously/unwriteable/

我发现使用位置参数比剪切和粘贴冗长的文件路径更有用。如果您要重复使用某个名称,请执行以下操作:

$ set /DIR/Whichheld $HOME/sbox a/path/to/a/previously/unwriteable filename
$ echo $# $*

那么这个

$ cp $1/$3/$4 $2/$3/$4 

负责处理一个文件。如果您需要大量副本:

$ from=$1/$3
$ to=$2/$3
$ pushd $from
$ cp * $to
$ popd 
$ pushd $to

会将 FROM 中的所有文件复制到 TO...

还有祝你好运。

答案3

使用ns。罢了sed

它演示了一种隐藏目录的方法,例如:

mkdir /tmp/dir && {
    rm "$_" && cd /dev/fd/3
} 3</tmp/dir

撇开 - 抱歉,我要么陷入了一个非常复杂的长达数年的骗局,要么陷入了神性,因此在登录和保留计算机方面遇到了问题。

无论如何,保重!

相关内容