2011-12-27 2 views
5

Для файла unix я хочу знать, имеет ли группа или мир разрешение на запись в файл.Как проверить Perl, если разрешение файла превышает 755?

Я думал об этих строках:

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 
} 

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

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

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

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

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

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

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

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

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

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

Обратите внимание, что биты набора и сброса должны быть непересекающимися (($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'. Тем не менее, вы, вероятно, правы, что это «лучший стиль» для использования суп алфавита. Я полагаю, что могу определить удобную константу: 'use constant S_I755 => (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);'? (Да, это значит быть шуткой.) Возможно, «используйте константу S_RWXR_XR_X => (S_IRWXU | S_IRGRP | S_IXGRP | 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 имеет необходимые функциональные возможности. –

 Смежные вопросы

  • Нет связанных вопросов^_^