Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Información general
La comunicación remota de PowerShell suele usar WinRM para la negociación de la conexión y el transporte de datos. SSH está ahora disponible para plataformas Linux y Windows y permite una verdadera comunicación remota multiplataforma en PowerShell.
WinRM proporciona un modelo de hospedaje sólido para las sesiones remotas de PowerShell. La comunicación remota basada en SSH no admite actualmente la configuración remota de puntos de conexión y de Just Enough Administration (JEA).
La comunicación de sesiones remotas de SSH permite realizar la administración básica de PowerShell entre equipos Windows y Linux. La comunicación remota a través SSH crea un proceso de host de PowerShell en el equipo de destino como un subsistema SSH. Finalmente, implementaremos un modelo de hospedaje general, similar a WinRM, para admitir la configuración del punto de conexión y JEA.
Los cmdlets New-PSSession
, Enter-PSSession
y Invoke-Command
ahora tienen un nuevo conjunto de parámetros configurado para admitir esta nueva conexión remota.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Para crear una sesión remota, especifique el equipo de destino con el parámetro HostName y proporcione el nombre de usuario con UserName. Al ejecutar los cmdlets de forma interactiva, se le pedirá una contraseña. También puede usar la autenticación de clave SSH mediante un archivo de clave privada con el parámetro KeyFilePath . La creación de claves para la autenticación SSH varía según la plataforma.
Información general de configuración
PowerShell 6 o posterior, y SSH debe estar instalado en todos los equipos. Instale tanto el cliente SSH (ssh.exe
) como el servidor (sshd.exe
) para que pueda realizar la conexión remota a y desde los equipos. OpenSSH para Windows ya está disponible en la compilación 1809 de Windows 10 y Windows Server 2019. Para obtener más información, consulte Administrar Windows con OpenSSH. Para Linux, instale SSH, incluido el servidor sshd, que es adecuado para la plataforma. También debe instalar PowerShell desde GitHub para obtener la funcionalidad de comunicación remota SSH.
El servidor SSH debe configurarse para crear un subsistema SSH para hospedar un proceso de PowerShell en el equipo remoto. Además, debe habilitar la autenticación basada enclaves o contraseñas.
Instalación del servicio SSH en un equipo Windows
Instale la versión más reciente de PowerShell. Para obtener más información, consulte Instalación de PowerShell en Windows.
Puede confirmar que PowerShell tiene compatibilidad con la comunicación remota ssh enumerando los
New-PSSession
conjuntos de parámetros. Observará que hay nombres de conjunto de parámetros que comienzan con SSH. Esos conjuntos de parámetros incluyen parámetros SSH .(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Instale la versión más reciente de OpenSSH de Win32. Para obtener instrucciones de instalación, consulte Introducción a OpenSSH.
Nota:
Si desea establecer PowerShell como shell predeterminado para OpenSSH, consulte Configuración de Windows para OpenSSH.
Edite el
sshd_config
archivo ubicado en$Env:ProgramData\ssh
.Asegúrese de que la autenticación de contraseña está habilitada:
PasswordAuthentication yes
Cree el subsistema SSH que hospeda un proceso de PowerShell en el equipo remoto:
Subsystem powershell C:/progra~1/powershell/7/pwsh.exe -sshs
Nota:
Hay un error en OpenSSH para Windows que impide el uso de una ruta de acceso con espacios para el ejecutable del subsistema. Hay dos formas de evitar este problema:
- Usar el nombre corto de estilo Windows 8.3 para la ruta de acceso ejecutable de PowerShell
- Creación de un vínculo simbólico al ejecutable de PowerShell que da como resultado una ruta de acceso sin espacios
Para obtener más información, consulte el problema 784 en el repositorio de powerShell/Win32-OpenSSH.
Solo tiene que obtener el nombre de estilo 8.3 para el segmento de la ruta de acceso que contiene el espacio. De forma predeterminada, PowerShell 7 está instalado en
C:\Program Files\PowerShell\7\
. El nombre de estilo 8.3 paraProgram Files
debe serprogra~1
. Puede usar el siguiente comando para comprobar el nombre:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
El nombre 8.3 es una característica heredada del sistema de archivos NTFS que se puede deshabilitar. Esta característica debe estar habilitada para el volumen en el que está instalado PowerShell.
Como alternativa, puede crear un vínculo simbólico al ejecutable de PowerShell que da como resultado una ruta de acceso sin espacios. Este método es preferible porque permite actualizar el vínculo si cambia la ruta de acceso al ejecutable de PowerShell, sin necesidad de actualizar
sshd_config
el archivo.Use el comando siguiente para crear un vínculo simbólico al archivo ejecutable:
$newItemSplat = @{ ItemType = 'SymbolicLink' Path = 'C:\ProgramData\ssh\' Name = 'pwsh.exe' Value = (Get-Command pwsh.exe).Source } New-Item @newItemSplat
Este comando crea el vínculo simbólico en el mismo directorio que usa el servidor OpenSSH para almacenar las claves de host y otra configuración.
Opcionalmente, habilite la autenticación de claves:
PubkeyAuthentication yes
Para obtener más información, consulte Administración de claves OpenSSH.
Reinicie el servicio sshd.
Restart-Service sshd
Agregue la ruta donde está instalado OpenSSH a la variable de entorno PATH. Por ejemplo:
C:\Program Files\OpenSSH\
. Esta entrada permite que se encuentre elssh.exe
.
Instalación del servicio SSH en un equipo Ubuntu Linux
Instale la versión más reciente de PowerShell. Consulte Instalación de PowerShell en Ubuntu.
Instale ubuntu OpenSSH Server.
sudo apt install openssh-client sudo apt install openssh-server
Edite el
sshd_config
archivo en la ubicación/etc/ssh
.Asegúrese de que la autenticación de contraseña está habilitada:
PasswordAuthentication yes
Opcionalmente, habilite la autenticación de claves:
PubkeyAuthentication yes
Para obtener más información sobre cómo crear claves SSH en Ubuntu, consulte la página de manpage para ssh-keygen.
Agregue una entrada del subsistema de PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Nota:
La ubicación predeterminada del ejecutable de PowerShell es
/usr/bin/pwsh
. La ubicación puede variar en función de cómo haya instalado PowerShell.
Reinicie el servicio ssh .
sudo systemctl restart sshd.service
Instalación del servicio SSH en un equipo macOS
Instale la versión más reciente de PowerShell. Para obtener más información, Instalación de PowerShell en macOS.
Asegúrese de que la comunicación remota ssh esté habilitada siguiendo estos pasos:
- Abierto
System Settings
. - Haga clic en
General
. - Haga clic en
Sharing
. - Verifique
Remote Login
para establecerRemote Login: On
. - Permitir el acceso a los usuarios adecuados.
- Abierto
Edite el
sshd_config
archivo en la ubicación/private/etc/ssh/sshd_config
.Use un editor de texto como nano:
sudo nano /private/etc/ssh/sshd_config
Asegúrese de que la autenticación de contraseña está habilitada:
PasswordAuthentication yes
Agregue una entrada del subsistema de PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
Nota:
La ubicación predeterminada del ejecutable de PowerShell es
/usr/local/bin/pwsh
. La ubicación puede variar en función de cómo haya instalado PowerShell.Opcionalmente, habilite la autenticación de claves:
PubkeyAuthentication yes
Reinicie el servicio sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Nota:
Al actualizar el sistema operativo, es posible que se sobrescriba el archivo de configuración ssh. Asegúrese de comprobar el archivo de configuración después de una actualización.
Autenticación
La comunicación remota de PowerShell a través de SSH se basa en el intercambio de autenticación entre el cliente SSH y el servicio SSH y no implementa ningún esquema de autenticación. El resultado es que los esquemas de autenticación configurados, incluida la autenticación multifactor, se controlan mediante SSH e independiente de PowerShell. Por ejemplo, puede configurar el servicio SSH para requerir autenticación de clave pública y una contraseña única para mayor seguridad. La configuración de la autenticación multifactor está fuera del ámbito de esta documentación. Consulte la documentación de SSH sobre cómo configurar correctamente la autenticación multifactor y validar que funciona fuera de PowerShell antes de intentar usarlo con la comunicación remota de PowerShell.
Nota:
Los usuarios conservan los mismos privilegios en sesiones remotas. Es decir, los administradores tienen acceso a un shell con privilegios elevados y los usuarios normales no lo hacen.
Ejemplo de ejecución remota de PowerShell
La manera más fácil de probar la comunicación remota es probarla en un solo equipo. En este ejemplo, se crea una sesión remota de regreso en el mismo equipo Linux. Estamos usando cmdlets de PowerShell de forma interactiva, por lo que vemos mensajes de SSH que solicitan comprobar el equipo host y solicitar una contraseña. Puede hacer lo mismo en un equipo Windows para asegurarse de que la función de acceso remoto está operativa. A continuación, cambie el nombre de host de forma remota entre equipos.
Linux a Linux
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 UbuntuVM1 RemoteMachine Opened DefaultShell Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName
------- ------ ----- ----- ------ -- -- ----------- --------------
0 0 0 19 3.23 10635 635 pwsh UbuntuVM1
0 0 0 21 4.92 11033 017 pwsh UbuntuVM1
0 0 0 20 3.07 11076 076 pwsh UbuntuVM1
Linux a Windows
Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]
Windows a Windows
C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 WinVM2 RemoteMachine Opened DefaultShell Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable
Name Value
---- -----
PSEdition Core
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
SerializationVersion 1.1.0.1
BuildVersion 3.0.0.0
CLRVersion
PSVersion 6.0.0-alpha
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
GitCommitId v6.0.0-alpha.17
[WinVM2]: PS C:\Users\PSRemoteUser\Documents>
Limitaciones
El comando sudo no funciona en una sesión remota en un equipo Linux.
PSRemoting a través de SSH no admite perfiles y no tiene acceso a
$PROFILE
. Una vez en una sesión, puede cargar un perfil mediante dot sourcing del perfil con la ruta de acceso completa. Esto no está relacionado con los perfiles ssh. Puede configurar el servidor SSH para que use PowerShell como shell predeterminado y cargar un perfil a través de SSH. Consulte la documentación de SSH para obtener más información.Antes de PowerShell 7.1, la comunicación remota a través de SSH no admitía sesiones remotas de segundo salto. Esta funcionalidad se limitaba a las sesiones que usan WinRM. PowerShell 7.1 permite que
Enter-PSSession
yEnter-PSHostProcess
funcionen desde cualquier sesión remota interactiva.