O PowerShell ftp get não salva no Windows Server

2

De um Windows Server 2012, usando PoweShell , conecto-me a um dispositivo remoto por meio de ftp e executo get para recuperar um arquivo. O processo continua sem problemas, mas o arquivo não é salvo na minha máquina local. O comando retorna Operation Complete e, após alguns segundos, a conexão é fechada.

Operation CompleteConnection closed by remote host.
ftp> 

No local de destino, um arquivo temporário de tamanho 0 é criado no início do processo e permanece inalterado. Tmp6A94.tmp

Eu tentei abrir o firewall seguindo este Como configurar o Firewall do Windows para um servidor FTP no modo passivo

netsh advfirewall firewall add rule name=”FTP Service” dir=in protocol=TCP enable=yes action=allow profile=any service=ftpsvc localport=any 
netsh advfirewall set global StatefulFTP disable

O que estou perdendo?

EDIT 1

Eu testei o comportamento ftp em outro WS2012 e também em um WS2012R2 e os dois não têm o mesmo problema. Nenhum deles tem o modo passivo ftp do firewall. Gostaria de saber se pode haver alguma outra regra de firewall que permita a transferência ftp.

EDIT 2

Este é o script PowerShell que eu uso para recuperar o arquivo do dispositivo remoto por meio de ftp :

function getFTPFile([String]$fileName)
{
    $ftpUser = "user"
    $ftpPassword = "password"
    $ftpServer = "ftpServer"

    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPassword)

    $uri = New-Object System.Uri("$ftpServer/files")

    $webclient.DownloadFile($uri, $fileName)
} 

Executar este script ou fazê-lo manualmente a partir do console PowerShell renderiza o mesmo resultado. Tudo funcionará corretamente até que o arquivo precise ser salvo no destino. Eu usei com êxito este script em outros servidores Windows.

Este é o erro gerado pelo script:

Exception calling "DownloadFile" with "2" argument(s): "The remote server returned an error: 150-Starting operation:
STATUS: Getting logs ...
Please wait...
Please wait...
STATUS: Finished getting logs
STATUS: get logs operation is complete
Size: 8262246 bytes
Please wait for 8 seconds ...
Operation Complete150-Accepted data connection
150 (8262246 bytes) to download
."
At C:\Users\administrator\getFTPFile.ps1:73 char:2
+     $webclient.DownloadFile($uri, $fileName)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

E esta é a operação com falha de um prompt PowerShell :

ftp> get logs logsFile
200 PORT command successful
150-Starting operation:
STATUS: Getting logs ...
Please wait...
Please wait...
STATUS: Finished getting logs
STATUS: get logs operation is complete
Size: 8283146 bytes
Please wait for 8 seconds ...

Operation CompleteConnection closed by remote host.

Esta é a saída quando a transferência é bem sucedida:

ftp> get logs logsFile
200 PORT command successful
150-Starting operation:
STATUS: Getting logs ...
Please wait...
Please wait...
STATUS: Finished getting logs
STATUS: get logs operation is complete
Size: 8283146 bytes
Please wait for 8 seconds ...

Operation Complete150-Connecting to port 63596
150 (8275012 bytes) to download
226-File successfully transferred
226 0.778 seconds (measured here), 10.15 Mbytes per second
ftp: 8275012 bytes received in 0.76Seconds 10916.90Kbytes/sec.

Além disso, eu não tentei nenhum outro cliente FTP.

EDIT 3

Agora, está funcionando ao usar ftp do PowerShell terminal e não está funcionando no script, sendo executado a partir do PowerShell .

    
por slybloty 29.01.2014 / 00:48

1 resposta

0

Não sei exatamente qual é o processo por trás do método WebClient::DownloadFile , mas parece-me que ele interrompe a conexão do ftp logo antes da conclusão da transferência do download, fazendo com que a operação falhe.

Usando o método assíncrono, consegui baixar o arquivo com êxito.
Aqui está minha função atualizada usando o WebClient::DownloadFileTaskAsync method . Eu também implementei uma verificação de status.

function getFTPfile([String]$fileName)
{
    $ftpUser = "user"
    $ftpPassword = "password"
    $ftpServer = "ftpServer"

    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPassword)

    $uri = New-Object System.Uri("$ftpServer/files")

    $job = $webclient.DownloadFileTaskAsync($uri, $fileName) 

    while(!$job.IsCompleted)
    { 
        Write-Host "Downloading file..."
        sleep 10
    }
    if($job.Status -ne "RanToCompletion")
        { Write-Host "Failed to download file." }
    else
        { Write-Host "Download successful." }
}
    
por 10.03.2015 / 22:59