使用File :: Path创建目录,但未正确设置所有者和组

Jos*_*ost 2 perl perl-module

我正在尝试编写一个小的Perl脚本来创建目录结构.要创建目录,我使用标准模块File :: Path,如下所示:

make_path($directory,
    {
        owner   => 'apache',
        group   => 'apache',
        mode    => 0500
    }
);
Run Code Online (Sandbox Code Playgroud)

执行脚本时,将根据需要创建目录,并按预期设置umask,但文件的所有者和组都是"root".这是错误的,但错误在哪里?错误消息不会打印或由错误参数给出.

提前致谢,

约斯特

Ken*_*nny 6

我只是尝试了它,并得到了与你相同的结果.我查看了文档:

perldoc File::Path
Run Code Online (Sandbox Code Playgroud)

......并没有提到'所有者'的选择.但是,搜索最新版本(2.08,AFAICT)文档,它就在那里.你能检查一下你系统上的模块版本吗?

perl -MFile::Path -e 'print $File::Path::VERSION'
Run Code Online (Sandbox Code Playgroud)

如果你没有运行2.08,那可能就是问题所在.我正在尝试追踪该模块的更改日志,但遇到困难......

[稍后]

好的,所以这就是你想要做的:

#!/usr/bin/perl -w

use strict;

use File::Path qw( make_path );

my $directory = $ARGV[0];
my $owner = 33;

make_path( $directory, { mode => 0500 } );
chown 33, 33, $directory;
Run Code Online (Sandbox Code Playgroud)

最后,最后一行是你要注意的那一行.使用该版本的File :: Path创建所有者时,无法设置所有者,但您可以更改它.我的例子中的33是我系统上www-data用户的UID; 显然,您希望将33更改为更适合您系统的内容.此外,您需要确保您的脚本以能够执行此操作的权限运行.例如,如果您以低级用户身份运行它,它将无法运行,但如果您以root身份运行它,则chown将起作用.你可能想在那里找到一些中间立场.

  • @Jost如果脚本*是*在你的系统之外使用,你可以简单地写`use File :: Path 2.08;`而不是静默失败,它会在系统上出现"File :: Path 2.08"时出错旧版本:) (3认同)