始めに断っておく。このエントリはオイラのオリジナルではない。多くのすばらしき先人達が残してくれた資産を参考にしている。個人的に参考にさせていただいたのは下記のサイトだが、実際にインターネットという大海原に旅立てば数多くの知見を得ることができるであろう。
- Webネタ - 2011-09-28 さくらVPSでDropbox
- 葉蔭@IT - さくらVPS CentOS6.2にdropbox
- 調べ物ログ - Dropbox を CUI で利用 (CentOS6.3)
というわけで、何番煎じかしらねぇけど書いとくよ(`・ω・´)b
要はLinuxで使えるクラウドなストレージをクロスプラットフォームなファイルトランスファーソリューションとして活用しようぜ☆……ってこと。別にクライアント to サーバでもいいし、サーバ to クライアントでもいい。クライアント to クライアントでもいいし、サーバ to サーバでもいい。
最初に大事なことをひとつ。Linuxで使えるクラウドなストレージはDropboxしかない。正確に言えば、Wine経由とかで使えるものもあるらしいけど、個人的にはオススメしない。ただ、山があったら登りたくなる人種ってのも一定以上居るのは承知してるので、そういう輩は自分で何とかすること。
そしてもう一つ。これだけ覚えて帰って欲しい。貴方がまだDropboxを使っていなくて、これからDropboxを使おうと思っているなら、このリンクからアカウントを作成するとボーナス容量をゲットすることができる。べっ……別にボーナス容量が欲しいんだからねっ!///
さて、それはさておき……。手持ちのLinux BoxにDropboxをインストールする方法から説明せねばならないだろう。……まあ、前述の記事を読めばすぐに解決するんだけどね_ノ乙(、ン、)_
まずはhttps://www.dropbox.com/install?os=lnxにアクセスする。「Dropbox をダウンロード」の枠の中をクリックしそうになるけど、違うそうじゃない。その下の「コマンドラインで Dropbox をインストールする」の項目を見るんだ。前者はGUIなLinux Box向け(Nautilusがインストールされてること前提)なパッケージだ。今回インストールしたいのはサーバ機などのCLI(CUI) Onlyな環境だ。……まあ、インストールする是非は自分で考えろ。
さて、そこに書いてある方法をそのままコマンドで叩く。やってることはLinux向けのTarballをダウンロードして展開するというだけなので、コマンドを実行するディレクトリにさえ気を付けていれば、さほどひどい目には遭わないであろう
$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf - --YYYY-MM-DD HH:mm:dd-- https://www.dropbox.com/download?plat=lnx.x86_64 www.dropbox.com をDNSに問いあわせています... 199.47.217.170 www.dropbox.com|199.47.217.170|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 FOUND 場所: https://dl-web.dropbox.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz [続く] --YYYY-MM-DD HH:mm:dd-- https://dl-web.dropbox.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz dl-web.dropbox.com をDNSに問いあわせています... 50.17.237.92 dl-web.dropbox.com|50.17.237.92|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 FOUND 場所: https://dl.dropboxusercontent.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz [続く] --YYYY-MM-DD HH:mm:dd-- https://dl.dropboxusercontent.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz dl.dropboxusercontent.com をDNSに問いあわせています... 54.243.72.116 dl.dropboxusercontent.com|54.243.72.116|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 20964351 (20M) [application/x-tar] `STDOUT' に保存中 100%[==============================================================================================================================>] 20,964,351 3.69M/s 時間 18s YYYY-MM-DD HH:mm:dd (1.08 MB/s) - stdout へ出力完了 [20964351/20964351]
今回は自分のホームディレクトリ(~/)で実行したので、下記のようなディレクトリが出来る。
$ ls -la 合計 92 drwx------. 10 haya admin 4096 9月 9 16:31 2013 . drwxr-xr-x. 20 root root 4096 9月 8 20:55 2013 .. -rw------- 1 haya admin 8318 9月 9 23:54 2013 .bash_history -rw-r--r--. 1 haya admin 18 2月 22 06:09 2013 .bash_logout -rw-r--r-- 1 haya admin 210 6月 28 15:30 2013 .bash_profile -rw-r--r--. 1 haya admin 124 2月 22 06:09 2013 .bashrc drwxr-xr-x 4 haya admin 4096 6月 6 04:03 2013 .dropbox-dist
で、その中身を見てみると、必要そうなものが一杯含まれているのが分かる。
$ cd .dropbox-dist/ $ ls -la 合計 49568 drwxr-xr-x 4 haya admin 4096 6月 6 04:03 2013 . (中略) -rwxr-xr-x 1 haya admin 89808 6月 6 04:03 2013 datetime.so drwxr-xr-x 4 haya admin 4096 6月 6 04:03 2013 distribute-0.6.26-py2.7.egg -rwxr-xr-x 2 haya admin 17506804 6月 6 04:03 2013 dropbox -rwxr-xr-x 1 haya admin 258 6月 6 04:03 2013 dropboxd -rwxr-xr-x 1 haya admin 22344 6月 6 04:03 2013 fastpath.so -rwxr-xr-x 1 haya admin 21736 6月 6 04:03 2013 faulthandler.so (中略)
やらなきゃ行けないのはデーモン(daemon)の起動。この中の「dropboxd」って奴を起動すること。あからさまにハイライトしておいたから、いちいち言及しなくてもいいだろうけど(*゜∀゜*)
で、そうすると下記のような感じになる。要は「てめぇのアカウントと紐付けやがれ!」ってことなので、Webブラウザから表示されたURL、すなわち「https://www.dropbox.com/cli_link?host_id={HOSTID}」のところに書かれているURLにアクセスする。このとき、ログインしてなければログインしろって言われるし、まあ、とにかく、画面の指示に従えばいい。上手いこと紐付けができると、下記のハイライトした行のようなメッセージが表示される。
$ ./dropboxd このクライアントはどのアカウントにもリンクされていません... このコンピュータをリンクするには、https://www.dropbox.com/cli_link?host_id={HOSTID} にアクセスしてください。 クライアントをリンクしました。{YOURNAME} へようこそ!
で、ディレクトリを見てみると見慣れぬ「Dropbox」なるディレクトリが出来ている。何を隠そう、コイツがSyncしたDropboxデータが格納されているディレクトリだ。別なコンピュータでファイルを追加すればコイツの中に現れるし、このディレクトリの中にファイルを作れば別なコンピュータからそのファイルを参照できる。気が済んだら「Ctrl+C」で終了することができるので、止めておくのが吉。
$ ls ~/ Dropbox
そう、これで終わり。基本的には。ただ、これだとちょっと使いにくい。もうちょっと細かい制御がしたい。そう思うはずだ。そんなときは、前述の「Dropbox をダウンロード」の枠の中にある「CLI スクリプト」ってテキストリンクのURLからファイルをダウンロードすると管理コマンドをゲットできる。
$ cd /path/to/dropbox-bin $ wget 'https://www.dropbox.com/download?dl=packages/dropbox.py' --YYYY-MM-DD HH:mm:dd-- https://www.dropbox.com/download?dl=packages/dropbox.py www.dropbox.com をDNSに問いあわせています... 199.47.217.171 www.dropbox.com|199.47.217.171|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 FOUND 場所: https://linux.dropbox.com/packages/dropbox.py [続く] --YYYY-MM-DD HH:mm:dd-- https://linux.dropbox.com/packages/dropbox.py linux.dropbox.com をDNSに問いあわせています... 199.47.217.170 linux.dropbox.com|199.47.217.170|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 111373 (109K) [application/octet-stream] `dropbox.py' に保存中 100%[==============================================================================================================================>] 111,373 258K/s 時間 0.4s YYYY-MM-DD HH:mm:dd (258 KB/s) - `dropbox.py' へ保存完了 [111373/111373]
わざわざ「/path/to/dropbox-bin」ってしてるのは理由がある。横着主義な人は「別にさっき出来た.dropbox-distの中に一緒においておけばいいじゃん!」って思うことだろう。そう思っていた時期が私にもありました……(;´Д`)。そうするとどうなるか。手元の環境では……
$ chmod 755 ./dropbox.py $ ./dropbox.py Traceback (most recent call last): File "./dropbox.py", line 24, in import locale File "/usr/lib64/python2.6/locale.py", line 202, in import re, operator ImportError: /path/to/.dropbox-dist/operator.so: undefined symbol: _PyUnicodeUCS2_AsDefaultEncodedString
みたいなエラーが出るんだ。そう、動かないんだ。だからこそ「/path/to/dropbox-bin」と明示してるんだ。
ちなみにちゃんと別ディレクトリに配置してやると……
$ ./dropbox.py Dropbox command-line interface commands: Note: use dropbox help to view usage for a specific command. status get current status of the dropboxd help provide help puburl get public url of a file in your dropbox stop stop dropboxd running return whether dropbox is running start start dropboxd filestatus get current sync status of one or more files ls list directory contents with current sync status autostart automatically start dropbox at login exclude ignores/excludes a directory from syncing lansync enables or disables LAN sync
といった感じでゴキゲンに動作する。
で、先のようにコマンドの簡単な解説が出てくれば準備OK。デーモンを実行するためには下記のようにすればいい。ちなみに「-i」オプションを付けると、アカウントにリンクするために必要なURL(先ほど紹介したよね?)を確認することが出来るらしい。
$ ./dropbox.py start Starting Dropbox...Dropbox isn't running! Done! $ ./dropbox.py start -i To link this computer to a dropbox account, visit the following url: https://www.dropbox.com/cli_link?host_id={HOSTID}
これで起動は完了。
ちなみに停止したかったり、現在の起動状況を確認するためには
$ ./dropbox.py stop Dropbox daemon stopped. $ ./dropbox.py status Dropbox isn't running!
のようにすればいい。
起動したところで、いろいろオプションを設定してみようと思う。まずは「Lan Sync」なる機能。何者かというと、ファイルの更新をまずLan内にお伺いを立てることによってDropboxサーバへのアクセスを減らし高速にSyncする……といったものらしい。https://www.dropbox.com/help/137/jaに詳細が書いてあるので読んでおくといい。
で、コイツはLAN内にサーバがあればまあ役に立ちそうな気もするのだけど、ポート空けるのメンドイしそんなに恩恵を受けられるかというと微妙そうなので無効化したいと思うのは自然なこと。無効化するには下記のようにすればいいらしい。
$ ./dropbox.py lansync enables or disables LAN sync dropbox lansync [y/n] options: y dropbox will use LAN sync (default) n dropbox will not use LAN sync $ ./dropbox.py lansync n
デフォルトではLAN Syncは有効化されているから、忘れずにやっておいた方がいいかもしれないね。
続いてSync対象外ディレクトリの設定。Dropboxに格納しているファイル全部をSyncしたいケースってまずないよね……ってことでこれは重要。で、下記のようにやってみたんだけど……
$ ./dropbox.py exclude /Photos ignores/excludes a directory from syncing dropbox exclude [list] dropbox exclude add [DIRECTORY] [DIRECTORY] ... dropbox exclude remove [DIRECTORY] [DIRECTORY] ... "list" prints a list of directories currently excluded from syncing. "add" adds one or more directories to the exclusion list, then resynchronizes Dropbox. "remove" removes one or more directories from the exclusion list, then resynchronizes Dropbox. With no arguments, executes "list". Any specified path must be within Dropbox.
コマンドの指定の仕方が違うって言われたorz で、改めて「exclude add {ディレクトリ名}」でやるんだけど、ふと思う。「アレ?このディレクトリ指定ってDropbox上のパスなんだろうか?」と。で、そのつもりで試してみると……
$ ./dropbox.py exclude add /Photos $ ./dropbox.py exclude add /Private $ ./dropbox.py exclude add /Public
のようにエラーも表示されないし、成功したように見える。
だがまて、成功したことを確認するまでは成功したとは言えないんだ。
$ ./dropbox.py exclude No directories are being ignored.
……な?失敗してるだろ?
ってことで、このパス指定はそのLinux Boxのディレクトリを指定しなきゃ行けないんだなってのがよく分かる。ってことで、気を取り直して設定してみる。
$ ./dropbox.py exclude add ./Dropbox/Photos/ Excluded: Dropbox/photos $ ./dropbox.py exclude add ./Dropbox/Private/ Excluded: Dropbox/private $ ./dropbox.py exclude add ./Dropbox/Public/ Excluded: Dropbox/public
なんかメッセージが表示されてる!ちょっと時間かかったりもしてる!……これは上手く言ってるだろうという期待を胸に確認してみる。
$ ./dropbox.py exclude Excluded: Dropbox/photos Dropbox/private Dropbox/public
指定したディレクトリがちゃんと除外設定されているようだ。ちなみに実ディレクトリ上はどうなっているかというと、これも併せて消えているのが確認できる。今回は、元々あったディレクトリを全て除外設定したので、空っぽなディレクトリになっている。
$ ls ./Dropbox/ $
で、例えばDropboxのWebインタフェースとかWin/Macのクライアントとかで、新しく専用のディレクトリを追加したらどうなるか……ってのを試してみる。今回は「public_html」なるディレクトリをDropbox上に追加してみた。すると……
$ ls ./Dropbox/ public_html
と、即座にSyncしてくれるようだ。
これを応用すれば、FTPとかSFTP/SCPを使わなくてもサーバにファイルをリリースすることができる(当然サーバからクライアント側にファイルを持ってくることもできる)ようになる。前述のように「public_html」なるディレクトリを作って、そいつをApacheかなにかでドキュメントルートに指定する……なんて使い方をしたくなるかもしれないし、サーバ上のログをこのDropboxなディレクトリに吐くようにして、クライアント側でゴニョゴニョしやすくしたくなるかもしれない。
あるいは複数サーバにこの手の手法でSyncするようにしておけば、Dropbox上のファイルを書き換えれば複数サーバに一括リリースが可能!夢がひろがりんぐ(*゜∀゜*)……と思うかもしれないけど、正直なところ、個人的にはどうかと思う。
私の知る限りログとか記録されないっぽいから誰が何をやったかってのも追跡しづらいし、ログイン自体メールアドレス&パスワードで出来ちゃうから狙われやすいんじゃないだろうかと思うのだ。ただでさえ「サイトが改ざんされた!」とかで大騒ぎになる今日この頃、そんなに狙い所を増やすのもいかがなものかと思ったりするしね(´・ω・`)
まあ、Dropboxのログインに2段階認証を使ったり、あくまで個人的にしっかり管理してやる……といったようなシチュエーションでかつ自己責任でやる分にはメリットもあるのかもしれないけど、別にFTPやSFTP/SCPを使ってやるのより楽か……といわれると微妙じゃない?……というのが私のスタンス。だから、「これは便利だよ!」と強く推奨する気も無いし、「これは便利そうに見えるけど絶対止めとけ!」と強く否定する気も無い。個々人が自分のケースと照らし合わせて考えればいい。おいらは責任とれないし。
まあ、私の認識が間違っていたり「このパターンなら大丈夫!」ってのがあるかもしれないので、覚えておいて損は無いと思う。たとえば、VMやら安全なLAN内に構築した開発サーバとファイルをやりとりする場合なんてのはそういうケースかもしれないね。