我有一份需要通过 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 的作者)