PHP 스크립트는 bash 스크립트를 실행할 수 없습니다. sh : 권한이 거부되었습니다


14

PHP에서 .sh 스크립트를 실행하려고하는데 실행되지 않습니다.

오류 로그를 확인한 후 'sh : Permission denied'오류가 발생합니다. 어떤 사용자 PHP가 실행되고 있는지 확인했으며 아파치 사용자가 수행했습니다.

.sh의 소유권을 아파치 사용자로 변경하려고 시도했지만 결과가 없습니다.

처음에는 이것이 스크립트가 www / dir 외부에 있기 때문이라고 생각했지만 스크립트를 동일한 디렉토리에 넣더라도 오류가 계속 발생합니다.

아파치 사용자를 SUDOers 목록에 추가하는 것 외에 다른 해결책이 있습니까?

'php filename.php'명령을 사용하여 퍼티에서 실행하면 sh 스크립트가 제대로 실행됩니다.


3
쉘 스크립트입니까 아니면 PHP 파일입니까? 마지막 단락은 명확하지 않습니다. 또한 x파일에서 실행 권한 ( )을 설정 했 습니까? shebang 행에 스크립트 인터프리터를 지정 했습니까?
다니엘 벡

PHP에서 실행되는 bash 스크립트입니다. 예, 실행 파일로 만들었고 스크립트 인터프리터를 지정했습니다. 퍼티에서 PHP 스크립트를 실행하면 bash 스크립트가 호출되고 올바르게 실행됩니다. 그러나 웹 브라우저에서 PHP 스크립트를 실행하면 bash 스크립트를 실행하지 못하고 퍼티에서 사용하는 사용자가 아닌 아파치 사용자로 실행 되므로이 오류가 발생합니다.
Robin Presto

1
시도하십시오 chmod 775 yourscript.sh. 그러면 r-x해당 파일의 "기타"사용자에게 권한 이 부여됩니다 (읽기 및 실행).
류혁

나는 그것을 시도했다. 내일까지 정확한 이유를 알 수 없습니다. 내 위치에서 로그에 액세스 할 수 없습니다. 다시 연락 드리겠습니다. 도와 주셔서 감사합니다. :)
Robin Presto

답변:


10

다음 제안을 시도하십시오.

  • 아래 테스트 명령을 실행하고 작동하는지 확인하십시오.
    • php -r "echo exec('whoami');"
  • 모든 상위 디렉토리 및 파일에 최소한 r-x플래그 권한 이 있는지 확인하십시오 .
    • chmod 755 dir; chmod 755 file
  • 파일의 소유자가 Apache 사용자 인지 확인하십시오 .
    • +s파일에 플래그 (sudo) 를 추가 하십시오 (권장되지 않음).
      • chmod u+s file,
  • PHP가에서 실행되고 있지 않은지 확인하십시오 safe_mode.
  • 스크립트가 Apache 루트 안에 있는지 확인하십시오.
    • 그렇지 않으면 스크립트를 그 안에 옮기십시오.
    • 또는 해당 디렉토리를 Apache 구성에 추가하십시오.
    • 또는이 디렉토리를에 추가하십시오 include_path. 예 :
      • php.ini 파일: include_path ".:/usr/local/lib/php:/your/dir"
      • 또는 .htaccess파일 :php_value include_path ".:/usr/local/lib/php:/your/dir"
  • 쉘이 /bin/shApache 사용자 에게 유효한지 (예 :) 설정되어 있는지 확인하십시오 (예 :로 확인 finger).
  • php.ini사용하지 않는지 확인하십시오 : disable_functionsfor execfunction
  • SELinux를 사용하거나 selinux-utils설치 (보안 강화 Linux 시스템) 한 경우 @Tonin 답변에 설명 된대로 확인 getenforce/ setenforce구성 하십시오 .

문제 해결:

  • php.ini또는 httpd.conf파일 을 변경 한 경우 웹 서버를 다시 시작해야합니다.
  • 자세한 내용은 Apache 오류 로그를 확인하십시오.
  • 당신에 사용 php.ini오류 (모든 종류의 display_error, error_reporting등).

1
그게 내 문제 였어 감사합니다! :)
Robin Presto

