The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何讓 OpenSSH for Windows 也能支援 Rsync 遠端加密連線傳輸

傳送大量檔案到遠端 Windows 電腦時,除了使用 SFTP 之外,其實也可以使用 Linux 知名的 rsync 命令來快速傳檔,不但傳輸過程可以透過 OpenSSH 加密,傳輸內容甚至於可以壓縮與進行差異比對。不過 Windows 要使用 Rsync 來傳檔真的比我想像中的難很多,我花了大量的時間搜尋解決方案無果,沒有一篇文章能用的,最後嘗試各種組合才被我找出一定能成功使用的方法。這篇文章看起來不長,但還真的花了不少時間研究,就馬上來看看 Windows 如何使用 Rsync 搭配 OpenSSH 來傳檔吧!

設定 Windows 伺服器端

基本上你只要設定好 OpenSSH Server 之後,就只要加裝 Rsync 工具即可,這裡我們會以 cwRsync 為主。

  1. 下載與安裝 cwRsync 最新版

    # 安裝 rsync 工具
    choco install rsync -y
    
  2. 重新啟動 sshd 服務

    Restart-Service sshd
    

設定 Windows 用戶端

這次我們因為需要使用到 cwRsync 內附的 ssh.exe 程式,但是 cwRsync 的 Chocolatey 套件只包含 rsync.exe 而已,所以我們用戶端不能用 Chocolatey 進行安裝。

  1. 下載與安裝 cwRsync 最新版

    # 下載最新版 cwRsync
    Invoke-WebRequest -Uri https://itefix.net/dl/free-software/cwrsync_6.2.4_x64_free.zip -OutFile cwrsync_6.2.4_x64_free.zip
    
    # 先解壓縮到暫存資料夾
    Expand-Archive -LiteralPath "$PWD\cwrsync_6.2.4_x64_free.zip" -DestinationPath "$env:TEMP\cwrsync"
    
    # 將 cwrsync_6.2.4_x64_free 目錄下所有檔案複製到 C:\cwrsync
    mkdir "C:\cwrsync"
    Copy-Item -Path "$env:TEMP\cwrsync\cwrsync_6.2.4_x64_free\*" -Destination "C:\cwrsync" -Recurse
    
    # 刪除壓縮檔
    del "$PWD\cwrsync_6.2.4_x64_free.zip"
    
  2. 設定系統層級PATH 環境變數加入 C:\cwrsync\bin 路徑

    # 下載設定環境變數的利器 SetEnv
    Invoke-WebRequest -Uri "https://github.com/doggy8088/SetEnv/releases/download/1.0/SetEnv.exe" -OutFile "SetEnv.exe"
    
    # 增加 PATH 系統環境變數
    .\setenv -a PATH %C:\cwrsync\bin
    
    # 刪除 SetEnv.exe
    del SetEnv.exe
    
  3. 使用 rsync 搭配 cwRsync 內附的 ssh.exe 來進行加密連線

    rsync -e 'c:\cwrsync\bin\ssh.exe -i mysshkey' -avzr 'myfile' user1@172.29.212.19:.
    

    我目前不太能理解為什麼不能用 Win32-OpenSSH 提供的 ssh.exe 來進行連線,但我嘗試了很多種不同的 ssh.exe,包含 Cygwin 的 ssh.exe 也不行,就只有 cwRsync 的 ssh.exe 可以用。我有建立一個 Issue #1869 來追蹤這個問題。

相關連結