ユーザ用ツール

サイト用ツール


curlの基本使用その2
Writing /var/www/vhosts/w629.ws.domainking.cloud/enjoy-lei.com/lei_wiki/data/cache/3/33f4893bc54137f8077136837683d6c5.i failed
Unable to save cache file. Hint: disk full; file permissions; safe_mode setting.
Writing /var/www/vhosts/w629.ws.domainking.cloud/enjoy-lei.com/lei_wiki/data/cache/3/33f4893bc54137f8077136837683d6c5.metadata failed

curlの基本使用その2

CURLの基本使用方法

*簡単な使用例 Netscape のウェブサーバからメインページを取得:

curl http://www.netscape.com/

funet の FTP サーバのユーザホームディレクトリから README ファイルを取得:

curl ftp://ftp.funet.fi/README

サーバのポート 8000 番からウェブページを取得:

curl http://www.weirdserver.com:8000/

FTP サイトからディレクトリのリストを取得:

curl ftp://cool.haxx.se/

ディクショナリから “curl” の定義を取得:

curl dict://dict.org/m:curl

一度に2つの文書を取得:

curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/

FTPS サーバからファイルを取得:

curl ftps://files.are.secure.com/secrets.txt
あるいは、より FTPS として正しい作法で同じファイルを取得:
curl --ftp-ssl ftp://files.are.secure.com/secrets.txt
SSH サーバから SFTP を利用してファイルを取得:
curl -u username sftp://shell.example.com/etc/issue
プライベートキーによる認証を用いた SCP を利用して SSH サーバからファイルを取得:
curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \ 
    scp://shell.example.com/~/personal.txt

IPv6 ウェブサーバからメインページを取得:

curl -g "http://[2001:1890:1112:1::20]/"
ダウンロード

ウェブページを取得してローカルファイルに保存:

curl -o thatpage.html http://www.netscape.com/
ウェブページをローカルに保存する際に、ファイル名をリモート文書のものと同じにする( URL に名前が与えられていないとこれは失敗する):
curl -O http://www.netscape.com/index.html
一度に2ファイル取得しつつ両者ともリモートの名前で保存:
curl -O www.haxx.se/index.html -O curl.haxx.se/download.html
パスワードの利用
FTP

名前とパスワード(ここでは name と passwd とする - 以下の例でも同様)を用いて FTP にアクセスするには、次の様に URL に埋め込む:
curl ftp://name:passwd@machine.domain:port/full/path/to/file

あるいは -u オプションで指定することもできる:

curl -u name:passwd ftp://machine.domain:port/full/path/to/file
FTPS
FTP と似ているが、証明書等の SSL-固有のオプションを指定する必要が生ずる。
注意:接頭子に ftps:// を用いるのが標準に倣う暗黙的方法だが、 ftp:// と --ftp-ssl オプションを用いた明示的方法が推奨される。
SFTP / SCP

FTP と似ているが、パスワードの代わりにプライベートキーを指定できる。プライベートキーそれ自体はリモートシステムへのログインパスワードとは無関係なパスワードにより保護されることに注意。プライベートキーファイルを与える際にはパブリックキーファイルも与える必要がある。
HTTP

