Cómo crear herramientas PowerShell para configurar SFTP

Cuando se utilizan varios equipos con Windows, es posible que tenga que acceder a los recursos compartidos mediante el uso de diferentes protocolos. Cuando se crea un recurso compartido de archivos en una máquina Windows, se suele utilizar el protocolo SMB. Sin embargo, se pueden compartir archivos en máquinas que no sean Windows utilizando NFS, FTP, SFTP, FTPS, SCP y otros protocolos. Si sólo utiliza PowerShell, por ejemplo, en Windows Server sin interfaz gráfica, conectarse al recurso compartido SFTP por primera vez puede parecer difícil. Esta entrada de blog explica cómo utilizar SFTP en Windows con PowerShell.

¿Qué es SFTP?

SFTP son las siglas de SSH File Transfer Protocol o Protocolo Seguro de Transferencia de Archivos. SFTP es la alternativa segura al tradicional Protocolo de Transferencia de Archivos (FTP) con funciones similares. SFTP funciona en la capa de aplicación del modelo OSI (capa 7), utiliza la conexión SSH y es especialmente popular en máquinas Linux que suelen tener un cliente SFTP de línea de comandos integrado. Si utiliza Windows, instale un cliente SSH gratuito como WinSCP, que tiene una interfaz gráfica de usuario y admite algo más que SFTP, o configure las herramientas PowerShell si necesita utilizar la línea de comandos. Windows y PowerShell no admiten SFTP de forma nativa, por lo que será necesario instalar componentes adicionales.

Cuando se utiliza una conexión SSH, las transferencias de datos a través de la red están cifradas y la conexión es segura, a diferencia del protocolo FTP tradicional sin cifrar, en el que los datos pueden ser interceptados por atacantes. SSH se utiliza para la autenticación, y si tiene credenciales de usuario de Linux, puede acceder a los archivos en una máquina Linux de destino después de pasar la autenticación desde su cliente SFTP de línea de comandos o un cliente GUI. También le permite copiar archivos de/a una máquina Linux remota a su máquina Linux o Windows local. Configurar el servidor SFTP en Linux no es difícil: instala el servidor SSH, crea usuarios y concede los permisos necesarios para usuarios y archivos/directorios.

No confundas SFTP y FTPS. Estos dos protocolos se utilizan con fines similares. Sin embargo, SFTP utiliza un número de puerto para una conexión y FTPS utiliza varios números de puerto para los canales de control y datos (que pueden ser más difíciles de configurar desde el punto de vista de la seguridad, incluidos los cortafuegos). FTPS es FTP con SSL (Secure Socket Layer). No voy a entrar en cómo configurar el servidor SFTP en esta entrada del blog. Lea sobre la instalación y configuración de Linux (incluido el servidor SSH) en Hyper-V aquí.

Instalación del módulo Posh-SSH

Para realizar operaciones con archivos (copiar archivos, eliminar archivos) en máquinas remotas mediante SFTP y SCP en PowerShell, debe instalar el módulo Posh-SSH en PowerShell. La instalación de este módulo también le permite ejecutar comandos remotos en un ordenador remoto utilizando la sesión SSH. Se requiere PowerShell 3.0 y .NET Framework 4.0 para instalar y utilizar Posh-SSH. Por lo tanto, puede instalar este módulo en Windows 8 o en versiones más recientes de Windows. También puede actualizar manualmente PowerShell y .NET Framework en Windows 7 SP1. Ejecute este comando para instalar el módulo SFTP de PowerShell (Posh-SSH):

install-module posh-ssh

Posh PowerShell – installing the PowerShell SFTP module

Como alternativa, puede utilizar este comando para instalar el módulo Posh-SSH para PowerShell:

iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")

Se requiere una conexión a Internet para instalar Posh-SSH con los comandos anteriores. En mi caso, he instalado el módulo Posh-SSH en PowerShell y puedo pasar a los siguientes pasos de configuración.

Conexión a un host remoto en PowerShell

En esta entrada de blog, estoy utilizando un entorno con una máquina Windows local y una máquina Linux remota, que están conectadas a la misma red:

  • 192.168.101.210 es una máquina Windows local con Windows 10 versión 20H2 instalado
  • 192.168.101.209 es una máquina Linux remota en la que se ejecuta el servidor SSH (SFTP)
  • user1 es el nombre del usuario Linux

Estas direcciones IP se utilizan en mis ejemplos. Introduzca sus direcciones IP y credenciales en los comandos y archivos de configuración correspondientes.

Comprobemos nuestro recurso compartido SFTP conectándonos al servidor Linux mediante SFTP utilizando WinSCP, el cliente SFTP gratuito para Windows. Conectarse a un servidor SFTP es sencillo. Introduzca la dirección IP del host de destino, el número de puerto (TCP 22 es el número de puerto predeterminado, pero puede configurar un servidor SSH para utilizar un número de puerto personalizado), el nombre de usuario y la contraseña para conectarse. No olvides seleccionar el protocolo SFTP.

