나는 쉘 스크립트에서 컬을 얻기 위해 모든 것을 시도했습니다. 이 곱슬머리에는
--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\n
CRLF, 변수 확장으로 변경되었습니다. 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 -x
Bash는 실제로 결과 문자열을 다음과 같이 출력합니다 '$----...'
.
$ 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"