FTP:复制,检查完整性并删除

时间:2015-06-03 16:43:49

标签: ftp checksum ftp-client

我正在寻找一种使用ftplftp连接到远程服务器的方法,并确保执行以下步骤:

  1. 将文件从FTP服务器复制到本地计算机。

  2. 检查下载的文件是否正常(即md5checksum)。

  3. 如果下载正常,则从FTP服务器删除下载的文件。

  4. 此例程将每天从我的本地计算机执行。这样做的最佳选择是什么?是否有一个工具可以对所有3个步骤进行抽象?

    我在客户端和服务器上运行Linux。

    更新:此外,我还有一个文本文件,其中包含FTP服务器上的文件与其MD5sum之间的关联。它们是在FTP服务器端计算的。

2 个答案:

答案 0 :(得分:2)

首先,确保您的远程服务器完全支持校验和计算。很多人没有。我相信甚至没有标准的FTP命令来计算远程文件的校验和。有很多提案,有很多专有解决方案。

最新提案是:
https://tools.ietf.org/html/draft-bryan-ftpext-hash-02

因此,即使您的服务器支持校验和计算,您也必须找到支持相同命令的客户端。

可用于计算校验和的一些命令包括:​​XSHA1XSHA256XSHA512XMD5MD5,{{1} }和XCRC

您可以使用WinSCP对其进行测试。 WinSCP支持所有前面提到的命令。测试其checksum calculation functionchecksum scripting command。如果它们有效,enable logging并检查,WinSCP对您的服务器使用什么命令和语法。

HASH(Windows和* nix版本)和ftp都不支持校验和计算,只允许自动验证下载的文件。

我甚至不知道任何其他可以自动验证下载文件的客户端。

你可以在一些功能丰富的客户端的帮助下编写脚本。

我在OP指定他/她在Linux上之前写过这个答案。我保留了Windows解决方案,以防它帮助其他人。

在Windows上,您可以使用PowerShell using WinSCP .NET assembly编写脚本。

lftp

您可以像以下一样运行它:

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

这部分基于Verifying checksum of a remote file against a local file over SFTP/FTP protocol的WinSCP示例。

(我是WinSCP的作者)

答案 1 :(得分:0)

这是一个远景,但是如果服务器支持php,则可以利用它。

将以下内容保存为<div id="popup-demo"><!-- Direct `body` child --> <h3>Popup Demo</h3> <p>Content goes here...</p> </div> <script> jQuery('#popup-demo').ysExit({}); </script> 文件(例如public static List<UserPresave> GetAllUserPresavesByPresaveIDs(List<Presave> ids) { using (var Context = GetContext()) { return Context.Presaves.Where(p => p.UserPresaves.Any(a => ids.Contains(a.Presave))).ToList(); } } ),与php文件放在同一文件夹中:

check.php

然后,访问页面name_of_file.txt,您应该获取文件的md5哈希值。

相关问题: