2011-12-27 6 views
5

Unixファイルの場合、グループまたはワールドにファイルに対する書き込み権限があるかどうかを知りたい。ファイルパーミッションが755より大きい場合、Perlをチェックインする方法は?

私は、これらのラインに考えてきた:

my $fpath = "orion.properties"; 
my $info = stat($fpath) ; 
my $retMode = $info->mode; 
$retMode = $retMode & 0777; 

if(($retMode & 006)) { 
    # Code comes here if World has r/w/x on the file 
} 

感謝を。

答えて

11

あなたはあなたの提案に接近している - statの使用量が少しオフである(しかし、考え直しに、あなたはFile::statを使用する必要があり、あなたのコードが完了した場合には役立ちます)、マスク定数が故障している、とコメントは、やや希望される葉:

use strict; 
use warnings; 
use File::stat; 

my $fpath = "orion.properties"; 
my $info = stat($fpath); 
my $retMode = $info->mode; 
$retMode = $retMode & 0777; 

if ($retMode & 002) { 
    # Code comes here if World has write permission on the file 
}  
if ($retMode & 020) { 
    # Code comes here if Group has write permission on the file 
} 
if ($retMode & 022) { 
    # Code comes here if Group or World (or both) has write permission on the file 
} 
if ($retMode & 007) { 
    # Code comes here if World has read, write *or* execute permission on the file 
} 
if ($retMode & 006) { 
    # Code comes here if World has read or write permission on the file 
} 
if (($retMode & 007) == 007) { 
    # Code comes here if World has read, write *and* execute permission on the file 
} 
if (($retMode & 006) == 006) { 
    # Code comes here if World has read *and* write permission on the file 
} 
if (($retMode & 022) == 022) { 
    # Code comes here if Group *and* World both have write permission on the file 
} 

質問タイトルに用語「ファイルのパーミッションが755より大きい場合はPerlでチェックする方法は?グループ/ワールドに書き込み権限があることは少し疑わしいです。

ファイルにはアクセス許可022(またはそれ以上の可能性がある622)が含まれている可能性があり、グループとワールドの書き込み許可が含まれますが、いずれの値も「755を超える」と主張できません。

私が役に立つことがわかりました概念の集合である:

  • 設定ビット - 0でなければならない許可フィールド内のビット - 1.
  • リセットビットである必要があります許可フィールド内のビット
  • Do not careビット - 設定またはリセットできるビットです。 (;グループおよびその他読み取ることができ、所有者の読み書き可能)

    • セット0644は:

    例えば、データファイルのために、私が必要な場合があります。

  • リセット0133(オーナーは実行できません - それはデータファイルであり、グループと他のユーザーは書き込みまたは実行できません)。

それどころか、データファイルのために、私が必要な場合があります:

  • セット0400(所有者が読み取ることができる必要があります)。
  • リセット0133(誰も実行できません;グループとその他は書き込みできません)。
  • Do not care 0244(所有者が書き込みできるかどうかは関係ありません;グループや他の人が読むことができるかどうかは関係ありません)。

ディレクトリは現在のディレクトリにすることができます。または、名前を知っていればディレクトリ内のファイルにアクセスできることを意味します。一方、読み取りアクセス権とは、ディレクトリ内のファイルただし、実行許可なしでアクセスすることはできません。したがって、次のようなことがあります。

  • (所有者はディレクトリ内のファイルを読み込み、使用できる必要があります)。
  • リセット0022(グループや他の人は、ディレクトリの変更やファイルの削除や追加ができないようにしてください)。
  • Do not care 0255(ユーザーがファイルを作成できるかどうかは気にしないでください。グループや他のユーザーがファイルを一覧表示できるかどうかは気にしないでください)。

setビットとresetビットは分離している必要があります(($set & $rst) == 0))。ビットの合計は常に0777です。 「ドントケア」ビットは0777 & ~($set | $rst)から計算できます。

+2

マジックナンバーの代わりに[Fcntl](http://p3rl.org/Fcntl)モード定数( 'S_I *')を使用してください。 – daxim

+2

私のような古い霧の場合、定数は 'Fcntl'のアルファベットスープよりもはるかに読みやすくなります。個別に、定数は読みやすくなりますが、 'S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH'は' 0755'よりも読みにくくなります。しかし、アルファベットスープを使用する方が「より良いスタイル」であるということは間違いありません。私は便利な定数を定義することができます: '定数S_I755 =>(S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);を使用します。 (はい、それは冗談であることを意図しています) '定数S_RWXR_XR_X =>(S_IRWXU | S_IRGRP | S_IXROP | S_IROTH | S_IXOTH);を使用するともっと美味しいかもしれません。 –

-3
#!/usr/bin/perl 

use warnings; 
use strict; 

chomp (my $filename = <STDIN>); 

my $lsOutput = `ls -l $filename`; 

my @fields = split (/ /,$lsOutput); 

my @per = split (//,$fields[0]); 

print "group has write permission \n" if ($per[5] eq 'w'); 

print "world has write permission" if ($per[8] eq 'w'); 
+0

'ls'の出力を解析することは信頼できません。それは効率的でも必要でもありません。 Perlには必要な機能が組み込まれています。 –

関連する問題