2

У меня есть список из нескольких сотен файлов, которые мне нужно вытащить через SFTP. Они расположены в разных каталогах, и мне нужно, чтобы они находились в одной и той же папке на моем локальном компьютере. Важно, что файлы в списке, расположенном в этих каталогах, не включены в загрузку.

Я задал этот вопрос для загрузки URL-адресов здесь: Массовая загрузка изображений с организацией. Мне также нужно иметь возможность загрузки SFTP. Буду признателен за любые рекомендации по поводу этого.

1 ответ1

1

Я не знаю ни одного программного обеспечения, которое может сделать это из коробки.

Я даже предполагаю, что вы их не найдете, поскольку использование URL-адреса HTTP в качестве спецификации загрузки SFTP не является распространенным явлением, и даже нет прямого преобразования URL-адреса в путь SFTP.

Если у вас есть URL, как

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

Файл, представленный с использованием SFTP, будет находиться в /sample1/usage1.jpg только в том случае, если для учетной записи SFTP веб-сайта предусмотрена привязка. Если нет, файл может быть в пути, например /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 xx:xx:xx:xx:xx:xx..."

    $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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .