디렉토리내의 모든 원소의 소유권, 그룹, 퍼미션 정보 가져와서 저장하기 정보
PHP 디렉토리내의 모든 원소의 소유권, 그룹, 퍼미션 정보 가져와서 저장하기
관련링크
본문
윈도우 리눅스 공용입니다.
단 윈도우의 경우에는 소유권, 그룹정보는 가져오지 못합니다.
여러가지 활요예가 있겠지만
이런경우에 유용합니다.
압축을 하고 전혀 다른 계정에 압축을 풀었을때
퍼미션이나 소유권 문제때문에 고민할때 사용하면 유용합니다.
이하 소스입니다.
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>
단 윈도우의 경우에는 소유권, 그룹정보는 가져오지 못합니다.
여러가지 활요예가 있겠지만
이런경우에 유용합니다.
압축을 하고 전혀 다른 계정에 압축을 풀었을때
퍼미션이나 소유권 문제때문에 고민할때 사용하면 유용합니다.
이하 소스입니다.
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>
추천
0
0
댓글 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로 주면
일단 외부 계정 사용자는 해당 디렉토리에 머가 들었는지 읽을수가 없고
쓸수도 없습니다.
그러나 웹서비스에서 경로를 파악하여 경로대로 파일로 바로 접근하는 경우에는
역시 모두 읽을수 있고 복사할수 있습니다.
좀 두서가 없는데,
웹호스팅 환경의 사용자는 항상 백업을 잘하고
항상 자신의 사이트가 외부 계정 사용자에게 노출될수 있다는 것을 명심하고
있어야겠습니다.
웹호스팅 환경에서는
디렉토리보안을 염두에 두지 않은 계정 같은 경우
싸그리 모든 정보를 다른 계정 사용자에서 알려줄수도 있기 때문입니다.
이팁을 응용하여 악용해서는 안되겠습니다.
디렉토리를 통째로 복사해오는 팁도 올릴려고 했으나
문제의 소지가 많아서 그부분은 올리지 않겠습니다.
잘아시는 분도 많겠지만, 잘 모르는 분들을 위해
소유권과 퍼미션에 대해 간단히 설명을 하겠습니다.
소유권은 파일을 생성한 주인입니다.(계정)
그룹은 해당파일을 공유할수 있는 그룹(계정과는 다릅니다.)입니다.
퍼미션은
다음과 같은 구조로 되어있습니다.
소유주 - 그룹 - 아무나
일반적으로 사용할경우에는 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
멋진 하루 되시기 바랍니다.
다음처럼 숫자로 보여지는 소유권에 대한 설명좀 부탁드려도 될까요?
chown 2308.2308
chown 99.99
멋진 하루 되시기 바랍니다.

네 그것은 계정의 고유 번호입니다.
리눅스 서버의 경우 ll 이라는 명령을치면
소유권과 그룹을 영문으로 표기해줍니다.
그러나 이것은 /etc/passwd에서 고유의 계정번호와 계정명을 매치시켜주기 때문에
사람이 읽이 좋게 기억하기 좋게 영문으로 보여줄뿐
실제로는 고유의 번호로서 작동됩니다.
따라서 . 앞의 숫자는 해당 소유주의 고유 번호이고
. 뒤의 숫자는 해당 그룹의 고유번호입니다.
일반적으로 계정을 생성할때 특별한 옵션을 주지 않으면
계정명과 같은 그룹명이 생기게 됩니다.
일반적으로 파일을 생성하게 되면 그 소유권과 그룹은
지금 작업하는 계정의 소유권과 그룹을 그대로 따라가게 됩니다.
답변이 되었는지 모르겠습니다.
리눅스 서버의 경우 ll 이라는 명령을치면
소유권과 그룹을 영문으로 표기해줍니다.
그러나 이것은 /etc/passwd에서 고유의 계정번호와 계정명을 매치시켜주기 때문에
사람이 읽이 좋게 기억하기 좋게 영문으로 보여줄뿐
실제로는 고유의 번호로서 작동됩니다.
따라서 . 앞의 숫자는 해당 소유주의 고유 번호이고
. 뒤의 숫자는 해당 그룹의 고유번호입니다.
일반적으로 계정을 생성할때 특별한 옵션을 주지 않으면
계정명과 같은 그룹명이 생기게 됩니다.
일반적으로 파일을 생성하게 되면 그 소유권과 그룹은
지금 작업하는 계정의 소유권과 그룹을 그대로 따라가게 됩니다.
답변이 되었는지 모르겠습니다.
고맙습니다.
몇 가지를 더 얻어갑니다. ^^;
몇 가지를 더 얻어갑니다. ^^;