rsync + ssh で大学のPCアカウントと自分のPCのファイルを同期する

大学のPCと自分のPCのどちらもよく使うのだが、ファイルの移動がめんどくさい。今まではUSBメモリにいれたり、Dropboxを使ったりしていたが、USBメモリは時々忘れて持ち合わせていなかったり、Dropboxは大学のPCにクライアントがインストールされていないので、いちいちブラウザを開いてアップロードしなければいけなかったりする。

もっと簡単で楽な方法がないか探してみたところ、大学のPCにsshで接続できることがわかった。sshとは簡単に言えばネットワークを介してリモートPCにログインして色々操作できる機能のこと。sshで大学のPCにログインして、自分のPCにファイルをコピーすればいい。

ファイルの同期には、rsyncという同期をとるのに便利なアプリケーションを使う。

以下わかりやすいように、

自分のPC ローカルPC
大学のPC リモートPC
ローカルPCのユーザー名 local_user
リモートPCのユーザー名 remote_user
リモートPCのホスト名 remote_host

と呼ぶことにする。

やること

  1. sshでパスワードを使わずにログインできるようにする
    1. ローカルPCで公開鍵と秘密鍵の生成
    2. リモートPCに秘密鍵を置く
  2. rsyncでファイルの同期を取る

sshでパスワードを使わずにログインできるようにする

sshでログインするには、ローカルPCの端末で

$ ssh remote_user@remote_host
Password:		//ここでパスワードを入力。入力しても画面には表示されないので注意。

とすればよいが、毎回パスワードを入力しなければならない。
簡単にするためにパスワード認証ではなく公開鍵認証にする。

ローカルPCで公開鍵と秘密鍵の生成
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/local_user/.ssh/id_rsa):	// 何も入力せずEnter
Created directory '/home/local_user/.ssh'.
Enter passphrase (empty for no passphrase): 				// 何も入力せずEnter
Enter same passphrase again: 						// 何も入力せずEnter
Your identification has been saved in /home/local_user/.ssh/id_rsa.
Your public key has been saved in /home/local_user/.ssh/id_rsa.pub.
The key fingerprint is:
44:8c:55:80:3c:95:33:9d:74:a4:9a:d2:cb:c5:74:a2 local_user@local_host
The key's randomart image is:
+--[ RSA 2048]----+
|     . *=*ooo    |
|      =.= oo     |
|       ..o+ .    |
|       o * o     |
|      . E o      |
|       o o       |
|        o        |
|                 |
|                 |
+-----------------+

これで /home/local_user/.ssh ディレクトリの下に、id_rsa(秘密鍵)とid_rsa.pub(公開鍵)が生成される。

生成されているか確認。

$ ls ~/.ssh/
id_rsa  id_rsa.pub
リモートPCに公開鍵を置く

ローカルPCのid_rsa.pub(公開鍵)をリモートPCのホームディレクトリにコピー。

$ scp ~/.ssh/id_rsa.pub remote_user@remote_host:~/
Password:		// パスワード入力

リモートPCにsshでログイン。

$ ssh remote_user@remote_host
Password:		// パスワード入力

コピーされているか確認。

$ ls ~/
// id_rsa.pub があるはず

コピーした公開鍵を /home/remote_user/.ssh/authorized_keys の末尾に追加する。

$ mkdir ~/.ssh		// .sshディレクトリがなければ作成
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

一度リモートPCからログアウトし、その後パスワードなしでログインできるか確認する。

$ exit
$ ssh remote_user@remote_host	// パスワードなしで接続できる

rsyncでファイルの同期を取る

使用するrsyncのコマンド

$ rsync -auvz --delete {コピー元} {コピー先}

オプションの意味

-a 再帰的(サブディレクトリもコピーされる)かつファイルの状態(更新日時など)もコピーされる
-u コピー先のほうが新しければコピーしない
-v 処理の詳細を表示する
-z データを圧縮して転送する
--delete コピー元で削除されたファイルはコピー先でも削除される

リモートPCの /home/remote_user/workspace/ ディレクトリをローカルPCの /home/local_user/workspace/ ディレクトリにコピーしたい場合

$ rsync -auvz --delete remote_user@remote_host:~/workspace/ ~/workspace/

逆にローカルPCからリモートPCにコピーしたい場合

$ rsync -auvz --delete ~/workspace/ remote_user@remote_host:~/workspace/

これでローカルPCで作業するときは、作業前にリモートPCからローカルPCにコピー、作業後にローカルPCからリモートPCにコピーするようにしておけば良い。