如何用perl管理“虚拟根”文件系统 - 一种“伪chroot”

时间:2013-11-17 13:29:18

标签: perl path relative-path filepath chroot

寻找具有类似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'

依旧......

问题:

  1. 存在这样的CPAN模块? (可能不是 - 我没找到)
  2. 如果没有,主要问题是:什么是最好的? (安全和快速)方式确保比'../../../../some'之类的相对路径仍然是伪chroot的“内部”?。存在一些模块吗?
  3. 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(它存在) )但这是错误的,因为它是我“伪根”的“外部”...所以 - 不知道......;(

2 个答案:

答案 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目录