LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1081|回复: 5

请教chroot()函数和execl()函数联合使用时的问题

[复制链接]
发表于 2007-4-14 11:50:27 | 显示全部楼层 |阅读模式
想实现一个非常简单的功能: 在子进程中chroot到指定目录,然后通过execl()函数执行指定目录下的/bin/sh。

结果是:
chroot()成功执行,但是execl函数会报错(errno==8)。



不知道如何在帖子里面实现代码的缩进效果,
所以将代码附在附件中(chroot.c):

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2007-4-14 11:53:28 | 显示全部楼层
补充一下:

如果不执行chroot,而是直接用通过execl()函数执行${RootPath}/bin/sh,是可以正常运行的,

所以可以排除由execl()所调用的函数无法运行的可能
回复 支持 反对

使用道具 举报

发表于 2007-4-14 15:11:48 | 显示全部楼层
Post by cupful_xu
想实现一个非常简单的功能: 在子进程中chroot到指定目录,然后通过execl()函数执行指定目录下的/bin/sh。

结果是:
chroot()成功执行,但是execl函数会报错(errno==2)。



不知道如何在帖子里面实现代码的缩进效果,
所以将代码附在附件中(chroot.c):
chroot(改变根目录)  
相关函数  chdir
#include<unistd.h>

int chroot(const char * path);
chroot()用来改变根目录为参数path 所指定的目录。只有超级用户才允许改变根目录,子进程将继承新的根目录。

返回值  调用成功则返回0,失败则返-1,错误代码存于errno。

范例  /* 将根目录改为/tmp ,并将工作目录切换至/tmp */
#include<unistd.h>
main()
{
chroot(“/tmp”);
chdir(“/”);
}

你如果想到你指定的目录下面去的话使用 chdir()函数
chroot()是改变你的根目录的函数.
回复 支持 反对

使用道具 举报

发表于 2007-4-14 17:54:55 | 显示全部楼层
你要确定chroot后,运行环境是否完整
手工命令行下chroot试试先
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-15 11:55:37 | 显示全部楼层
发现不是chroot()和execl()函数使用的问题,
而是被execl()调用的函数的问题:


被execl()函数调用的函数其实只是一个符号链接,

在chroot()之前链接到/bin/bash上,所以如果不chroot()就可以正常运行,
在chroot()之后链接到${RootPath}/bin/bash,这是一个SH4架构上的二进制代码,所以就会有errno=8 ( Exec format errno) 的错误。


感谢scutan和x11的热心帮助 :)
回复 支持 反对

使用道具 举报

发表于 2007-4-15 12:11:34 | 显示全部楼层
呵呵.受教了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表