Cómo cargar archivos a través de FTP con PowerShell

Logotipo de Powershell

El Protocolo de transferencia de archivos (FTP) es un servicio común utilizado para transferir archivos entre clientes y servidores. Suele ser útil automatizar estas transferencias de archivos, y los scripts de PowerShell pueden resultar útiles para acelerar este proceso.

Cómo usar FTP en PowerShell

Hay algunas formas diferentes de realizar transferencias FTP en PowerShell.

Lo más sencillo es usar WebClient.UploadFile. PowerShell es un lenguaje de secuencias de comandos orientado a objetos y tiene acceso completo a .NET bibliotecas estándar con New-Object. Con esto, puedes crear un nuevo WebClientconfigure las credenciales para ello y cargue un archivo.

$client = New-Object System.Net.WebClient
$client.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$client.UploadFile("ftp://example.com/path/archive.zip", "C:archive.zip")

Esto funcionará bien, pero no podrá manejar solicitudes encriptadas TLS/SSL ni realizar transferencias FTP «activas». Usando FtpWebRequestcubierto a continuación, resolverá este problema.

Sin embargo, no es una buena práctica almacenar su nombre de usuario y contraseña en una secuencia de comandos, especialmente si esa secuencia de comandos se está enviando a un repositorio de Git compartido. En su lugar, puede establecer variables de entorno como FtpUsername y acceder a ellos en el script.

function uploadToFTPServer($remote, $local) 

uploadToFTPServer "ftp://example.com/path/archive.zip", "C:archive.zip"

Convertir esto en una función también le permitirá realizar fácilmente múltiples transferencias llamando a la función con diferentes parámetros.

Transferencias FTP avanzadas con PowerShell

Si necesita más control, debe usar FtpWebRequest. Esto admitirá transferencias TLS y también le permitirá desactivar el modo pasivo. La forma más fácil de usarlo es abrir una secuencia de archivos y copiarla en la secuencia FTP.

function uploadToFTPServer($remote, $local) 

uploadToFTPServer "ftp://example.com/archive.zip" "C:archive.zip"

Dado que utiliza secuencias de archivos y no lee todos los bytes, esto tiene la ventaja de funcionar mejor con transferencias de archivos grandes.

Envío de transferencias SFTP con Posh-SSH

SFTP es un protocolo FTP alternativo que opera sobre SSH. Es un poco más complicado de usar que el FTP normal, ya que no puede simplemente enviar un nombre de usuario y una contraseña, y no es compatible con PowerShell nativo.

Deberá instalar el Posh-SSH paquete para comunicarse a través de SFTP:

Install-Module -Name Posh-SSH

Luego podrá iniciar una nueva sesión, utilizando un nuevo objeto de credencial. Esto funciona de la misma manera que las transferencias de solicitudes web, excepto que también deberá cerrar la sesión al final.

Import-Module Posh-SSH

$Password = ConvertTo-SecureString $Env:FtpPassword -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ($Env:FtpUsername, $Password)

$FilePath = "C:archive.zip"
$SftpPath="/folder"

$ThisSession = New-SFTPSession -ComputerName '1.2.3.4' -Credential $Credential

Set-SFTPFile -SessionId ($ThisSession).SessionId -LocalFile $FilePath -RemotePath $SftpPath
Get-SFTPSession | % 

Envío de archivos enormes con una barra de progreso en PowerShell

Usando la secuencia de archivos CopyTo es simple, pero para transferencias largas, es posible que desee algún tipo de control del progreso. Esto es un poco complicado de agregar, ya que tendrá que copiar las secuencias usted mismo, pero funciona bien con el siguiente script:

$request = [Net.WebRequest]::Create("ftp://example.com/path/archive.zip")
$request.Credentials =
New-Object System.Net.NetworkCredential($Env:FtpUsername, $Env:FtpPassword)
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile

$fileStream = [System.IO.File]::OpenRead("C:archive.zip")
$ftpStream = $request.GetRequestStream()

$buffer = New-Object Byte[] 10240
while (($read = $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0)


$ftpStream.Dispose()
$fileStream.Dispose()

Deja un comentario