PHP의 사용자 정의 Linux 호스팅 제어판 - 루트로 명령 실행

PHP의 사용자 정의 Linux 호스팅 제어판 - 루트로 명령 실행

LEMP/LAMP 스택 관리 경험을 바탕으로 맞춤형 Linux 호스팅 제어판을 개발하고 싶습니다. 이것은 단지 애완 동물 프로젝트입니다. 나는 몇 가지 장애물에 부딪쳤다고 생각합니다.

CP는 PHP로 작성되었으며 NginX에서 포트 8000의 기본 서버로 제공됩니다. 저는 프레임워크를 사용하지 않고 일반 PHP만 사용합니다.

퍼티에서 루트로 로그인하면 다음과 같이 시스템 uuid를 얻을 수 있습니다.

[root@localhost ~]# dmidecode -s system-uuid
997C4DE8-213B-4ACC-8E23-01E79D6CC12F

다음 스크립트를 사용하여 PHP에서 이것을 시도할 때:

var_dump(shell_exec('dmidecode -s system-uuid 2>&1'));

다음 메시지가 나타납니다.

sh: dmidecode: 명령을 찾을 수 없습니다

위 명령을 실행하고 PHP로 출력을 얻으려면 어떻게 해야 합니까?

Nginx/PHP-FPM이 사용자로 실행 중입니다 nginx. nginx 사용자를 루트 그룹에 추가해야 합니까?

/etc/init.d/php-fpm restart예를 들어 제어판에서(php-fpm 게이트웨이 다시 시작) 매우 구체적인 명령을 실행할 수 있기를 원합니다 .

이 목표를 어떻게 달성할 수 있나요? 내 옵션은 무엇입니까? cPanel 및 DirectAdmin과 같은 제어판은 어떻게 수행합니까?


나는 또한 다음을 시도했습니다. 명령을 설치 sudo및 사용 sudo visudo하고 끝에 다음 줄을 추가합니다.

nginx    ALL=(ALL)    NOPASSWD:/path/to/php_shell.sh
Defaults:nginx        !requiretty

내용은 php_shell.sh다음과 같습니다:

#!/bin/bash
dmidecode -s system-uuid

이제 다음과 같이 실행하려고 합니다.

var_dump(shell_exec('sudo sh /path/to/php_shell.sh 2>&1'));

나는 얻다:sudo: no tty present and no askpass program specified

답변1

dmidecode일반적으로 디렉토리에 있고 항상 PATH에 있는 것은 아닙니다. 따라서 PHP에서는 예를 /usr/sbin들어 에서 찾은 전체 경로를 사용합니다 .type -p dmidecode/usr/sbin/dmidecode

sudo의 경우 그렇게 하지 않았 sudo sh ...으므로 sudo /path/to/php_shell.shNOPASSWD 항목이 일치하지 않습니다. 그러나 일반 스크립트가 루트로 실행되도록 허용하는 것보다 sudo 파일에 명령과 해당 인수를 명시적으로 나열하는 것이 더 좋습니다. 따라서 예를 들어 사용하십시오.

Defaults:nginx        !requiretty
nginx ALL NOPASSWD:/usr/sbin/dmidecode -s system-uuid

여러 명령을 루트로 실행해야 하는 경우 동일한 줄에 입력하고 쉼표로 구분하세요.

관련 정보