rsyncのありふれたリモートコピー

Tags : Linux  

使用しているのが、もう完全にLinux環境になってしまったので、バックアップはrsyncで取っています。

自前で立てるサーバーであれば、SSH周りも自由に設定できますが、共有サーバーですとそうは行きません。向こうから指定されたオプションをダラダラ付けるのが面倒なので、ちょっとしたアップはコントロールパネル経由かFTP経由でやっていたのですが、最近昔とった杵柄で、.bashrcをいじりだしたので、ついでにいろいろaliasやら使い出しました。そこで、rsyncもエイリアスを切ることにしました。

ついでですから、SSHの設定もメモに残しておきます。

自分のマシンで認証鍵生成

サーバーでも立てないと、ほとんど一回やったっきりになり、忘れてしまいます。今回もすっかり忘れてました。:D

相手マシンで認証鍵が使用できなければ使えません。その場合はパスワードを使用しログインです。その前にSSH接続を許していなければ、シェルログインはできません。

ssh-keygen -t rsa -C “コメント”

あとは指示に従って入力していきます。SSHの接続時にパスフレーズによる確認を行うと、パスワード使用時と同じような操作になりますが、より安全性が高まります。しかしcronなどの自動化を行う場合、パスフレーズ入力はできないため、その場合はこの生成時にパスフレーズを指定しません。

デフォルト(.ssh/id_rsa)はパスワード付き、自動に利用する時は別のキーを作成し、SSHは-iオプションで鍵ファイルを指定するのが、上手い指定方法でしょう。

パスフレーズは後から-pオプションで変更できます。生成し直す必要はありません。

ssh-keygen実行時は、出力先にデフォルトのキーが提示されるので、そこで別の名前を付け生成します。

最後まで、質問に答えるとデフォルトならid_rsaとid_rsa.pubができます。id_rsaのパーミッションが600か400になっているか確認し、違っていれば設定します。

id_rsaは秘密鍵です。原則自分のマシンの中だけで使用するものです。ですからセキュリティーを考えるのであれば、そのままネットで他の場所に送信するのは避けましょう。

id_rsa.pubは公開鍵です。他のマシンに送って使用するものです。滅多矢鱈に送りつけるものではありませんが、SSL通信とかを行えば、相手マシンには届くものです。あまり、神経質になる必要はありません。

この公開鍵をSSHでログインしたい、リモートマシン上の、自分のホームディレクトリーに設置します。リモートマシンの.ssh/authorized_keysに追加します。追加です。既に中身がある場合は、書き換えてはいけません。このファイルはどの鍵をSSHで受け付けるかを指定するものです。

一般にリダイレクトを使っての追加を>>で行うように指示されていることが多いですが、エディターで開いて、一番最後の行以降に追加しても大丈夫です。要は、公開鍵のファイルの中身を、相手のリモートマシンの.ssh/authorized_keysの中身に追加できればOKです。

rsyncでリモート転送

古い情報に従うと、うまくできません。バージョンの違いがあるようです。大体、この様な感じでしょうか。(もう、ずっと昔からsync系のコマンドは結構変更が大きかったですね。)

rsync -av -delete --exclude="除外1" --exclude="除外2" -e "ssh オプション" 元ディレクトリーフルパス ユーザー名@送信先ホスト:転送先ディレクトリーフルパス

sshの接続ポートはセキュリティーのため変更されていることが多いです。除外指定が多い場合はリストで指定する方法もあります。前述のデフォルト以外の鍵ファイルを使用する場合も、-eオプションの中で-iオプションを指定します。

例えば接続ポートが1234、ローカル/home/oreore/sagi-projectディレクトリーをpolice.comへユーザーwareware、/home/wareware/sagi-projectディレクトリーへ送信する場合は、以下のようになります。Gitで管理しているLaravelプロジェクトを想定し、.gitとapp/storageディレクトリーは転送の除外にしましょう。

rsync -av -delete --exlude =".git" --exclude="app/storage/" -e "ssh -p 1234" /home/oreore/sagi-project/ wareware@police.com:/home/wareware/sagi-project

長いですね。:)

bashでタイプを節約するように設定しましょう。.bashrcに以下の関数を登録します。もちろん、ご利用の際は値を自分の環境に合わせてください。

warewaresync() { rsync -av -delete --exclude=".git/" --exclude="app/storage/"  -e "ssh -p 1234" /home/oreore/$1 wareware@police.com:/home/wareware/$2 }

これで簡単にrsyncできるようになります。コマンドから、以下のように指定すれば、長々と指定した時と同様にrsyncしてくれます。

warewaresync sagi-project/ sagi-project

何度もrsyncする必要があるのでしたら、これも.bashrcにエイリアスで登録してしまいましょう。

alias sagiupload='warewaresync sagi-project/ sagi-project'

これで、sagiupload一発で、いつでも簡単にrsyncでリモートへ転送してくれます。

プロジェクトの開始時に、同様にエイリアスを切っておくと、以降の手間がかかりませんよ。

Laravel4プロジェクト用関数例

除外はもっと細かく指定したほうが良いかも知れません。上記の例では、app/storageディレクトリーが転送されないため、それ以下のディレクトリーが存在しなくなります。--exclude="app/strorage/cache/*" --exclude="app/storage/logs/*"...のように全5ディレクトリーを指定してください。

さらに、転送先が実機の場合、テストは必要ありません。かなりテストのファイルはあるので、転送しないほうが早いです。

こうした指定を全部取り込んだバージョンです

warewaresync() { rsync -av -delete --exclude=".git/" --exclude="app/storage/cache/*" --exclude="app/storage/logs/*" --exclude="app/storage/meta/*" --exclude="app/storage/sessions/*" --exclude="app/storage/views/*" --exclude="test/" --exclude="tests/" --exclude="Tests/" --exclude="test-suite" -e "ssh -p 1234" /home/oreore/$1 wareware@police.com:/home/wareware/$2 }

テスト関係のファイルがほぼ転送されないことに気をつけてください。実機で必要なテストディレクトリーが転送されるようにスクリプトを調整してもらうか、もしくは転送できるようにディレクトリー名を工夫してください。(例えばHonbanTestなど)