在 shell 脚本中 curl --data-binary $'

use*_*378 2 curl

我已经尝试了所有从 shell 脚本中进行 curl 的方法。这个卷发有一个

--data-binary $'
Run Code Online (Sandbox Code Playgroud)

我无法让我的脚本重新创建的部分。出于某种奇怪的原因,它会将 $ 移动到单引号内。任何想法如何解决它?

--data-binary '$
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)

它让我发疯。我已经尝试了一切。转义 $,将其放在单引号中。双引号。改变每一个“为'。我肯定错过了一些人。

编辑:有人指出我没有那么清楚地解释自己。确实如此:我正在运行像“bash curl.sh”这样的脚本。curl.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"

Run Code Online (Sandbox Code Playgroud)

但是,当我执行它时, --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"
Run Code Online (Sandbox Code Playgroud)

会跑

--data-binary '$------WebKitFormBoundary
Run Code Online (Sandbox Code Playgroud)

同样的事情发生在

--data-binary "$"'------WebKitFormBoundary
Run Code Online (Sandbox Code Playgroud)

--data-binary '$''------WebKitFormBoundary
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 7

$"..."ksh93的报价运营商(也见于bash)是国际化的消息,这不是你想要的这里。

要扩展\r\n,您需要$'...'(也来自 ksh93,但支持更广泛)。

参数并未在其中展开,因此您需要:

--data-binary $'....\r\n...name="'"$var1"$'"...\r\n...'
Run Code Online (Sandbox Code Playgroud)

对于--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'
Run Code Online (Sandbox Code Playgroud)

或者使用标准sh语法:

eval "$(printf 'CR="\r" LF="\n" CRLF="\r\n"')"
Run Code Online (Sandbox Code Playgroud)

"..."为整个事情使用标准:

--data-binary "...${CRLF}...name=\"$var1\"..."
Run Code Online (Sandbox Code Playgroud)

请参阅如何将特殊字符用作普通字符?有关各种 shell 中各种引用运算符的详细信息。