【问题标题】:Connecting to webapp with ftp in a release pipeline to download files在发布管道中使用 ftp 连接到 webapp 以下载文件
【发布时间】:2026-01-21 16:35:01
【问题描述】:

我尝试使用以下 powershell 脚本连接到 ftp:

#FTP Server Information - SET VARIABLES
$ftp = "ftp://XXX.com/" 
$user = 'UserName' 
$pass = 'Password'
$folder = 'FTP_Folder'
$target = "C:\Folder\Folder1\"

#SET CREDENTIALS
$credentials = new-object System.Net.NetworkCredential($user, $pass)

function Get-FtpDir ($url,$credentials) {
    $request = [Net.WebRequest]::Create($url)
    $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
    if ($credentials) { $request.Credentials = $credentials }
    $response = $request.GetResponse()
    $reader = New-Object IO.StreamReader $response.GetResponseStream() 
    while(-not $reader.EndOfStream) {
        $reader.ReadLine()
    }
    #$reader.ReadToEnd()
    $reader.Close()
    $response.Close()
}

#SET FOLDER PATH
$folderPath= $ftp + "/" + $folder + "/"

$files = Get-FTPDir -url $folderPath -credentials $credentials

$files 

$webclient = New-Object System.Net.WebClient 
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
$counter = 0
foreach ($file in ($files | where {$_ -like "*.txt"})){
    $source=$folderPath + $file  
    $destination = $target + $file 
    $webclient.DownloadFile($source, $target+$file)

    #PRINT FILE NAME AND COUNTER
    $counter++
    $counter
    $source
}

但我在连接时不断收到 530 错误(身份验证错误)。我知道用户名和密码有效,因为我已经在其他 ftp 客户端中对其进行了测试。 所以,我认为这可能是个问题,因为 webapp 需要特定的协议,而这个脚本中没有使用。

我一直在做一些研究,我发现一种叫做 Posh-SSH 的东西可能会起作用。但是有没有办法修改我的脚本呢?当我使用 winscp 连接时,我使用带有 TLS/SSL 隐式加密的 FTP 协议到端口 990。

更新:工作 我做了以下工作:

#FTP Server Information - SET VARIABLES
$ftp = "ftp://waws-prod-xxx.ftp.azurewebsites.windows.net" 
$user = 'xxxxx\xxxxx@email.com' 
$pass = '$FRnqxxpxxxxxxx'
$folder = 'site/wwwroot/wwwroot/images/uploaded'
$target = "C:\Folder\Folder1\"

#SET CREDENTIALS
$credentials = new-object System.Net.NetworkCredential($user, $pass)

function Get-FtpDir ($url,$credentials) {
    $request = [Net.WebRequest]::Create($url)
    $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
    if ($credentials) { $request.Credentials = $credentials }
    $response = $request.GetResponse()
    $reader = New-Object IO.StreamReader $response.GetResponseStream() 
    while(-not $reader.EndOfStream) {
        $reader.ReadLine()
    }
    #$reader.ReadToEnd()
    $reader.Close()
    $response.Close()
}

#SET FOLDER PATH
$folderPath= $ftp + "/" + $folder + "/"

$files = Get-FTPDir -url $folderPath -credentials $credentials

Write-Host($files)


$files 

$webclient = New-Object System.Net.WebClient 
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
$counter = 0
foreach ($file in ($files)){
    $source=$folderPath + $file  
    $destination = $target + $file 
    $webclient.DownloadFile($source, $target+$file)

    #PRINT FILE NAME AND COUNTER
    $counter++
    $counter
    $source
}

我最终为 Web 应用程序添加了一个新凭据,并将主机名中的 sftp 更改为 ftp,现在它可以工作了。使用 webpublish 文件中的凭据也可以。

我还让 WinSCP 工作,我能够下载完整的文件夹和孩子们。

#FTP Server Information - SET VARIABLES
$ftp = "waws-prod-xxx-xxx.ftp.azurewebsites.windows.net" 
$user = 'xxxxxx\xxxx@xxxxx.no' 
$pass = '$xxxxxxxxx'
$folder = 'site/wwwroot/wwwroot/images/uploaded/*'
$target = "C:\Folder\Folder1\*"

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

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Ftp
    HostName = $ftp
    UserName = $user
    Password = $pass 
}

$session = New-Object WinSCP.Session

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

    # Download files
    $session.GetFiles($folder, $target).Check()
}
finally
{
    # Disconnect, clean up
    $session.Dispose()
}    

【问题讨论】:

    标签: powershell ftp azure-powershell


    【解决方案1】:

    FtpWebRequest(或任何其他内置 .NET FTP API)不支持隐式 TLS/SSL 加密。
    Does .NET FtpWebRequest Support both Implicit (FTPS) and explicit (FTPES)?


    Posh-SSH 是 SSH/SFTP 库。它与 FTP 无关。


    当您收到 “身份验证错误” 时,我相信您的问题实际上有所不同。仔细检查您的凭据。您可能在代码中使用了错误的代码。

    另外,如果 WinSCP 适合您,您可以使用 WinSCP .NET assembly from the PowerShell。 WinSCP GUI 甚至可以generate a code template for you,基于您的工作 GUI 会话。

    【讨论】:

    • 我确实最终使用了 WINSCP。