쉘 스크립트의 컬 --data-binary $'

쉘 스크립트의 컬 --data-binary $'

나는 쉘 스크립트에서 컬을 얻기 위해 모든 것을 시도했습니다. 이 곱슬머리에는

--data-binary $'

부품을 다시 생성하기 위한 스크립트를 얻을 수 없습니다. 이상한 이유로 $를 작은따옴표 안으로 이동합니다. 그것을 고치는 방법에 대한 아이디어가 있습니까?

--data-binary '$
curl -s  -H 'Connection: keep-alive' \
  -H 'Cache-Control: max-age=0' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'Origin: https://url.com' \
  -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6AiBMw0TyIybreRa' \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'Sec-Fetch-Mode: navigate' \
  -H 'Sec-Fetch-User: ?1' \
  -H 'Sec-Fetch-Dest: document' \
  -H 'Referer: https://url.com' \
  -H 'Accept-Language: en-US,en;q=0.9,es;q=0.8' \
  -H "Cookie: JSESSIONID=$jsession; __utmc=35664418; __utmz=35664418.1593348512.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BALANCEID=balancer.apphpgal01; acceta_default=im10snhiask7qic85vrr1dr4i2; __utma=35664418.1302973562.1593348512.1593372701.1593378049.6; __utmt=1; __utmb=35664418.5.10.1593378049" \
  --data-binary $"------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name=\"$var1\"\r\n\r"$var2"\r\n------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name=\"$var3\"\r\n\r\n\r\n------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name=\"g-recaptcha-response\"\r\n\r\n$recaptcha\r\n------WebKitFormBoundary6AiBMw0TyIybreRa--\r\n" \
  --compressed "https://url.com"

이것이 나를 미치게 만든다. 나는 모든 것을 시도했습니다. $를 이스케이프 처리하고 작은따옴표로 묶습니다. 큰따옴표. 모든 "를 '로 변경하세요. 여러분, 확실히 뭔가 빠졌습니다.

편집하다: 제가 명확하게 설명하지 못했다고 지적하신 분이 계십니다. 정답: 저는 "bashcurl.sh"와 같은 스크립트를 실행하고 있습니다. 컬.sh의 내용은 다음과 같습니다

curl -s -H "Cookie: JSESSIONID=$jsession" \
  --data-binary $"------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name=\"$var1\"\r\n\r"$var2"\r\n------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name=\"g-recaptcha-response\"\r\n\r\n$recaptcha\r\n------WebKitFormBoundary6AiBMw0TyIybreRa--\r\n" \
  --compressed "https://url.com"

그러나 실행하면 --data-binary 부분이 따옴표 안에 달러 기호 $를 넣습니다.

또한 @Stéphane Chazelas가 제안한 대로 이것을 시도했지만 성공하지 못했습니다.

--data-binary \$'------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name="'"$var1"'"\r\n\r'"$var2"'\r\n------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name="'"$var3"'"\r\n\r\n\r\n------WebKitFormBoundary6AiBMw0TyIybreRa\r\nContent-Disposition: form-data; name="g-recaptcha-response"\r\n\r\n'"$recaptcha"'\r\n------WebKitFormBoundary6AiBMw0TyIybreRa--\r\n' \
  --compressed "https://url.com"

실행할 수 있습니다

--data-binary '$------WebKitFormBoundary

같은 일이 일어났습니다.

--data-binary "$"'------WebKitFormBoundary

또한

--data-binary '$''------WebKitFormBoundary

답변1

ksh93 $"..."인용 연산자( 에도 있음 bash)는 국제화된 메시지에 사용되는데 이는 원하는 바가 아닙니다.

확장하려면 (ksh93에서도 가능하지만 더 광범위하게 지원됨)이 \r\n필요합니다 .$'...'

그러나 매개변수는 확장되지 않으므로 다음이 필요합니다.

--data-binary $'....\r\n...name="'"$var1"$'"...\r\n...'

--data-binary( ....<CR><LF>...name="<contents-of-var1>"...<CR><LF>...여기서 <CR>, <LF><contents-of-var1>각각입력하다제어 문자,개행또한 ~으로 알려진새로운 팀$var1인수에 전달할 제어 문자 및 변수의 내용입니다 curl.

즉, 시퀀스 확장이 필요한 부분 $'...'과 변수 확장이 필요한 부분에 대한 것입니다.\x"..."

또 다른 옵션은 다음을 정의하는 것입니다.

CR=$'\r' LF=$'\n' CRLF=$'\r\n'

또는 표준 sh구문을 사용하십시오.

eval "$(printf 'CR="\r" LF="\n" CRLF="\r\n"')"

그리고 "..."모든 것에 표준을 사용하십시오.

--data-binary "...${CRLF}...name=\"$var1\"..."

바라보다일반 문자처럼 특수 문자를 사용하는 방법은 무엇입니까?다양한 셸의 다양한 인용 연산자에 대한 자세한 정보입니다.

답변2

그래서 당신이 원하는 것은 기본적으로 다음과 같습니다.

$ cat quote.sh
#!/bin/bash
str=foobar
printf "%s\n" $'str='"$str"$'\nanother line\n'
#             <-----><----><----------------->  see below

$ bash quote.sh
str=foobar
another line

즉, \r\nCRLF, 변수 확장으로 변경되었습니다. Stéphane이 언급했듯이 이를 위해서는 및 를 모두 사용해야 합니다 $'...'. 변수 내에서 백슬래시 이스케이프 및 일반 큰따옴표를 해석합니다. 둘 다, 그리고 여전히 다릅니다(그리고 여기서는 유용하지 않습니다). 위에서 인용된 세 가지 다른 문자열을 표시했습니다. 컬링하려는 문자열 내에 리터럴 큰따옴표를 배치해야 하는 경우 작은따옴표 안에 있는 그대로 배치할 수 있습니다. 개행 문자로 구분된 두 개의 큰따옴표입니다."..."$'...'$"..."$'"\n"'

스크립트 실행은 $'...'표준 기능이 아니고 예를 들어 Debian과 Ubuntu 모두에서 지원되지 않기 /bin/sh때문에 해당 셸을 사용하면 실패합니다.

$ sh quote.sh
$str=foobar$\nanother line\n

$작은따옴표 안에 넣으면 결과는 Bash에서 얻는 결과와 다소 유사합니다 echo '$str=...'.

이들 모두에서 는 $인용되거나 이스케이프되어 인용의 시작이 아닌 일반 문자로 해석됩니다 $'...'.

--data-binary \$'------Web...'
--data-binary '$------Web...'
--data-binary "$"'------Web...'
--data-binary '$''------Web...'

이들 중 하나를 사용하면 set -xBash는 실제로 결과 문자열을 다음과 같이 출력합니다 '$----...'.

$ echo --data-binary \$'------Web...'
+ echo --data-binary '$------Web...'
--data-binary $------Web...

실제로 문자열은 꽤 부피가 크고 여러 줄에 걸쳐 있으므로 조각으로 작성하는 것이 좋습니다.

이 같은:

data=
data+=$'------WebKitFormBoundary6AiBMw0TyIybreRa\r\n'
data+=$'Content-Disposition: form-data; name="'"$var1"$'"\r\n'
#      ^                                     *^^     ^^^*    ^
#   ^ = shell quotes, * = quotes in the resulting string
data+=$'------WebKitFormBoundary6AiBMw0TyIybreRa\r\n'
... 

그런 다음

curl ... --data-binary "$data"

관련 정보