mi 用 FTP アップロード ツールコマンド

ダウンロード(は右クリック)(公開日 2005-08-13 更新 2005-08-14)

OSX 専用です。 Mac のテキストエディタ mi 用の ftp アップロードのためのツール。(ちょっと改造を加えれば他でも、あるいは他の UNIX 環境でも使えそう)

機能概要

インストールは mi のモード設定フォルダ(ホームディレクトリ下の Library/Preferences/mi/mode/ )を開いて、適当な場所(例えば「標準」モードの「tool」フォルダ内)に置きます。アップロードの設定は以下で説明する設定ファイルに記述します。

設定ファイル

アップロード先を記述する設定ファイルを作成する必要がある。

簡単な例

次の様に設定ファイルに記述すると、

/Users/taro/なんとか/
ftp://foo.bar.com/public/
myID:myPassword

「なんとか」フォルダ以下のファイルのみが転送対象となり、編集中のファイルのパスが
/Users/taro/なんとか/abc/index.html ならば、
ftp://foo.bar.com/public/abc/index.html にアップロードされる。
myIDmyPassword が転送先サイトへログインするときのユーザ名とパスワードになる。パスワードを* にするとキーチェーンからパスワードが取得される。

上の例ではアップロード先を一つしか与えなかったが、一般には複数のアップロード先を記述する事が出来る。これで、ファイルのディスク内での所在によって適宜アップロード先を変えられる。例えば:

~/なんとか/
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 コマンドに渡す追加オプション)
[転送対象]
ここで指定した文字列が編集中のファイルの絶対パスの先頭部分に一致するとき、転送の対象になる。最初の例の場合、パスの先頭部分が /Users/taro/なんとか/ に一致する文書(つまり「なんとか」フォルダやそれより深い階層のフォルダ内の文書)が対象になる。
[転送先]
ファイルのアップロード先のベース URL をここに記述する。 編集中のファイルパスから[転送対象]の文字列を取り除いた残りの部分がここで指定した転送先に追加され、実際の転送先 URL になる。

出来上がる転送先 URL は正しい URL 構文に従う必要がある。最初の例で [転送先]に付加される部分は abc/index.html だが、この中に日本語などの2バイト文字や一部の特殊文字が存在してはならない。不正な URL に対しては処理を行わないようにしてあるが、チェックは多少大雑把だ。

[ユーザ情報]
ユーザ名(アップロード先ログイン名)とパスワードを文字 : (コロン)で区切って指定する。
[転送オプション]
curl コマンドに与える追加のオプションがあれば、ここで指定する。コマンドライン入力の形式そのままに記述する(下の「デフォルト転送オプション」の例と同様な感じに)。詳細はオンラインマニュアルに記載(ターミナルで 「man curl」)。日本語訳もある。転送先ディレクトリ自動作成や SSL など非常に多様な設定が可能。

複数のサイトに転送する

設定ブロックの最後の行に、特殊キーワード :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 内の []{} を解釈させないためのものであり、無用な混乱を避けたいなら常に設定しておくべきだろう。

キーチェーンファイルの指定

デフォルトでは、キーチェーンアクセスに登録されているすべてのキーチェーンが検索対象になるが、キーワード行 //KEYCHAIN で始まるブロックで特定のキーチェーンのみを検索対象にすることができる。例えば:

//KEYCHAIN
~/ひみつ/秘密の鍵束.keychain

の様に指定する。ここでも、 ~/ はホームディレクトリを表す。 一つの //KEYCHAIN が適用される設定の範囲は //OPTIONS と同様。2行目が空行ならデフォルトのキーチェーンを指定したことになる。

その他

Unicode に起因する問題

(簡単な説明)設定に記述する転送対象に「ぶ」などの濁音文字が含まれている場合は注意。 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 となる。 この aA のような名前の付け替えを応用すれば、例えば 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

利用は自己責任で。複製/配布/改変は自由に行ってよろしい。元々そういう性質のものだ。ただし、改変したものを配布する場合は、その事実を配布物に明記すること。できれば何の目的でどの部分を変えたかも添えた方が良いだろう。