Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Visã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 a realização de sessões remotas básicas do PowerShell entre computadores Windows e Linux. A comunicação remota SSH cria um processo anfitrião 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
, Enter-PSSession
, e Invoke-Command
cmdlets agora têm um novo conjunto de parâmetros para suportar esta 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. Para obter o recurso de remoting por SSH, você também precisa instalar o PowerShell a partir do GitHub.
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çãobaseada 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.
Observação
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
Observação
Há um bug no OpenSSH para Windows que impede que você use um caminho com espaços para o executável do subsistema. Há duas maneiras de contornar esse problema:
- Use o nome curto no estilo Windows 8.3 para o caminho executável do PowerShell
- Criar um link simbólico para o executável do PowerShell que resulta em um caminho sem espaços
Para obter mais informações, consulte o problema #784 no repositório PowerShell/Win32-OpenSSH.
Você só precisa obter o nome de estilo 8.3 para o segmento do caminho que contém o espaço. Por padrão, o PowerShell 7 é instalado no
C:\Program Files\PowerShell\7\
. O nome de estilo 8.3 paraProgram Files
deve serprogra~1
. Você pode usar o seguinte comando para verificar o nome:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
O nome 8.3 é um recurso herdado do sistema de arquivos NTFS que pode ser desativado. Esse recurso deve ser habilitado para o volume no qual o PowerShell está instalado.
Como alternativa, você pode criar um link simbólico para o executável do PowerShell que resulta em um caminho sem espaços. Esse método é preferido porque permite que você atualize o link se o caminho para o executável do PowerShell for alterado, sem também precisar atualizar seu
sshd_config
arquivo.Use o seguinte comando para criar um link simbólico para o executável:
$newItemSplat = @{ ItemType = 'SymbolicLink' Path = 'C:\ProgramData\ssh\' Name = 'pwsh.exe' Value = (Get-Command pwsh.exe).Source } New-Item @newItemSplat
Este comando cria o link simbólico no mesmo diretório usado pelo servidor OpenSSH para armazenar as chaves de host e outras configurações.
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 à sua variável de ambiente PATH. Por exemplo,
C:\Program Files\OpenSSH\
. Esta entrada permite que ossh.exe
seja 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 arquivo
sshd_config
na localização/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
Observação
O local padrão do executável do PowerShell é
/usr/bin/pwsh
. O local pode variar dependendo de como você instalou o PowerShell.
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:
- Abra
System Settings
. - Clique em
General
- Clique em
Sharing
. - Verifique
Remote Login
para definirRemote Login: On
. - Permitir o acesso aos usuários apropriados.
- Abra
Edite o arquivo
sshd_config
na localização/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
Observação
O local padrão do executável do PowerShell é
/usr/local/bin/pwsh
. O local pode variar dependendo de como você instalou o PowerShell.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
Observação
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.
Observação
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 a usar interativamente cmdlets do PowerShell, então vemos mensagens de aviso do SSH a pedir para verificar o computador hospedeiro e a solicitar uma senha. Você pode fazer a mesma coisa em um computador Windows para garantir que a comunicação remota esteja funcionando. Em seguida, estabeleça uma ligação remota entre os 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 através de SSH não suporta Perfis e não tem acesso ao
$PROFILE
. Uma vez durante uma sessão, pode carregar um perfil ao executar o comando de origem do perfil com o caminho completo do arquivo. 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 que
Enter-PSSession
eEnter-PSHostProcess
trabalhem a partir de qualquer sessão remota interativa.