PHP mkdir : 권한 거부 문제


99

PHP mkdir 함수로 디렉토리를 만들려고하는데 다음과 같은 오류가 발생합니다 Warning: mkdir() [function.mkdir]: Permission denied in ..... 문제를 해결하는 방법?


2
플랫폼 / 웹 서버 / 운영 체제?
Salman A 2011 년

1
이 질문을 확인하십시오 : http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir 동일한 문제가 있었고 여기에 대한 대답으로 문제가 해결되었습니다. Linux에서 실행되는 경우 SELinux에 대한 답변이 적용될 수 있습니다.
Lucas Madureira

나를 위해 작동하는 이것을 시도하십시오 stackoverflow.com/a/12656964/7516620 여기에 링크 설명 입력
Akshay Italiya

답변:


172

나는 이것이 오래된 스레드라는 것을 알고 있지만 더 나은 대답이 필요합니다. 권한을 777로 설정할 필요가 없습니다. 이는 세계에 대한 읽기 및 쓰기 액세스를 제공하므로 보안 문제입니다. 아파치 사용자에게 디렉토리에 대한 읽기 / 쓰기 권한이 없을 수 있습니다.

Ubuntu에서 수행하는 작업은 다음과 같습니다.

  1. 모든 파일이 Apache 그룹 및 사용자의 소유인지 확인하십시오. Ubuntu에서는 www-data 그룹 및 사용자입니다.

    chown -R www-data:www-data /path/to/webserver/www

  2. 다음으로 www-data 그룹의 모든 구성원이 파일을 읽고 쓸 수 있습니다.

    chmod -R g+rw /path/to/webserver/www

PHP mkdir()함수는 이제 오류를 반환하지 않고 작동합니다.


3
좋은 대답입니다! 바라건대 이것은 시간이 지남에 따라 페이지 상단으로 이동합니다!
높은 불규칙한


Apache는 캐시 및 로그와 같은 것을 쓰기위한 권한이 필요합니다. 미세 조정의 문제 일뿐입니다.
Manatax

@simpleengine 안녕하세요. 저는 CodeIgnter에서 만들고 Ubuntu 14.14 Lts에서 개발하려는 프로젝트에서 동일한 문제에 직면하고 있습니다. 필요한 단계를 좀 더 자세히 설명해 주시겠습니까? 이 오류를 수정하려면 수행하십시오 ??? 추가 정보를 제공하기 위해 : 절대 경로는 /opt/lampp/htdocs/www/my-app/public/uploads.. 기본적으로 로그인 한 모든 사용자가 업로드 폴더에 파일을 업로드하고 사진을 저장할 앨범 폴더 (php로 수행됨)를 만드는 것입니다. ..
ltdev 2015 년

6
안전한 방법을 보여주지 않고 "안전하지 않다"고 계속 말하는 사용자를 좋아하지 않습니다.
che-azeh

38

미래에 구글을 통해 이것을 찾는 사람들을위한 늦은 답변. 나는 같은 문제에 부딪쳤다.

참고 : 저는 MAC OSX LION을 사용하고 있습니다.

아파치가 사용자 "_www"로 실행되고 있으며 파일을 편집 할 수있는 권한이 없습니다. php를 통해 작동하는 파일 시스템 기능이 없음을 알 수 있습니다.

어떻게 고치는 지:

Finder 창을 열고 메뉴 모음에서 이동> 폴더로 이동> / private / etc / apache2를 선택합니다.

이제 httpd.conf를 엽니 다.

찾기:

User _www 
Group _www

사용자 이름 변경 :

User <YOUR LOGIN USERNAME>

이제 다음 양식 터미널을 실행하여 아파치를 다시 시작하십시오.

sudo apachectl -k restart

그래도 작동하지 않으면 위의 작업을 수행하기 전에 다음을 수행합니다. 관련이있을 수 있습니다.

