Explicación del cliente PowerShell SSH y la comunicación remota

¿Necesita administrar un servidor remoto o un dispositivo de red? Entonces probablemente esté usando SSH para conectarse y administrarlos.

El protocolo SSH le permite conectarse de forma segura a un dispositivo remoto a través de una red no segura (internet).

Para usar SSH, la mayoría de las personas usan una herramienta de cliente SSH, como Putty. Pero ¿sabías que PowerShell tiene un cliente SSH incorporado?

El cliente PowerShell SSH está habilitado de forma predeterminada en Windows 10 1809 y versiones posteriores.

Esto significa que ahora puede conectarse fácilmente a cualquier dispositivo remoto desde su herramienta de línea de comandos favorita.

También podemos usar SSH en PowerShell para administrar otra máquina con Windows de forma remota, pero deberá usar PowerShell 6 o superior para ejecutar el servidor SSH.

Cliente PowerShell SSH

La forma más común de usar SSH en PowerShell es como cliente SSH. Suponiendo que mantenga su Windows actualizado, debería tener SSH habilitado de forma predeterminada.

Simplemente puede comprobarlo abriendo PowerShell y escribiendo el siguiente comando:

# type ssh and press enter
ssh

# Result:
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [[email protected]]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

Con PowerShell abierto, puede conectarse a un servidor remoto o dispositivo de red con un solo comando:

ssh <username>@<host_ip_address>

# For example:
ssh [email protected]

También puede usar el nombre de host en lugar de la dirección IP. Si no proporciona un nombre de usuario, se utilizará su cuenta de usuario local.

Cuando presione enter, deberá ingresar la contraseña del usuario SSH. Cuando se conecte a un dispositivo por primera vez, deberá aceptar la clave del host. Simplemente presione enter o escriba sí.

powershell ssh

Si tiene SSH ejecutándose en un puerto diferente al puerto predeterminado 22, entonces puede cambiar el número de puerto con el -P bandera:

ssh <username>@<host_ip_address> -P <port_number>

# For example
ssh [email protected] -P 1022

PowerShell SSH Keygen

Algunos servidores o servicios remotos solo permiten el acceso SSH con el uso de una clave SSH.

Deberá generar una clave SSH local y cargar la clave en el servidor (o servicios) para que pueda verificarlo y crear una conexión segura.

La clave SSH existe a partir de una clave privada y pública. Deberá mantener la clave privada en su máquina local (y asegurarse de guardarla para usted) y la clave pública se carga en el servidor.

PowerShell tiene un keygen SSH incorporado que puede usar para generar una nueva clave. Escriba el siguiente comando para generar una clave:

ssh-keygen -t Ed25519

# Result
Generating public/private Ed25519 key pair.
Enter file in which to save the key (C:\Users\lazyadmin/.ssh/id_ed25519): <press enter>

# It will ask for apassphrase, you can leave it empty - see below for more details
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

# Generated key
Your identification has been saved in C:\Users\lazyadmin/.ssh/id_ed25519.
Your public key has been saved in C:\Users\lazyadmin/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:1232131+ASdi123SscvBbwn9Qfxj0 [email protected]
The key's randomart image is:
+--[ED25519 256]--+
| .o .            |
|..o+ .           |
|o..o .   o       |
|+..# o .         |
|=.+ =...S.       |
|.+.C.+. + E      |
|. *[email protected] O. .     |
| = O*o  .        |
|. +++.           |
+----[SHA256]-----+

La opción -t Ed25519 es un algoritmo más nuevo que se usa para crear la clave. En sistemas heredados, es posible que esto no sea compatible. A continuación, puede utilizar el antiguo sistema de cifrado RSA.

ssh-keygen -b 4096 -t RSA

Las claves se almacenan en su perfil de usuario. La ruta se muestra en la salida, pero generalmente se guardan en la siguiente ubicación:

%userprofile%\.ssh

Frase de contraseña SSH Keygen

Durante la creación de la clave ssh, se le pedirá que ingrese una frase de contraseña o que la deje vacía (predeterminado).

La frase de contraseña se utiliza para cifrar la clave local. De esta forma, puede almacenar de forma segura la clave local. Si alguien obtiene acceso a la clave, no puede usarla sin la frase de contraseña.

Pero antes de usar la frase de contraseña, hay una cosa importante que debe tener en cuenta. Deberá ingresar la frase de contraseña cada vez que use la clave SSH.

La mayoría de las veces, la clave SSH se usa en la automatización, como los servicios de GitHub, por ejemplo. En esos casos de uso, el uso de una frase de contraseña no es una opción.

Conexión remota de PowerShell con SSH

También podemos usar SSH en PowerShell para establecer una conexión remota a otra computadora o servidor.

Esto puede ser entre computadoras Windows o Windows-Linux y viceversa.

La creación de una sesión remota de PowerShell entre dos máquinas Windows ya era posible con WinRM.

Pero ahora también puede usar SSH para crear la conexión. La ventaja de SSH es que puede usarlo en Windows, Linux y macOS.

Necesitará PowerShell 6 o superior para usar SSH para conexiones remotas entre máquinas Windows y Linux. Estoy usando PowerShell 7 en los ejemplos a continuación.

Instalar servidor OpenSSH

El primer paso es instalar el Servidor OpenSSH en su computadora con Windows. Como se mencionó, el cliente SSH ahora está instalado y habilitado de forma predeterminada. Pero el servidor SSH no lo es.

Puede verificar si el servidor OpenSSH está instalado con el siguiente cmdlet:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

