file_put_contents 권한이 거부되었습니다.


97

디버깅을 위해 파일에 쿼리를 작성하려고합니다. 파일은 database/execute.php. 내가 쓰려는 파일은 database/queries.php.

나는 사용하려고 file_put_contents('queries.txt', $query)

하지만 나는

file_put_contents (queries.txt) [function.file-put-contents] : 스트림 열기 실패 : 권한이 거부되었습니다.

내가이 queries.txt777 파일 chmod'd을, 문제는 무엇을 할 수 있을까?


php.ini파일 액세스를 거부 할 수있는 것이 있는지 파일을 살펴본 적이 있습니까?
Hello71

2
또한 반드시 디렉토리를 잘 chmod'd되어 있는지 확인
크레용 폭력

1
또한 절대 파일 이름을 사용해보십시오. 현재 폴더에 대한 해석이 PHP와 다를 수 있습니다.
laher

1
chmod 상태를 다시 확인할 수 있습니까?
Jonah

1
이런 종류의 문제에 대한 문제 해결 체크리스트가 있습니다. stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

답변:


72

디렉토리 권한을 조정 해보십시오.

터미널에서 실행 chmod 777 database(데이터베이스 폴더가 포함 된 디렉토리에서)

아파치와 올바르게 chmodd 된 경우 아무도이 디렉토리에 액세스 할 수 없습니다.

또 다른 방법은 echo "getcwd ()"입니다. 현재 디렉토리가 표시되며 '/something.../database/'가 아닌 경우 'query.txt'를 서버의 전체 경로로 변경해야합니다.


104
777은 보안 위험이 아닙니까?
hitautodestruct 2013 년

12
서버 계정이 대상 디렉터리를 쓸 수 있어야 할뿐만 아니라 대상 디렉터리의 모든 상위 디렉터리가 서버 계정이 탐색 할 수 있도록 허용해야한다고 강력하게 의심합니다. 나는 이것이 권한에 + x가 될 것이라고 생각합니다.
Erhannis

2
새로운 LAMP 스택에서 Erhannis의 이론을 실험했는데 이론이 옳습니다.
thotheolh

4
@MajidFouladpour 나는 chmod +x /parent/directory타겟의 모든 부모 디렉토리에 대해 생각 합니다. chmod +x /parent/directory, chmod +x /parent
Erhannis 2014-09-17

1
이제 이런 종류의 문제에 대한 문제 해결 체크리스트가 있습니다. stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

18

다른 옵션

Apache (www-data)폴더의 소유자를 만들 수 있다는 것 입니다.

sudo chown -R www-data:www-data /var/www

file_put_contents이제 작동 해야합니다 . 그러나 보안을 강화하려면 아래와 같은 권한을 설정하는 것이 좋습니다.

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • /var/wwwPHP 파일의 루트 폴더로 변경 하십시오.

7

지금은 꽤 오래되었지만 이와 같은 파일에 수동으로 쿼리를 작성할 필요는 없습니다. MySQL에는 로깅 지원이 내장되어 있으므로 개발 환경 내에서 활성화하기 만하면됩니다.

'일반 쿼리 로그'에 대한 문서를 살펴보십시오.

http://dev.mysql.com/doc/refman/5.1/en/query-log.html


3

여러분들이 문제를 한 달 동안 겪었고 모든 것을 다했지만 고칠 수 없었지만 이제 해결책을 알고 있습니다.

공유 리눅스 호스팅을 사용하고 있는데, 관리자가 PHP를 5.3으로 변경했을 때 "file_put_contents"코드에 대해 많은 오류가 발생했습니다. 내 계획을 테스트 해보십시오.

호스트에서 mytest.php와 같은 파일을 만들고이 코드를 입력하고 저장합니다.

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