How to use SFTP – connecting to a remote machine in WinSCP

La conexión SFTP funciona en mi caso. Hemos copiado dos archivos en la carpeta compartida (la ubicación de los archivos es /home/user1/shared/ en la máquina Linux remota). Veamos cómo conectarse a la carpeta compartida desde Windows y cómo utilizar SFTP con Posh-SSH en PowerShell.

How to use SFTP in Windows

Para trabajar con archivos a través de SFTP, primero debes establecer una sesión. Para ello, ejecute este comando en PowerShell:

New-SFTPSession -Computername 192.168.101.209

La ventana de autenticación se muestra después de ejecutar el comando. Introduzca un nombre de usuario y una contraseña para acceder a la máquina Linux remota con los archivos a los que necesita acceder a través de SFTP. Si ha introducido las credenciales correctas, debería ver la salida de PowerShell con la información sobre el número de sesión SFTP, la dirección IP del host remoto y el estado de la conexión. Una vez creada una sesión, se le asigna un número de índice.

How to use SFTP in PowerShell – connecting to a server and creating a new session

Siempre puede introducir el comando help con los argumentos apropiados para mostrar la información de ayuda breve sobre la sintaxis de uso de los comandos PowerShell:

help New-SFTPSession

Lista de todos los comandos PowerShell elegantes disponibles:

Get-Command -Module Posh-SSH

o

Get-command -Name * -module *posh-ssh

Este es el método para crear una sesión SSH que te permita ejecutar un comando en un host remoto, por ejemplo, para listar archivos en el directorio:

Import-Module Posh-SSH

$SSHSession = New-SSHSession -ComputerName 192.168.101.209 -Credential $(Get-Credential) -Verbose

$SSH = $SSHSession | New-SSHShellStream

Invoke-SSHCommand -Index 0 -Command "ls -l /home/user1/shared"

PowerShell SFTP - listado de archivos en un directorio de un servidor SFTP

Creación de un script PowerShell

Vamos a crear un script de prueba para explorar las operaciones básicas que se pueden realizar en PowerShell cuando se trabaja con recursos SFTP. Esto no es un script SFTP, es un script PowerShell para trabajar con SFTP. Este script de prueba debe copiar el archivo de instalación de .NET Framework desde una máquina Linux remota a una máquina Windows local.

Cree un archivo de script test-PS.ps1 con el contenido que se muestra a continuación.

#Creating a folder to store files downloaded from the SFTP share

New-item -itemtype directory -force -path c:\temp\ps

#Setting credentials for the user account

$password = ConvertTo-SecureString "My_Password000" -AsPlainText -Force

$creds = New-Object System.Management.Automation.PSCredential ("user1", $password)

#Establishing an SFTP session

$Session = New-SFTPSession -Computername 192.168.101.209 -credencial $creds

#Downloading the .NET installer file by using the established SFTP session

Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:\temp\ps

Abra PowerShell en un equipo Windows, vaya a la carpeta donde está almacenado este script de prueba y ejecute el script

. .\test-PS.ps1

El archivo NetFrameworkNDP462.exe debe copiarse de /home/user1/shared/ (en una máquina Linux remota) a C:\temp\ps\ (en una máquina Windows local). Como se puede ver en la siguiente captura de pantalla, el archivo se copia correctamente en mi caso.

PowerShell SFTP – copying a file from an SFTP server in PowerShell

Para listar los archivos de un directorio en el recurso SFTP, puede crear un script PowerShell con el siguiente contenido:

$passwordTest = "Your_Password000"

$securePasswordTest = ConvertTo-SecureString $passwordTest -AsPlainText -Force

$credentialsTest = New-Object System.Management.Automation.PSCredential ("user1", $securePasswordTest)

$sessionTest = New-SFTPSession -ComputerName 192.168.101.209 -Credential $credentialsTest -AcceptKey

$sourceTest = "/home/user1/shared/"

$destinationTest= "c:\temp\ps\"

Get-SFTPChildItem -Recursive $sessionTest -Path $sourceTest | ForEach-Object{

   if ($_.Fullname -like '*.csv')

   {

      Get-SFTPFile $sessionTest -RemoteFile $_.FullName -LocalPath $destinationTest -Overwrite

   }

   write-output $_.FullName

}

Remove-SFTPSession $sessionTest -Verbose

Donde:

Tu_contraseña000 es la contraseña de la cuenta de usuario utilizada para conectarse vía SSH al SFTP compartido;

usuario1 es el nombre del usuario;

192.168.101.209 es la dirección IP del host remoto al que nos conectamos para acceder a los archivos vía SFTP.

Guarde la secuencia de comandos como list-files.ps1 y ejecútela en PowerShell en su equipo local desde una carpeta en la que se almacene este archivo de secuencia de comandos.

.\list-files.ps1

