디렉토리내의 모든 원소의 소유권, 그룹, 퍼미션 정보 가져와서 저장하기

윈도우 리눅스 공용입니다.
단 윈도우의 경우에는 소유권, 그룹정보는 가져오지 못합니다.

여러가지 활요예가 있겠지만
이런경우에 유용합니다.
압축을 하고 전혀 다른 계정에 압축을 풀었을때
퍼미션이나 소유권 문제때문에 고민할때 사용하면 유용합니다.

이하 소스입니다.

function Ysave_dir_owner_perm($dir, $debug=false){

if (!is_dir($dir)) return false;

if (!preg_match("`/$`", $dir)) $dir .= '/';

if (preg_match("`win`i", PHP_OS)) $os = 'windows';
else $os = 'unix or linux';

$text = '';

$d = dir($dir);
while (false !== ($entry = $d->read())) {

if (substr($entry, 0, 1) == '.') continue;

if ($os != 'windows') $text .= 'chown ' . fileowner($dir . $entry) . '.' . filegroup($dir . $entry) . ' ' . $dir . $entry . " \n";
$text .= 'chmod ' . substr(decoct(fileperms($dir . $entry)), -4) . ' ' . $dir . $entry . " \n";
if ($debug == true) {

if ($os != 'windows') echo 'chown ' . fileowner($dir . $entry) . '.' . filegroup($dir . $entry) . ' ' . $dir . $entry . " <br>\n";
echo 'chmod ' . substr(decoct(fileperms($dir . $entry)), -4) . ' ' . $dir . $entry . " <br>\n";
}

if (is_dir($dir . $entry)){

$text .= Ysave_dir_owner_perm($dir . $entry, $debug);
}
else{

continue;
}
}
$d->close();

return $text;
}

function Ysave_file($file, $text, $perm=0777){

if (empty($file)) return false;
$fp = @fopen ($file, 'w');
if (empty($fp)) return false;

@fwrite ($fp, $text);
@fclose($fp);

return @chmod ($file, $perm);
}

$dir = './';
$text = Ysave_dir_owner_perm($dir, true);
if ($text == false) echo '디렉토리내의 정보를 읽는데 실패하였습니다.';
$save_result = Ysave_file('./temp/owner_perm.txt', $text, 0777);
if (empty($save_result)) echo '파일저장에 실패하였습니다.';


참고 url http://82da.com/Ybbs/sample/Ysave_dir_owner_perm.php<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
|

댓글 4개

음 사실 이팁은 좀 위험한 팁입니다.
웹호스팅 환경에서는
디렉토리보안을 염두에 두지 않은 계정 같은 경우
싸그리 모든 정보를 다른 계정 사용자에서 알려줄수도 있기 때문입니다.
이팁을 응용하여 악용해서는 안되겠습니다.

디렉토리를 통째로 복사해오는 팁도 올릴려고 했으나
문제의 소지가 많아서 그부분은 올리지 않겠습니다.

잘아시는 분도 많겠지만, 잘 모르는 분들을 위해
소유권과 퍼미션에 대해 간단히 설명을 하겠습니다.

소유권은 파일을 생성한 주인입니다.(계정)
그룹은 해당파일을 공유할수 있는 그룹(계정과는 다릅니다.)입니다.

퍼미션은
다음과 같은 구조로 되어있습니다.
소유주 - 그룹 - 아무나
일반적으로 사용할경우에는 8진수로 사용하고
사람이 읽을때는 주로 영문 표기를 사용합니다.

r - 8진수 4에 해당하며 읽을수 있는 권한을 뜻합니다.
w - 8진수 2에 해당하며 쓰거나 수정 삭제 할수 있는 권한을 뜻합니다.
x - 8진수 1에 해당하며 실행할수 있는 권한을 뜻합니다.
세개의 파트에 각각 이것을 조합하여 퍼미션을 구성합니다.

예를 들어 777 이면
첫번째 파트가 소유주파트인데 7 이므로 (4 + 2 + 1) 소유주는 해당 파일이나 디렉토리에 대해
읽거나 수정삭제, 실행이 가능합니다.
두번째 파트도 7이므로 그룹으로 지정된 계정은 해당 파일이나 디렉토리를 모두 읽거나 수정삭제, 실행이 가능합니다.
세번째 파트도 7이므로 역시 아무계정도 모든 권한을 가집니다.
특별한 경우가 아니라면 777이렇게 주는 것은 위험합니다.

예를 들어 644
일반적으로 파일을 생성하면 대부분의 시스템에서 파일의 퍼미션을 644 로 줍니다.
첫번째 파트 소유주 파트가 6 (4 + 2) 이므로 소유주 계정은 읽거나 수정삭제 등이 가능합니다. 현재 1이 포함되어있지 않으므로 쉘스크립트와 같이 쉘상에서 실행하는 파일의 경우 소유주라 하더라도 실행이 불가능합니다.
두번째 파트 그룹은 4이므로 그룹으로 지정된 그룹은 읽을수만 있습니다.
세번째 파트 아무나는 4이므로 아무나가 해당 파일을 읽을수 있습니다.
읽을 수 있다는 의미는 다른 계정 사용자가 그 파일의 내용을 vi같은 것으로 읽어볼수 있고
복사도 가능합니다.