여전히 나에게 운이 없다 :( 어떤 제안?```[root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 루트 루트 4096 9 월 3 일 12:31 / drwxrwxrwt. 4 루트 루트 4096 9 월 3 일 15:45 / tmp -rwxr-xr-x. 1 루트 루트 24 9 월 3 일 15:39 / tmp / sleep safe_mode = 꺼짐 include_path = "/ tmp : / home / kiwi_build"```
pihentagy

1
아 set, setenforce가 해결했습니다. OMG
pihentagy

13

이러한 문제는 사용하는 OS 및 구성 방법에 따라 달라질 수 있습니다. 일부 Linux 배포판 (주로 CentOS 또는 Fedora와 같은 RHEL 기반)은 기본적으로 SELinux가 활성화되어 제공됩니다. 다음 명령을 사용하여이를 점검하고 임시로 변경할 수 있습니다.

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

또한 다음을 사용하여 현재 구성에 대한보다 완전한 뷰를 가질 수 있습니다.

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

이 변경은 /etc/selinux/config파일 을 편집 하고 SELINUX변수를 permissive또는로 설정하여 영구적으로 만들 수 있습니다 disabled.

그러나 실제로 이러한 상황에 처한 경우 이러한 종류의 문제를 해결하는 올바른 방법/var/log/audit/audit.log로그 파일 을 확인하는 것 입니다. SELinux 규칙과 관련된 모든 이벤트가 포함됩니다. 그러면 스크립트에 올바른 컨텍스트, 즉 apache / php 사용자가 실행할 수있는 권한을 부여해야합니다. SELinux 보안 컨텍스트 확인은 다음을 사용하여 수행됩니다 ls -Z.

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

여기에는 각 파일 / 디렉토리의 사용자, 역할 및 유형이 나열됩니다. 여기서 httpd_sys_script_exec_t형식은 cgi 디렉토리의 파일에 httpd가 실행할 권한을 부여합니다. 쉘 스크립트는 아마도 같은 유형이어야합니다.

명령 audit.log행에 행을 공급할 수도 있습니다 audit2allow. SELinux를 행복하게 만드는 데 필요한 변경 사항을 출력합니다. 그러나 일반적으로 제안 된 변경 사항은 SELinux 정책 자체에서 수행해야하며 이는 귀하의 경우에는 수행하지 않아야합니다 (여전히이 출력은 진행 상황에 대한 힌트를 줄 수 있습니다).

다음 페이지는 유사한 문제와이를 해결하는 다른 방법을 설명합니다. http://sheltren.com/stop-disabling-selinux


자세한 답변 감사합니다! 아아, 내가 언급 한 것처럼 내일까지 루트 액세스 권한을 가질 수 없습니다. 그래서 나는 다시 당신에게 돌아올 것이다! :) 그리고 네, CentOS를 사용하고 있습니다.
Robin Presto

나는 당신의 대답을 매우 유익했습니다! 불행히도 집행이 비활성화되었고 문제가 아니기 때문에 당신을 선택하지 않았습니다. 나는 당신의 대답에서 많은 것을 배웠지 만 감사합니다. 내가 :) 충분히 명성을 얻을 때 나는 당신을 투표 할 것이다
로빈 프레스토에게

걱정하지 마십시오. 내 게시물에서 배운 것을 알게되어 기쁩니다!
Tonin

만약 getenforced가 문제라면, 도대체 무슨 일이 일어나고 있는지는 분명하지 않습니다. 내 하루를 구했다!
pihentagy

1

그래서 Google에서 비슷한 문제를 검색 한 후 여기에 왔습니다. SELinux에 대한 의견이 올바른 방향으로 지적되었다고 생각했습니다.

필자의 경우 쉘 명령을 사용하는 사용자 지정 Git 배포 스크립트를 사용하고있었습니다. 이 명령은 BASH에서 제대로 작동하지만 Git에서 "permission denied"및 "repository"가 있습니다. 이것은 정말 이상 했고이 답변을 우연히 발견 할 때까지 여러 수정을 거쳤습니다.

root@ls:~# /usr/sbin/setenforce Permissive 나를 위해 문제를 해결했습니다.


0

내 상황이 약간 다르지만 Google에서 나를 데려왔으므로 공유하겠다고 생각했습니다 ...

내 서버는 데비안을 안정적으로 실행하고 셸 스크립트를 한 번 실행하려고 시도한 후 권한이 자동으로 644로 변경되고 다음 스크립트 실행 시도가 발생했습니다 Permission denied. 그것은 나를 위해 삼바 서버 문제로 판명되었으며 지금까지 패턴을 알지 못했습니다.

Windows 편집기에서 Samba 파티션에 파일을 저장할 때 QA 이상한 권한 이 수정되었습니다. map archive = no삼바 주식을 10 년 동안 사용한 후에도 옵션 에 대해 몰랐습니다 .

Windows 데스크탑에서 Notepad ++를 사용하는 것에 대한 무언가는 umask가 설정 될 때 대상 파일의 권한을 775 대신 675로 변경합니다.


-7

Apache를 통해 PHP에서 루트 명령 실행

PHP 함수 내에서 쉘 명령을 루트로 수행 해야하는 웹 응용 프로그램이 있으며 꽤 간단하다고 생각할 것입니다 ...하지만 모든 세부 사항을 얻으려면 몇 가지 Google이 필요하므로 여기에 유용한 메모가 있습니다. 그것. 이것은 Apache를 실행하는 Linux 시스템에 있으며“shell_exec”에서“sudo”를 사용하여 명령을 실행합니다.

가장 중요한 것은 / etc / sudoers 파일을 편집하는 것이며 일반적으로 루트로”visudo”명령을 사용하여 수행 할 수 있습니다.

아파치가 명령을 실행할 수 있고 암호가 필요하지 않은지 확인하십시오.

apache  ALL=(ALL)       NOPASSWD: ALL

그런 다음이 줄을 주석 처리해야합니다.

#Defaults    requiretty

그렇지 않으면 / var / log / secure에 다음 오류가 표시됩니다.“죄송합니다. sudo를 실행하려면 tty가 있어야합니다.” 이제 준비가되었습니다. PHP 코드는 간단합니다 :

$ results = shell_exec ( 'sudo date');


5
이것은 끔찍한 생각입니다. 아파치 설치가 손상되거나 실행중인 응용 프로그램이 손상된 경우 해커는 시스템에 너무 쉽게 액세스 할 수 있습니다. 옳은 것은 스크립트에 대한 권한을 변경하는 것입니다. 사물을 크게 열어 두지 마십시오
Journeyman Geek

2
아파치 사용자 / 역할에 모든 권한을 부여하는 명백한 보안 문제로 인해이 답변에 대한 공감대를 발행 할 의무가 있다고 생각합니다.
Ramhound 2012

@JourneymanGeek "if" 아니라 설치가 손상되는 시점 입니다.
Michael Hampton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.