今天,似乎一切都随着chroot()的引入而一片光明。几乎所有的命令都能直接通过了。仔细一算,竟然只剩下两条命令了,简直是胜利在望了。所以,我到实验室,想把我的命令再改改,应该没有什么问题吧。
可是,由于改变了进程的根目录,使我的STAT命令的列目录功能失效了。所以我感觉,只要不合并目录,直接使用chroot后的根目录,似乎很容易就能解决。但是,出现了意想不到的错误。修改了之后,服务器总是出现失败。百思不得其解,google一番,突然想到:今天下午的时候出现就是因为chroot后失败。而我的函数中为了获取用户名和组名,调用了getpwuid()和getgrgid(),而这两个函数man后发现是需要/etc/passwd和/etc/group的。现在由于改变了进程看到的根目录,他找不到/etc/passwd和/etc/group了,所以就失败。
加入调试信息,发现果然进程在此终止,在想google一个替代方案,竟然一无所获。而且,查到的都是不好的消息。比如,这两个函数返回的字符指针是指向静态区域的,似乎是不可重入的。而且,chroot到ftp的根目录/var/pub后,似乎是无法返回的。也就是说,我的程序永远看不到/etc/passwd了,这个问题无解?
我又测试了需要/etc/xylftp/xylfpt.pass文件的USER和PASS命令 ,果然,chroot后,它们也失效了。和这两条命令的作者windflush联系了一下,讨论了半天,似乎他还有点蒙,依然无解。把这个问题发到了新闻组,还没有人回复。等吧,看来,这个问题挺严重的。
心情一下从很好到了很不好,很郁闷啊~
怕啥,船到桥头自然直
确实……
By definition, a chroot() is not undoable.
问题是,目前看来是没法chroot回去的。
这有啥难的?~~get*id()之前chroot回去,调完再chroot回来不就成了么?!