2013-02-15 1 views
7

현재 브라우저 브라우저가 웹 페이지를 탐색 할 때 실행중인 PHP 스크립트가 있습니다. 스크립트를 실행할 때 변수를 저장하면 텍스트 파일을 작성합니다. 폴더의 소유자는 아파치이지만 모든 사람이 테스트 용으로 읽기 전용으로되어 있습니다. (필자는 권한 문제 일 가능성이 있다고 생각했다.) SELINUX는 서버에서 사용할 수 있으며, 콘솔에서 스크립트를 실행하면 텍스트 파일이 올바르게 만들어지고 올바른 디렉토리에 생성됩니다. 내가 작성하고 텍스트 파일을 만들려고하는이 라인을 사용하고file_put_contents txt 파일을 만들지 않습니다

file_put_contents("My working file location", $myString); 

, 나는 내가 그것을 실행하고 오프라인 모드, 즉 그것을 만들 수 있습니다 becaus 내 파일 위치가 작동하는지 알고 콘솔을 통해 실행합니다. 문제는 내가 쓰려고하는 변수가 HTTP Post를 통해 채워지고 브라우저를 통해 스크립트를 실행할 때 또는 아파치가 스크립트를 실행할 때 파일을 작성하거나 작성하지 않는다는 것입니다. 이 스크립트가이 텍스트 파일을 작성하게하려면 구문 쓰기/변경 구문에 대한 액세스를 허용하려면 어떻게해야합니까?

+1

아파치 사용자는 디렉토리 권한이 있어야합니다 - 명령 행에서 아파치 사용자로 스크립트를 실행하려고 시도하는지 확인하십시오. 작동하지 않는지 확인하십시오. – user1914292

+2

아파치 오류 로그를 확인하면 실패한 부분에 대한 세부 정보를 얻을 수 있습니다. –

+0

$ myString 값은 무엇입니까? 그 맞습니까 ? – Cooper

답변

9

문제는 아파치가 지정한 파일 위치에 쓸 권한이 없기 때문일 수 있습니다. 그 디렉토리로 이동하여 ls 명령 권한과 그룹 소유권을 확인 : 디렉토리에 대한 사용 권한, 소유자, 그룹을 보여 출력에 세 개의 열이 있습니다

cd "My working file location" 
ls -l . 

. 대부분 루트 사용자가 소유하고 있으므로 apache 디렉토리에 쓸 수있는 권한이 없습니다.

이 경우 파일을 만들려고하면 아파치 로그에 오류가 표시됩니다.

tail -f /var/log/apache2/error.log 
+0

문제가 해결 된 문제를 해결했습니다. selinux 권한과 apache 권한. – choppyfireballs

+2

답변을 공유하는 것이 좋습니다. Google이 여기로 리디렉션했고 여전히 차단되었습니다. –

+1

@VenderAeloth choppyfireballs는 여기서는별로 활발하지 않은 것처럼 보입니다.하지만 그가 응답하지 않으면 검색시 답변을 공유해주십시오! –

-2

당신이 777로 디렉터리를 chmodding 봤어 : 브라우저에서 스크립트를 실행하는 동안 로그를 미행 시도?

이 시도 : 맞춤법이 틀린 무언가의

if(file_put_contents('file.txt', 'text')){ 
    die('yes'); 
} else { 
    die('no'); 
} 

수 있습니다.^

+1

때로는 이것이 잘못된 것을 보는 좋은 방법입니다. – tofutim

1

나는 최근에 같은 문제가 있었고이 질문에 비틀 거렸다. 불행히도 고삐 파이어 볼은 OP가 자신의 해결책을 찾은 의견에 불과하다고 말하면서 우리에게 도움이되지 못하는 대답을 받아 들였습니다. 검색 및 성공 후 file_put_contents이 다시 작동하게되면서 내 솔루션을 공유하기로 결정했습니다. 내 파일 및 디렉토리의

권한은 (당신의 디렉토리가이 위치에있는 파일을 작성하는 루트와 다른 보조금을 줄 것이다 chmod 757 있는지 확인) 어떤 글을 적용하기 위해 확인했다. 그것이 나를 위해하지 않은 것처럼 여전히 작동하지 않는다면 시스템이 아마도 SELinux (Security Enhanced Linux) 시스템이기 때문입니다.

setenforce 0을 쓰려면 selinux를 허용 모드로 설정하고 스크립트를 다시 실행하십시오. 작동하면 문제가 잘 설명되어 있음을 의미합니다.

그런 경우 selinux를 setenforce 1으로 돌리고 프로젝트 디렉토리가있는 디렉토리에 ls -Zl을 입력하십시오.이 하나 하나의 디렉토리에서 컨텍스트를 전송하는 chcon를 사용하는 경우이 당신에게

drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project 

또는 다른 무언가하지만 httpd_sys_content_t 같은 라인을 제공 할 것입니다. httpd_sys_content_t이 없다면 어쨌든 해당 디렉토리의 컨텍스트를 변경해야하기 때문에 괜찮습니다.

먼저 파일을 쓰려면 public_content_rw_t 컨텍스트를 수락해야합니다. 입력

setsebool -P httpd_anon_write on 

이 (P) ermanently SELinux가 true로 부울 httpd_anon_write 자신의 위치에 파일을 쓸 수있는 권한이 있어야합니다 public_content_rw_t로 불리는 어떤 컨텍스트를 설정합니다.

이제 프로젝트 디렉토리가 public_content_rw_t 인 SELinux를 말해야합니다. 그렇지 않으면 파일을 쓸 수 없습니다. 유형 :

semanage fcontext --add --type public_content_rw_t "/project(/.*)?" 

restorecon -RvF /project 위의 사양을 적용 SELinux가 말할 수 있습니다.

이제 디렉토리가 public_content_rw_t이고 파일을 쓸 수 있어야합니다. 나도이 문제로 실행

cd /mydir/ 
setsebool -P allow_httpd_anon_write true 

안부

-1

확실히 있습니다. 제 경우에는 디렉토리의 소유권이 잘못되었음을 발견했습니다. 일반적인 Apache 설치의 경우 디렉토리는 root : root가 아닌 www-data : www-data가 소유해야합니다.

0

: 내 솔루션은 정말 분명하지만이 일을하면 난

+0

이것은 질문에 대한 답변을 제공하지 않습니다. 일단 충분한 [평판] (https : // stackoverflow.co.kr/help/whats-reputation) 당신은 [모든 게시물에 댓글을 달 수 있습니다] (https://stackoverflow.com/help/privileges/comment); 대신, [질문자의 설명이 필요없는 답변을 제공하십시오] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do- 대신). - [리뷰에서] (리뷰/저품절 포스트/17017422) –