シェルスクリプトのカール --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"のようなスクリプトを実行しています。 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)は国際化されたメッセージに使用されますが、これは望むものではありません。

拡張には(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が述べたように、これを行うにはと両方を使用する必要があります$'...'。変数内でバックスラッシュエスケープと正規二重引用符を解釈します。両方とも、まだ異なります(そしてここでは役に立ちません)。上記で引用した3つの異なる文字列を表示しました。カールしたい文字列内にリテラル二重引用符を配置する必要がある場合は、一重引用符内にそのまま配置できます。改行文字で区切られた2つの二重引用符。"..."$'...'$"..."$'"\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"

関連情報