curl は HTTP URL におけるユーザ名とパスワードの埋込みもサポートする。ファイル取得は次のようにする:
curl http://name:passwd@machine.domain/full/path/to/file
あるいはユーザ名とパスワードを別途指定してもよい:
curl -u name:passwd http://machine.domain/full/path/to/file
HTTP にはいくつもの異なる認証手段があり、 curl においては Basic, Digest, NTLM, Negotiate がサポートされる。どの手段を用いるか指定しなかった場合のデフォルトは Basic になる。 --anyauth オプションを用いるとサーバが受容可能な認証手段のうち最も安全なものを curl に自動的に選ばせることができる。
注意! 本来 HTTP URL はユーザ名とパスワードの埋込みをサポートしないので、プロクシを通す場合このやり方はできない。そのような状況では -u で指定しなければならない。
HTTPS
おそらく最も一般的な利用はプライベート証明書との併用になるだろう。以下に示すように。
プロクシ
ポート 888 を利用する my-proxy という名前のプロクシを通して FTP からファイルを取得:
curl -x my-proxy:888 ftp://ftp.leachsite.com/README
上と同じプロクシを通して、ユーザ名とパスワードを要求する HTTP サーバからファイルを取得:
curl -u user:passwd -x my-proxy:888 http://www.get.this/
一部のプロクシは特別な認証を要する。-U を用いて上と同様に指定する:
curl -U user:passwd -x my-proxy:888 http://www.get.this/
プロクシを利用させたくないホストおよびドメインをコンマ区切りのリストで指定することもできる:
curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/
HTTP/1.1 の代わりに HTTP/1.0 を利用して CONNECT を試行させたい場合は --proxy (または -x )の代わりに --proxy1.0 でプロクシを指定する。
--socks4 による SOCKS4 プロクシ、および --socks5 による SOCKS5 プロクシもサポートされる。
更なるプロクシ制御については curl がサポートする環境変数を参照のこと。
範囲指定
HTTP 1.1 からはバイト単位の範囲指定が導入されている。これにより、クライアントからは文書の一部分のみを要求することが可能になる。HTTP の場合は複数の部分もリクエスト可能である。この機能は -r オプションでサポートされる。
文書の最初の 100 バイトを取得:
curl -r 0-99 http://www.get.this/
文書の最初の 500 バイトを取得:
curl -r -500 http://www.get.this/
FTP ファイルについても単独の区間に限りサポートされる。始点と終点を指定する。
FTP により文書の最初の 100 バイトを取得:
curl -r 0-99 ftp://www.get.this/README
アップロード
FTP / FTPS / SFTP / SCP

標準入力(stdin)からの全データをサーバにアップロード:

curl -T - ftp://ftp.upload.com/myfile
ユーザ名とパスワードでログイン後に、ファイルのデータをアップロード:
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile
転送先のファイル名がローカルファイルと同じ名前になるようにリモートサイトにアップロード:
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
ローカルファイルをリモートファイルに追記するようにアップロード:
curl -T localfile -a ftp://ftp.upload.com/remotefile
プロクシを通した FTP アップロードもサポートされる。ただし、プロクシがトンネルを許容している必要がある。次のような形になる:
curl --proxytunnel -x proxy:port -T localfile ftp.upload.com
HTTP

標準入力(stdin)からの全データを HTTP サイトにアップロード:

curl -T - http://www.upload.com/myfile
ただし、 HTTP サーバが PUT を許容するように設定されている必要があることに注意。
HTTP データをアップロードする別法については後の POST 節を参照のこと。
冗長/デバッグモード
curl が意図されたように動作しない、サーバがアクセスさせてくれない、あるいは応答の意味が汲み取れないような場合、 -v オプションによる冗長モードが使える。クライアントとサーバ間における全てのやり取りが利用者から見えるように、(実際のデータは伏せつつ)多くの情報と送受信の内容が出力される。
curl -v ftp://ftp.upload.com/
curl の動作について更なる詳細や情報を得たければ、 --trace あるいは --trace-ascii オプションを用いてログをとるファイル名を与える。次の様に:
curl --trace trace.txt www.haxx.se

*詳細情報

特定のファイル/文書についての詳しい情報を得る手段はプロトコルごとに異なる。単独のファイルについての詳細を得るには -I/--head オプションを用いる。HTTP と FTP においてはファイルについて取得可能な全情報が得られる。 HTTP からはより多岐にわたる情報が得られる。
HTTP の場合、 -i/--include を用いてデータに先立って示される( -I により得られるものと同じ)ヘッダ情報を取得できる。 FTP や HTTP からファイルを取得する際にはヘッダを別途指定したファイルに保存させるために -D/--dump-header オプションが利用できる。

HTTP ヘッダを別ファイル(この例では headers.txt )に保存:

curl --dump-header headers.txt curl.haxx.se
別ファイルに保存しておいたヘッダは、サーバから受け取ったクッキーを後で利用したいときに非常に役立つ。詳細はクッキー節を参照。
HTTP POST
curl によるデータのポストは簡単である。 -d <データ> オプションを用いる。ポストデータは URL エンコードしておかなければならない。

簡単な name と phone のポスト:

curl -d "name=Rafael%20Sagula&phone=3320780" \ 
        http://www.where.com/guest.cgi
