我有一个像这样的shell脚本:
#/bin/sh
#do some stuff
Run Code Online (Sandbox Code Playgroud)
但是解释器sh
不在/bin/
而是在另一个目录中。同样,脚本在我没有写权限的目录中创建文件夹。我已经替换了sh
正在使用 sed的目录,但是有大量的脚本相互依赖,我无法更改它们可能创建的所有可能的目录。
有没有办法模拟文件系统/读/写,以便脚本可以被沙箱化并且可以做它想做的事情,类似于 Sandboxie 在 Windows 中所做的?
您正在寻找的至少是chroot环境,即运行的程序只能访问系统目录树的子树。请注意,chroot 仅适用于文件系统访问,它不会以任何其他方式限制进程:chroot 中的进程仍然可以访问网络、调试 chroot 之外的程序等。
chroot 甚至通过符号链接限制文件系统访问:如果你有一个指向 chroot 外部的符号链接,那么当从 chroot 进程访问时,绝对符号链接来自 chroot 的根,而相对符号链接..
没有任何比 chroot 的根更上一层楼。因此,要在不同位置组装包含文件的 chroot,您不能使用符号链接。您可以使用绑定安装、复制文件(但这会占用空间并且它们不会自动更新)或使用硬链接(但这设置起来不方便并且不能跨文件系统完成)。
该chroot
系统调用只能由root用户调用。作为非 root 用户,您可以改用fakechroot。这仅适用于动态链接的程序(大多数)。Fakechroot 可以从多个位置组装一个目录树,因此通常您不需要使用绑定安装(但如果您确实需要绑定安装,则可以在bindfs
没有 root 权限的情况下使用)。
小智 -1
给自己一个工作 bin 目录,将脚本复制到其中,然后用代理项替换目录名称。
在你的 .profile 中
ORIGINAL_PATH=${ORIGINAL_PATH:=$PATH}
PATH=$HOME/bin:${ORIGINAL_PATH}
export ORIGINAL_PATH
Run Code Online (Sandbox Code Playgroud)
保证你始终拥有一致的 PATH,
然后在命令行:
$ mkdir $HOME/bin
$ cp {the script you need} $HOME/bin
$ pushd $HOME/bin
$ vi {the script}
Run Code Online (Sandbox Code Playgroud)
将那些不可写目录的名称更改为您可以访问的名称。所以,你可能:
$ pushd # might take you HOME, if not cd $HOME
$ mkdir sbox # your "sandbox"
$ pushd sbox
$ mkdir -p a/path/to/a/previously/unwriteable/ ...
Run Code Online (Sandbox Code Playgroud)
后者创建一个目录:
$HOME/sbox/a/path/to/a/previously/unwriteable/
Run Code Online (Sandbox Code Playgroud)
我发现使用位置参数比剪切和粘贴冗长的文件路径更有用。如果您要重复使用某个名称,请执行以下操作:
$ set /DIR/Whichheld $HOME/sbox a/path/to/a/previously/unwriteable filename
$ echo $# $*
Run Code Online (Sandbox Code Playgroud)
那么这个
$ cp $1/$3/$4 $2/$3/$4
Run Code Online (Sandbox Code Playgroud)
负责处理一个文件。如果您需要大量副本:
$ from=$1/$3
$ to=$2/$3
$ pushd $from
$ cp * $to
$ popd
$ pushd $to
Run Code Online (Sandbox Code Playgroud)
会将 FROM 中的所有文件复制到 TO...
还有祝你好运。