Mac: rsyncによる2点間のファイルコピー (rsync, vpn, afp, applescript使用)

年末年始に今まで自宅に設置していた MacMini (Serverではなくデスクトップマシン) を実家に移設したのですが、Eye-Fiを使っているコンパクトデジカメで写真を撮影しながら「あ、Eye-Fiのファイル転送先設定が実家に移設したMacMiniのままだ…」という事に今更気がつきました。

最も簡単な解決方法は自宅に残っているMacBook ProかMacBook AirにEye-Fi CenterとEye-Fi Helperをインストールして転送先を変更すれば良いのですが、もう少し難しく解決してみようと思い、VPN接続で実家のネットワークに接続しrsyncコマンドを使って自宅のLANに接続されているAirMac Extremeに繋がっている外付けHDDへファイルを転送する方法を試してみました。

条件としては次の通り。

  • 自宅はCATVでインターネットへ常時接続。
  • 実家はFTTHでインターネットへ常時接続。
  • VPN接続は自宅のMacBook Pro (MBP)から実家のMac mini server (MacMiniとは別のMac OS X Server搭載のサーバー)間で行う。Mac mini serverはVPN接続クライアントと実家のLAN内に設置しているMacMini間でルーティングを行う。
  • Eye-Fiのファイルは実家のMacMini上で共有されているフォルダに保存されている。
  • これらのファイルを自宅のAirMac Extremeに接続されたHDDへコピーする。

Applescriptに作業させたい内容は次の通り。

  1. 予め[システム環境設定] – [ネットワーク] で設定しておいたVPN接続先に自動的に接続する。
  2. 実家のMacMiniの共有フォルダにafpで接続(マウント)する。
  3. 自宅のAirMac Extremeに接続のHDDにafpで接続(マウント)する。
  4. rsyncコマンドを走らせ、MacMini側の変更をAirMac Extreme側へコピーする。

ということで、エラー処理などを全く考慮していませんが紹介しちゃいます。

tell application “System Events”
tell current location of network preferences
set VPNservice to service “<<VPN接続名>>”  –事前に設定しておいたVPN接続先を指定
set isConnected to connected of current configuration of VPNservice –接続済みかどうかを確認
if isConnected = false then –接続済みでなければ
if exists VPNservice then connect VPNservice –接続する
delay 30 –接続が完了するまで30秒程度掛かった事があるので長めに待機
end if
set isConnected to connected of current configuration of VPNservice –接続済みかどうかを再度確認
if isConnected then –接続済みであれば
tell application “Finder”
mount volume “afp://192.168.0.100/Share/” as user name “<<User Name>>” with password “<<Password>>–MacMiniの共有フォルダをマウント
mount volume “afp://10.0.3.1/Temp/” as user name “<<User Name>>” with password “<<Password>>–AirMac ExtremeのHDDをマウント
set SyncCommand to “rsync -avz –exclude=.DS_Store /Volumes/Share/Eye-Fi /Volumes/Temp/” –rsyncのコマンドを定義
do shell script SyncCommand –rsyncのコマンドを実行
end tell
end if
end tell
end tell
前述の通り全くエラー処理はしていませんのであしからず。目的は達成できていると思っています。

ポイントは、afpでマウントした共有フォルダは /Volumes 以下にディレクトリとして見えるという事を利用して、同期元と同期先の2つのネットワーク上の共有フォルダをあたかもローカルフォルダの様に扱っています。rsyncコマンドはssh転送にも対応しているのでそれを使っても良いのですが、事前に鍵の生成や転送をするのが面倒だったのでまずは簡単に実現できる方法で試してみました。その反面、VPNや共有フォルダがネットワークの不調などで切断されると途中でファイル転送が中断されてしまう場合があります。

また、rsyncのオプションとして ‘–exclude=.DS_Store’ を指定しました。.DS_Storeが含まれたディレクトリの同期を行うと.DS_Storeで始まるファイル/ディレクトリが大量に転送される場合があるので除外しました。

エラー発生時の処理やtellコマンドとend tellコマンドの位置も調整しなければなりませんし、ファイル転送終了後に切断も出来ていない状態なのでまだまだ改善の余地がありますが、同じ様な事をお考えの方の参考になれば幸いです。より良い方法があれば是非共有して頂ければ助かります。

#想定していない動きをする事も考えられますので、流用される場合は自己責任でお願いします。意味の分からない場合は試さない方が安全だと思います。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください