Una Guía Detallada para Empezar con PowerShell Remoto

¿Alguna vez has querido ejecutar comandos de PowerShell en una máquina remota desde la comodidad de tu estación de trabajo? Bueno, con la Remotización de PowerShell puedes hacerlo. Con PowerShell remoto, puedes ejecutar comandos y scripts en múltiples sistemas remotos de manera sostenible.

¿Suena interesante? Sigue leyendo para aprender cómo domar esas máquinas remotas al estilo PowerShell.

Prerrequisitos

Este tutorial será una demostración práctica. Si deseas seguirlo, asegúrate de tener al menos tres computadoras con PowerShell 7. Una será tu computadora de gestión y las otras dos serán las máquinas remotas.

Este tutorial utilizará las siguientes computadoras.

  • A Windows 10 PC with PowerShell 7 installed as the management computer. You will launch remote commands from this machine.
  • A Windows 10 PC with PowerShell 7 installed. This machine will be the endpoint for remote PowerShell over WinRM.
    • A user account on the remote Windows machine with local administrator rights. This tutorial uses a user account called ma.
  • Máquina Linux con SSHD habilitado para servir como un punto de conexión remoto de PowerShell sobre SSH. Este tutorial utiliza Fedora 35.
    • Una cuenta de usuario para ejecutar comandos remotos en la máquina Linux. La cuenta debe tener permisos de sudo y acceso SSH. Este tutorial utiliza una cuenta llamada test. Cree una cuenta de usuario en este punto si no tiene una en su máquina Linux.

Habilitar PowerShell Remoto en Windows Sobre WinRM

Cuando instala PowerShell 7, hay una opción para habilitar la ejecución remota de PowerShell, y es posible que la haya habilitado en ese momento. Pero, para asegurarse, siga los siguientes pasos para habilitar PowerShell remoto.

1. Inicie sesión en el PC remoto con Windows 10.

2. Abra PowerShell como administrador.

3. Ejecute el siguiente comando para habilitar PowerShell remoto.

Enable-PSRemoting

El comando ejecuta varios cambios de configuración, que verás en la consola.

Enabling Remote PowerShell on Windows over WinRM

Habilitando PowerShell remoto en Linux a través de SSH

WinRM es exclusivo de Windows, lo que significa que no puedes habilitar PowerShell remoto en Linux con él. En cambio, puedes habilitar PowerShell remoto a través de SSH en Linux. Suponiendo que ya has instalado PowerShell, sigue los siguientes pasos.

1. Inicia sesión en tu sistema Linux remoto y abre una sesión de terminal.

2. Abre el archivo de configuración del servidor SSH en un editor de texto. Utiliza el editor de texto que prefieras, como Gedit, Sublime o Nano. En este ejemplo se usa Gedit.

sudo nano /etc/ssh/sshd_config

3. A continuación, agrega la siguiente línea al archivo. Esta línea crea un subsistema SSH que aloja un proceso de PowerShell.

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Create an SSH subsystem for PowerShell on Linux

4. Cierra el editor.

5. Por último, reinicia el servidor SSH ejecutando el siguiente comando.

sudo systemctl restart sshd

Agregando hosts de confianza de PowerShell remoto en la máquina local

En este punto, tu ordenador remoto está listo para recibir comandos. Pero, tu ordenador de gestión puede negarse a conectarse a los hosts de PowerShell remotos si no están en la lista de hosts de confianza. Para evitar posibles problemas de conexión remota, debes agregar los hosts remotos a tus hosts de confianza.

Abre PowerShell como administrador en tu ordenador de gestión.

Ejecuta el siguiente comando winrm. Este comando agrega tus máquinas remotas de Windows (192.168.8.107) y Linux (192.168.8.171) a la lista de hosts de confianza de tu ordenador.

winrm set winrm/config/client '@{TrustedHosts=" 192.168.8.171,192.168.8.107"}'
Adding remote machines as Trusted Hosts

Ejecución de Comandos en Computadoras Remotas

Con todas las piezas en su lugar, ejecutarás comandos en la máquina remota en esta sección.

1. Abre una nueva sesión de PowerShell en tu ordenador de gestión.

2. Ahora, ejecuta el siguiente comando Invoke-Command para listar los primeros cinco servicios en la máquina remota como usuario ma. El comando a ejecutar aparece entre las llaves del interruptor ScriptBlock, como se muestra a continuación.

Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Windows host

3. Para realizar lo mismo con un host Linux remoto, ejecuta el siguiente comando en su lugar. Observa que -HostName reemplaza a -ComputerName, y -UserName reemplaza a -ComputerName. Estos parámetros indican al cmdlet Invoke-Command que el objetivo es un host SSH.

Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Linux host

Ejecución de Scripts en Computadoras Remotas

También puedes ejecutar un archivo de script de PowerShell en un equipo remoto con el cmdlet Invoke-Command. Pero en lugar de especificar el parámetro -ScriptBlock, especificarás el parámetro -FilePath seguido de la ruta local del script.

