Cómo crear herramientas de PowerShell para configurar SFTP
Cuando se ejecutan varios equipos con Windows, es posible que sea necesario acceder a recursos compartidos mediante distintos protocolos. Cuando se crea un recurso compartido de archivos en un equipo con Windows, normalmente se utiliza el protocolo SMB. Sin embargo, los archivos se pueden compartir en equipos que no sean de Windows utilizando NFS, FTP, SFTP, FTPS, SCP y otros protocolos. Si solo utilizas PowerShell, por ejemplo, en Windows Server sin interfaz gráfica, conectarte por primera vez a un recurso compartido SFTP puede parecer complicado. En esta entrada del blog se explica cómo utilizar SFTP en Windows con PowerShell.
¿Qué es SFTP?
SFTP son las siglas de «SSH File Transfer Protocol» o «Secure File Transfer Protocol». SFTP es la alternativa segura al Protocolo de Transferencia de Archivos (FTP) tradicional, 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 equipos Linux, que suelen tener un cliente SFTP de línea de comandos integrado. Si utilizas Windows, instala un cliente SSH gratuito como WinSCP, que cuenta con una interfaz gráfica de usuario y es compatible con más protocolos además de SFTP, o configura las herramientas de PowerShell si necesitas utilizar la línea de comandos. Windows y PowerShell no admiten SFTP de forma nativa, por lo que será necesario instalar componentes adicionales.
Al utilizar una conexión SSH, las transferencias de datos a través de la red se cifran 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 dispones de credenciales de usuario de Linux, puedes acceder a los archivos de una máquina Linux de destino después de superar la autenticación desde tu cliente SFTP de línea de comandos o desde un cliente con interfaz gráfica. También te permite copiar archivos desde o hacia una máquina Linux remota a tu máquina local, ya sea Linux o Windows. Configurar el servidor SFTP en Linux no es difícil: basta con instalar el servidor SSH, crear usuarios y otorgar los permisos necesarios a los usuarios y a los archivos o directorios.
No confundas SFTP con FTPS. Estos dos protocolos se utilizan con fines similares. Sin embargo, SFTP utiliza un único número de puerto para la conexión, mientras que FTPS utiliza varios números de puerto para los canales de control y de datos (lo que puede resultar más complicado de configurar desde el punto de vista de la seguridad, incluyendo los cortafuegos). FTPS es FTP con SSL (Secure Socket Layer). En esta entrada del blog no voy a entrar en detalles sobre cómo configurar un servidor SFTP. Lee sobre la instalación y configuración de Linux (incluido el servidor SSH) en Hyper-V en aquí.
Instalación del módulo Posh-SSH
Para realizar operaciones con archivos (copiar o eliminar archivos) en equipos remotos mediante SFTP y SCP en PowerShell, debes instalar el módulo Posh-SSH en PowerShell. La instalación de este módulo también te permite ejecutar comandos remotos en un equipo remoto mediante la sesión SSH. Los requisitos para instalar y utilizar Posh-SSH son PowerShell 3.0 y .NET Framework 4.0. Por lo tanto, puede instalar este módulo en Windows 8 o en versiones posteriores 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
Como alternativa, puedes 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 necesita 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 del blog, utilizo un entorno con un equipo local con Windows y un equipo remoto con Linux, ambos conectados a la misma red:
- 192.168.101.210 es un equipo local con Windows 10 versión 20H2 instalado
- 192.168.101.209 es un equipo remoto con Linux en el que se ejecuta el servidor SSH (SFTP)
- user1 es el nombre del usuario de Linux
Estas direcciones IP se utilizan en mis ejemplos. Introduce tus direcciones IP y credenciales en los comandos y archivos de configuración correspondientes.
Comprobemos nuestro recurso compartido SFTP conectándonos al servidor Linux a través de SFTP utilizando WinSCP, el cliente SFTP gratuito para Windows. Conectarse a un servidor SFTP es muy sencillo. Introduce la dirección IP del host de destino, el número de puerto (el puerto TCP 22 es el predeterminado, pero puedes configurar un servidor SSH para que utilice un número de puerto personalizado), el nombre de usuario y la contraseña para conectarte. No olvides seleccionar el protocolo SFTP.
En mi caso, la conexión SFTP funciona. Hemos copiado dos archivos a la carpeta compartida (la ubicación de los archivos es /home/user1/shared/ en la máquina Linux remota). Veamos cómo conectarnos a la carpeta compartida desde Windows y cómo utilizar SFTP con Posh-SSH en PowerShell.
Para trabajar con archivos a través de SFTP, primero debes establecer una sesión. Para ello, ejecuta este comando en PowerShell:
New-SFTPSession -Computername 192.168.101.209
Después de ejecutar el comando, aparecerá la ventana de autenticación. Introduce un nombre de usuario y una contraseña para acceder a la máquina Linux remota que contiene los archivos a los que necesitas acceder mediante 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 la sesión, se le asigna un número de índice.
Siempre puede introducir el comando «help» con los argumentos adecuados para mostrar la información de ayuda breve sobre la sintaxis de uso de los comandos de PowerShell:
help New-SFTPSession
Mostrar todos los comandos disponibles de PowerShell: Get-Command -Module Posh-SSH
o
Get-command -Name * -module *posh-ssh
A continuación se explica cómo crear una sesión SSH que te permita ejecutar un comando en un host remoto; por ejemplo, para mostrar los archivos de un 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"
Creación de un script de PowerShell
Creemos un script de prueba para explorar las operaciones básicas que se pueden realizar en PowerShell al trabajar con recursos SFTP. No se trata de un script de SFTP, sino de un script de PowerShell para trabajar con SFTP. Este script de prueba debería copiar el archivo de instalación de .NET Framework desde un equipo Linux remoto a un equipo Windows local.
Crea un test-PS.ps1 archivo de script 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:tempps
#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 -credential $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:tempps
Abre PowerShell en una máquina Windows, ve a la carpeta donde está almacenado este script de prueba y ejecuta el script
.test-PS.ps1
El archivo NetFrameworkNDP462.exe debería copiarse desde /home/user1/shared/ (en una máquina Linux remota) a C:tempps (en una máquina Windows local). Como se puede ver en la captura de pantalla siguiente, en mi caso el archivo se ha copiado correctamente.
Para mostrar la lista de archivos de un directorio en el recurso SFTP, puedes crear un script de 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:tempps"
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:
Your_Password000 es la contraseña de la cuenta de usuario utilizada para conectarse vía SSH al recurso compartido SFTP;
user1 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 a través de SFTP.
Guarda el script como list-files.ps1 y ejecuta este script en PowerShell en tu equipo local desde la carpeta donde se encuentra almacenado este archivo de script.
.list-files.ps1
Presta atención al parámetro -Recursive definido en el script de prueba. En la captura de pantalla siguiente puedes ver los resultados al utilizar el parámetro -Recursive y sin este parámetro.
Una de las desventajas de ejecutar scripts como los que se muestran en los ejemplos anteriores es que las credenciales se almacenan en texto sin cifrar en el script, lo cual no garantiza la seguridad. Un usuario que pueda abrir un script (incluso con permisos de solo lectura) puede ver una contraseña y utilizarla para obtener acceso no autorizado.
Existe un método para mejorar el nivel de seguridad y almacenar una contraseña de forma cifrada en un archivo. Se utiliza la API de protección de datos de Windows para cifrar una contraseña, a la que solo se puede acceder desde la cuenta de usuario y el ordenador utilizados para crear dicho archivo de contraseñas. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
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 aparecerá como texto sin cifrar.
Cuando necesites introducir la contraseña, indica el archivo en el que se guarda la contraseña cifrada ( C:temppassword.txt en nuestro caso).
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
Este método para definir una contraseña es más seguro. Puedes modificar el script en el que has definido la contraseña. Como alternativa a abrir un script en un editor de texto, puedes hacer clic con el botón derecho del ratón sobre el archivo ps1 y, en el menú contextual, hacer clic en Edit.
Se abrirá Windows PowerShell ISE. Se trata de una herramienta nativa de Windows que resalta la sintaxis en color para mayor comodidad y muestra los comandos de PowerShell disponibles en el panel derecho.
Los comandos del script de prueba son ahora los siguientes:
New-item -itemtype directory -force -path c:tempps
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$creds = $credential = New-Object System.Management.Automation.PsCredential("user1",$password)
$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds
Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps
Puedes modificar de nuevo tu script y configurarlo para que ejecute el archivo de instalación descargado en el equipo con Windows. El comando para instalar .NET Framework en modo silencioso (desde la ubicación donde se encuentra el archivo de instalación) es:
.NetFrameworkNDP462.exe /q /norestart
Introduce el nombre de tu archivo de instalación si es diferente.
Añade la siguiente línea al final del script:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Si deseas eliminar el archivo de instalación después de que se finalice la instalación, considera añadir esta línea al final del script:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
El uso de PowerShell y Posh-SSH te permite automatizar operaciones en PowerShell mediante el protocolo SFTP para copiar archivos entre hosts de la red. Puedes crear un script para descargar archivos y ejecutarlos, lo que te permitirá ahorrar tiempo cuando necesites realizar una instalación masiva de software en un gran número de ordenadores.
Conclusión
Ahora puedes copiar archivos hacia y desde máquinas Linux a través de SFTP si hay un servidor SSH configurado en dichas máquinas. Posh-SSH es un módulo de PowerShell necesario para utilizar SFTP en equipos Windows desde los que se desea acceder a servidores SFTP remotos y realizar tareas de automatización SFTP. Los proveedores de servicios gestionados y los administradores de sistemas de las organizaciones pueden utilizar PowerShell y SFTP.
PowerShell se utiliza a menudo para gestionar máquinas virtuales Hyper-V y máquinas virtuales de VMware (en PowerCLI). Recuerda realizar backups de las máquinas virtuales Hyper-V. Al igual que PowerShell se utiliza para automatizar la ejecución de comandos, NAKIVO Backup & Replication automatiza el backup de máquina virtual y ofrece muchas funciones adicionales de protección de datos. Además, el producto admite la instalación en modo multiinquilino, lo cual resulta especialmente útil para los proveedores de servicios gestionados. Descarga la edición gratuita de NAKIVO Backup & Replication y empieza a proteger tus máquinas virtuales y físicas hoy mismo.










