我已经尝试了一切方法来从 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"