URL "www.your-domain.com/mytest.php"를 한 번 열고 이메일을 확인합니다. mytest.php에 입력 한 정보가 포함 된 호스트의 이메일이 있어야합니다. 보낸 사람 이름을 확인하십시오. 자사의 경우 아무도는 뭔가 정의되지 때문에 당신은 "권한 거부"에 대한 문제가 있고 보낸 사람 이름이 내 아이디 같은 경우 : iietj8qy@hostname5.netly.net을 당신은 확률값을 가지고 있겠지.

내 관리자가 서버를 변경하고 호스트를 다시 설치 한 것 같습니다. 문제가 해결 된 것 같습니다. 호스트 관리자에게 내가 말한 내용을 말하면 답을 찾을 수 있습니다.

도움이 되길 바랍니다!


나는 완전히 길을 잃었다 !! 당신은 무엇을 말하려고하는? 아파치 사용자가 서버 (공유 또는 기타)에서 호스트 이름을 가져올 수 없다고 말하는 경우 호스팅 서비스 선택을 재고 할 때입니다.
Fr0zenFyr

3

나는 그것이 매우 오래된 질문이라는 것을 알고 있지만 몇 가지 자세한 설명과 함께 좋은 해결책을 추가하고 싶었습니다. 시스템과 같은 Ubuntu에서 두 개의 명령문을 실행해야하며 매력처럼 작동합니다.

Linux의 권한은 3 자리 숫자로 표시 할 수 있습니다. 첫 번째 숫자는 파일 소유자의 권한을 정의합니다. 두 번째 숫자는 특정 사용자 그룹의 권한입니다. 세 번째 숫자는 그룹의 소유자 나 구성원이 아닌 모든 사용자의 권한을 정의합니다.

웹 서버는 그룹의 구성원 인 ID로 실행되어야합니다. 웹 서버는 파일 및 디렉토리의 소유자와 동일한 ID로 실행해서는 안됩니다. Ubuntu에서는 ID www-data로 아파치를 실행합니다. 해당 ID는 권한이 지정된 그룹의 구성원이어야합니다.

파일의 내용을 변경하려는 디렉토리에 적절한 권한을 부여하려면 다음 명령문을 실행하십시오.

find %DIR% -type d -exec chmod 770 {} \;

이는 OP의 질문에서 % ROOT % / database 디렉토리에 대한 권한이 그에 따라 변경되어야 함을 의미합니다. 따라서 변경하거나 제거해서는 안되는 파일을 해당 디렉토리 내에 두지 않는 것이 중요합니다. 내용을 변경해야하는 파일에 대해 별도의 디렉토리를 만드는 것이 가장 좋습니다.

디렉터리에 대한 읽기 권한 (4)은 디렉터리 내에서 메타 데이터와 함께 모든 파일과 디렉터리를 수집 할 수 있음을 의미합니다. 쓰기 권한 (2)은 디렉토리의 내용을 변경할 수있는 권한을 제공합니다. 파일 추가 및 제거, 권한 변경 등을 의미합니다. 실행 권한 (1)은 해당 디렉토리로 이동할 수있는 권한이 있음을 의미합니다. 후자가 없으면 디렉토리로 더 깊이 들어가는 것이 불가능합니다. 웹 서버는 파일 내용을 변경해야 할 때 읽기, 쓰기 및 실행 권한이 필요합니다. 따라서 숫자 7이 필요합니다.

두 번째 진술은 OP에 대한 질문입니다.

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

문서를 읽고 쓸 수 있어야하지만 파일을 실행할 필요는 없습니다. 7은 파일 소유자에게, 6은 그룹에 제공됩니다. 웹 서버는 내용을 변경하기 위해 파일을 실행할 권한이 필요하지 않습니다. 이러한 쓰기 권한은 해당 디렉토리의 파일에만 부여되어야합니다.

다른 모든 사용자에게는 어떠한 권한도 주어서는 안됩니다.

파일을 변경할 필요가없는 디렉토리의 경우 5 개의 그룹 권한으로 충분합니다. 권한 및 몇 가지 예에 대한 문서 :

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


