寻找具有类似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'
依旧......
问题:
Ps:还没有代码示例,因为不知道如何开始 - 确保正确的方法是$dir->cd('../../any/long/../..//relative/../../../path')
保留在pseudo chrooted
环境中的正确方法。
编辑:File::Spec->canonpath
不会清除../..
- 按其设计。这里Cwd->realpath
不合适,因为如果伪chroot 是/some/path
,那么简单的类似Cwd->realpath( File::Spec->catpath('/some/path', '../../tmp') )
会返回/tmp
(它存在) )但这是错误的,因为它是我“伪根”的“外部”...所以 - 不知道......;(
答案 0 :(得分:3)
这是File::System模块。 File::System::Real可能就是你正在寻找的东西。它适用于绝对路径,并在File::System::Object中实现了一个辅助方法
$clean_path = $obj->normalize_path($messy_path)
并说出来:
强制应用于根的'..'返回根的原则。 这通过阻止用户访问文件来提供安全性 在根之外(假设对于给定的文件系统是可能的) 实现)。
因此,您可以直接使用此模块,或者您可以查看normalize_path
的编程方式,以了解如何清理路径......
示例:
use Modern::Perl;
use File::System;
use Data::Dumper::Concise;
my $root = File::System->new("Real", root => '/some/path');
say Dumper $root;
my $file = $root->lookup('/etc/passwd'); #will looking for /some/path/etc/passwd
say Dumper $file;
my $content = $file->content;
say $content;
答案 1 :(得分:0)
http://perldoc.perl.org/File/Spec.html#rel2abs()
检查出rel2abs,它应该能够将相对路径转换为绝对路径。之后,您可以检查例如正则表达式是否在伪chrooted目录
中