使用Docker,您可以非常轻松地做到这一点。
docker pull ubuntu
docker run -t -i ubuntu /bin/bash
# make your changes and then log out
docker commit $(docker ps -a -q | head -n 1) sandbox
cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
chmod a+x /usr/local/bin/sandbox
echo /usr/local/bin/sandbox >> /etc/shells
useradd testuser -g docker -s /usr/local/bin/sandbox
passwd testuser
无论何时testuser
登录,它们都将被放置在一个隔离的容器中,在该容器中看不到任何外部容器,甚至其他用户的容器也是如此。
当他们注销时,该容器将被自动删除。
说明:
docker pull ubuntu
在这里,我们获取将要使用的基本图像。Docker提供了标准映像,而ubuntu就是其中之一。
docker run -t -i ubuntu /bin/bash
# make your changes and then log out
在这里,我们从ubuntu映像启动shell。您所做的任何更改都将保留给您的用户。
您也可以使用Dockerfile来构建映像,但是就一回事而言,我认为这比较简单。
docker commit $(docker ps -a -q | head -n 1) sandbox
在这里,我们将最后运行的容器转换为名为的新映像sandbox
。
cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
这将是一个伪造的外壳,用户必须在登录时运行该外壳。该脚本会将它们启动到一个docker容器中,该容器在注销后会自动清除。
chmod a+x /usr/local/bin/sandbox
我希望这很明显:-)
echo /usr/local/bin/sandbox >> /etc/shells
这在您的系统上可能不是必需的,但在我的外壳上,除非存在,否则它不能是登录外壳/etc/shells
。
useradd testuser -g docker -s /usr/local/bin/sandbox
我们创建一个新用户,将其外壳设置为要创建的脚本。该脚本将强制它们启动到沙盒容器中。他们是该docker
组的成员,以便用户可以启动新容器。
将用户置于docker组中的一种替代方法是向他们授予单个命令的sudo权限。
passwd testuser
我希望这也是显而易见的。