shell_exec를 사용하여 PHP에서 쉘 명령 실행

shell_exec를 사용하여 PHP에서 쉘 명령 실행

내 논문에는 관리자가 액세스를 요청하는 사용자를 승인할 수 있는 관리 인터페이스를 만드는 것이 포함됩니다. 열린 성운.

승인 후 사용자는 OpenNebula에 추가되어야 합니다(즉, 명령에 해당함 oneadmin createuser username password). (인터페이스에 대한 추가 정보(섹션 4.2).)

PHP 파일에서 쉘 명령을 실행하여 이 작업을 수행하려고 합니다. 이것이 작동하지 않는 이유는 무엇입니까(아래는 제가 사용하고 있는 일반 코드가 아닌 단지 구체적인 예입니다)?

$execQuery = "/bin/su oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
shell_exec ($execQuery); //execute query in shell.

이 방법도 작동하지 않습니다(oneadmin으로 로그인한 경우에도 PHP에서 스크립트를 실행할 때).

shell_exec ("/usr/bin/oneuser create test10 test10");

쉘에 이 명령을 입력하면 작동합니다. PHP를 통해 다른 쉘 명령을 실행해 보았는데 잘 작동하는데 문제가 무엇인지 궁금합니다.

/usr/bin/oneuser rwx모든 사용자에게 파일 권한을 부여했습니다 .

답변1

우수한PHP 매뉴얼shell_exec, 이는 함수가 출력을 문자열로 반환함을 나타냅니다. 시작된 프로그램의 출력이 예상되는 경우 다음과 같이 캡처해야 합니다.

$execQuery = "echo -n test_command";
$output = shell_exec($execQuery);
echo $output;

귀하의 질문은 귀하가 데이터를 캡처하려고 한다는 것을 나타내지 않습니다. 명령을 실행할 때 stdout과 stderr이 연결되어 있는지도 확인하면 무슨 일이 일어나고 있는지 더 잘 알 수 있을 것입니다. 귀하의 예를 사용하여 :

$output = shell_exec("/usr/bin/oneuser create test10 test10 2>&1");
var_dump($output);

이는 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다. ~처럼샤둘이 제안함, 이러한 프로그램을 실행하려면 비밀번호를 입력할 수 있는 대화형 터미널이 필요한 것으로 보입니다. 입력이 필요하지 않더라도 대화형 셸을 기대할 수 있습니다. 그의 말이 맞습니다. su이 경우에는 잘 작동하지 않습니다. 그러나 작업에 적합한 도구가 있습니다.

sudohttp 사용자가 비밀번호 없이 사용자 이름으로 프로그램을 실행할 수 있도록 설정할 수 있지만 visudosudoers 파일을 편집하고 다음 줄을 추가하는 데 사용하는 다른 작업을 실행하거나 다른 작업을 수행할 수 없습니다.

http    ALL=(username) /usr/bin/oneadmin

그런 다음 PHP에서 명령은 다음과 같습니다.

$execQuery = "sudo -u username /usr/bin/oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
$out = shell_exec ("$execQuery 2>&1");
echo $out

답변2

노력하다 passthru($cmd);

이를 통해 사용자는 터미널 화면에서 I/O를 수행할 수 있습니다.

답변3

첫 번째 경우에는 su일반적으로 런타임 시 비밀번호가 필요합니다. shell_exec상호작용을 제대로 처리할 수 없습니다.

모르겠어요 oneuser. 어쩌면 비밀번호도 물어보려고 하는 걸까요?

답변4

먼저, 웹 서버가 시스템 명령을 실행할 수 있도록 허용해야 합니다. 하지만 지금은 CentOS6.3 64비트를 사용하겠습니다.램프 서버.

먼저 아파치가 사용하고 있는 현재 사용자를 알아야 합니다. 대부분의 경우 apache사용자 이름이 있는지 확인하기 위해 PHP를 통해 사용자 이름을 확인하겠습니다.

<?php
    echo shell_exec("whoami");
?>

제 경우에는 출력이 입니다 . 이제 권한을 apache편집 하고 부여하겠습니다 .sudoerapache

sudoer 파일을 입력하려면 다음 명령을 입력하십시오.

visudo

이제 아파치가 PHP 스크립트에서 전체 루트 액세스 권한을 얻을 수 있도록 파일 끝에 다음 줄을 추가합니다.

apache  ALL=NOPASSWD: ALL

이제 다음 스크립트를 실행하세요.PHP, 사용자를 다음과 같이 취급해야 합니다.뿌리,

<?php
    echo shell_exec("sudo whoami");
?>

관련 정보