Comunicação remota do PowerShell através de SSH
Descrição geral
A comunicação remota do PowerShell normalmente usa o WinRM para negociação de conexão e transporte de dados. O SSH agora está disponível para plataformas Linux e Windows e permite a verdadeira comunicação remota do PowerShell multiplataforma.
O WinRM fornece um modelo de hospedagem robusto para sessões remotas do PowerShell. Atualmente, a comunicação remota baseada em SSH não oferece suporte à configuração de ponto final remoto e à administração apenas suficiente (JEA).
A comunicação remota SSH permite que você faça a comunicação remota de sessão básica do PowerShell entre computadores Windows e Linux. A comunicação remota SSH cria um processo de host do PowerShell no computador de destino como um subsistema SSH. Eventualmente, implementaremos um modelo geral de hospedagem, semelhante ao WinRM, para suportar a configuração de endpoint e JEA.
Os New-PSSession
cmdlets , Enter-PSSession
e Invoke-Command
agora têm um novo conjunto de parâmetros para dar suporte a essa nova conexão remota.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Para criar uma sessão remota, especifique o computador de destino com o parâmetro HostName e forneça o nome de usuário com UserName. Ao executar os cmdlets interativamente, será solicitada uma senha. Você também pode usar a autenticação de chave SSH usando um arquivo de chave privada com o parâmetro KeyFilePath . A criação de chaves para autenticação SSH varia de acordo com a plataforma.
Informações gerais de configuração
O PowerShell 6 ou superior e o SSH devem ser instalados em todos os computadores. Instale o cliente SSH (ssh.exe
) e o servidor (sshd.exe
) para que você possa ir e vir remotamente dos computadores. O OpenSSH para Windows já está disponível no Windows 10 build 1809 e no Windows Server 2019. Para obter mais informações, consulte Gerenciar o Windows com OpenSSH. Para Linux, instale SSH, incluindo servidor sshd, que é apropriado para sua plataforma. Você também precisa instalar o PowerShell do GitHub para obter o recurso de comunicação remota SSH.
O servidor SSH deve ser configurado para criar um subsistema SSH para hospedar um processo do PowerShell no computador remoto. Além disso, você deve habilitar a autenticação baseada em senha ou chave.
Instalar o serviço SSH em um computador Windows
Instale a versão mais recente do PowerShell. Para obter mais informações, consulte Instalando o PowerShell no Windows.
Você pode confirmar se o PowerShell tem suporte à comunicação remota SSH listando os conjuntos de
New-PSSession
parâmetros. Você notará que há nomes de conjuntos de parâmetros que começam com SSH. Esses conjuntos de parâmetros incluem parâmetros SSH .(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Instale o Win32 OpenSSH mais recente. Para obter instruções de instalação, consulte Introdução ao OpenSSH.
Nota
Se você quiser definir o PowerShell como o shell padrão para OpenSSH, consulte Configurando o Windows para OpenSSH.
Edite o
sshd_config
arquivo localizado em$env:ProgramData\ssh
.Verifique se a autenticação de senha está ativada:
PasswordAuthentication yes
Crie o subsistema SSH que hospeda um processo do PowerShell no computador remoto:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
Nota
A partir do PowerShell 7.4, você não precisa mais usar o parâmetro ao executar o
-nologo
PowerShell no modo de servidor SSH.Nota
O local padrão do executável do PowerShell é
c:/progra~1/powershell/7/pwsh.exe
. O local pode variar dependendo de como você instalou o PowerShell.Você deve usar o nome abreviado 8.3 para todos os caminhos de arquivo que contenham espaços. Há um bug no OpenSSH para Windows que impede que os espaços funcionem em caminhos executáveis do subsistema. Para obter mais informações, consulte este problema do GitHub.
O nome curto 8.3 para a
Program Files
pasta no Windows é geralmenteProgra~1
. No entanto, você pode usar o seguinte comando para certificar-se de:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
EightDotThreeFileName --------------------- c:\progra~1
Opcionalmente, habilite a autenticação de chave:
PubkeyAuthentication yes
Para obter mais informações, consulte Gerenciando chaves OpenSSH.
Reinicie o serviço sshd.
Restart-Service sshd
Adicione o caminho onde o OpenSSH está instalado à variável de ambiente Path. Por exemplo,
C:\Program Files\OpenSSH\
. Esta entrada permite que ossh.exe
para ser encontrado.
Instale o serviço SSH em um computador Ubuntu Linux
Instale a versão mais recente do PowerShell, consulte Instalando o PowerShell no Ubuntu.
Instale o Ubuntu OpenSSH Server.
sudo apt install openssh-client sudo apt install openssh-server
Edite o
sshd_config
arquivo no local/etc/ssh
.Verifique se a autenticação de senha está ativada:
PasswordAuthentication yes
Opcionalmente, habilite a autenticação de chave:
PubkeyAuthentication yes
Para obter mais informações sobre como criar chaves SSH no Ubuntu, consulte a página de manual para ssh-keygen.
Adicione uma entrada de subsistema do PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -nologo
Nota
O local padrão do executável do PowerShell é
/usr/bin/pwsh
. O local pode variar dependendo de como você instalou o PowerShell.Nota
A partir do PowerShell 7.4, você não precisa mais usar o parâmetro ao executar o
-nologo
PowerShell no modo de servidor SSH.Reinicie o serviço ssh .
sudo systemctl restart sshd.service
Instalar o serviço SSH num computador macOS
Instale a versão mais recente do PowerShell. Para obter mais informações, Instalando o PowerShell no macOS.
Certifique-se de que a comunicação remota SSH está ativada seguindo estes passos:
- Abrir
System Settings
. - Clique em
General
- Clique em
Sharing
. - Verifique
Remote Login
para definirRemote Login: On
. - Permitir o acesso aos usuários apropriados.
- Abrir
Edite o
sshd_config
arquivo no local/private/etc/ssh/sshd_config
.Use um editor de texto como nano:
sudo nano /private/etc/ssh/sshd_config
Verifique se a autenticação de senha está ativada:
PasswordAuthentication yes
Adicione uma entrada de subsistema do PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
Nota
O local padrão do executável do PowerShell é
/usr/local/bin/pwsh
. O local pode variar dependendo de como você instalou o PowerShell.Nota
A partir do PowerShell 7.4, você não precisa mais usar o parâmetro ao executar o
-nologo
PowerShell no modo de servidor SSH.Opcionalmente, habilite a autenticação de chave:
PubkeyAuthentication yes
Reinicie o serviço sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Nota
Quando você atualiza seu sistema operacional, o arquivo de configuração SSH pode ser substituído. Certifique-se de verificar o arquivo de configuração após uma atualização.
Autenticação
A comunicação remota do PowerShell sobre SSH depende da troca de autenticação entre o cliente SSH e o serviço SSH e não implementa nenhum esquema de autenticação em si. O resultado é que todos os esquemas de autenticação configurados, incluindo a autenticação multifator, são manipulados por SSH e independentes do PowerShell. Por exemplo, você pode configurar o serviço SSH para exigir autenticação de chave pública e uma senha de uso único para maior segurança. A configuração da autenticação multifator está fora do escopo desta documentação. Consulte a documentação do SSH sobre como configurar corretamente a autenticação multifator e validá-la fora do PowerShell antes de tentar usá-la com a comunicação remota do PowerShell.
Nota
Os usuários mantêm os mesmos privilégios em sessões remotas. Ou seja, os administradores têm acesso a um shell elevado, e os usuários normais não.
Exemplo de comunicação remota do PowerShell
A maneira mais fácil de testar a comunicação remota é experimentá-la em um único computador. Neste exemplo, criamos uma sessão remota de volta para o mesmo computador Linux. Estamos usando cmdlets do PowerShell interativamente, então vemos prompts do SSH pedindo para verificar o computador host e solicitando uma senha. Você pode fazer a mesma coisa em um computador Windows para garantir que a comunicação remota esteja funcionando. Em seguida, remoto entre computadores alterando o nome do host.
Linux para 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 para 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 para 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>
Limitações
O comando sudo não funciona em uma sessão remota para um computador Linux.
PSRemoting sobre SSH não suporta perfis e não tem acesso ao
$PROFILE
. Uma vez em uma sessão, você pode carregar um perfil por ponto sourcing o perfil com o caminho de arquivo completo. Isso não está relacionado aos perfis SSH. Você pode configurar o servidor SSH para usar o PowerShell como o shell padrão e carregar um perfil por meio do SSH. Consulte a documentação do SSH para obter mais informações.Antes do PowerShell 7.1, a comunicação remota sobre SSH não oferecia suporte a sessões remotas de segundo salto. Esse recurso foi limitado a sessões usando o WinRM. O PowerShell 7.1 permite
Enter-PSSession
eEnter-PSHostProcess
funciona a partir de qualquer sessão remota interativa.