Preste atención al parámetro -Recursivo definido en el script de prueba. En la siguiente captura de pantalla puede ver los resultados de utilizar el parámetro -Recursivo y sin este parámetro.

How to use SFTP in PowerShell – checking contents of a directory on a remote server

Una de las desventajas de ejecutar scripts como los mostrados en los ejemplos anteriores es que las credenciales se almacenan en el texto sin formato de un script, lo que no es seguro. Un usuario que pueda abrir un script (incluso con permisos de sólo lectura) puede ver una contraseña y utilizarla para un acceso no autorizado.

Existe un método para mejorar el nivel de seguridad y almacenar una contraseña en la vista cifrada en un archivo. La API de protección de datos de Windows se utiliza para cifrar una contraseña, a la que sólo se puede acceder desde la cuenta de usuario y el ordenador utilizados para crear este archivo de contraseña.

(get-credential).password | ConvertFrom-SecureString | set-content "C:\temp\password.txt"

How to use SFTP in PowerShell – saving an encrypted password to a file

A continuación, la contraseña se guarda cifrada en el archivo de texto. Si alguien ve el contenido de este archivo, la contraseña no se muestra como texto sin formato.

A password for an SFTP user account is encrypted and saved in the text file

Cuando necesite introducir la contraseña, defina el archivo con una contraseña cifrada guardada(C:\temp\password.txt en nuestro caso).

$password = Get-Content "C:\temp\password.txt" | ConvertTo-SecureString

$credential = New-Object System.Management.Automation.PsCredential("user1",$password)

Este método de definir una contraseña es más seguro. Puede modificar el script en el que definió la contraseña. Como alternativa a abrir un script en un editor de texto, puede hacer clic con el botón derecho del ratón en el archivo ps1 y, en el menú contextual, hacer clic en Editar.

PowerShell SFTP automation – editing a script file

Se abre Windows PowerShell ISE. Se trata de una herramienta nativa de Windows que colorea la sintaxis para mayor comodidad y muestra los comandos PowerShell disponibles en el panel derecho.

SFTP script editing for running in PowerShell

Los comandos del script de prueba son ahora los siguientes:

New-item -itemtype directory -force -path c:\temp\ps

$password = Get-Content "C:\temp\password.txt" | ConvertTo-SecureString

$creds = $credential = New-Object System.Management.Automation.PsCredential("user1",$password)

$Session = New-SFTPSession -Computername 192.168.101.209 -credencial $creds

Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:\temp\ps

Puede volver a modificar el script y configurarlo para que ejecute el archivo de instalación descargado en el equipo Windows. El comando para instalar .NET Framework en modo silencioso (desde el directorio donde se encuentra el archivo de instalación) es:

.\NetFrameworkNDP462.exe /q /norestart

Introduzca el nombre de su archivo de instalación si el nombre es diferente.

Añade la línea al final del script:

Start-process "C:\temp\ps\NetFrameworkNDP462.exe" -argumentlist /q /norestart

Si desea eliminar el archivo de instalación una vez finalizada la instalación, considere añadir esta línea al final del script:

remove-item -path "C:\temp\ps\NetFrameworkNDP462.exe" -recurse -force

El uso de PowerShell y Posh-SSH le permite automatizar operaciones en PowerShell utilizando el protocolo SFTP para copiar archivos entre hosts en la red. Puede crear un script para descargar archivos y ejecutarlos para ahorrar tiempo cuando necesite realizar una instalación masiva de software en un gran número de ordenadores.

Conclusión

Ahora puede copiar archivos a/desde máquinas Linux a través de SFTP si hay un servidor SSH configurado en las máquinas Linux. Posh-SSH es un módulo de PowerShell necesario para utilizar SFTP en equipos Windows desde los que desee acceder a servidores SFTP remotos y realizar tareas de automatización de SFTP. PowerShell y SFTP pueden ser utilizados por proveedores de servicios gestionados y administradores de sistemas en organizaciones.

PowerShell se utiliza a menudo para gestionar máquinas virtuales Hyper-V y máquinas virtuales VMware (en PowerCLI). Recuerde hacer backup de las máquinas virtuales Hyper-V. Al igual que PowerShell se utiliza para automatizar la ejecución de comandos, NAKIVO Backup & Replication automatiza las copias de seguridad de las máquinas virtuales y proporciona muchas funciones adicionales de protección de datos. Además, el producto es compatible con la instalación en modo multiinquilino, lo que resulta especialmente útil para los proveedores de servicios gestionados. Descargue la edición gratuita de NAKIVO Backup & Replication y empiece hoy mismo a proteger sus máquinas virtuales y físicas.

1 Year of Free Data Protection: NAKIVO Backup & Replication

1 Year of Free Data Protection: NAKIVO Backup & Replication

Deploy in 2 minutes and protect virtual, cloud, physical and SaaS data. Backup, replication, instant recovery options.

Artículos recomendados