创建chroot环境


创建chroot环境

首先看一段代码

#include<iostream>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

using namespace std;
const int SIZE = 512;

int main()
{
//chroot之前这段代码是可以运行的
//	printf("%d\n", execl("/bin/ls", "ls", (char*) NULL));

	char python_path[SIZE];
	sprintf(python_path, "/home/xxx/test/python/a.py");
	//execl("/usr/bin/python", "python",python_path, (char*) NULL);
	char root_path[SIZE];
	sprintf(root_path, "/home/xxx/test/python/");
	chroot(root_path);
	chdir("/");

//	char str[SIZE];
//	getcwd(str, 100);
	
//	printf("current directory is :%s\n", str);
//此处返回-1,也就是execl没有执行
	printf("%d\n", execl("/python", "python", "./a.py", (char*) NULL));

	return 0;
}

为什么没有执行呢?

因为需要拷贝chroot之后的运行环境,如果此处要执行python,则需要找到所有的动态链接库。

动态链接库

首先,执行:

ldd /usr/bin/python 出来的结果,拷贝到相应的目录。

然后,执行:

strace python 得到带`open`的部分,同样拷贝。

如果需要重定向到文件,则执行:

strace -o python.txt python

拷贝之后就可以再chroot环境中执行python了,注意拷贝一定要完整。

拷贝脚本

#!/bin/bash

CHROOT='/chroot'
mkdir $CHROOT

for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq )
  do
    cp --parents $i $CHROOT
  done

# ARCH amd64
if [ -f /lib64/ld-linux-x86-64.so.2 ]; then
   cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT
fi

# ARCH i386
if [ -f  /lib/ld-linux.so.2 ]; then
   cp --parents /lib/ld-linux.so.2 /$CHROOT
fi

echo "Chroot jail is ready. To access it execute: chroot $CHROOT"

执行之后,能自动拷贝相应文件的动态链接库到相应的chroot目录。

比如,执行:

./chroot.sh /bin/ls