curl によるフォームポストの手始め:
フォーム内の必要な <input> タグを全て抜き出す。(これを自動化してくれる formfind.pl という perl プログラムも curl のサイトに用意されている。)
フォームに "通常の" post があるならば、 -d をポストに用いる。 -d は次のような形式の完全な "ポスト文字列" を引数にとる:
<variable1>=<data1>&<variable2>=<data2>&...
variable1, variable2 ... の実際の名前は <input> タグで name=... に設定されている名前になる。data1, data2 ... の実際の内容は <input> フィールドに入力されるべき内容になる。データは正しく URL エンコードされてなければならない。すなわち、スペースは + に、特殊な文字は %XX ( XX は文字の ASCII コードを 16進表現)の形に置き換える。
例:

<form action="post.cgi" method="post">
<input name=user size=10>
<input name=pass type=password size=10>
<input name=id type=hidden value="blablabla">
<input name=ding value="submit">
</form>
ユーザ名 foobar とパスワード 12345 を入力させたいとする。ページの URL が http://www.formpost.com/getthis/ であるとするならば、これらをポストするコマンドラインは次のようになる:
curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" \ 
          http://www.formpost.com/getthis/post.cgi
-d オプションにおいては、一般的に CGI 等により受容される MIME タイプ application/x-www-form-urlencoded が利用される。一方で、 curl は次に示すより高機能な multipart/form-data タイプもサポートする。後者のタイプではファイルアップロードなども可能になる。
-F オプションにおいては -F "name=contents" の様な形で引数をとる。内容データ( contents )をファイルから読み込ませたい場合は name=@<ファイル名> の書式で指定する。ファイルを指定した場合、ファイル名の後に ;type=<MIME タイプ> を付加してファイルの内容型( content-type )を指定することもできる。複数のファイルを一つのフィールドにまとめてポストすることもできる。例えば、それぞれ内容型が異なる3ファイルをフィールド名 coolfiles にひとまとめにする場合、次のような書式になる:
curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
        http://www.post.com/postit.cgi
内容型が省略されている場合、ファイルの拡張子から推測が行われる(ただし、ごく一部の内容型しかサポートされていない)。あるいは、以前に指定した内容型が再利用される (複数のファイルが一度に指定されていた場合は先頭のファイルからとられる)。あるいは、既定の text/plain が利用される。
以下に -F によるフォーム入力の模倣を示す。フォームの3つのフィールドへ入力するものとする。一つはポストするファイル名、一つは貴方の名前、一つはファイルについての説明文とし、ポストしたいファイル名は cooltext.txt とする。これらのデータを普段利用しているブラウザを使わずに curl によるポストを行わせるには、まずページの HTML ソースを読んで入力フィールドの名前を見つけておく必要がある。この例では、入力フィールド名が file, yourname, filedescription であったとする。
curl -F "file=@cooltext.txt" -F "yourname=Daniel" \
     -F "filedescription=Cool text file with cool text inside" \
     http://www.post.com/postit.cgi
一度に2つのフィールドをポストするには2通りの方法がある:
1. 一つのフィールドに2つのファイルを託す:
curl -F "pictures=@dog.gif,cat.gif"
2. ファイルのそれぞれに対し一つずつの、2つのフィールドを使う:
curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"
先頭の @ や < 、あるいは後続の ;type= を解釈させずに、フィールド値をリテラルとして送信するには、 -F の代わりに --form-string を用いる。このやり方は利用者や他の予測不能なソースから値を取得している場合に推奨される。これらの状況において -F を用いると、利用者が誤って curl にファイルのアップロードをさせてしまう可能性が生じる。
リファラ
HTTP リクエストにはオプションでページアクセスの参照元アドレス情報(リファラ)を含ませられる。このリファラをコマンドラインから指定できる。この機能はリファラ情報の有無やその内容に動作が依存してしまう困ったサーバ、あるいは CGI スクリプトを上手く騙す際に特に有用である。
curl -e www.coolsite.com http://www.showme.com/
注意:リファラ: [sic] フィールドは HTTP 仕様によれば完全な URL とされている。
ユーザエージェント
HTTP リクエストにはオプションでリクエスト送出元のブラウザの情報( User-Agent )を含ませられる。この情報をコマンドラインから指定できる。この機能は特定のブラウザしか受け付けてくれない困ったサーバ、あるいは CGI スクリプトを上手く騙す際に特に有用である。
例:
curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/
他のよく利用される文字列:
'Mozilla/3.0 (Win95; I)'     Netscape Version 3 for Windows 95
'Mozilla/3.04 (Win95; U)'    Netscape Version 3 for Windows 95
'Mozilla/2.02 (OS/2; U)'     Netscape Version 2 for OS/2
'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)'           NS for AIX
'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)'      NS for Linux
ただし Internet Explorer はどうやっても互換性をとることが難しい:
'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)'    W95 の MSIE
ユーザエージェント名は Mozilla ばかりではない:
'Konqueror/1.0'             KDE ファイル マネージャ デスクトップ クライアント
'Lynx/2.7.1 libwww-FM/2.14' Lynx コマンドライン ブラウザ
クッキー
一般に、クッキーはクライアント側の状態情報の維持のためにウェブサーバにより利用されるものである。サーバは Set-Cookie: <data> のような形式の応答行を含んだヘッダを返してクッキーを設定する。通常、 data 部は ("NAME1=VALUE1; NAME2=VALUE2;" のようにセミコロン ; で区切られた)名前=値 のペアの集合である。サーバはクッキーが利用されるべきパス( path=<パス名> 等と指定), クッキーの有効期限( expire=<日付> ), ドメイン( domain=<ドメイン名> ), クッキーの利用に安全な接続が必須なのかどうか ( secure )についても指定してくる。