3

이 링크 stackoverflow-image 저장 에서 정보를 수집하는 것은 chmod 777 및 사용자 azerafati 및 Loek Bergman에서 작동하지 않습니다.

/ etc / apache / envvars 파일을 보면 다음과 같은 내용이 표시됩니다.

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache는 사용자 이름 'www-data'로 실행됩니다.

'0755'는 파일 소유자가 읽기 / 쓰기 / 실행할 수 있지만 그룹 및 다른 사용자는 쓸 수 없음을 의미합니다. 따라서 터미널에서 '이미지'폴더가있는 폴더로 이동하십시오. 그런 다음 다음을 입력하십시오.

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

소유자를 변경하기 전에 먼저 권한을 변경해야합니다. 메시지가 나타나면 암호를 입력하십시오. 그러면 이미지 폴더의 'www-data'소유자가됩니다.

이제 업로드가 작동합니다.


1

Ubuntu를 사용하고 웹 호스팅 서비스가 아닌 페이지를 로컬로로드 할 때이 오류를 수신하는 모든 사용자의 경우

방금 노틸러스 ( sudo nautilus)를 열고 열려고하는 파일을 마우스 오른쪽 버튼으로 클릭하고 속성> 설정> '다른 모든 사람'에게 읽기 쓰기 권한을 부여 하여이 문제를 해결 했습니다.


0

같은 문제가 있었다. 내 문제는 selinux가 시행하도록 설정되었습니다.

777로 chmoding하고 모든 상위 폴더에 apache 사용자에 대한 실행 권한이 있는지 확인한 후에도 "스트림 열기 실패 : 권한 거부"오류가 계속 발생했습니다. 내 문제는 selinux가 강제로 설정되어 있다는 것이 밝혀졌습니다 (나는 centos7에 있습니다), 이것은 devbox이므로 꺼졌습니다.


0

이 문제는 다음 단계를 통해 해결할 수 있습니다.

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

도움이되기를 바랍니다.


0

로컬에서 서버로 git에서 가져 오는 경우 캐시와 함께 업로드되는보기 파일 또는 기타 캐시 된 파일 때문에 캐시를 지워야하는 경우가 있습니다.

php artisan cache:clear

때로는 응용 프로그램이 git pull 이전에 작동했다면 트릭 일 수 있습니다.


0

이것이 도움이 될 수 있습니다. 그것은 나를 위해 일했습니다. 터미널에서 시도

setenforce 0


-2

이 문제를 해결하는 방법은 두 가지가
있습니다 chmod 777 path-to-your-directory. 1 ..
작동하지 않으면
2. 단순히 파일의 전체 경로를 제공하십시오 query.txt.


2
이것은 끔찍하게 안전하지 않고 극도로 나쁜 습관입니다. 또한 사용자 지정 응용 프로그램을 개발할 때 감지하고 수정하기가 어렵고 쉽게 간과 될 수 있습니다. 실제로 올바른 권한을 파악하십시오.
ftrotter

-3

여기에 해결책이 있습니다. URL에서 img를 복사하려면. 이 URL :http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

원하는 경로를 작성하십시오. .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-11

또한, 같은 말했다 file_put_contents man pagephp.net, 문제를 명명 조심.

file_put_contents($dir."/file.txt", "hello");

작동하지 않을 수 있지만 (구문이 정확하더라도)

file_put_contents("$dir/file.txt", "hello");

공장. 나는 다른 PHP가 설치된 서버에서 이것을 경험했습니다.


17
이것은 올바르지 않습니다. 문자열 이라고 가정하면 모든 경우에 $dir."/file.txt"기능적으로 동일 합니다. 또한 Kivanc가 주장하는 것처럼이 동작은 php.net에 문서화되어 있지 않습니다. "$dir/file.txt"$dir
mattbasta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.