(PHP) Program execution, Shell escape
실행 연산자 command
안전모드 상태이거나, shell_exec()
가 무효일 때는 사용할 수 없다.
1
2
$filelist = `ls -al`; // 명령을 실행. 반환값은 실행 결과 전체.
echo "<pre>$filelist</pre>";
Program execution 함수 목록
안전모드 상태일 경우 safe\_mode\_exec_dir
에 지정되어 있는 디렉토리에 위치해 있는 경우에만 실행할 수 있다.
system
— Execute an external program and display the output 명령을 실행하고 자체적으로 실행 결과 전체를 출력. 리턴값은 실행 결과의 마지막 한 행.passthru
— Execute an external program and display raw outputshell_exec
— Execute command via shell and return the complete output as a stringexec
— Execute an external program 명령을 실행. 리턴값은c system()
과 같음.popen
— Opens a pipe to a process executed by forking the command.proc_open
— Execute a command and open file pointers for input/outputproc\_get_status
— Get information about a process opened by proc_openproc_nice
— Change the priority of the current processproc_close
— Close a process opened by proc_open and return the exit code of that processproc_terminate
— Kills a process opened by proc_open
preg_replace()
에 e
(eval) modifier가 포함되어 있는 경우 치환된 값을 코드로 실행하게 된다. e.g.
1
2
$input = "Bet you want a BMW.";
echo preg\_replace("/([a-z]\*)/e\0", "strtoupper('\\1')", $input);
\0
이 유효한 이유는 정규식의 패턴은 C 문자열로 전달 되기 때문이다. /e
가 없으면 strtoupper()
가 그냥 문자열로 인식된다
Open files with lock ( 특히 oepn sessions ) 은 백그라운드에서 프로그램을 실행하기 전에 반드시 close되어야 한다.
exec()
등등을 사용하면 유용한 경우는 오래 걸리는 작업(e.g., 보고서 생성)을 수행할 때 별도의 작업자 프로세스로 해당 작업을 넘겨줄 때이다. 별도의 단독 스크립트를 작성해 이를 exec()
를 이용해 bash에서 호출하면 PHP 프로세스를 지연시키지 않는 별도의 논 블로킹 프로세스를 생성하기 때문에 현재 PHP 스크립트와 분리할 수 있으며 그냥 수행하는 것 보다 매우 빠르게 처리할 수 있다.
escape
Escape shell metacharacters
쉘에서 사용하는 특수문자 앞에 \
를 붙여 escape한다. & # ;
| * ? ~ < > ^ ( ) [ ] { } $ \ \x0A \xFF ‘ “`
'
와 "
는 한 쌍이 아닐 때만 escape되는데, 구버전은 한 쌍이어도 escape된다. windows에서는 위 특수문자에 더해서 %
와 !
도 escape되며 \
가 붙는 것이 아니라 공백으로 replace된다.