我有一个像这样的 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
撇开 - 抱歉,我要么陷入了一个非常复杂的长达数年的骗局,要么陷入了神性,因此在登录和保留计算机方面遇到了问题。
无论如何,保重!