【发布时间】:2013-11-17 13:29:18
【问题描述】:
正在寻找具有类似 perls chroot 功能的模块,但我不能使用 perl 的 chroot,因为它需要 root 权限。所以需要类似的东西:
#make a new "pseudo chroot"
my $dir = Chroot->new(path => '/some/path');
#change directory
$dir->cd('/tmp'); #the real path will be /some/path/tmp
$dir->pwd; #returns "/tmp"
$dir->real_pwd; #returns /some/path/tmp
$dir->cd('/lib') #now $dir->pwd is /lib - $dir->real_pwd is /some/path/lib
$dir->cd('../../../tmp');
$dir->pwd; #returns '/tmp' - ignores exceeded ../..
$dir->real_pwd #returns '/some/path/tmp'
等等……
问题:
- 是否存在这样的 CPAN 模块? (可能不是 - 我没有找到)
- 如果不是,主要问题是:什么是最好的? (安全且快速)的方式来确保像 '../../../../some' 这样的相对路径保持在伪 chroot 的“内部”?。是否存在一些用于此的模块?
Ps:还没有代码示例,因为不知道如何开始 - 确保$dir->cd('../../any/long/../..//relative/../../../path') 保留在pseudo chrooted 环境中的正确方法是什么算法。
编辑:File::Spec->canonpath 不会清理../.. - 按照它的设计。 Cwd->realpath 在这里不适合,因为如果 pseudo chroot 是 /some/path 简单的连接,Cwd->realpath( File::Spec->catpath('/some/path', '../../tmp') ) 将返回 /tmp(它存在)但它是错误的,因为它是我的“伪根”的“外部”......所以 - 还不知道......;(
【问题讨论】:
-
IMO,这个问题的答案远远超出了 SO 问题可以回答的范围。您将必须拥有大量的
XS代码,这些代码挂接到 Perl 的低级 IO 调用,并用间接 IO 调用代替。当然,这不会在 Perl 之外持续存在,因此如果用户使用system($string),Chroot 仿真将立即被破坏。 -
那么
open、require、mkdir等呢? -
@KentFredric 我需要一个简单的“路径清理”例程 - 可能问错了......
标签: perl path relative-path filepath chroot