1. Primero, crea un archivo de script de PowerShell llamado nametime.ps1 en tu ordenador local.

2. Abre el script en tu editor de script preferido y añade el siguiente código. Guarda el archivo después.

# nametime.ps1
hostname
Get-Date
Create the PowerShell script

3. Ejecute el cmdlet Invoke-Command con el parámetro -FilePath. El -FilePath debe apuntar al archivo de script. En este ejemplo, el archivo de script está en el mismo directorio de trabajo.

# Invocar el script en el PowerShell remoto a través de WinRM
Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -FilePath .\nametime.ps1

# Invocar el script en el PowerShell remoto a través de SSH
Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -FilePath .\nametime.ps1
Invoke a script on remote PowerShell hosts

Gestión de un equipo remoto de forma interactiva

En la sección anterior, viste cómo ejecutar comandos individuales en una máquina remota. En esta sección, aprenderás a abrir una sesión interactiva, de modo que puedas ejecutar múltiples comandos en la máquina remota como si estuviera local.

1. Ejecute el comando Enter-PSSession para iniciar una sesión remota en la máquina en 192.168.8.107 como usuario ma.

Enter-PSSession -ComputerName 192.168.8.107 -Credential ma

Ingrese la contraseña de la cuenta de usuario remoto, ma, en el indicador como se muestra a continuación.

Entering an interactive remote session

Verá un nuevo indicador, como se muestra a continuación. La dirección IP dentro de los corchetes indica el host de PowerShell remoto.

Viewing a remote prompt

3. Liste los archivos en el directorio de trabajo actual con el comando dir, como se muestra a continuación. Puede ejecutar tantos comandos de PowerShell como desee dentro de una sesión dir

dir

El contenido del directorio debería estar en su pantalla, como se muestra en la captura de pantalla a continuación.

Linting the files on a remote machine

4. Ejecute el cmdlet Exit-PSSession a continuación para salir de la sesión una vez que haya terminado de gestionar la máquina remota.

Exit-PSSession

Al salir, debería volver a un indicador local, como se muestra en la captura de pantalla a continuación

Exiting a remote session

Desconectar y Reconectar Sesiones de PowerShell Remotas

Es posible almacenar una sesión de forma persistente como alternativa a sesiones interactivas o comandos únicos. Almacenar una sesión te permite cambiar entre sesiones sin perder contexto. En esta sección, aprenderás a crear y gestionar sesiones persistentes.

1. Ejecuta el cmdlet New-PSSession para crear una sesión en la computadora remota, 192.168.8.107, como usuario ma (-Credential). Guarda la sesión en la variable $var, de la siguiente manera.

$var = New-PSSession -ComputerName 192.168.8.107 -Credential ma

2. Ejecuta la variable $var para ver su contenido de la siguiente manera

$var

Como se muestra a continuación, deberías ver un objeto de sesión con un RemoteMachine ComputerType y un State establecido en Opened.

Displaying the details of a session

3. Ejecuta el comando Enter-PSSession para ingresar a la sesión almacenada en $var.

Enter-PSSession $var

Si todo está bien, el indicador cambiará a un indicador remoto sin más salida, como se muestra a continuación.

Entering a persistent remote session

4. Crea una variable, $rem1, dentro de la sesión. Usa cualquier nombre de variable y cadena de identificación que te convenga. Usarás esta variable más adelante para determinar si te has conectado a la misma sesión.

$rem1 = "same session"

5. Ejecuta el siguiente comando para salir de la sesión remota de PowerShell.

Exit-PSSession
Disconnecting from a persistent remote session

6. Vuelve a establecer una sesión remota de PowerShell.

Enter-PSSession $var

7. Ejecuta la variable $rem1 en el indicador de sesión remota, como se muestra a continuación, para ver su valor.

$rem1

Deberías ver el mismo valor que estableciste anteriormente antes de salir de la sesión remota de PowerShell, confirmando que te has vuelto a conectar a la misma sesión.

Viewing the value of a session variable

8. Ejecuta el comando Exit-PSSession para salir de la sesión una vez más de la siguiente manera.

Exit-PSSession

9. Finalmente, ejecuta Invoke-Command con el interruptor session establecido en $var para mostrar el nombre de host de la máquina remota en la misma sesión remota. Este método es una forma alternativa de ejecutar comandos en la misma sesión sin tener que conectarse, desconectarse y reconectarse manualmente a una sola sesión.

Invoke-Command -Session $var -ScriptBlock {hostname}
Displaying the hostname of a remote machine

10. Ejecuta Remove-PSSession para eliminar por completo la sesión almacenada en $var.

Remove-PSSession $var

Conclusión

¡Felicidades! Al llegar al final de este tutorial, has aprendido cómo administrar un sistema Windows o Linux con PowerShell remoto. Esta guía tenía como objetivo mojarte los pies. ¿Por qué no sumergirte aún más con PowerShell en Linux sobre una sesión remota?

Source:
https://adamtheautomator.com/remote-powershell/