下面给出功能将近完整的 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 的作用。(责任编辑:A6)
时间:2009-07-10 16:40
来源:developerWorks 中国
作者:王 华东
原文链接