2017-09-08 1 views
0

안녕하세요, 저는 PHP 파일에서 실행해야하는 sed 명령을 가지고 있습니다. 명령은 쉘에서 제대로 실행되지만 PHP에서는 문제를 말하는 아파치 오류를 제공합니다. 세미콜론, 내가 그들 모두를 탈출 시도, 나는 또한 곱슬 brakets 탈출 시도, 다음이 아파치에서 오류가 없지만 예상대로 명령이 어떤 작업을 수행하지 않는, 여기에 명령을 큰 따옴표로PHP에서 실행하는 쉘 명령을 이스케이프하는 방법

$cmd = "sed -n -i '/ENDSNUMB/{x;d;};1h;1!{x;p;};${x;p;}' ./taggedfiles/$tagfile"; 
shell_exec($cmd); 
+2

은 $ tagfile'는 PHP 변수는 연결하는 원하거나 당신이 그대로 통과하고 싶은가 '인가 그게 당신 명령이에요? –

+0

$ tagfile은 sed 바꾸기를 수행 할 파일입니다 –

답변

2

의, PHP는에 시도 인라인 변수를 문자열로 구문 분석합니다. $이 문제입니다.

작은 따옴표를 사용하여 시도하고이처럼 문자열에서 사람들을 탈출 :

$cmd = 'sed -n -i \'/ENDSNUMB/{x;d;};1h;1!{x;p;};${x;p;}\' ./taggedfiles/' . $tagfile; 
shell_exec($cmd); 

그래도 쉘 코드로 파싱 변수에 매우주의해야합니다. 제대로 탈출하지 않으면 Command Injection 공격에 취약 할 수 있습니다.

당신은 매뉴얼에서 ... 모두 교체 값 을 이렇게 escapeshellcmd을 사용할 수 있습니다
+1

또한 좋은 점은'shell_exec()'함수로 에러 (반환 된 코드)를 검사 할 수 없기 때문에'shell_exec()'함수 대신'exec())' – Denniselite

+0

@Ivar 아파치 오류는 없지만 파일에는 아무런 변화도주지 않습니다. –

+0

@ AndrésChandía Magnus의 의견에 대한 답변을 통해 답변을 업데이트했습니다. – Ivar

1

-http://php.net/manual/en/function.escapeshellcmd.php

<?php 
// We allow arbitrary number of arguments intentionally here. 
$command = './configure '.$_POST['configure_options']; 

$escaped_command = escapeshellcmd($command); 

shell_exec($escaped_command); 
?> 
+0

고마워요.하지만 아무런 차이가 없습니다. –

관련 문제