터미널을 열고 다음 명령을 실행합니다. (내 웹 서버 파일은 / Library / WebServer / www에 있습니다. 웹 사이트 위치에 따라 변경)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
이 솔루션은 작동하지만 누군가가 악성 코드 (예 : Shellshock 익스플로잇을 통해)를 실행하도록 유도하면 Apache가 시스템에 혼란을 일으킬 수 있습니다. 대안은 Apache를 그대로 실행하고 _www사용자와 Apache에 대한 그룹을 만드는 것입니다. 새 그룹을 만들고라고 말하고 trusted자신과 그 _www안에 넣으십시오 . 그런 다음 서버 문서 디렉토리에있는 모든 파일의 그룹 소유자를 신뢰할 수있게 만드십시오. 마지막으로 chmod g+rwxApache가 액세스해야하는 파일에만 필요한 작업을 수행 하여 trusted그룹이 파일을 편집 할 수있는 권한을 갖도록 합니다.
Chris Middleton

3
이 대답은 나쁜 생각이라는 것을 다시 강조하기 위해 차를 치는 것뿐입니다. 아파치 프로세스가 자신의 특수 목적 사용자가 소유하는 데에는 많은 이유가 있습니다.
danyamachine

16

PHP에서 mkdir을 사용할 때 권한을 777로 설정하지 마십시오.

링크 전용 답변은 StackOverflow에서 모범 사례로 간주되지 않지만 여기에 제공된 조언은 일반적으로 후속 조치를 취해서는 안됩니다.

비슷한 질문에 대한이 훌륭한 답변으로 되돌리고 싶습니다 . 나는 인용한다 :

777 사용 제안을 중지하십시오. 모든 사람이 파일을 쓸 수있게 만들고 있습니다. 이는 권한 시스템이 설계된 모든 보안을 잃는다는 것을 의미합니다. 이것을 제안한다면, 잘못 구성된 웹 서버에 미칠 수있는 결과에 대해 생각해보십시오. 파일을 덮어 쓰면 웹 사이트를 "해킹"하기가 매우 쉬워 질 것입니다. 그러지 마십시오.


9

디렉토리의 권한을 수정 당신은 디렉토리를 만들려고 의를 .


Filezilla를 사용하여 파일 권한을 재귀 적으로 755로 변경하여 원래 질문의 문제를 해결했습니다. 상위 폴더를 마우스 오른쪽 버튼으로 클릭하고 755 권한을 설정해도 괜찮은 일종의 일반 파일 저장소 폴더라고 가정하고 파일 속성-> 숫자 값-> 755를 클릭 한 다음 "하위 디렉토리로 반복"을 선택합니다. 파일이 많은 경우 하위 디렉토리를 통해 전파하는 데 몇 분 정도 걸립니다. 그런 다음 다시 시도하십시오.
TARKUS

7

이 스레드가 오래되었다는 것을 알고 있지만 언젠가 누군가에게 도움이 될 것입니다.

PHP가 mkdir ()에 대해 "Permission denied"라고 말하는 문제-잘못된 URL 경로. 따라서 문제를 해결하려면 올바른 경로를 얻기 만하면됩니다. 나는 이렇게했다 :

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
새 호스트로 전송할 때 나에게 일어났습니다 (mysqlnd lol가 있음). 새로운 전체 홈 디렉토리 경로로 변경하는 것을 잊었습니다. 실제로 권한 문제가 아니었다는 것이 밝혀졌습니다.
JSG

2

디렉토리를 만들려면 파일 시스템 권한이 있어야합니다.

예 : Ubuntu 10.04에서 apache (php)는 사용자로 실행됩니다 : www-data in group : www-data

즉, 사용자 www-data는 디렉토리를 생성하기 위해 액세스해야합니다.

www-data 사용자가 되려면 'su www-data'를 사용하여 직접 시도 할 수 있습니다.

빠른 수정으로 다음을 수행 할 수 있습니다. sudo chmod 777 my_parent_dir


14
chmod 0777세계에 대한 읽기 및 쓰기 액세스 권한을 부여합니다! 그런 조언을해서는 안됩니다. 그러나 사용자 그룹의 조언은 현재 최고입니다. :)
KingCrunch 2011 년

1
세상이 OS에 접근 할 수 있다면 당연합니다. 더 나은 방법은 다음과 같습니다 sudo는 대한 Chown www가 데이터 : www가 데이터 my_parent_dir
존 Skarpeteig

