This is an old revision of the document!
Verify checksum of a remote file against a local file over SFTP/FTP protocol
The following example uses WinSCP .NET assembly from a PowerShell script. If you have another preferred language, you can easily translate it.
In the latest beta version, the example is distributed in WinSCP installer as a WinSCP extension.
You can use the script (e.g. VerifyFileChecksum.ps1
) from WinSCP GUI as a local custom command:
powershell.exe -File C:\path\VerifyFileChecksum.ps1 -sessionUrl "!S" -localPath "!^!" -remotePath "!/!" -pause
Advertisement
Make sure you check Use remote files option.
Note that calculation of remote file checksum is supported with SFTP and FTP protocols only, subject to support of respective protocol extension.
# @name Verify &Checksum # @command powershell.exe -ExecutionPolicy Bypass -File "%EXTENSION_PATH%" -sessionUrl "!S" -localPath "!^!" -remotePath "!/!" -pause # @description Compares checksums of the selected local and remote file # @flag RemoteFiles # @version 1 param ( # Use Generate URL function to obtain a value for -sessionUrl parameter. $sessionUrl = "sftp://user:mypassword;fingerprint=ssh-rsa-xx-xx-xx@example.com/", [Parameter(Mandatory)] $localPath, [Parameter(Mandatory)] $remotePath, [Switch] $pause = $False ) try { Write-Host $localPath # Calculate local file checksum $sha1 = [System.Security.Cryptography.SHA1]::Create() $localStream = [System.IO.File]::OpenRead($localPath) $localChecksum = [System.BitConverter]::ToString($sha1.ComputeHash($localStream)) Write-Host $localChecksum # Load WinSCP .NET assembly $assemblyPath = if ($env:WINSCP_PATH) { $env:WINSCP_PATH } else { $PSScriptRoot } Add-Type -Path (Join-Path $assemblyPath "WinSCPnet.dll") # Setup session options $sessionOptions = New-Object WinSCP.SessionOptions $sessionOptions.ParseUrl($sessionUrl) $session = New-Object WinSCP.Session try { # Connect $session.Open($sessionOptions) Write-Host $remotePath # Calculate remote file checksum $remoteChecksum = [System.BitConverter]::ToString($session.CalculateFileChecksum("sha-1", $remotePath)) Write-Host $remoteChecksum } finally { # Disconnect, clean up $session.Dispose() } # Compare cheksums if ($localChecksum -eq $remoteChecksum) { Write-Host "Match" $result = 0 } else { Write-Host "Does NOT match" $result = 1 } } catch [Exception] { Write-Host $_.Exception.Message $result = 1 } # Pause if -pause switch was used if ($pause) { Write-Host "Press any key to exit..." [System.Console]::ReadKey() | Out-Null } exit $result
Advertisement