Post

(PHP) Program execution, Shell escape

실행 연산자 command

안전모드 상태이거나, shell\_exec() 가 무효일 때는 사용할 수 없다.

1
2
3
$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 output
  • shell\_exec — Execute command via shell and return the complete output as a string
  • exec— 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/output
  • proc\_get\_status — Get information about a process opened by proc_open
  • proc\_nice — Change the priority of the current process
  • proc\_close — Close a process opened by proc_open and return the exit code of that process
  • proc\_terminate — Kills a process opened by proc_open

preg\_replace()e(eval) modifier가 포함되어 있는 경우 치환된 값을 코드로 실행하게 된다. e.g.

1
2
3
$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

escapeshellcmd()

쉘에서 사용하는 특수문자 앞에 \를 붙여 escape한다. & # ; | * ? ~ < > ^ ( ) [ ] { } $ \ \x0A \xFF ‘ “`

'"는 한 쌍이 아닐 때만 escape되는데, 구버전은 한 쌍이어도 escape된다. windows에서는 위 특수문자에 더해서 %!도 escape되며 \가 붙는 것이 아니라 공백으로 replace된다.

Escape shell argument string

escapeshellarg()

This post is licensed under CC BY 4.0 by the author.