ダウンロード(は右クリック)(公開日 2005-08-13 更新 2005-08-14)
OSX 専用です。 Mac のテキストエディタ mi 用の ftp アップロードのためのツール。(ちょっと改造を加えれば他でも、あるいは他の UNIX 環境でも使えそう)
インストールは mi のモード設定フォルダ(ホームディレクトリ下の Library/Preferences/mi/mode/ )を開いて、適当な場所(例えば「標準」モードの「tool」フォルダ内)に置きます。アップロードの設定は以下で説明する設定ファイルに記述します。
アップロード先を記述する設定ファイルを作成する必要がある。
ftp_path_mapping.txt として保存する:~/Library/Preferences/mi/ftp_path_mapping.txt~/ はホームディレクトリを表す)。次の様に設定ファイルに記述すると、
/Users/taro/なんとか/ ftp://foo.bar.com/public/ myID:myPassword
「なんとか」フォルダ以下のファイルのみが転送対象となり、編集中のファイルのパスが
/Users/taro/なんとか/abc/index.html ならば、
ftp://foo.bar.com/public/abc/index.html にアップロードされる。
myID と myPassword が転送先サイトへログインするときのユーザ名とパスワードになる。パスワードを* にするとキーチェーンからパスワードが取得される。
上の例ではアップロード先を一つしか与えなかったが、一般には複数のアップロード先を記述する事が出来る。これで、ファイルのディスク内での所在によって適宜アップロード先を変えられる。例えば:
~/なんとか/ ftp://foo.bar.com/public/ myID1:myPassword1 ~/なんとか2/ ftp://abc.xyz.net/public/ myID2:myPassword2
ホームディレクトリの「なんとか」フォルダ下のファイルのアップロード先は foo.bar.com 、「なんとか2」フォルダ下のファイルのアップロード先は abc.xyz.net になる。(この例で用いた ~/ はホームディレクトリを表す簡略記法で、利用中のユーザ名が taro ならば最初の例の /Users/taro/なんとか/ と同じ意味になる。)
厳密には次のような形式で与える。それぞれの設定が別々のアップロード先を表す。
<設定1> (空行) <設定2> (空行) <設定3> (空行) ...(以下同様)
各設定は次の様に記述する。
[転送対象](転送対象となるファイルの範囲) [転送先](アップロード先 URL) [ユーザ情報](サーバへのログインアカウント情報) [転送オプション](curl コマンドに渡す追加オプション)
/ や ~/ で始まらない設定ブロックは無視される。:NEXT キーワードを除き、各設定ブロックの5行目以降は無視される/Users/taro/なんとか/ に一致する文書(つまり「なんとか」フォルダやそれより深い階層のフォルダ内の文書)が対象になる。
~/ にするとホームディレクトリ下を表す様になる。/ だと、ディスクの全ファイルが転送対象に含まれてしまう!~/Sites/ としなければならない。「本当」の名前(パス)は Finder の情報ウインドウで調べられる。
出来上がる転送先 URL は正しい URL 構文に従う必要がある。最初の例で [転送先]に付加される部分は abc/index.html だが、この中に日本語などの2バイト文字や一部の特殊文字が存在してはならない。不正な URL に対しては処理を行わないようにしてあるが、チェックは多少大雑把だ。
: (コロン)で区切って指定する。
* 1つだけにするか、空行にして以下の部分も省略する。: 以下の部分を省略する: myID 。* 1つだけを指定する: myID:* 。この場合、パスワードはデフォルトのキーチェーンからユーザ名とホスト名が一致するものとして検索されるので、「キーチェーンアクセス」でインターネットパスワードを設定しておく。
設定ブロックの最後の行に、特殊キーワード :NEXT が記されていると、次に合致した設定に対しても転送処理が行われるようになる。これにより、一つのファイルを同時に複数のサイトへアップロードすることも可能になる。例えば、
~/Sites/ ftp://original.XYZ.net/ myID:* :NEXT ~/Sites/ ftp://mirror.XYZ.net/ myID:myPassword :NEXT ~/Sites/ file:///Volumes/myHDD/site-back-up/
この例の場合、 ~/Sites/ 下のファイルは3カ所にアップロードされることになる。
最後の file:/// にはホスト名が無い。これは自分のマシン自身(localhost)を指す。自分のマシンに ftp サーバを立てていれば、 ftp:/// も利用できる。
curl コマンドに与えるデフォルトのオプションをキーワード行 //OPTIONS で始まるブロックで指定することができる。ブロックの2行目にコマンドライン入力の形式そのままに記述する。例えば:
//OPTIONS --ftp-create-dirs --max-time 120 --connect-timeout 20 --globoff
この例は、リモートのディレクトリが ftp サーバに存在しないときには自動的に作成させ、全体の処理にかける制限時間を 120 秒にし、サーバへの接続確立に 20 秒以上手間取った場合は中止させることを指示する。最後の --globoff は curl にとってメタ文字となるファイルパスや URL 内の []{} を解釈させないためのものであり、無用な混乱を避けたいなら常に設定しておくべきだろう。
//OPTIONS が適用される設定の範囲はその直後から次の //OPTIONS ブロックが現れる手前まで。2行目を空行(または空白)にするとオプションは空になる。curl [デフォルト転送オプション] [設定固有の転送オプション] -T [転送ファイルの絶対パス] -u [ユーザ情報(含パスワード)] [転送先 URL]
デフォルトでは、キーチェーンアクセスに登録されているすべてのキーチェーンが検索対象になるが、キーワード行 //KEYCHAIN で始まるブロックで特定のキーチェーンのみを検索対象にすることができる。例えば:
//KEYCHAIN ~/ひみつ/秘密の鍵束.keychain
の様に指定する。ここでも、 ~/ はホームディレクトリを表す。
一つの //KEYCHAIN が適用される設定の範囲は //OPTIONS と同様。2行目が空行ならデフォルトのキーチェーンを指定したことになる。
(簡単な説明)設定に記述する転送対象に「ぶ」などの濁音文字が含まれている場合は注意。 Finder から濁音文字を含むファイル名を設定ファイルにコピー&ペーストした場合、当該文字は「ぶ = ふ + ゛」といった様な「分解状態」になっているので「合成状態」に直しておくこと。
(詳細な説明) OSX のファイルシステムで使われている文字コードは Unicode(UTF-8)だが、 NFD (Normalization Form D)と呼ばれる、正規化された形式の Unicode が利用されている。簡単に言うと、濁音などの合成可能文字はファイルシステムのソート処理の都合上、清音と濁点の二文字に分解されている。通常の合成済み NFC(Normalization Form C)とは、文字列としては同値でもデータとしては異なる。転送対象のファイルのパスを設定ファイルの文字列と比較するためには、この微妙な差異をどこかで吸収してやる必要があり、その目的でスクリプトの最初の方でファイルパスを iconv コマンドで通常の Unicode NFC に変換している。
[転送対象]と[転送先]は必ずしもディレクトリを表す / で終わる必要はない。設定が
/xyz/a ftp://X.Y.Z/A
ならば、「xyz」フォルダ内の文字 a で始まるファイル(または a で始まるフォルダ内のファイル)のみが転送の対象になり、ファイル /xyz/abc.html の転送先は ftp://X.Y.Z/Abc.html となる。
この a → A のような名前の付け替えを応用すれば、例えば Apache サーバのアクセスを制御する .htaccess のように名前が . で始まるファイルは OSX のシステムでは不可視なので編集が面倒だが、手元ではファイル名を _htaccess 、アップロード時には .htaccess に変わるように設定することもできる。
文書のパスにホスト名が含まれていれば転送先のホスト名を空にすることさえ可能:
/xyz/ ftp://
この場合、文書 /xyz/hoge.fuga.com/index.html の転送先は ftp://hoge.fuga.com/index.html になる。
FTP アップロードに関係ありそうな curl の転送オプションを挙げておく:
-a/--append 付加的(非上書き)ファイルアップロード
-B/--use-ascii ASCII テキスト転送を利用
--disable-eprt EPRT / LPRT コマンドオフ
--disable-epsv EPSV コマンドオフ
--connect-timeout <seconds> 接続制限時間を指定
--crlf アップロード時の LF → CRLF 変換
--ftp-create-dirs リモートディレクトリ自動作成
--ftp-pasv PORT オフ、 PASV を利用
-g/--globoff {} [] による URL 一括/連番指定オフ
--krb4 <level> krb4 を利用, セキュリティレベルを指定
-K/--config 設定ファイルを指定
--limit-rate <rate> 転送レート上限を指定
-m/--max-time <seconds> 転送制限時間を指定
-n/--netrc ユーザ名とパスワードを必ず .netrc から取得
--netrc-optional .netrc か URL を利用, -n より優先
-o/--output <file> 標準出力のリダイレクト先ファイルを指定
-P/--ftp-port <address> PASV オフ, PORT を利用, アドレスを指定
( '-' ならデフォルト)
-q .curlrc 設定ファイル無効化(最初に与える)
-Q/--quote <cmd> ファイル転送前に送信するコマンドを指定
-s/--silent 沈黙モード, 出力オフ
-S/--show-error エラーを出力, -s と伴でもエラーは出力。
--stderr <file> 標準エラー出力のリダイレクト先を指定
( '-' なら標準出力)
--trace <file> デバッグトレース出力オン, 出力ファイルを指定
--trace-ascii <file> --trace に加えて出力の16進部分を破棄
-v/--verbose 処理内容をより詳しく説明的に出力
-w/--write-out [format] 処理完了後に出力する内容を指定
-y/--speed-time speed-limit による中止までの時間を指定(既定値 30 秒)
-Y/--speed-limit 転送継続のための speed-time の時間内の転送レート下限を指定
以下 SSL 用
--ftp-ssl ftp 転送に SSL/TLS を利用
--egd-file <file> 乱数データ用 EGD ソケットのパスを指定
-E/--cert <cert[:passwd]> クライアント証明書ファイルとパスワードを指定
--cert-type <type> 証明書ファイル種別(DER/PEM/ENG)を指定
--key <key> プライベートキーファイル名を指定
--key-type <type> プライベートキーファイル種別(DER/PEM/ENG)を指定
--pass <pass> プライベートキーのパスフレーズを指定
--engine <eng> 暗号エンジンを指定
--cacert <file> ピア検証用 CA 証明書を指定
--capath <directory> ピア検証用 CA ディレクトリを指定
--ciphers <list> SSL 暗号リストを指定
--random-file <file> 乱数データファイルを指定
-1/--tlsv1 TLSv1 を利用
-2/--sslv2 SSLv2 を利用
-3/--sslv3 SSLv3 を利用
© 2005 HIROSE, Yukio
利用は自己責任で。複製/配布/改変は自由に行ってよろしい。元々そういう性質のものだ。ただし、改変したものを配布する場合は、その事実を配布物に明記すること。できれば何の目的でどの部分を変えたかも添えた方が良いだろう。