首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FTP:复制、检查完整性和删除

FTP:复制、检查完整性和删除
EN

Stack Overflow用户
提问于 2015-06-03 16:43:48
回答 2查看 13.3K关注 0票数 2

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

  1. 将文件从FTP服务器复制到本地计算机。
  2. 检查下载的文件是否正常(即md5checksum)。
  3. 如果下载良好,则从FTP服务器删除下载的文件。

这个例程将每天在我的本地机器上执行。做这件事的最佳选择是什么?是否有一个工具可以对所有三个步骤进行抽象?

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-06-03 18:49:27

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

最新的建议是:

https://datatracker.ietf.org/doc/html/draft-bryan-ftpext-hash-02

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

可以用来计算校验和的命令有:XSHA1XSHA256XSHA512XMD5MD5XCRCHASH

您可以使用WinSCP对其进行测试。WinSCP支持前面提到的所有命令。测试它的校验和计算函数脚本命令。如果它们工作,启用日志和check,什么命令以及WinSCP对您的服务器使用什么语法。

ftp ( Windows或*nix版本)和lftp都不支持校验和计算,更不用说自动验证下载的文件了。

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

您肯定可以在某个功能丰富的客户端帮助下编写脚本。

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

在Windows上,您可以使用使用PowerShell WinSCP .NET程序集编写脚本。

代码语言:javascript
运行
复制
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

你可以像这样运行:

代码语言:javascript
运行
复制
powershell -file checksum.ps1 -remotePath ./file.dat -localPath C:\path\file.dat

这部分是基于WinSCP 通过SFTP/FTP协议验证远程文件与本地文件的校验和示例的。

(我是WinSCP的作者)

后来编辑了这个问题,说OP有一个带有校验和的文本文件。这使它成为一个完全不同的问题。只需下载该文件,计算本地校验和,并将其与文本文件中的校验和进行比较。如果它们匹配,则删除远程文件。

票数 3
EN

Stack Overflow用户

发布于 2018-07-08 05:47:41

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

将以下内容保存为php文件(例如,check.php),保存在与name_of_file.txt文件相同的文件夹中:

代码语言:javascript
运行
复制
<? php
echo md5_file('name_of_file.txt');
php>

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

相关问题:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30626006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档