또는 권한을 그대로두고 www-data를 상위 디렉토리의 그룹에 추가하십시오.
Marc B

0

당신이 할 수있는 다른 일은 다음으로 이동하는 것입니다 : / etc / sudoers

해당 사용자에게 권한을 부여하는 다음 줄을 추가합니다. www-data ALL = (ALL : ALL) ALL Why www-data? 이것은 아파치가이 사용자 이름으로 실행되기 때문입니다.

사용자가 다른 경우 사용자 이름 ALL = (ALL : ALL) ALL을 시도하십시오.

이것은 나를 위해 일했습니다.


5
sudoers직접 편집하지 말고 루트로 로그인하고 te visudo명령을 사용하십시오 .이 명령은 잘못된 편집을 방지하기 위해 변경 사항을 확인합니다.이 명령은 sudoers 파일이로드 될 때 구문 분석 오류를 일으킬 수 있습니다. 무엇이든 변경)
Elias Van Ootegem

사용자 이름을 찾는 방법. www-data처럼? nginx를 사용하고 있지만 작동하지 않습니다
robspin 2018

1
@robspin 이것을 시도하십시오 : ps aux | egrep '(nginx)'
maxwells

0

Mac을 사용 중이므로 Mac의 _www (apache 사용자 그룹) 그룹에 자신을 추가 할 수 있습니다.

sudo dseditgroup -o edit -a $USER -t user _www

Mac이 파일을 생성하는 것처럼 보이는 휠 그룹에 _www 사용자를 추가합니다.

sudo dseditgroup -o edit -a _www -t user wheel

0

방금이 문제가 발생했습니다. 지금 당장 제공 할 수있는 최선의 해결책은 다음과 같습니다. 코드를 포함하지 않았음에도 불구하고

  1. 대상 폴더의 이름을 확인하십시오. 예 : new_folder (대부분의 호스트가 런타임에 밑줄, 대시 등을 사용하는 이름을 만드는 것을 허용하지 않기 때문에 권한 오류가 발생할 수 있습니다). 그것은 나를 위해 일했습니다.
  2. 재귀 명령을 사용하여 하위 폴더를 만드는 경우 mkdir 명령에 0755 (시작에 0을 포함해야 함)를 입력하는 것을 잊지 마십시오. 예 :

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

이것은 또한 지금 저에게 효과적입니다.


3
777은 보안 문제입니다
MaicolBen 2015-08-12

0755에, 지금 편집
arungisyadi

0

LINUX를 사용하는 경우 일부 배포판에서는 다를 수 있으므로 먼저 apache의 사용자를 확인하겠습니다.

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

결과가 "http"라고 가정 해 보겠습니다. 다음을 수행하십시오. path_to_folder를 폴더 경로로 변경하십시오.

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

umask의 문제가 아닌지 확인하십시오.

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}

0

FTP 서버를 설치 한 후에 sudo apt-get install vsftpd는 구성해야합니다. 쓰기 액세스를 활성화하려면 /etc/vsftpd.conf파일 을 편집 하고 주석 처리를 제거해야합니다.

#write_enable=YES

줄, 그래서 읽어야합니다

write_enable=YES

파일 다시 시작 저장 vsftpd과를 sudo service vsftpd restart.

다른 구성 옵션에 대해서는 이 문서를 참조 하거나man vsftpd.conf


0

이 오류는 잘못된 경로를 사용하는 경우 발생합니다.

예 :

우분투 시스템을 사용하고 있으며 프로젝트 폴더 이름은 'myproject'입니다.

myproject / public / report 디렉토리가 있고라는 새 폴더를 만들고 싶다고 가정 합니다. orders 합니다.

그런 다음 내 프로젝트가 존재하는 전체 경로가 필요합니다. PWD 명령으로 경로를 얻을 수 있습니다.

따라서 내 루트 경로는 = '/ home / htdocs / myproject /'입니다.

$ dir = '/ home / htdocs / myproject / public / report / Orders';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

그것은 당신을 위해 작동합니다! 즐겨 !!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.