コンピューターからリモートサーバーにファイルをリアルタイムで同期するということは、ファイルが作成、更新、または削除されるたびに、即座にリモートサーバーにアップロードされるか、リモートサーバーから削除されるということです。これは、写真やビデオをリモート間でコピーの保存、継続的な統合やデプロイのプロセスの一環としてのアプリケーション変更のデプロイ、サードパーティーとのファイルの自動共有など、多くの面でメリットがあることが証明されています。

このようなプロセスをエンドツーエンドで処理する多くの製品のほんの一例として、Dropbox、Box、Egnyte が挙げられます。これらはファイルシステムの変更を追跡するクライアント、必要なリモートストレージ、リモートストレージ上のファイルにアクセスし共有するための手段を提供します。

SFTPサーバーへのファイルの同期は、汎用的で自動化しやすく、シンプルなGUI (グラフィカル・ユーザ・インターフェース)やコマンドラインクライアントでもファイルに簡単かつ安全にアクセスできるため、多くの企業にとって好ましいソリューションとなる傾向があります。そこで本記事では、Windowsやサーバー上のファイルを、リモート環境にあるSFTPサーバーと同期させる方法をご紹介します。

Syncplify.me AFT!

筆者たちが Syncplify.me AFT!に出会ったのは、共通の顧客がサーバー上のファイルをSFTP To Goに同期した際に問題が発生したときでした。Syncplifyの問題解決へのアプローチに感心し、私たちも試してみることにしました。

AFT(Automated File Transfer:自動ファイル転送)は、ファイル転送を自動化することを目的とし、JavaScriptの拡張版であるaftJS言語を用いて、ファイルシステムの変更監視、リモートサーバーへの接続、ファイルのアップロード、ダウンロード、削除を行う簡単なスクリプトを書くことができます。あらかじめパッケージ化されたスクリプトが装備されているので、すぐに使い始めることができ、スクリプト言語は、プロセスを完全にコントロールするのにとても強力です。例えば、ファイルを変更するたびにリモートサーバーに新しいファイルを作成したり、ローカルで削除されたファイルをリモートサーバーに移動したりしたい場合も以前のバージョンに上書きするのではなく、これら全てが可能です。

また、WindowsとLinuxの両方で使えるクロスプラットフォームであることも魅力の一つです。

削除されたファイルをリモートサーバーにそのまま残す同期スクリプトの例は、次のようになります:

{
  // Let's enable console feedback, in case we're running this script via the shell
  ConsoleFeedback = true;

  // First, let's create the file-system watcher
  watcher = new FsWatcher();
  // Then we elect to delay notification by *at least* 300 seconds (5 minutes)
  // (useful to allow the file system to finish whatever operation is ongoing)
  watcher.DelayBySeconds = 300;
  // We may choose *not* to be notified of certain events
  watcher.NotifyRename = false;
  watcher.NotifyRemove = false;
  watcher.NotifyChmod = false;
  // We can specify inclusion and exclusion filters (optional, not mandatory)
  watcher.InclusionFilter = ['*.*'];
  watcher.ExclusionFilter = ['notes.txt', 'budget.xlsx'];
  // Almost ready, let's tell the object what folder we want to monitor
  watcher.WatchDir('C:\\TestFolder', false);
  // And then start the watcher
  watcher.Start();

  // We need to keep checking events indefinitely, an endless cycle is what we need
  while (true) {
    // Let's sleep for 500 milliseconds at each cycle, to keep CPU usage low
    Sleep(500);
    // When inside an endless cycle, it's always safe to check if we received a Halt signal at every cycle
    if (HaltSignalReceived()) {
      break;
    }
    // No Halt signal? Good, then let's acquire the list of pending event that we need to process
    evt = watcher.Events()
    // Do we have at least 1 event to process?
    if (evt.length > 0) {
      // We only connect to the server IF there are events to be processes
      var scli = new SftpClient();
      scli.Host = 'sftphost.com:22';
      scli.User = 'your_username';
      scli.Pass = 'your_password';
      scli.Options.UploadPolicy = AlwaysOverwrite;
      if (scli.Connect()) {
        // Cycle over all pending events...
        for (var i = 0; i < evt.length; i++) {
          if (evt[i].Event == 'WRITE') {
            // If it is a WRITE event (new or modified file) let's upload it to the server
            scli.UploadWithPath(evt[i].Object, '/DestinationPath', 1);
          }
        }
        // Do not forget to close the connection
        scli.Close();
      }
      // Set the client object to null to save memory
      scli = null;
    }
  }

オリジナルのスクリプトは こちら

Syncplify.me AFTの料金プラン詳細は、 こちらからダウンロードしてご確認いただけます。

WinSCP

WinSCPは、 Windows用の無料SFTPクライアントとしてよく知られています。また、多くのCLI(コマンドラインインターフェース)オプションや、PowerShell や他の様々な .NET 言語で使用できる .Net のアセンブリのライブラリにより、プロセスの自動化にも利用できます。

Syncplify.me AFTとは反対に、WinSCPはWindows上でのみ動作します。これはおそらく、元々が Linuxのセキュアコピーコマンドである「scp」のポートであるためです。また、同期処理を完全にコントロールすることはできませんが、コマンドライン引数の keepuptodateは、その様々なオプションにより、ほとんどのケースをカバーすることができるでしょう。

SFTPセッションを開き、ディレクトリを同期させるためのコマンドラインの例は次のようになります:

C:\path_to_winscp\WinSCP.exe /console /ini=C:\path_to_config\WinSCP.ini /command "option batch continue" "open sftp://your_username:your_password@sftphost.com:22" "keepuptodate C:\Test_Folder /DestinationPath' -filemask=|notes.txt;*.tmp"

WinSCP のダウンロードはこちら。また、keepuptodateオプションについてはこちらをご覧ください。


写真提供: Vincent Branciforti - Unsplashより