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
.