본문 바로가기
IT/web

[PHP] shell_exec() 한글이 포함된 svn 이 동작하지 않을 때 해결 방안

by 어느해겨울 2021. 12. 27.

 

shell_exec() 로 한글 경로가 포함된 svn 이 동작하지 않을 때

 

결론부터 얘기하면 shell의 locale 문제였다.

shell에서 실행하면 shell에 설정된 locale에 따라 url encode 가 동작하니 당연히 정상으로 동작하고,

web을 통해 실행하면 shell_exe()의 기본 환경(LC_CTYPE=C) 때문에 한글 경로가 오류 나는 것이었다.

 

shell - locale 실행 결과

interm@interm-virtual-machine:~/www/public_html$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ko_KR.UTF-8
LC_TIME=ko_KR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ko_KR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ko_KR.UTF-8
LC_NAME=ko_KR.UTF-8
LC_ADDRESS=ko_KR.UTF-8
LC_TELEPHONE=ko_KR.UTF-8
LC_MEASUREMENT=ko_KR.UTF-8
LC_IDENTIFICATION=ko_KR.UTF-8
LC_ALL=

web - shell_exec("locale")을 통한 var_dump 결과

string(282) "LANG=C LANGUAGE= LC_CTYPE="C" LC_NUMERIC=ko_KR.UTF-8 LC_TIME=ko_KR.UTF-8 LC_COLLATE="C" LC_MONETARY=ko_KR.UTF-8 LC_MESSAGES="C" LC_PAPER=ko_KR.UTF-8 LC_NAME=ko_KR.UTF-8 LC_ADDRESS=ko_KR.UTF-8 LC_TELEPHONE=ko_KR.UTF-8 LC_MEASUREMENT=ko_KR.UTF-8 LC_IDENTIFICATION=ko_KR.UTF-8 LC_ALL= "

 

시도해본 것들.

- 한글 포함된 경로의 string을 urlencode

- 스페이스 문제일까 str_replace를 통한 공백 \ 추가

- svn의 문제일까 한글만 포함된 url, 공백이 포함된 url shell/web 에서 실행 및 비교해보기

- php env를 putenv()를 통해 locale 지정

등 그 외 생각 안나는 조치까지..

 

php의 exec_shell()은 fork 된 shell 내에서 환경변수를 줬던 게 기억났다.

진작에 생각해냈어야 했는데 한글 경로를 자주 안 쓰다 보니 이런 삽질도 하게 된다. 분명 예전에도 했던 건데..

그래서 exe_shell() 내 명령을 수정하며 문제 해결.

 

$num_rev = shell_exec("svn info <URL> --username -i <username> | grep Revision: | cut -c11-");	
echo $num_rev;	// NULL 출력, svn encoding 오류


$num_rev = shell_exec("export LC_CTYPE=ko_KR.UTF-8; svn info <URL> --username -i <username> | grep Revision: | cut -c11-");	
echo $num_rev;	// 정상 출력 확인
 
 

댓글