通过 URL 保存目录批量 SFTP 下载指定文件

通过 URL 保存目录批量 SFTP 下载指定文件

我有一份需要通过 SFTP 提取的数百个文件的列表。它们位于不同的目录中,我需要将它们放在本地计算机上设置的同一目录中。重要的是,位于这些目录中的列表中的文件不包含在下载中。

我在这里询问了下载网址的问题:批量下载带组织的图像。我还需要有 SFTP 下载选项。如能提供任何建议,我将不胜感激。

答案1

我不知道有哪个软件可以实现这个功能。

我甚至认为你找不到任何东西,因为使用 HTTP URL 作为 SFTP 下载规范并不常见,甚至没有从 URL 到 SFTP 路径的直接映射。

如果你有如下 URL:

https://www.example.com/sample1/image1.jpg

仅当网站 SFTP 帐户已 chroot 时,才会显示使用 SFTP 呈现的文件/sample1/usage1.jpg。如果没有,则文件可以位于类似路径/home/user/httpdocs/sample1/usage1.jpg或任何其他路径中。

因此我相信你必须以某种方式编写脚本。

另外,您没有指定 URL 中的主机名是更改还是保持不变。如果更改,您从哪里获取主机凭据?或者它们也包含在 URL 中吗?

下面是使用 PowerShell 脚本的示例WinSCP .NET 程序集

进行相应配置$remoteRoot

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions
    $sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
    $sessionOptions.HostName = "example.com"
    $sessionOptions.UserName = "user"
    $sessionOptions.Password = "mypassword"
    $sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="

    $session = New-Object WinSCP.Session

    $remoteRoot = "/home/user"

    try
    {
        # Connect
        $session.Open($sessionOptions)

        foreach ($line in [System.IO.File]::ReadLines("list.txt"))
        {
            if ($line -Match "http\://[a-z.]+(/(.*)/[a-z0-9.]+)$")
            {
                $remotePath = $matches[1]
                $remoteDir = $matches[2]
                $localDir = $remoteDir -Replace "/", "\"

                if (!(Test-Path $localDir))
                {
                    Write-Host "Creating directory $localDir"
                    New-Item $localDir -Type directory | Out-Null
                }

                Write-Host "Downloading $remotePath"
                $session.GetFiles(($remoteRoot + $remotePath), ($localDir + "\")).Check()
            }
            else
            {
                Write-Host "$line does not have expected URL format"
            }
        }        
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch [Exception]
{
    Write-Host $_.Exception.Message
    exit 1
}

(我是 WinSCP 的作者)

相关内容