원격 SFTP 서버에 Windows 폴더를 동기화 하는 방법

컴퓨터에서 원격 서버로 파일을 실시간으로 동기화한다는 것은 파일이 생성, 업데이트 또는 삭제될 때마다 즉시 원격 서버에 업로드되거나 원격 서버에서 삭제된다는 것을 의미합니다. 이는 사진 및 비디오의 원격 간 복사본 저장, 지속적인 통합 및 배포 프로세스의 일부로 애플리케이션 변경 사항 배포, 타사와의 자동 파일 공유 등 여러 사례들을 통해 이득이 높은 것으로 입증되었습니다.

Dropbox, Box, Egnyte는 이러한 프로세스를 엔드투엔드 방식으로 처리하는 많은 제품 중 일부에 불과합니다. 이들은 파일 시스템 변경 사항을 추적하는 클라이언트, 필요한 원격 저장소, 원격 저장소의 파일에 액세스하고 공유할 수 있는 수단을 제공합니다.

SFTP 서버에 파일을 동기화하는 방법은 범용적이고 자동화하기 쉬우며, 간단한 GUI나 명령줄 클라이언트를 통해서도 쉽고 안전하게 파일에 액세스할 수 있기 때문에 많은 기업에서 선호하는 솔루션입니다. 이 글에서는 Windows 컴퓨터 또는 서버에 있는 파일을 원격 SFTP 서버와 동기화하는 방법을 소개하고자 합니다.

Syncplify.me AFT!

필자가 Syncplify.me AFT!를 만나게 된 계기는 공통의 고객이 서버의 파일을 SFTP To Go에 동기화할 때 문제가 발생했을 때였는데, Syncplify의 문제 해결 방식에 감탄하여 우리도 시도해보기로 했습니다.

AFT(Automated File Transfer: 자동 파일 전송)는 파일 전송을 자동화하는 것을 목적으로 자바스크립트의 확장 버전인 aftJS 언어를 사용하여 파일 시스템 변경 모니터링, 원격 서버 연결, 파일 업로드, 다운로드, 삭제하는 등의 간단한 스크립트를 작성할 수 있습니다. 미리 패키지화된 스크립트가 제공되기 때문에 바로 사용할 수 있으며, 스크립팅 언어는 프로세스를 완전히 제어하는 데 매우 강력합니다. 예를 들어, 파일을 변경할 때마다 원격 서버에 새로운 파일을 만든다거나, 로컬에서 삭제된 파일이 있을 때마다 이전 버전을 덮어쓰는게 아니라 원격 서버로 파일을 옮기는 것도 가능합니다.

또한 윈도우즈와 리눅스 모두에서 사용할 수 있는 크로스 플랫폼이라는 점도 매력 중 하나이죠.

삭제된 파일을 원격 서버에 그대로 남기는 동기화 스크립트의 예는 다음과 같습니다:

{
  // 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를 다운로드 받거나 가격플랜에 대해 궁금하시면 여기에서 확인하세요.

보안성과 안정성을 극대화한 SFTP To Go
SFTP To Go는 관리형 SFTP/FTPS/S3를 서비스 형태로 제공하며, 최고의 안정성, 보안, 가용성, 1분 만에 설치가 가능하며 모든 규모의 기업에 적합합니다.
지금 바로 SFTP To Go를 사용해 보세요!

WinSCP

WinSCP는 Windows용 무료 SFTP 클라이언트로 잘 알려져 있습니다. 다양한 CLI(명령줄 인터페이스) 옵션과 PowerShell 및 다양한 .NET 언어에서 사용할 수 있는 .Net 어셈블리 라이브러리를 통해 프로세스 자동화에도 사용할 수 있습니다.

Syncplify.me AFT와 달리 WinSCP는 어느 플랫폼에서 이용하지 못하고 Windows에서만 작동합니다. 이는 아마도 원래 리눅스의 보안 복사 명령어인 `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의 옵션에 대해서는 이 내용을 참조하세요.

보안성과 안정성을 극대화한 SFTP To Go
SFTP To Go는 관리형 SFTP/FTPS/S3를 서비스 형태로 제공하며, 최고의 안정성, 보안, 가용성, 1분 만에 설치가 가능하며 모든 규모의 기업에 적합합니다.
지금 바로 SFTP To Go를 사용해 보세요!

Post photo by Vincent Branciforti on Unsplash