2011-12-27 2 views

답변

11

당신은 당신의 제안에 가까운 - stat의 사용은 오프 조금 (그러나 제 생각에, 당신은 File::stat을 사용하고 있어야합니다; 코드가 완료된 경우 도움), 마스크 상수, 결함 및 주석 잎이 다소 필요합니다 : 파일 권한이 755보다 큰 경우

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로 확인? 그룹/세계에 쓰기 권한이 있음 '은 조금 의심됩니다.

파일의 권한이 022 (또는 그럴듯하게 622) 일 수 있으며 그룹 및 세계 쓰기 권한이 포함되지만 어느 값도 '755보다 큼'이라고 합리적으로 주장 할 수 없습니다.

내가 유용하다고 한 개념의 집합은 다음과 같습니다

  • 세트 비트 - 비트 권한 필드에서
  • 리셋 비트 수 있어야합니다 - 권한 필드의 비트는 0이어야하는
  • Do not care 비트 - 설정 또는 재설정 할 수있는 비트입니다. (, 그룹 및 기타 읽을 수 있습니다 소유자 읽고 쓸 수)

    • 세트 0644이 :

    예를 들어, 데이터 파일, 나는이 필요할 수 있습니다.

  • 재설정 0133 (소유자는 실행할 수 없습니다 - 데이터 파일이며 그룹 및 기타는 쓰기 또는 실행할 수 없습니다).

가능성, 데이터 파일, 나는이 필요할 수 있습니다 :

  • 세트 0400 (소유자가 읽을 수 있어야합니다).
  • 재설정 0133 (아무도 실행할 수없고 그룹 및 기타는 쓸 수 없습니다).
  • Do not care 0244 (소유자가 글을 쓸 수 있는지 여부는 중요하지 않으며 그룹이나 다른 사람들이 읽을 수 있는지 여부는 중요하지 않음).

디렉토리가 약간 다릅니다 : 실행 권한은 디렉토리를 현재 디렉토리로 만들거나 디렉토리에있는 파일에 액세스 할 수 있음을 의미합니다. 읽기 권한은 디렉토리에있는 파일을 찾을 수 있음을 의미합니다. 하지만 실행 권한이 없어도 액세스 할 수는 없습니다. 그러므로 다음과 같이 설정해야합니다.

  • (소유자가 디렉토리의 파일을 읽고 사용할 수 있어야 함).
  • 재설정 0022 (그룹 및 다른 사용자는 디렉토리를 수정하거나 파일을 삭제 또는 추가 할 수 없어야합니다.)
  • Do not care 0255 (사용자가 파일을 만들 수 있는지 여부는 신경 쓰지 않고 그룹 또는 다른 사람이 파일을 나열하거나 사용할 수 있는지 여부는 신경 쓰지 마십시오).

set 및 reset 비트는 분리되어야하며 (($set & $rst) == 0)) 비트의 합계는 항상 0777입니다. "do not care"비트는 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 '의 출력을 구문 분석하는 것이 신뢰할 수 없습니다. 그것도 효율적이거나 필요하지 않습니다. 펄에는 필요한 기능이 내장되어 있습니다. –

관련 문제