サーバから次のようなヘッダを含むページを受信したとする:

Set-Cookie: sessionid=boo123; path="/foo";
この場合サーバは、パスが /foo で開始されるページを取得する際に、最初のペアを渡してもらうことを期待している。
例えば、クッキーにより渡された name を要求するページを取得する場合:
curl -b "name=Daniel" www.sillypage.com
以前に受け取ったクッキーは後続のセッションに利用できる。サーバから取得したクッキーを次のようにファイルに保存したとする:
curl --dump-header headers www.example.com
そのサイト(あるいは別サイト)へ再び接続する際にファイル headers に保存しておいたクッキーを利用できる:
curl -b headers www.example.com
ヘッダをファイルに保存する方法はクッキーの記憶に有効ではあるが、エラーも生じ易いので推奨される方法ではない。代わりに、受け取ったクッキーを一般的な netscape クッキー形式で保存させるとよい:
curl -c cookies.txt www.example.com
-b オプションを用いると「クッキーの意識的処理」が有効になる。さらに -L オプションを用いて location: ヘッダに追従させられるようにもできる(これはよくクッキーと併用される)。もしサイトからクッキーと location が送信される場合、次のように存在しないファイルを与えて「クッキーの意識的処理」を起動させられる:
curl -L -b empty.txt www.example.com
クッキーを読み込むファイルはプレーンな HTTP ヘッダ、または netscape クッキーファイル形式でなければならない。いずれの形式かはファイルの内容から判別される。上述のコマンドでは www.example.com から取得されたヘッダを解析され、クッキーが保存される。保存されたクッキーのうち location に追従する際にリクエストに合致するものがサーバに送信される。 empty.txt は存在しないファイルでもよい。
クッキーの読み書きを netscape クッキーファイルにて行う場合、同じファイルを -b と -c の両者に同時に与えてもよい:
curl -b cookies.txt -c cookies.txt www.example.com
プログレスメータ
プログレスメータは動作状況を利用者に示すためのものである。出力の各フィールドの意味は次のとうり:

  % Total    % Received % Xferd  Average Speed          Time             Curr.
                                 Dload  Upload Total    Current  Left    Speed
  0  151M    0 38608    0     0   9406      0  4:41:43  0:00:04  4:41:39  9287

  左から順に:
   %             - 転送全体の進捗状況(パーセント)
   Total         - 予期されている全体の転送量
   %             - ダウンロードの進捗状況(パーセント)
   Received      - ダウンロード量(バイト)
   %             - アップロードの進捗状況(パーセント)
   Xferd         - アップロード量(バイト)
   Average Speed
     Dload       - 平均ダウンロード速度
     Upload      - 平均アップロード速度
   Time
     Total       - 起動から完了までに要する予測時間
     Current     - 起動時からの経過時間
     Left        - 現時点から完了までに要する予測時間
   Curr.Speed    - 直近5秒間における平均転送速度
                  (起動時から最初の5秒までは、それまでの平均)
-# オプションを与えると全く異なるプログレスバーが表示される。詳しい情報が無用ならこちらを使うとよい。

