有没有什么方法可以运行脚本,以便当它引用 /bin/sh 或 /usr/bin/cowsay 之类的内容时,改为运行 ~/fake/bin/sh ?
对于它运行的其他脚本以及它们运行的脚本,这种效果应该仍然有效。
答案1
如果脚本是合作性的,即如果它没有试图故意对抗你,那么你可以使用chroot在目录树的子树中运行它。在 chroot 下运行的程序无法直接访问它所在的树外部的文件,但它可以通过其他方式与外界交互,包括向进程发送信号、通过套接字通信、访问网络等。
chroot ~/fake myscript
子树~/fake
需要包含脚本所需的所有内容:~/fake/bin/sh
,~/fake/lib/ld-linux.so.2
以及~/fake/lib/libc.so.6
或系统上的动态加载程序和标准库,/proc
在 Linux 下用于ps
工作等。它们必须是实际文件,而不是符号链接,因为符号链接遍历本身受到 chroot 的约束。
绑定坐骑可以帮助构建 chroot 树,而无需复制所有必需的文件。
Chroot 需要 root 权限。如果您要运行的所有程序都是动态链接的,您可以使用fakechroot
以更轻量级的方式使用 chroot。 Fakechroot 通过拦截系统调用来工作库预加载,所以它不需要任何特权。使用 fakechroot,通常会遵循指向 chroot 外部的符号链接,因此您可以构建符号链接森林以使子树中的内容可用。
如果脚本不合作,您将需要一个适当的隔离工具:容器或虚拟机。
答案2
尝试使用符号链接:
sudo ln -sf ~/fake/bin/sh /usr/bin/cowsay
注意:(-f
强制)将(可能)导致您的原始文件/usr/bin/cowsay
被符号链接替换。
可执行文件中的任何语句~/fake/bin/sh
或该可执行文件调用的任何外部程序是否作用于符号链接本身或符号链接指向的文件,随着程序和语句的不同而有所不同。