본문 바로가기
IT/web

[PHP] fileperms을 활용한 파일 탐색과 퍼미션 검사

by 어느해겨울 2022. 1. 6.

 

fileperms을 활용한 파일 탐색과 퍼미션 검사

 

이전에 작성한 탐색기 함수를 이용하여 대상 경로의 모든 파일 중 사용자가 지정한 퍼미션이 아닌 파일을 배열로 반환하는 함수를 만든다.

공동 공간에서 작업을 하거나 서버 내 파일 생성/삭제 등 여러 파일을 제어하다 보면 퍼미션이 꼬이는 경우가 종종 발생한다. 특히 웹 서비스와 관련된 파일을 만들고 관리하다 보면 퍼미션으로 인해 웹 페이지에서 접근이 안 되는 경우가 많다.

그럴 때 일괄적으로 특정 경로의 퍼미션 체크를 할때 유용하게 사용된다.

 

 

▽ 파일 탐색기 함수 포스팅

https://muabow.tistory.com/249

 

[PHP] readdir을 활용한 파일 목록 읽기 예제, 파일 탐색기

readdir을 활용한 파일 목록 읽기 예제, 파일 탐색기 opendir, readdir, is_dir 함수를 사용하는 재귀 함수로 구성하였다. 디렉터리는 제외하고 파일만 조회하고 탐색된 전체 경로(full path)를 배열로 반환

muabow.tistory.com

 

소스코드

<?php
	// https://muabow.tistory.com/249, 참고
	function get_file_list($_target_dir) {
		if( $fp = opendir($_target_dir) ) {
			$files = Array();
			$in_files = Array();

			while( $file = readdir($fp) ) {
				if( $file[0] != '.' ) {
					if( is_dir("{$_target_dir}/{$file}") ) {
						$in_files = get_file_list("{$_target_dir}/{$file}");

						if( is_array($in_files) ) {
							$files = array_merge($files, $in_files);
						}

					} else {
						array_push($files, "{$_target_dir}/{$file}");
					}
				}
			}
			closedir($fp);

			return $files;
		}
	}

	function get_invalid_perm_list($_target_dir, $_target_perm) {
		$arr_res_info = [];
		
		foreach( get_file_list($_target_dir) as $idx => $file ) {
			$perms = fileperms($file);
			$perms = $perms - 32768;

			if( decoct($perms) != $_target_perm ) {
				$arr_res_info[] = array("perm" => decoct($perms), "file" => $file);
			}
		}

		return $arr_res_info;
	}
?>

 

사용방법

<?php
	// /var/log/apache2 경로의 모든 파일 중 퍼미션이 755가 아닌 것을 탐색한다.
    
	$arr_invalid_list = get_invalid_perm_list("/var/log/apache2", 755);
	print_r($arr_invalid_list);
?>

 

결과

muabow@muabow:~/public_html$ php permission_check.php
Array
(
    [0] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.14.gz
        )

    [1] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.3.gz
        )

    [2] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.12.gz
        )

    [3] => Array
        (
            [perm] => 644
            [file] => /var/log/apache2/other_vhosts_access.log.1
        )

    [4] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.12.gz
        )

    [5] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.14.gz
        )

    [6] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.5.gz
        )

    [7] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.2.gz
        )

    [8] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.8.gz
        )

    [9] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.6.gz
        )

    [10] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.8.gz
        )

    [11] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/other_vhosts_access.log
        )

    [12] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.9.gz
        )

    [13] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.1
        )

    [14] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.11.gz
        )

    [15] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log
        )

    [16] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log
        )

    [17] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.3.gz
        )

    [18] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.2.gz
        )

    [19] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.10.gz
        )

    [20] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.9.gz
        )

    [21] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.7.gz
        )

    [22] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.1
        )

    [23] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.11.gz
        )

    [24] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.4.gz
        )

    [25] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.5.gz
        )

    [26] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.6.gz
        )

    [27] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.7.gz
        )

    [28] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.13.gz
        )

    [29] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.10.gz
        )

    [30] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/error.log.4.gz
        )

    [31] => Array
        (
            [perm] => 640
            [file] => /var/log/apache2/access.log.13.gz
        )

)

해당 배열의 퍼미션과 파일의 목록을 확인하여 chmod 를 통해 퍼미션을 변경해주면 쉽게 퍼미션 관리를 할 수 있다.

 

끝.

 

 

댓글