簡単な要求でcurl
新しいことを経験しました。
このコマンドは、次のようなカールの簡単な呼び出しです。
curl http://example.com/endpoint/?arg1=val1&arg2=val2
呼び出しは500MB以上のXMLファイルを返す必要があり-O
ますが(準備ができたらファイルに保存します)、実際には奇妙なことはありません。
奇妙なことは、カールが単にpidを出力してから背景に入るということです:
[1] 31562
しばらくすると、リモートファイルがコンソールとバックグラウンドに表示され始めましたが、それは利用できませんでしたCtrl+C
。
私はこのようなことを経験したことがありません。 1.9GBファイルをダウンロードしようとすると:
curl -O https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso
普通に使えますよ!
どんなアイデアがありますか?
一般ダウンロード用ヘッダー:
curl -v -s https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso 1> /dev/null
* Trying 92.123.112.141:443...
* TCP_NODELAY set
* Connected to download.microsoft.com (92.123.112.141) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
... more HTTPS stuff ...
} [5 bytes data]
> GET /download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso HTTP/1.1
> Host: download.microsoft.com
> User-Agent: curl/7.65.3
> Accept: */*
>
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/octet-stream
< Accept-Ranges: bytes
< Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
< x-ms-blob-content-md5: mw6jWIuMir1+rZG9/mzj+A==
< Last-Modified: Sat, 13 Oct 2018 00:34:54 GMT
< ETag: "0x8D630A3B1CF6138"
< Content-Length: 2048196608
< Date: Mon, 10 Feb 2020 21:11:55 GMT
< Connection: keep-alive
<
{ [16038 bytes data]
^C
私の携帯電話:
* Trying 192.168.0.200:80...
* TCP_NODELAY set
* Connected to example.com port 80 (#0)
> GET /endpoint/?arg1=val1&arg2=val2 HTTP/1.1
> Host: example.com
> User-Agent: curl/7.65.3
> Accept: */*
>
^C
答え1
URLに引用符がない&
文字が含まれています。これはコマンドが開始されることを意味します。
curl http://example.com/endpoint/?arg1=val1
後ろのシェル変数は、シェルが行を解析するときにURLの次のビットが意味するものであるため、arg2
値に設定されます。val2
URLの周りに引用符を使用してください。
curl 'http://example.com/endpoint/?arg1=val1&arg2=val2'
&
この文字はURLに含まれていなくても?
ワイルドカード文字です(ファイル名ワイルドカードパターンの単一文字と一致)。したがって、引用符で囲まれていないURLは、デフォルト設定のシェルzsh
で苦情を表示しますno matches found
。また、シェルオプションが設定されていても、シェルに苦情が表示されますbash
。同様に、一致しないパターンを削除するようにシェルが設定されている場合(たとえば)、URLは完全に削除されます。no match
failglob
shopt -s nullglob
bash
ボーナス:
curl
コマンドを次のように書くこともできます。
curl --silent \
--url-query arg1=val1 \
--url-query arg2=val2 \
'http://example.com/endpoint/'
を使用すると、データがURLにエンコードされ、ファイルからデータをロードすることもできます--url-query
(セマンティクススキームを管理するため、curl
ドキュメントのオプションを参照し、curl
そこの説明を参照してください)。--data-urlencode
また、シェル変数から取得した値の場合、シェル変数の値をURL文字列に直接注入することを防ぎます。
また、--variable
何が役に立つかを学びます。
答え2
URLをエンコードするには、&を%2に置き換えます。
これはうまくいきます - カール 'http://example.com/endpoint/?arg1=val1%2arg2=val2'
エンコードされたURLで常にカールを使用することをお勧めします。https://www.urlencoder.org/