在发布管道中使用 ftp 连接到 webapp 以下载文件

Connecting to webapp with ftp in a release pipeline to download files

我试过使用以下 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 连接时,我使用 FTP 协议和 TLS/SSL 对端口 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
}

我最终向网络应用程序添加了一个新的凭据,并将主机名中的 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()
}    

FtpWebRequest(也不支持任何其他 built-in .NET FTP API)不支持隐式 TLS/SSL 加密。
参见 Does .NET FtpWebRequest Support both Implicit (FTPS) and explicit (FTPES)?


Posh-SSH 是 SSH/SFTP 库。与FTP.

无关

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

此外,如果 WinSCP 适合您,您可以根据您的工作 GUI 会话使用 WinSCP .NET assembly from the PowerShell. WinSCP GUI can even generate a code template for you