速度制御

転送維持に必要な速度条件を課すことができる。 -y および -Y スイッチは、一定時間において転送レートが定められた下限を下回るときに転送を中止させる。
1分平均で 3000 バイト/秒よりも遅い場合にダウンロードを中止させる例:
curl -Y 3000 -y 60 www.far-away-site.com
上の処理をトータルでの時間制限(次の例では 30 分)と組み合わせて用いることもできる:
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
転送レートが定められた上限を超えないようにもさせられる。この機能は通信帯域が狭い状況において、転送ばかりに帯域を割きたくないときに有用になる。
データ転送レートが 10 キロバイト/秒を超えないようにする例:
curl --limit-rate 10K www.far-away-site.com
あるいは
curl --limit-rate 10240 www.far-away-site.com
データをアップロードする際に転送レートが 1 メガバイト/秒を超えないようにする例:
curl -T upload --limit-rate 1M ftp://uploadshereplease.com
--limit-rate オプションが利用される場合、転送レートは秒単位で統制されるので全体での転送レートが指定値を下回ることも有り得る。転送が一定時間滞った場合など、この差が無視できない程の量になる可能性もある。

設定ファイル

curl は起動時の際には利用者のホームディレクトリから自動的に .curlrc 設定ファイルを読み込む(win32 システムにおいては _curlrc )。
設定ファイルの内容は、通常のコマンドラインオプションにより構成されるが、省略形でないオプションについてはダッシュ(-)を省いて可読性を向上させられる。オプションとパラメータはスペース, =, : のいずれかで区切る。コメントも記述できる。行頭の文字が # であれば、その行はコメントと見なされる。
パラメータにスペースが含まれている場合はパラメータ全体を二重引用符(")で括らなければならない。括られた内部で二重引用符を使いたい場合は \" と記す。
注意:オプションとその引数は同一行内に記述すること。
例:設定ファイル内でデフォルトの制限時間、およびプロクシを設定:
#制限時間 30分
        -m 1800
#すべてのアクセスにおいてプロクシを利用:
        proxy = proxy.our.domain.com:8080
行末の空白は無視されないが、各行の先頭から連続する空白は無視される。
コマンドラインの最初に -q を用いることで規定の設定ファイルの読み込みを抑止できる:
curl -q www.thatsite.com
URL を与えずに curl を起動した際にヘルプページを取得して表示させるように設定ファイルに指定する例:
#既定の取得 URL 
        url = "http://help.with.curl.com/curlhelp.html"
-K/--config オプションを用いて別の設定ファイルを読み込ませることもできる。ファイル名を - にすると読み込みは標準入力からになる。これはオプションがプロセステーブル等に現れないようにしたい場合などに有用になる:
echo "user = user:passwd" | curl -K - http://that.secret.site.com
エキストラ HTTP ヘッダ
独自のプログラムから curl を利用する場合、ウェブページ取得の際に独自ヘッダを渡す必要が生ずるかもしれない。 -H オプションをこれに利用できる。
ページ取得時にヘッダ X-you-and-me: yes をサーバに送信する:
curl -H "X-you-and-me: yes" www.love.com
これはヘッダ内に通常と異なるテキストを含めて送信させたい場合にも有用である。 curl が通常送信するヘッダが -H で指定したヘッダに置き換えられる。特に内部ヘッダを空に置き換えた場合、当該ヘッダは送信されなくなる。例えば Host: ヘッダの利用を抑制させるには:
curl -H "Host:" www.server.com
FTP と パス
ftp:// URL によりファイルを取得する際の URL に与えるパスはログインディレクトリからの相対パスになることに注意。ユーザの FTP サイトのホームディレクトリからファイル README を取得する場合:
curl ftp://user:passwd@my.site.com/README
同じサイトのルートディレクトリから README ファイルを取得するには絶対パスを指定しなければならない:
curl ftp://user:passwd@my.site.com//README
(すなわちファイルパスの前に余分なスラッシュが必要になる)
SFTP と SCP とパス名
sftp:// および scp:// URL の場合, パス名はサーバ上の絶対パスになる。リモートのユーザホームディレクトリから相対的な場所に位置するファイルへアクセスするには、次の様に /~/ 接頭子を付加する:
curl -u $USER sftp://home.example.com/~/.bashrc

FTP とファイアウォール

FTP プロトコルでは、データ転送の準備ができ次第、通信を行ういずれかの側が第二の接続を開くことになる。これには2種類の方式がある。
curl における既定の方式では、PASV コマンドを用いてサーバが別のポートを開いてクライアント側からの接続を待つようにする。これはクライアント側が内部への接続を許容しないファイアウォールの内側にある場合に適している。
curl ftp.download.com
逆にサーバ側が、例えばファイアウォールの背後にあって 21 番ポート以外への接続を許可しない場合(あるいは単に PASV コマンドがサポートされていない場合も)、 PORT コマンドを用いてサーバからクライアント側の(PORT コマンドのパラメータとして)指定する IP 番号とポート番号へ接続させるように仕向けることになる。
-P オプションには少しばかりの異なる選択が用意されている。すなわち、利用者のマシンは複数の IP-アドレス、あるいはネットワークインターフェースを持ち得るが、どれを用いるかを指示することができる。次のようにアドレスとして既定ものを利用させることもできる:
curl -P - ftp.download.com
インターフェース le0 の IP アドレスを通した PORT によるダウンロード(これは Windows では動作しない):
curl -P le0 ftp.download.com
利用者側の IP アドレスを 192.168.0.10 とする PORT によるダウンロード:
curl -P 192.168.0.10 ftp.download.com
ネットワークインターフェース
ポートとインターフェースを指定してサーバからウェブページを取得:
curl --interface eth0:1 http://www.netscape.com/
あるいは
curl --interface 192.168.1.10 http://www.netscape.com/
HTTPS
セキュア HTTP には curl がビルドされる際に SSL ライブラリのインストールを必要とする。そのようにビルドされていれば、HTTPS プロトコルを通して文書の送受信が可能になる。
例:
curl https://www.secure-site.com
curl には、サイトからのファイルの送受信の際に有効な証明書を要する場合に利用者の個人証明書を用いる機能がある。ただし、証明書は PEM-形式でなければならない。 PEM は証明書を格納するための標準的かつオープンな形式ではあるが、もっとも普及しているブラウザでは採用されていない(Netscape と MSIE は両者とも PKCS#12 形式と呼ばれるものを採用している)。普段利用しているブラウザの証明書を curl と共用するためには、ブラウザの形式による証明書を PEM 形式へ変換するプログラムを入手する必要がある。この種の変換プログラムは OpenSSL の最近のバージョンには含まれている。より古いバージョンについては、 Dr Stephen N. Henson の手によるこの機能を追加する SSLeay 用のパッチがある。パッチ(要 SSLeay のインストール)は彼のサイトから入手できる:
http://www.drh-consultancy.demon.co.uk/
証明書と個人パスワードを用いて自動的に文書を取得する例:
curl -E /path/to/cert.pem:password https://secure.site.com/
コマンドラインによるパスワードの指定を無視した場合、データ転送前に正しいパスワードの入力が要求される。
多くの古い SSL サーバにおける SSLv3 あるいは TLS は、より新しいバージョンの OpenSSL 等からの利用の際に問題を抱えているので、 curl に利用させる SSL のバージョンを指定できるとよい。 -3, -2, -1 で利用したい正確な SSL バージョンを指定できる(順に SSLv3, SSLv2, TLSv1 に対応する):
curl -2 https://secure.site.com/
指定しなかった場合、最初に v3, 次に v2 の利用が試みられる。
OpenSSL を用いて普段利用するブラウザの証明書を curl が対応する PEM 形式に変換するには、次のようにする(ここではブラウザを netscape とみなしているが、 IE でも同様なやり方になる):
netscape の 'security' メニューボタンから始める。
'certificates->yours' を選択してリストから証明書を選択する。
'export' ボタンを押す。
その証明書の PIN コードを入力。
適切な保存場所を選択。
'openssl' アプリケーションを起動して証明書を変換する。カレントディレクトリが openssl のインストールディレクトリであれば、次のようになる:
#. /apps/openssl pkcs12 -in <変換元ファイル> -clcerts -out <PEMファイル名>
ファイル転送の再開
HTTP(S) のダウンロードおよび、FTP のダウンロード/アップロードについては、以前に中止したファイル転送の中断点からの再開が可能である。
文書のダウンロード再開:
curl -C - -o file ftp://ftp.server.com/path/file
文書のアップロード再開:(*1):
curl -C - -T file ftp://ftp.server.com/path/file
ウェブサーバからの文書ダウンロードを再開(*2):
curl -C - -o file http://www.server.com/
(*1) FTP サーバが非標準コマンド SIZE をサポートしている必要がある。そうでない場合、その旨が curl から告知される。
(*2) ウェブサーバが少なくとも HTTP/1.1 をサポートしている必要がある。そうでない場合、その旨が curl から告知される。
日時条件
HTTP では文書のリクエストにおいてクライアント側から日時条件を課せられる: If-Modified-Since (指定日時以降に更新されていれば取得)または If-Unmodified-Since (更新されていなければ取得)。これには -z/--time-cond オプションを用いる。
例えばリモートファイルがローカルの複製より新しい場合にのみダウンロードさせるには、次のようにする:
curl -z local.html http://remote.server.com/remote.html
逆にリモートのファイルがローカルのファイルより古い場合にのみダウンロードさせることもできる。そのためには日付文字列の先頭にダッシュ - を付加する:
curl -z -local.html http://remote.server.com/remote.html
日付を "自由形式" テキストで指定することも可能である。January 12, 2012 以降に更新されたファイルのみをダウンロードさせるには:
curl -z "Jan 12 2012" http://remote.server.com/remote.html
curl においては多岐にわたる日付書式がサポートされている。いずれの書式であれ、ダッシュ - の前置は有効である。
辞書 - DICT
次を試してみよう:
curl dict://dict.org/m:curl
curl dict://dict.org/d:heisenbug:jargon
curl dict://dict.org/d:daniel:web1913
m の別名として match や find も使える。 d の別名として define や lookup も使える。例えば:
curl dict://dict.org/find:curl
RFC の URL 記法に即していないが DICT プロトコルには即したコマンド:
curl dict://dict.org/show:db
curl dict://dict.org/show:strat
認証については(RFC からは要求されないが)まだ未サポート。
LDAP
OpenLDAP ライブラリがインストールされていれば、 ldap:// も使える。
LDAP は複雑で LDAP クエリを書くことは易しい仕事ではない。構文についての記述をどこかから入手することを強く薦める。次の2つを薦める(前者はリンク切れ):
Netscape の "Netscape Directory SDK 3.0 for C Programmer's Guide Chapter 10: Working with LDAP URLs":
http://developer.netscape.com/docs/manuals/dirsdk/csdk30/url.htm
RFC 2255, "The LDAP URL Format"
http://curl.haxx.se/rfc/rfc2255.txt
ローカル LDAP サーバからメールアドレスに特定のサブドメインを含む人達を抽出する例:
curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"
同じ情報を HTML 形式で取得するには -B オプション(強制 ASCII 化)を用いずに行う。
環境変数
以下の環境変数が有効になる:
http_proxy, HTTPS_PROXY, FTP_PROXY
これらはそれぞれのプロトコルに応じたプロクシに設定されるべきものになる。汎用プロクシは次の環境変数に設定する。
ALL_PROXY
プロクシを通すべきではないホスト名はコンマ区切りのリストとして次の環境変数に設定する(アスタリスク * はすべてのホストにマッチする)。
NO_PROXY
ホスト名がこれらの文字列のいずれかにマッチした場合、あるいはこれらの文字列のいずれかのドメインに含まれる場合、それらのノードとの通信にはプロクシは利用されなくなる。
-x/--proxy オプションは環境変数よりも優先される。
NETRC
Unix では古くから .netrc の概念が導入されている。すなわち、よく利用する FTP サイトのログイン名とパスワードをファイルに保存しておいて、サイトを訪れる度にいちいち入力せずに済むようにするものである。誰かがパスワードを覗き見ることができたなら大きなセキュリティリスクになるので、ほとんどの UNIX プログラムは利用者自身以外がこのファイルを読み込める場合には、このファイルを読み込もうとはしない(しかしながら、curl はこの点をケアしていない)。
curl では -n/--netrc あるいは --netrc-optional オプションを用いて .netrc ファイルを利用できる。 FTP に限らず、どのプロトコルでも、認証が使える場面で利用できる。
ごく簡単な .netrc ファイルの中身:
machine curl.haxx.se login iamdaniel password mysecret
出力のカスタマイズ
スクリプトプログラマが curl による処理の進捗状況についての情報を得られるようにするために、 -w/--write-out オプションが導入されている。これを用いれば直前の転送について、どのような情報を出力させるか指定できる。
ダウンロード量(バイト)をテキストと改行を加えて表示させる:
curl -w 'We downloaded %{size_download} bytes\n' www.download.com
KERBEROS FTP 転送
kerberos4 および kerberos5/GSSAPI による FTP 転送もサポートされている。 kerberos パッケージがインストールされていて、かつ、それを利用可能にするように curl がビルドされている必要がある。
まず kinit/kauth ツール等による通常の手順で krb-ticket を取得しておく。その後、次のようにする:
curl --krb private ftp://krb4site.com -u username:fakepwd
-u オプションで指定したパスワードは使われないが、無いと curl から入力を促される。真のパスワードは既に kinit/kauth で入力済みである。
TELNET
curl による TELNET のサポートは基本的なものであり、使い方はごく簡単である。標準入力 (stdin) からの全データはリモートサーバへ渡される。 TELNET サーバへの接続は次のような形になる:
curl telnet://remote.server.com
標準入力からサーバへ送信するデータを入力する。結果は標準出力 (stdout) または,-o オプションで指定したファイルに出力される。
接続が遅いなどの場合には、 -N/--no-buffer を用いて出力時のバッファ利用を止められる。
TELNET プロトコルのネゴシエーションにおいてオプションを渡すには -t を用いる。 vt100 ターミナルの使用をサーバに通知する例:
curl -t TTYPE=vt100 telnet://remote.server.com
-t で設定できる他の有用なオプション:
XDISPLOC=<X display> X display の指定.
NEW_ENV=<var,val> 環境変数の設定
注意:TELNET プロトコルにはログインに際しユーザ名とパスワードを指定する方法が定められていないので curl は自動ログインを行えない。そのため、ログインプロンプトが受信されるのを待ち、適宜ユーザ名とパスワードを送信する必要がある。
永続的接続
一つのコマンドライン内に複数のファイルを指定すると、それらすべての転送は指定した順番どうりに行われる。
libcurl による転送においては、同一ホストに対する次の転送の際に前の転送で確立された接続を開いたまま再利用できるように、接続はなるべく持続させられる。これにより、最初の接続を除く残り全部の接続時間が大幅に短縮され、ネットワークの利用効率も格段に良くなる。
curl の別々の起動に対しては接続の持続は図られないことに注意。ホストが同じであるなら、一つのコマンドライン内にできるだけ多くの URL を詰め込んだ方が高速になる。ファイル転送に HTTP プロクシを利用している場合、実質的にすべての転送において持続性が維持されることになる。
同一コマンドラインによる複数転送
上で述べたように、単に URL を追加していくだけで一つのコマンドラインで複数のファイルを一括してダウンロードできる。それらを標準出力に吐き出させずにローカルファイルに保存するには、各 URL ごとに保存オプションを与えてやる。このことは -O オプションにもあてはまる(しかし --remote-name-all にはあてはまらない)。
例:2つのファイルを取得する際に、最初のものには -O をあてがい、二番目のものには独自のファイル名を与えてローカルに保存する:
curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg
同様なやり方で複数のファイルのアップロードも行える:
curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt
IPv6
ホスト検索の結果が IPv6 アドレスであった場合、まずサーバへの IPv6 接続が最初に試みられ、接続が失敗に終われば IPv4 接続が行われる。 --ipv4 と --ipv6 オプションは両者とも利用可能な場合にどちらのアドレスを利用するかを定める。 IPv6 アドレスは次のような書式で直接 URL に指定することもできる:
http://[2001:1890:1112:1::20]/overview.html
この方式が用いられる場合、連番指定用の角括弧([, ])が curl から解釈されないように -g オプションを与えなければならない。 fe80::1234%1 の様なリンクに局所的なあるいはサイトに局所的なスコープ識別子を含むアドレスも利用可能であるが、スコープ部は数字でなければならず、パーセント文字 は URL エスケープされなければならない。先の例は SFTP URL では次のような形になる:
sftp://[fe80::1234%251]/
URL 以外で与えられた IPv6 アドレス(例えば --proxy, --interface, --ftp-port オプション等で与えたもの)は URL エンコードされるべきではない。
curlの基本使用その2.txt · 最終更新: 2013/12/06 12:53 by luis_lee