2013-03-10 2 views
2

"간단한"cgi 셸 스크립트 프록시 서버를 작성하여 jsonp 스타일 콜백에 인용 된 XML을 래핑하는 동안 시행 착오와 Opera의 뛰어난 디버거를 통해 해결 된 백 슬래시를 이스케이프 처리하는 문제가 발생했습니다. 나는 아직도 여분의 백 슬래시 세트가 필요한 이유를 알아 내려고 노력 중이다 (8 대 4). 각각의 구문 분석에서 백 슬래시의 수를 두 배로 늘려야한다는 것을 이해할 수 있지만, 어딘가에 반복을 간과하거나 처리를 오해하는 것으로 보입니다. 브라우저에서 두 번 파싱됩니까?왜 백 슬래시가 8 개 필요합니까?

이는 여기에

#!/bin/sh 
CB=${QUERY_STRING%%&*} 
URL=${QUERY_STRING#*&} 
case "$CB" in 
    callback=*) 
     printf "Content-type: application/javascript\r\n\r\n${CB##*=}(\"" 
     wget -q --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \ 
      |tr -c [\ -~] " "|sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 
     printf "\")" 
     ;; 
    *)exit;; 
esac 

작동 내가 (- 간단한 비 GZIP 버전으로 교체 편집)를 사용하고 테스트 페이지입니다 왜 알아 내려고 노력하고 최종 작업 코드입니다.

<html><head><title>test</title></head><body><div id="notaniframe"></div> 
<script> 
    function dummy(data){document.getElementById("notaniframe").innerHTML=data} 
    Loaded=0 
    setTimeout(function(){if(!Loaded)alert("load failed")},30000); 
</script> 
<script onload='Loaded=1' src="http://localhost/cgi-bin/xml2jsonp.cgi?callback=dummy&http://stackoverflow.com"></script> 
</body></html> 

이 단지

답변

2

한 패스가 배시에 의해 수행 된 DIV로 stackoverflow.com crams; 이 명령을

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 

가 실행이 sed 스크립트

s/[\]/\\\\/g;s/["]/\\"/g 

한 패스 sed에 의해 수행된다; 대체 문자열에서 \\\을 의미합니다. 따라서이 sed 스크립트는 \\\"으로 바꿔 \"으로 바꿉니다. 원했던대로. (" 주변의 사각 괄호가 실제로 여기에 아무것도하지 않아도됩니다, 그리고 사각 브래킷은 약 \ 다른 \으로 탈출에 해당합니다.)

당신은 작은 따옴표를 사용하여 백 슬래시 한 세트를 제거 할 수 있습니다 Bash 스크립트에서 큰 따옴표가 아닌 큰 따옴표; 작은 따옴표 안에서는 \은 특별한 의미가 없습니다. 이 때문에, 그 문제에 관해서,

sed 's/[\]/\\\\/g;s/["]/\\"/g' 

또는 : 여기에

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 

을 : 다른 말로하면, 당신은 변경할 수 있습니다

sed 's/\\/\\\\/g;s/"/\\"/g' 
+0

'나오지도의/[\]/\\\\/g; s/[ "]/\\"/ g''은 정확히 내가 누락 된 내용이었습니다. 왜 이번에는 sed와 함께 큰 따옴표를 사용했는지 모르겠습니다. 감사. – technosaurus

+0

@technosaurus : 천만에요! – ruakh

관련 문제