【问题标题】:FTP: copy, check integrity and deleteFTP:复制、检查完整性和删除
【发布时间】:2015-08-18 00:17:18
【问题描述】:

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

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

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

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

这个例程每天都会从我的本地机器上执行。这样做的最佳选择是什么?是否有一种工具可以抽象出所有 3 个步骤?

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

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

【问题讨论】:

  • 你在什么平台上?
  • 哦,好的,我同时发布了 Windows 解决方案。我会保留它以防它帮助别人。希望您能通过 Linux 解决方案得到答案。
  • 如果您已经知道校验和,这将是一个完全不同的问题!
  • 只需下载文件,计算本地校验和并将其与文本文件中的校验和进行比较。如果匹配,删除远程文件。

标签: ftp checksum ftp-client


【解决方案1】:

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

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

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

一些可用于计算校验和的命令有:XSHA1XSHA256XSHA512XMD5MD5XCRCHASH

您可以使用 WinSCP 进行测试。 WinSCP 支持所有前面提到的命令。测试其checksum calculation functionchecksum 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 有一个带有校验和的文本文件。这使它成为一个完全不同的问题。只需下载文件,计算本地校验和并将其与文本文件中的校验和进行比较。如果匹配,则删除远程文件。

【讨论】:

    【解决方案2】:

    这是一个很长的机会,但如果服务器支持php,你可以利用它。

    将以下内容另存为php 文件(例如check.php),与name_of_file.txt 文件位于同一文件夹中:

    <? php
    echo md5_file('name_of_file.txt');
    php>
    

    然后,访问页面check.php,你应该会得到你文件的md5哈希。

    相关问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多