2011-08-13 8 views
2

ディレクトリ構造を作成する小さなPerlスクリプトを作成しようとしています。次のようにディレクトリを作成するには、私は、標準モジュールファイル::パスを使用します。望んでいたと予想通りのumaskが設定されているようFile :: Pathを使用してディレクトリを作成しましたが、所有者とグループが正しく設定されていません。

make_path($directory, 
    { 
     owner => 'apache', 
     group => 'apache', 
     mode => 0500 
    } 
); 

スクリプトを実行して、ディレクトリが作成されますが、両方の所有者およびグループのファイルは「root」です。これは間違っていますが、どこにエラーがありますか? error-parameterによってエラーメッセージが出力されることはありません。事前に

おかげで、

ヨースト

+0

も動作しない数値のユーザーIDとグループIDを与える:

もっと正しい方法は、このようなものになることができます。 – Jost

答えて

6

私はちょうどそれを試してみましたが、あなたと同じ結果を得ました。私はドキュメントを見て:

perldoc File::Path 

... '所有者'オプションの記載はありません。しかし、最新バージョン(2.08、AFAICT)のドキュメントを検索してください。システム上のモジュールのバージョンを確認できますか?

perl -MFile::Path -e 'print $File::Path::VERSION' 

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; 

を最終的に:私は...

[後]

OKを今モジュールの変更履歴を追跡しようとするが、困難を抱えているので、ここであなたが何をしたいです、最後の行はメモしたい行です。 File :: Pathのバージョンで作成するときに所有者を設定することはできませんが、変更することはできます。私の例の33は、私のシステム上のwwwデータユーザーのUIDです。明らかに、あなたのシステムにとってより賢明なものに33を変更したいと思っています。また、スクリプトがこれを実行できる権限で実行されていることを確認する必要があります。たとえば、これを低レベルのユーザーとして実行すると動作しませんが、rootとして実行するとchownが機能します。あなたはそこにいくつかの中間地点を見つけたいかもしれません。

+0

はい、それは答えかもしれません - 私のシステム上のバージョンは2.07_03です。私は新しいバージョンを取得しようとします。 – Jost

+0

それは私のシステムと同じバージョンなので、あなたは怒っていません。私はあなたが探している答えであると信じて私の答えを更新しました。 – Kenny

+0

私は単純にFile :: Pathバージョンを更新しましたが、私は最新のシステムのファンです。とにかくそれはトリックでした。ありがとうございました。 – Jost

2

これは、File::Pathのバグであると主張します。それは認識しないキーを静かに無視します。

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Path; 

print "Using File::Path version $File::Path::VERSION with Perl $]\n"; 

my $tmpdir = "/tmp/file-path-test-$$"; 

print "Creating $tmpdir\n"; 
mkdir $tmpdir, 0777 or die "$tmpdir: $!\n"; 

my @result = File::Path::make_path 
       ("$tmpdir/new-dir", 
        { owner => 'kst', 
        mode => 0500, 
        nosuchkey => 'WTF?' }); 

print "Created (@result)\n"; 

(これは、あなたが「KST」という名前のシステム上のアカウントを持っていると想定しています。お使いのシステムのために必要に応じて調整します。)

を、私は、ファイルを使用してsudoの下でこれを実行すると::パスのバージョン2.07_03をPerl 5.010001では、作成されたディレクトリはrootによって所有されています。私はまったく同じことをするが、Perl 5.014000でFile :: Pathバージョン2.08_01を使用すると、ディレクトリはkstになります。いずれの場合も、認識できないキーには問題がないことが示されています(古いバージョンの場合はownernosuchkey、新しいバージョンの場合はnosuchkey)。

perldoc File::Path私が紛失していない限り、この問題は解決されておらず、プログラムが新しいオプションを処理できるかどうかを確認するための明確な方法はありません。 (あなたは$File::Path:VERSIONをチェックすることができましたが、新しいオプションがいつ実装されたかを知る必要があります)

私はちょうどreported thisです。

+0

[変更](http://search.cpan.org/dist/File-Path/Changes)ファイルを参照して、その機能が2.08で追加されたことを確認できます。 – cjm

+0

また、 'make_path'を呼び出して' chown'を呼び出すこともできますし、あなたのバージョンを気にする必要はありません。 –

0

Answer by Kennyは、単一のディレクトリを作成したい場合にのみ有効です。 make_path ('foo/bar'); 2番目のケースでは、最終ディレクトリの所有者/グループのみが変更されます。

#!/usr/bin/perl -w 

use strict; 

use File::Path qw(make_path); 
use File::Spec; 

my $directory = $ARGV[0]; 
my $gid = getgrnam("my_group"); 
my $uid = getpwnam("my_user"); 

make_path($directory, { mode => 0750 }); 
my @directories = File::Spec->splitdir($directory); 
my @path; 
foreach my $dir (@directories) { 
    push(@path, $dir); 
    chown $uid, $gid, File::Spec->catdir(@path); 
} 
関連する問題