PHP에서는 시스템 외부 명령을 실행하는 네 가지 방법이 제공됩니다: exec(), passthru(), system(), 그리고 shell_exec(). 시작하기 전에, php.ini 파일에서 이러한 함수가 비활성화되어 있는지 확인해야 합니다. disable_functions 설정을 검사하세요:
disable_functions =
만약 위의 네 가지 함수 중 하나라도 disable_functions 목록에 포함되어 있다면, 이를 제거해야 합니다. 기본적으로 PHP는 시스템 외부 명령 실행 함수를 금지하지 않습니다.
방법 1: exec()
exec()는 명령어를 실행하고 마지막 줄의 결과를 반환합니다. 선택적으로 출력된 모든 줄을 배열로 저장할 수도 있습니다.
<?php
function showDirectoryContents() {
$output = [];
$result = exec('ls', $output, $returnCode);
echo "마지막 줄: " . htmlspecialchars($result) . "<br>";
echo "전체 출력:<br>";
print_r($output);
echo "실행 상태 코드: " . $returnCode;
}
showDirectoryContents();
?>
결과는 다음과 같습니다:
마지막 줄: test.php
전체 출력:
Array ( [0] => index.php [1] => test.php )
실행 상태 코드: 0
중요 포인트: exec()는 마지막 줄만 반환하며, 전체 출력은 두 번째 매개변수로 전달된 배열에 저장됩니다. 세 번째 매개변수는 명령어 실행의 성공 여부를 나타내는 상태 코드입니다.
방법 2: passthru()
passthru()는 명령어의 결과를 직접 출력합니다. 이 함수는 주로 이진 데이터(예: 이미지)를 처리할 때 유용합니다.
<?php
function displayRawOutput() {
passthru('ls');
}
displayRawOutput();
?>
위 코드는 다음과 같이 출력됩니다:
index.phptest.php
중요 포인트: passthru()는 결과를 그대로 브라우저에 출력하며, 별도의 echo나 return 없이 작동합니다. 또한 이진 데이터를 처리할 수 있습니다.
방법 3: system()
system()는 명령어의 결과를 브라우저에 출력하며, 실행 성공 여부를 boolean 값으로 반환합니다.
<?php
function listRootDirectory() {
$returnCode = 0;
$output = system('ls /', $returnCode);
echo "<br>실행 상태 코드: " . $returnCode;
}
listRootDirectory();
?>
위 코드는 다음과 같이 출력됩니다:
bin boot cgroup dev etc home lib lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
실행 상태 코드: 0
중요 포인트: system()는 exec()와 달리 즉시 결과를 출력합니다. 두 번째 매개변수는 실행 상태 코드를 받습니다.
방법 4: shell_exec() 및 백틱(`)
shell_exec()는 백틱 연산자(`)의 변형입니다. 이는 명령어의 전체 출력을 문자열로 반환합니다.
<?php
function getCurrentPath() {
$path = shell_exec('pwd');
echo "현재 경로: " . htmlspecialchars(trim($path));
}
getCurrentPath();
?>
위 코드는 다음과 같이 출력됩니다:
현재 경로: /home/www/html
중요 포인트: shell_exec()는 명령어의 전체 출력을 문자열로 반환하며, 보통 다량의 텍스트 또는 단일 결과를 처리할 때 사용됩니다.