외부 명령어를 실행시키고 실행된 프로세스의 stdout, stderr 등을 핸들링하기 위해 사용하는 proc_open() 함수를 Windows에서 사용할 때,

명령어에 공백문자가 있으면 거기까지만 인식하는 버그가 있음.

예를 들어 C:\Program Files\External\Proc.exe 라는 명령어를 매개변수로 넘기면 C:\Program 까지만 인식함.

물론 명령어 문자열은 쌍따옴표로 감쌌고, 혹시나 해서 역슬래시를 2개씩 넣어보고 했지만 뭘 해봐도 공백문자 앞까지만 인식함.


이 버그를 우회하기 위해 PHP 5.2.1 부터 array 형태의 6번째 매개변수인 $other_options에 bypass_shell 이란 키가 추가되었음.

bypass_shell은 Windows 전용옵션으로, true로 세팅하면 명령어를 cmd.exe를 통해 우회실행 시킨다는 옵션임.


bypass_shell을 true로 세팅하면 명령어에 공백문자가 있어도 문제없이 실행됨.


예제는 아래 링크에서 확인가능.

[PHP] 프로세스를 실행시키면서 STDOUT, STDERR를 문자열 변수에 담기 (open_proc, descriptor_spec, stream_get_contents)










Posted by bloodguy
,