WEB开发网
开发学院操作系统Linux/Unix 理解 chroot 阅读

理解 chroot

 2009-07-12 08:32:13 来源:WEB开发网   
核心提示: 清单 9. 粗略 `chroot` 的使用$gcc-Walltest.c-otest#./test#lsash:ls:notfound#busyboxlsbinetcnewhometesttest.c下面给出功能将近完整的 chroot ,加上了一些错误处理并新增了可执行指定命令的功能,理

清单 9. 粗略 `chroot` 的使用

$ gcc -Wall test.c -o test 
 
# ./test 
# ls 
ash: ls: not found 
 
# busybox ls 
bin   etc   newhome test   test.c 
 

下面给出功能将近完整的 chroot ,加上了一些错误处理并新增了可执行指定命令的功能。当在没有给出 chroot 切换后要执行的命令时,默认执行 `/bin/sh`,同时检测环境以确认使用何种 shell。

清单 10. 功能完整的 chroot

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
int main(int argc, char *argv[]) 
{ 
  if(argc<2){ 
    printf("Usage: chroot NEWROOT [COMMAND...] \n"); 
    return 1; 
  } 
 
  printf("newroot = %s\n", argv[1]); 
  if(chroot(argv[1])) { 
    perror("chroot"); 
    return 1; 
  } 
 
  if(chdir("/")) { 
    perror("chdir"); 
    return 1; 
  } 
 
  if(argc == 2) { 
    argv[0] = getenv("SHELL"); 
    if(!argv[0]) 
      argv[0] = (char *)"/bin/sh"; 
 
    argv[1] = (char *) "-i"; 
    argv[2] = NULL; 
  } else { 
    argv += 2; 
  } 
 
  execvp (argv[0], argv); 
  printf("chroot: cannot run command `%s`\n", *argv); 
 
  return 0; 
} 
 

保存以上代码为 newchroot.c 文件,编译后运行测试其功能。最后要指出的是,本文中的 `chroot` 并没有使用静态编译。如果有必要(如,在 initrd 中使用 chroot),chroot 应该使用静态编译,若是使用动态编译,那么要拷贝相关的动态库文件到相应目录结构中。

清单 11. `newchroot` 的测试

$ gcc -Wall newchroot.c -o newchroot 
 
# ./newchroot . /bin/ash 
newroot = . 
# 
 
 

结束语

在 Linux 系统初始引导的过程中,通常都有使用 chroot。但是 chroot 的好处不仅于此,它还增加了系统的安全性等。而通过本文后半部分对 chroot 的认识,我相信读者可以更好的发挥chroot 的作用。

本文源代码下载:http://file.ddvip.com/2009_07/work.tar.bz2

上一页  1 2 3 4 5 

Tags:理解 chroot

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接