# Result:
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

Como puede ver, el servidor OpenSSH no está presente. Podemos instalarlo/habilitarlo con PowerShell:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

El siguiente paso es iniciar el servidor OpenSSH. Porque es un servicio que podemos configurar para que se inicie automáticamente:

# Start the sshd service
Start-Service sshd

# Set the service to automatic start
Set-Service sshd -StartupType Automatic

Configurar el servidor SSH

Necesitamos editar el archivo de configuración SSHD para que podamos autenticarnos con una contraseña y usar PowerShell en la máquina remota.

Si no configuramos el servidor SSH, solo podemos usar comandos básicos en la máquina remota (Windows Shell Prompt).

cliente ssh de powershell

Para usar completamente todos los cmdlets de PowerShell, necesitaremos configurar el servidor SSH para agregar PowerShell como un subsistema.

El archivo de configuración SSHD se almacena en la carpeta programdata. Como ya tenemos abierto PowerShell, lo usaremos para abrir el archivo de configuración:

# Change the directory to the programdata folder> ssh
cd $env:ProgramData\ssh

# Open the configuration file in notepad
PS C:\ProgramData\ssh> notepad .\sshd_config

En el archivo de configuración quitar el # antes de la linea Contraseña Autenticación sí y agregue la siguiente línea en el archivo de configuración. (La ubicación realmente no importa, pero agregué debajo de la parte «# anular el valor predeterminado de ningún subsistema»)

Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile

Reinicie el servicio SSHD para cargar el nuevo archivo de configuración:

Restart-service sshd

Comunicación remota SSH con PowerShell

Con el servidor SSH instalado en nuestro servidor, ahora podemos conectarnos usando PowerShell en nuestro cliente. Podemos usar el mismo cmdlet que con la comunicación remota de WinRM, la diferencia está en el nombre de host frente al nombre de la computadora.

  • New-PSSession
  • Entrar-PSSession
  • Invocar-Comando

Si utiliza New-PSSession -Computername entonces se utilizará el protocolo WinRM. Cuando usas el parámetro -hostname en su lugar, se utilizará SSH.

psremoting ssh

Puede iniciar una nueva sesión remota de PowerShell de la siguiente manera:

# Directly open a remoting session
Enter-PSSession -HostName la-srv-lab01 -UserName admin

# Create a new session
$session = New-PSSession -HostName la-srv-lab01 -UserName admin

# Invoke a command on the remote machine
Invoke-Command -Session $session -ScriptBlock {Get-Process -Name "Explorer"}

# Result:
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName   PSComputerName
 ------    -----      -----     ------      --  -- -----------   -------------
    517    49,78     122,99      24,83    3532   1 explorer      la-srv-lab01

Además, tenga en cuenta que usamos el parámetro -Username en vez de -Credentials como con el método WinRM.

Podemos ejecutar comandos remotos de PowerShell con el Invocar-Comando cmdlet o abra PowerShell en el servidor con Entrar-PSSession.

conexión remota powershell

Administrar múltiples conexiones SSH

La ventaja de herramientas como Putty es que puedes administrar y guardar tus conexiones SSH. Esto le permite volver a conectarse fácilmente a los servidores o dispositivos de red que usa con frecuencia.

Con Windows Terminal puedes lograr lo mismo. El nuevo Terminal de Windows le permite almacenar fácilmente diferentes conexiones y usar diferentes interfaces de línea de comandos.

Terminal de Windows

Si quieres saber más sobre Winows Terminal entonces no dejes de leer este artículo donde explico todos los detalles sobre este poderoso terminal.

Terminando

Usar SSH con PowerShell es realmente conveniente y elimina la necesidad de una herramienta adicional (cliente SSH).

Personalmente, uso mucho PowerShell, así que cuando necesito verificar o hacer algo en un servidor, es muy fácil conectarme rápidamente desde mi ventana de PowerShell.

Espero que este artículo le haya resultado útil, si tiene alguna pregunta, simplemente deje un comentario a continuación.

Otros artículos relacionados

Cómo usar Start-Transcript en PowerShell

Cómo usar Start-Transcript en PowerShell

Cuando ejecute scripts de PowerShell automáticamente, necesitará una forma de registrar cualquier error o advertencia que ocurra. Una opción es ...
Leer Más
Cómo usar Try, Catch, Finalmente en PowerShell

Cómo usar Try, Catch, Finalmente en PowerShell

Los errores en su secuencia de comandos de PowerShell pueden detener la ejecución de su secuencia de comandos, pero a ...
Leer Más
Explicación del cliente PowerShell SSH y la comunicación remota

Explicación del cliente PowerShell SSH y la comunicación remota

¿Necesita administrar un servidor remoto o un dispositivo de red? Entonces probablemente esté usando SSH para conectarse y administrarlos. El ...
Leer Más
Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Azure Automation es una de las herramientas más populares para ejecutar scripts de PowerShell en la nube. No solo puede ...
Leer Más
Cómo crear un perfil de PowerShell

Cómo crear un perfil de PowerShell

¿Quiere sacar más partido a su PowerShell? Luego, asegúrese de configurar su perfil de PowerShell para mejorar su consola de ...
Leer Más
[PowerShell] Exportar el estado de MFA de los usuarios de Office 365

[PowerShell] Exportar el estado de MFA de los usuarios de Office 365

Uno de los informes que realmente extraño en el Centro de administración de Microsoft 365 es una descripción general clara ...
Leer Más

Deja un comentario