.batスクリプトでURLに引用符を適用するにはどうすればよいですか?


0

CMDで機能するcurlコマンドの一般的な形式は次のとおりです。

-o latest.dump -L "カールhttps://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/xxxx.dump?AWSAccessKeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411489500&Signature=%2F5zwQNZNN0H2XSR4wSqQ%2FFExBdI%3D "

しかし、URLは動的に生成されるため、これを.batスクリプトに入れます。問題ありませんので、紙に書かれている.batスクリプトを次に示します。

@echo off

for /f "delims=" %%a in ('heroku pgbackups:url') do @set this_url=%%a
ECHO %this_url%
curl -v -o latest.dump -L %this_url%

しかし、最初の '&'で予想されるように、出力はベイルします。のエコーthis_urlは、引用符付きの完全な文字列を示しています。この文字列を引用符でカプセル化するにはどうすれば追加、または強制できますか?

私は試みましたが、それは同じタイプのエラーを返します:

cmd /k ""curl -v -o latest.dump -l" "('heroku pgbackups:url')""

UnixやCYGWINでこれを行わない理由を尋ねる人もいるかもしれません。最初にやった。このコマンドは、私のOS Xパーソナルマシンで完全に機能します。CYGWINで動作するはずですか?まあ、私は同じタイプのエラーを受け取ります。

uri_escapeライブラリを使用してPerlスクリプトを組み込み、挿入しようとしました。ただし、渡されるURLはcurlによって認識されません。

単一引用符で囲まれた出力を強制すると、URLが修正されますが、URLの最後の数文字内に閉じた単一引用符が配置されるため、URLがカールしなくなります。

heroku pgbackups:urlCMDコンソールでの出力は次のとおりです。

"https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccess
KeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411657655&Signature=MqzqBitAN7MADiLAsdAN4ZQk
RH0%3D"

上記の.batファイルの出力は次のとおりです。

https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccessK
eyId=AKIAJSCBEZJRDOTGNGZQ
'Expires' is not recognized as an internal or external command,
operable program or batch file.
'Signature' is not recognized as an internal or external command,
operable program or batch file.
* About to connect() to s3.amazonaws.com port 443 (#0)
*   Trying 205.251.243.66...   % Total    % Received % Xferd  Average Speed   Ti
me    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0co
nnected
* Connected to s3.amazonaws.com (205.251.243.66) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server finished (14):
{ [data not shown]
* SSLv3, TLS handshake, Client key exchange (16):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Finished (20):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
{ [data not shown]
* SSLv3, TLS handshake, Finished (20):
{ [data not shown]
* SSL connection using AES128-SHA
* Server certificate:
*        subject: C=US; ST=Washington; L=Seattle; O=Amazon.com Inc.; CN=s3.amazo
naws.com
*        start date: 2014-04-12 00:00:00 GMT
*        expire date: 2015-04-13 23:59:59 GMT
*        subjectAltName: s3.amazonaws.com matched
*        issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of
use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA
- G3
*        SSL certificate verify result: unable to get local issuer certificate (
20), continuing anyway.
> GET /hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccessKeyId=AKIAJSCBEZJRD
OTGNGZQ HTTP/1.1
> User-Agent: curl/7.21.7 (amd64-pc-win32) libcurl/7.21.7 OpenSSL/0.9.8r zlib/1.
2.5
> Host: s3.amazonaws.com
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< x-amz-request-id: 4566C5AB208C1248
< x-amz-id-2: zF/zr+fbR/pE7nvF7vvUmOdZQeMzjSBI6SPLKH14LGAI5JAb2xyoLhuuDGBDhqcq
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Thu, 25 Sep 2014 14:51:46 GMT
< Server: AmazonS3
<
{ [data not shown]
100   231    0   231    0     0    592      0 --:--:-- --:--:-- --:--:--   704
* Connection #0 to host s3.amazonaws.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
} [data not shown]
'Expires' is not recognized as an internal or external command,
operable program or batch file.
'Signature' is not recognized as an internal or external command,
operable program or batch file.

403エラーは、URLが変更されたことを示しますが、それ以外の場合は通過します。または、400エラーが発生します。スクリプト内の何らかの理由で、「&」はスクリプト内で解釈されるためリダイレクトされます。

あなたが私なら、このコマンドをどのように実行してこのURLを動的に渡し、CMD、bashなどによって解釈されないのですか?サンクス、サム


OKに見えるECHOコマンドの結果を表示できますが、curlで使用すると値が失敗しますか?何か意味がありません。値をECHOでき、引用符で囲まれている場合、curlでも機能するはずです。
dbenham

はい、何か意味がありません。ECHO%this_url%は、「s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/…」を返します。
sam452 14

「curl --verboseオプションの出力は:...」が投稿されたコードにどのように関係するのかわかりません 。最初に投稿されたバッチスクリプトの正確な出力は何ですか?
dbenham 14

回答:


0

最初に投稿したスクリプトを見る:

@echo off

for /f "delims=" %%a in ('heroku pgbackups:url') do @set this_url=%%a
ECHO %this_url%
curl -v -o latest.dump -L %this_url%

の出力がECHO %this_url%、引用符で囲まれた投稿どおりである場合、既存のバッチスクリプトが機能するはずです。

の値に%this_url%引用符がない場合は、curlコマンドに引用符を追加する必要があります。

curl -v -o latest.dump -L "%this_url%"

%this_url%既存の引用符を削除し、明示的に独自の引用符を追加することにより、引用符が含まれているかどうかに関係なく機能するようにコマンドを変更できます。

curl -v -o latest.dump -L "%this_url:"=%"

あなたがリストする他のコマンドは、私にとって完全に間違っているように見えます:

cmd /k ""curl -v -o latest.dump -l" "('heroku pgbackups:url')""

外側の引用符も、引用符も必要ありません"curl -v -o latest.dump -l"。exeファイルのみを引用符で囲むことができ"curl"ますが、curlへのパスを含め、パスにスペースまたはポイズン文字が含まれている場合を除き、引用符は不要です。

私は単に"('heroku pgbackups:url')"構文をまったく理解していません。


はい、これについて説明してくれてありがとう。コマンドheroku pgbackups:urlの出力は、余分な長いURLを生成します。コマンドを実行して自分の引用符を明示的に追加しようとすると、上記と同じ結果が得られます。コマンド内の各「&」に対して、パーサーはそれぞれを個別のコマンドとして読み取り、curlは失敗します。それぞれがURLに組み込まれたAmazon認証の一部であることがわかります。私はそれらの各部分を別々の変数にキャプチャしてコマンドで連結しようとしましたが、何らかの理由で連結するのは1つの変数だけです。
sam452 14

問題は、この長いURLに対して、Windowsが少なくともcygwinでURLを変更する復帰を追加していることです。そのため、hergコマンドの出力をdos2unixにパイピングするcygwinで実行することができます。CMD、.BATで動作するようにするには、おそらく答えがありますが、cygwinで動作します。
sam452 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.