따라서 웹서버가 읽어서 웹페이지로 보여줘야 하므로
아무나 부분은 대부분 항상 4이상입니다.
따라서 경로가 노출된 파일의경우
다른계정사용자가 원본 그대로의 파일을 읽을수가 있습니다.
물론 복사해 올수도 있습니다.

그러므로 외부 계정 사용자에게 경로를 노출시키지 않은 가장 기본적인 방법은
디렉토리의 퍼미션을 특수한 경우를 제외하곤
711 이나 701로 주면
일단 외부 계정 사용자는 해당 디렉토리에 머가 들었는지 읽을수가 없고
쓸수도 없습니다.
그러나 웹서비스에서 경로를 파악하여 경로대로 파일로 바로 접근하는 경우에는
역시 모두 읽을수 있고 복사할수 있습니다.

좀 두서가 없는데,
웹호스팅 환경의 사용자는 항상 백업을 잘하고
항상 자신의 사이트가 외부 계정 사용자에게 노출될수 있다는 것을 명심하고
있어야겠습니다.
또 하나의 신기한 체험을 하게 되어 감사합니다.

다음처럼 숫자로 보여지는 소유권에 대한 설명좀 부탁드려도 될까요?
chown 2308.2308
chown 99.99

멋진 하루 되시기 바랍니다.
네 그것은 계정의 고유 번호입니다.
리눅스 서버의 경우 ll 이라는 명령을치면
소유권과 그룹을 영문으로 표기해줍니다.
그러나 이것은 /etc/passwd에서 고유의 계정번호와 계정명을 매치시켜주기 때문에
사람이 읽이 좋게 기억하기 좋게 영문으로 보여줄뿐
실제로는 고유의 번호로서 작동됩니다.

따라서 . 앞의 숫자는 해당 소유주의 고유 번호이고
. 뒤의 숫자는 해당 그룹의 고유번호입니다.

일반적으로 계정을 생성할때 특별한 옵션을 주지 않으면
계정명과 같은 그룹명이 생기게 됩니다.
일반적으로 파일을 생성하게 되면 그 소유권과 그룹은
지금 작업하는 계정의 소유권과 그룹을 그대로 따라가게 됩니다.

답변이 되었는지 모르겠습니다.
고맙습니다.
몇 가지를 더 얻어갑니다. ^^;
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
19년 전 조회 2,430
19년 전 조회 1,514
19년 전 조회 3,169
19년 전 조회 2,033
19년 전 조회 5,394
19년 전 조회 2,459
19년 전 조회 3,455
19년 전 조회 2,891
19년 전 조회 1,787
19년 전 조회 3,908
19년 전 조회 2,437
19년 전 조회 2,326
19년 전 조회 3,042
19년 전 조회 3,325
19년 전 조회 2,523
19년 전 조회 2,292
19년 전 조회 2,350
19년 전 조회 2,028
19년 전 조회 3,113
19년 전 조회 2,034
19년 전 조회 2,070
19년 전 조회 1,733
19년 전 조회 2,239
19년 전 조회 2,219
19년 전 조회 2,508
19년 전 조회 2,904
19년 전 조회 2,417
19년 전 조회 2,480
19년 전 조회 3,527
19년 전 조회 3,245
19년 전 조회 3,232
19년 전 조회 3,045
19년 전 조회 2,055
19년 전 조회 2,365
19년 전 조회 2,260
19년 전 조회 2,078
19년 전 조회 2,521
19년 전 조회 2,445
19년 전 조회 2,823
19년 전 조회 2,200
19년 전 조회 3,531
19년 전 조회 2,001
19년 전 조회 2,603
19년 전 조회 1,615
19년 전 조회 2,856
19년 전 조회 3,087
19년 전 조회 2,185
19년 전 조회 2,012
19년 전 조회 2,496
19년 전 조회 2,407
19년 전 조회 3,101
19년 전 조회 6,785
19년 전 조회 2,728
19년 전 조회 3,207
19년 전 조회 3,113
19년 전 조회 1,936
19년 전 조회 3,378
19년 전 조회 2,206
19년 전 조회 2,723
19년 전 조회 2,382
19년 전 조회 4,382
19년 전 조회 2,494
19년 전 조회 2,770
19년 전 조회 3,535
19년 전 조회 3,741
19년 전 조회 3,261
19년 전 조회 2,489
19년 전 조회 3,059
19년 전 조회 3,917
19년 전 조회 3,798
19년 전 조회 1,729
19년 전 조회 2,218
19년 전 조회 5,421
19년 전 조회 6,731
19년 전 조회 2,568
19년 전 조회 2,126
19년 전 조회 2,613
19년 전 조회 3,281
19년 전 조회 3,526
19년 전 조회 2,992
19년 전 조회 2,615
19년 전 조회 4,738
19년 전 조회 6,729
19년 전 조회 5,005
19년 전 조회 5,969
19년 전 조회 2,689
19년 전 조회 2,509
19년 전 조회 2,216
19년 전 조회 2,316
19년 전 조회 4,616
19년 전 조회 4,661
19년 전 조회 2,527
19년 전 조회 2,196
19년 전 조회 2,521
19년 전 조회 3,148
19년 전 조회 2,935
19년 전 조회 1,910
19년 전 조회 1,979
19년 전 조회 3,163
19년 전 조회 2,378