PHP를 통해 쉘 스크립트를 실행하려고 하는데 권한 오류가 발생하지만 www-data 사용자에게 비밀번호 없이 sudo 명령을 사용할 권한을 추가하려고 하는데 작동하지 않고 그렇게 하지 않습니다. 제가 잘못 신고한 것인지 모르겠습니다. 내 "visudo" 파일이 편집되는 방법은 다음과 같습니다.
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/builder-sites-nginx.sh
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/MyClassToCallScript.php
내 PHP 코드는 다음과 같습니다
$command = "sudo sh ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
// dump($command);
$response = shell_exec($command);
내 코드 셸:
#!/bin/bash
FILE_FROM=/etc/nginx/sites-available/sites-builders
FILE_TO=/etc/nginx/sites-enabled/"$1"
[ ! -d "$FILE_FROM" ] && mkdir -p "$FILE_FROM"
if test -f "$FILE_TO"; then
echo "syntax is ok. $FILE_TO already exists"
else
ln -s "$FILE_FROM/$1" /etc/nginx/sites-enabled/
#check stats
if nginx -t > /dev/null 2>&1; then
echo "syntax is ok"
service nginx reload
else
echo "syntax is not ok"
rm "$FILE_TO"
fi
fi
하지만 내 대답은 "비어있다"입니다. 나는 "visudo"에 다음 발췌문을 추가하여 이것을 테스트했습니다.
www-data ALL=(ALL) NOPASSWD:ALL
위에서 언급한 접근 방식을 사용하면 효과가 있지만 내 사이트의 보안이 손상될 것이라고 생각합니다. 그렇죠? 내 Apache 사용자에게 sudo 권한이 있는 이유는 무엇입니까? 누군가 악의적인 파일을 넣으면 문제가 발생할 수 있으므로 원래 질문으로 돌아갑니다. 주어진 스크립트를 실행할 때 "visudo" 경로를 올바르게 배치하는 방식입니까?
답변1
실행 중이 아닙니다 . sudo /var/www/mysite/classes/builder-sites-nginx.sh
실행 중이며 www-data 실행을 허용하도록 구성되어 있지 않습니다 (그렇게 해서도 안 됩니다. 이는 거대한 보안 허점이 됩니다. 이에 상응하는 것 ).sudo sh /var/www/mysite/classes/builder-sites-nginx.sh
sudo
sudo sh
www-data ALL=(ALL) NOPASSWD:ALL
/var/www/mysite/classes/builder-sites-nginx.sh
make 실행 파일을 사용 하고 이것이 첫 번째 줄인지 chmod +x
확인하십시오 ( 스크립트가 bash 전용 기능을 사용하지 않기 때문에 작동함).#!/bin/bash
#!/bin/sh
그런 다음 PHP 코드를 다음과 같이 수정합니다.
$command = "sudo ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
그런데 정의된 위치와 방법에 따라 $domain
(예: 사용자 제공 데이터에서 오는 경우) PHP escapeshellcmd()
기능을 사용하여 정리해야 할 수도 있습니다.