Как проверить в Perl, если разрешение файла больше, чем 755? - PullRequest
5 голосов
/ 27 декабря 2011

Для файла Unix я хочу знать, есть ли у группы или мира разрешение на запись в файл.

Я думал об этом:

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
} 

Спасибо.

Ответы [ 2 ]

13 голосов
/ 27 декабря 2011

Вы близки с вашим предложением - использование 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
}

Терминология в заголовке вопроса «Как проверить в Perl, если разрешение файла больше 755? то есть Группа / Мир имеет разрешение на запись '- это немного подозрительно.

Файл может иметь разрешения 022 (или, более правдоподобно, 622), и это будет включать разрешение на запись группы и мира, но ни одно из значений не может быть обоснованно заявлено как «больше 755».

Набор понятий, которые я нашел полезными:

  • Установить биты - биты в поле прав доступа, которые должны быть 1.
  • Сбросить биты - биты в поле прав доступа, которые должны быть 0.
  • Не волнует биты - биты, которые можно установить или сбросить.

Например, для файла данных мне может потребоваться:

  • Установите 0644 (владелец может читать и писать; группа и другие могут читать).
  • Сброс 0133 (владелец не может выполнить - это файл данных; группа и другие не могут записать или выполнить).

Скорее всего, для файла данных мне может потребоваться:

  • Установите 0400 (владелец должен уметь читать).
  • Сброс 0133 (никто не может выполнить; группа и другие не могут писать).
  • Не волнует 0244 (не имеет значения, может ли владелец писать; не имеет значения, может ли группа или другие читать).

Каталоги немного отличаются: разрешение на выполнение означает, что вы можете сделать каталог вашим текущим каталогом, или обращаться к файлам в каталоге, если вы знаете их имя, в то время как разрешение на чтение означает, что вы можете узнать, какие файлы находятся в каталоге, но вы не может получить к ним доступ без разрешения на выполнение. Следовательно, вы можете иметь:

  • Установите 0500 (владелец должен иметь возможность читать и использовать файлы в каталоге).
  • Сброс 0022 (группа и другие не должны иметь возможности изменять каталог - удалять или добавлять файлы).
  • Не волнует 0255 (не важно, может ли пользователь создавать файлы; не важно, может ли группа или другой список или использовать файлы).

Обратите внимание, что биты установки и сброса должны быть непересекающимися (($set & $rst) == 0)), сумма битов всегда будет 0777; биты "все равно" могут быть вычислены из 0777 & ~($set | $rst).

0 голосов
/ 27 декабря 2011
#!/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');
...