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

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

我已经尝试了一切方法来从 shell 脚本中进行卷曲。这个卷发有一个

--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"

这真让我抓狂。我什么方法都试过了。转义 $,将其放在单引号中。双引号。将每个 " 改为 '。伙计们,我肯定漏掉了一些东西。

编辑: 有人指出我没有解释清楚。正确的是:我正在运行这样的脚本“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"

但是,当我执行它时,--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)用于国际化消息,这不是您想要的。

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

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

--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\"..."

如何像普通字符一样使用特殊字符?有关各种 shell 中各种引用运算符的详细信息。

答案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"'

我询问了有关运行该脚本的问题,因为$'...'它不是标准功能,并且在例如 Dash 中不受支持,Debian 和 Ubuntu 都将其作为/bin/sh.所以使用该 shell 会失败:

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

$如果将 放在单引号内,结果与在 Bash 中得到的结果有点相似,例如echo '$str=...'

在所有这些中, the$被引用或转义,并被解释为常规字符,而不是引用的开头$'...'

--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"

相关内容