首先,确保您的远程服务器完全支持校验和计算。许多人没有。我相信甚至没有标准的 FTP 命令来计算远程文件的校验和。有很多提案,也有很多专有解决方案。
最新提案是:
https://datatracker.ietf.org/doc/html/draft-bryan-ftpext-hash-02
所以即使你的服务器支持校验和计算,你也必须找到支持相同命令的客户端。
一些可用于计算校验和的命令有:XSHA1、XSHA256、XSHA512、XMD5、MD5、XCRC 和 HASH。
您可以使用 WinSCP 进行测试。 WinSCP 支持所有前面提到的命令。测试其checksum calculation function 或checksum scripting command。如果它们有效,enable logging 并检查 WinSCP 对您的服务器使用的命令和语法。
ftp(无论是 Windows 还是 *nix 版本)和 lftp 都不支持校验和计算,只允许自动验证下载的文件。
我什至不知道有任何其他客户端可以自动验证下载的文件。
您绝对可以借助一些功能丰富的客户端编写脚本。
在 OP 指定他/她在 Linux 上之前,我已经写了这个答案。我保留 Windows 解决方案以防它帮助其他人。
在 Windows 上,您可以使用 PowerShell using WinSCP .NET assembly 编写脚本。
param (
$sessionUrl = "ftp://username:password@example.com/",
[Parameter(Mandatory)]
$localPath,
[Parameter(Mandatory)]
$remotePath,
[Switch]
$pause = $False
)
try
{
# Load WinSCP .NET assembly
Add-Type -Path (Join-Path $PSScriptRoot "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 "Downloading $remotePath to $localPath..."
$session.GetFiles($remotePath, $localPath).Check();
# Calculate remote file checksum
$buf = $session.CalculateFileChecksum("sha-1", $remotePath)
$remoteChecksum = [BitConverter]::ToString($buf)
Write-Host "Remote file checksum: $remoteChecksum"
# Calculate local file checksum
$sha1 = [System.Security.Cryptography.SHA1]::Create()
$localStream = [System.IO.File]::OpenRead($localPath)
$localChecksum = [BitConverter]::ToString($sha1.ComputeHash($localStream))
Write-Host "Downloaded file checksum: $localChecksum"
# Compare cheksums
if ($localChecksum -eq $remoteChecksum)
{
Write-Host "Match, deleting remote file"
$session.RemoveFiles($remotePath).Check();
$result = 0
}
else
{
Write-Host "Does NOT match"
$result = 1
}
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
}
catch [Exception]
{
Write-Host "Error: $($_.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
你可以像这样运行它:
powershell -file checksum.ps1 -remotePath ./file.dat -localPath C:\path\file.dat
这部分基于Verifying checksum of a remote file against a local file over SFTP/FTP protocol 的 WinSCP 示例。
(我是 WinSCP 的作者)
这个问题后来被编辑说 OP 有一个带有校验和的文本文件。这使它成为一个完全不同的问题。只需下载文件,计算本地校验和并将其与文本文件中的校验和进行比较。如果匹配,则删除远程文件。