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

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

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

이하 소스입니다.

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,436
19년 전 조회 1,519
19년 전 조회 3,172
19년 전 조회 2,043
19년 전 조회 5,404
19년 전 조회 2,470
19년 전 조회 3,466
19년 전 조회 2,897
19년 전 조회 1,796
19년 전 조회 3,912
19년 전 조회 2,445
19년 전 조회 2,336
19년 전 조회 3,051
19년 전 조회 3,333
19년 전 조회 2,530
19년 전 조회 2,300
19년 전 조회 2,361
19년 전 조회 2,034
19년 전 조회 3,118
19년 전 조회 2,042
19년 전 조회 2,076
19년 전 조회 1,739
19년 전 조회 2,248
19년 전 조회 2,225
19년 전 조회 2,521
19년 전 조회 2,910
19년 전 조회 2,423
19년 전 조회 2,486
19년 전 조회 3,533
19년 전 조회 3,253
19년 전 조회 3,239
19년 전 조회 3,048
19년 전 조회 2,060
19년 전 조회 2,371
19년 전 조회 2,271
19년 전 조회 2,083
19년 전 조회 2,527
19년 전 조회 2,453
19년 전 조회 2,830
19년 전 조회 2,208
19년 전 조회 3,535
19년 전 조회 2,005
19년 전 조회 2,612
19년 전 조회 1,626
19년 전 조회 2,861
19년 전 조회 3,093
19년 전 조회 2,192
19년 전 조회 2,019
19년 전 조회 2,505
19년 전 조회 2,411
19년 전 조회 3,108
19년 전 조회 6,791
19년 전 조회 2,737
19년 전 조회 3,215
19년 전 조회 3,121
19년 전 조회 1,946
19년 전 조회 3,382
19년 전 조회 2,213
19년 전 조회 2,726
19년 전 조회 2,387
19년 전 조회 4,392
19년 전 조회 2,499
19년 전 조회 2,773
19년 전 조회 3,542
19년 전 조회 3,745
19년 전 조회 3,271
19년 전 조회 2,496
19년 전 조회 3,064
19년 전 조회 3,922
19년 전 조회 3,802
19년 전 조회 1,737
19년 전 조회 2,223
19년 전 조회 5,435
19년 전 조회 6,733
19년 전 조회 2,570
19년 전 조회 2,133
19년 전 조회 2,622
19년 전 조회 3,285
19년 전 조회 3,531
19년 전 조회 2,999
19년 전 조회 2,622
19년 전 조회 4,742
19년 전 조회 6,738
19년 전 조회 5,009
19년 전 조회 5,973
19년 전 조회 2,693
19년 전 조회 2,513
19년 전 조회 2,223
19년 전 조회 2,324
19년 전 조회 4,621
19년 전 조회 4,670
19년 전 조회 2,535
19년 전 조회 2,201
19년 전 조회 2,527
19년 전 조회 3,152
19년 전 조회 2,941
19년 전 조회 1,912
19년 전 조회 1,989
19년 전 조회 3,169
19년 전 조회 2,384