2

統計を使用して perl で特定のファイルのアクセス許可を確認しようとしています。

だから私がこれをしたとき

foreach (@original_files) {
    my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
      $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat ($_);

    print "$mode \n";
}

これは以下を出力します:

33204 which corresponds to the permission -rw-rw-r--

なぜ33204なのか理解できません。<--これは私の最初の質問です

次に、$mode を、umask の数値システムであることがわかっている 8 進数に変換してみました。

これは私のコードです:

printf ("%0\n",$mode);

今、これは 100664 を出力しますが、これは最後の 3 桁 (rw-rw-r--) をかなり下回っていますが、最初の 3 桁がどこから来たのかわかりません (100664 の 100) それが私の 2 番目の質問です

最後に、このコードをもう一度試しました:

printf ("%o\n", $mode & 775); #im not sure about the 775, or is it 577

その最後のコードは私が望んでいたものです。それは 664 を出力します。私の質問は、なぜ i と $mode to i が値 (775 か何か) を忘れたときに、正しい許可を出力するのかということです。

OT の質問も: $_ と @_ の違いは何ですか?

4

2 に答える 2

6

私のウェブホストのman 2 stataboutモードから:

S_IFMT     0170000   bit mask for the file type bit fields
S_IFSOCK   0140000   socket
S_IFLNK    0120000   symbolic link
S_IFREG    0100000   regular file
S_IFBLK    0060000   block device
S_IFDIR    0040000   directory
S_IFCHR    0020000   character device
S_IFIFO    0010000   FIFO
S_ISUID    0004000   set UID bit
S_ISGID    0002000   set-group-ID bit (see below)
S_ISVTX    0001000   sticky bit (see below)
S_IRWXU    00700     mask for file owner permissions
S_IRUSR    00400     owner has read permission
S_IWUSR    00200     owner has write permission
S_IXUSR    00100     owner has execute permission
S_IRWXG    00070     mask for group permissions
S_IRGRP    00040     group has read permission
S_IWGRP    00020     group has write permission
S_IXGRP    00010     group has execute permission
S_IRWXO    00007     mask for permissions for others (not in group)
S_IROTH    00004     others have read permission
S_IWOTH    00002     others have write permission
S_IXOTH    00001     others have execute permission

0(先頭は、それらの数値が 8 進数であることを意味することに注意してください。)

mode単語には 7 つのフィールドが表示されます。

S_IFMT   file type
S_ISUID  set UID bit
S_ISGID  set-group-ID bit
S_ISVTX  sticky bit
S_IRWXU  owner permissions
S_IRWXG  group permissions
S_IRWXO  other permissions

モードを数値 (0x81B4 = 33204 = 0100664 = 0b1000000110110100) としてではなくフィールドとして表示すると、次のようになります。

S_IFMT:  S_IFREG (regular file)
S_ISUID: 0 (no set UID bit)
S_ISGID: 0 (no set-group-ID bit)
S_ISVTX: 0 (no sticky bit)
S_IRWXU: S_IRUSR | S_IWUSR (user has rw)
S_IRWXG: S_IRGRP | S_IWGRP (group has rw)
S_IRWXO: S_IROTH (other has r)

行うことは、さまざまな許可を含むフィールドを抽出する& 0777ことと同じです。& (S_IRWXU | S_IRWXG | S_IRWXO)


$_を参照する変数です$main::_。これは、いくつかの構造 ( foreach ループ、mapgrep) によって設定され、多くの演算子 (たとえばsay;means say $_;) によってデフォルトとして使用されます。

の要素は@_、実行中のサブルーチンに渡されるパラメーターにエイリアスされます。たとえば$_[0]、したがって$x含ま4れていますsub f { my ($x) = @_; ... } f(4);

于 2013-05-10T03:25:03.273 に答える
2
  1. -rw-rw-r--2 進数に対応します110110100(最初の - 許可ではありません)。3 ビットのグループを扱っているので、便宜上 8 進数 (3 ビットのグループを 0 ~ 7 にマップする) を使用します: 644.

  2. 100644 の 100 を理解するには、man 2 stat.

  3. それにかんする:

    printf ("%o\n", $mode & 775); #775 についてはよくわかりませんが、それとも 577 ですか

775 は 8 進数ではなく 10 進数です。最後の 9 ビットのみが必要な場合は、数値と 8 進数の 777 (= すべてのビットが設定され、2 進数の 111_111_111) の AND をとります。

printf "%o\n", 0100664 & 0777;  # 664
于 2013-05-10T03:28:57.357 に答える