2011-01-13 6 views
3

以下のコードでは、文「$retMode & 0777」と「$retMode & 006」は何を意味していますか? POSIXではPerlでFile :: statを使用している文を理解するのに助けが必要です

use File::stat; 

my $fpath = "/home/xyz/abc.sh" ; 
my $info ; 
my $retMode ; 
my $property = "File_Permission"; 

$info=stat($fpath) ; 
if($info){ 
    $retMode = $info->mode; # This field contain file mode info 
    $retMode = $retMode & 0777; 
    if(($retMode & 006)) { 
     printf "$property|%03o|$fpath\n",$retMode; 
    } 
} 
+0

なぜコードは "other"の読み取りまたは書き込みをチェックしますか? – DVK

+0

あなたは '&'演算子が何を意味するかを見るために[ドキュメンテーション](http://perldoc.perl.org/perlop.html#Bitwise-And)を調べてみましたか? – Ether

+0

@Ether - 私のコメントやOPへの返答でしたか? – DVK

答えて

2

ファイルのモードが読み取りを記述するビットのセットで、書き込み、およびファイルの所有者、ファイルのグループ、および他の皆のための実行権限を環境。

完全な概要については、http://www.tuxfiles.org/linuxhelp/filepermissions.htmlまたはgoogle "linux file permissions"を参照してください。この場合

if(($retMode & 006)) { 
     printf "$property|%03o|$fpath\n",$retMode; 
} 

あなたが書いたり、ファイルに読み取り許可のいずれかがある場合は、条件内のコードが実行されるだけで

+0

あなたは、任意のユーザーが書き込み権限を持っているのか、読み取り権限を持っているのかということです。 – mob

5

$retMode & 0777は、リターンモード(ファイルのアクセス権+ファイルタイプ)と、8進表現の数値が777のBitwise-And(たとえば、10進数511、たとえば2進数111111111)の値を取ることを意味します。

これは技術的に9ビット目の上の整数から任意のビットを削除するので、モードのバイナリ表現が> 9ビットであった場合、この操作の後、主なアクセス権を表す最後の9ビットだけを残します他の/グループ/ユーザのための読み書き/実行)。

なぜ?そのため(としてperldoc statショーは)、mode()statから返さ:

% 0 『であれば" は、ファイルの種類の部分と、使用して(複数可)のprintfをマスクする必要があり、ファイルの種類とその権限の両方が含まれています』あなたは本当の許可を見たいと思っています。

つまり、9ビット目以上のデータが含まれていますが、最後の9ビットだけが上記のコードの後のパーミッションデータを表します。より正確に言えば、最後の12桁は許可を表します(したがってコードは& 07777を実行する必要があります)が、ビット10-12はユーザー/グループ/その他の読み取り/書き込み/実行パーマ(setuid、is_directoryなど)と無関係な特別な許可ビットを表します。


$retMode & 006は、同様のメカニズムを持っていますが、目的が異なります。 006オクタルはバイナリで110なので、基本的にモードビットベクトルをとり、2/3の位置にビットだけを残します。ブール値のコンテキストで結果が使用されるため、結果の#が0でないかどうかを確認するだけです。つまり、これらの2ビットのうちの1つが1に設定されているかどうかを確認します。& 006は実際にはBADどのビットがどのパーマであるかは明白ではない(私はに微妙にをヒントしているが、上の段落でどのビット2/3が意味しているか説明しない)。代わりに、Fcntlモジュールでシンボリックモード定数(S_IF *)と関数(S_IS *)をインポートする必要があります

use Fcntl ':mode'; 
$retMode = $retMode & 0777; # Ignoring setuid and directory bits 
$other_read_or_write = $retMode & (S_IWOTH || S_IROTH); 
            # Bits 2/3 - Other read/write 
if ($other_read_or_write) { 
    printf "$property|%03o|$fpath\n",$retMode; 
} 
1

彼らはビット演算Perl bitwise andです。

$ retMode & 0777は$ retModeの下位9ビットより上のすべてのビットをクリアします。写真に

$ retMode & 006試験下3ビットの2つと(0以外の数)がtrueを返すこれらのビットは番号2に対応する場合、3、4、5、6、7

( xは1または0であると)一番下の行に先頭行から行く変わらないです:

$ RetMode & 0777:

$RetMode: xxxxxxxxxxxxxxxxxx 
0777  000000000111111111 
Result:  000000000xxxxxxxxx 

$ RetMode & 006:

$RetMode: 000000000xxxxxxxxx 
0777  000000000000000110 
Result:  000000000000000xx0 

gravitonが公開されているので、ファイルに対するアクセス許可をテストしています。

関連する問題