我正在开发一个项目,该项目可以自动编译、执行和测试所提交的 C、C++、Java 和 Python 程序的输出。显然,这需要在某种安全环境中进行,因为可以提交任何类型的代码。在尝试使用 chroot jail 自行创建容器(最终发现不切实际)后,我转向了容器。
现在,假设我有一个 C 程序,它接受一个int i
as 参数并返回该参数i+1
。我想编写一个脚本,将 C 程序(假设plusone.out
)连同测试输入列表(input.txt
)一起复制到 LxC 容器,在容器内执行程序,将输出写入文件(output.txt
),然后将该文件导出回主机系统,以便主应用程序(在容器外运行)可以检查结果。还需要对资源进行一些限制,但我可以使用 LxC 的内置实现来做到这一点cgroups
。
我知道如何完成上面列出的大部分内容,但我无论如何也找不到如何将文件从主机复制到容器或反过来。我看到的每个教程都通过运行ls
或echo
在容器内演示行为,但从未从主机系统导入脚本或程序。有人能帮助我吗,或者能给我推荐一些可以告诉我如何实现这一点的文档吗?
答案1
这是在网络服务器上运行吗?如果是,请确保主机和容器确实已锁定。如果是在面向公众的网站上,请再三确认(听起来您知道该怎么做,但我想提一下)
将二进制文件直接复制到容器文件系统
假设您的主机“执行器”程序具有 root 权限,请尝试以下操作:
cp test_runner /var/lib/lxc/<container_name>/rootfs/tmp/
Rootfs 是容器的原始文件系统。然后,您可以通过执行以下操作来执行脚本:
lxc-attach -n container -- /tmp/testprogram
如果不是以 root 身份运行,请尝试使用非特权容器(从安全角度来看这实际上可能更好)。然后,您可以将文件直接复制到容器中,而无需 root 权限。Stephane Graber(ubuntu 的 lxc 开发人员之一)在他的博客上有一个很棒的介绍:非特权 LXC 容器简介