Windows equivalente ao ssh - como conectar-se a uma máquina remota e acessar a linha de comando?


19

Estou com dificuldades para encontrar uma solução para estender uma estrutura projetada para máquinas * nix para o Windows. Atualmente, a estrutura é executada de um servidor * nix e ssh para outros servidores * nix e executa vários comandos diferentes, como verificar arquivos de log, sincronizar arquivos do controle de origem, enviar logs de volta ao controle de origem, etc. preso é como se conectar às máquinas remotas do Windows e acessar a linha de comando. A conexão também pode vir de outra máquina Windows, não precisa ser iniciada em uma máquina unix, pode ir de janelas para janelas em vez de unix para janelas.

Aqui está um exemplo de como os comandos são atualmente executados em sistemas unix. Algo assim está em um loop que percorre uma lista de nomes de servidores. Eu preciso obter algo assim para rodar em máquinas Windows.

ssh ${user}@${server} "cd /app/app_name/logs; <export source control params>; <submit logs to source control>" >> Log.txt

Além disso, eu preferiria não usar uma ferramenta de terceiros (meu orçamento é de aproximadamente US $ 0). Eu verifiquei o PsExec e alguns outros, mas parece que você precisa de acesso de administrador ou precisa passar usuários / passar em texto sem formatação.


Por padrão, um usuário não administrativo normalmente não pode executar código em uma máquina remota. Você pode ter que criar sua própria solução. Existe um contexto específico em que o código precisa ser executado? Os comandos devem ser executados sempre o mesmo?
Harry Johnston

Embora você possa instalar o MobaSSH como servidor e usar o putty como cliente, ou usar o psexec para fazer o que quiser mais ou menos (o que é desaprovado na minha experiência), o idioma equivalente no mundo do Windows não é usar um shell em tudo, exceto contar com o suporte no nível de comando para execução remota, seja um comando legado ou um PowerShell combinado com compartilhamentos de rede e unidades mapeadas.
Shanteva

Respostas:


14

Use o Powershell Remoting: https://msdn.microsoft.com/en-us/powershell/scripting/core-powershell/running-remote-commands

Desavergonhadamente copiado e colado:

Comunicação Remota do Windows PowerShell

O sistema de comunicação remota do Windows PowerShell, que usa o protocolo WS-Management, permite executar qualquer comando do Windows PowerShell em um ou mais computadores remotos. Permite estabelecer conexões persistentes, iniciar sessões interativas 1: 1 e executar scripts em vários computadores. Para usar o sistema remoto do Windows PowerShell, o computador remoto deve estar configurado para gerenciamento remoto. Depois de configurar o sistema de comunicação remota do Windows PowerShell, muitas estratégias de comunicação remota ficam disponíveis para você. O restante deste documento lista apenas alguns deles.

Iniciar uma sessão interativa

Para iniciar uma sessão interativa com um único computador remoto, use o cmdlet Enter-PSSession. Por exemplo, para iniciar uma sessão interativa com o computador remoto Server01, digite:

Enter-PSSession Server01

O prompt de comando é alterado para exibir o nome do computador ao qual você está conectado. A partir de então, todos os comandos digitados no prompt serão executados no computador remoto e os resultados serão exibidos no computador local.

Para finalizar a sessão interativa, digite:

Exit-PSSession

Executar um comando remoto

Para executar qualquer comando em um ou mais computadores remotos, use o cmdlet Invoke-Command. Por exemplo, para executar um comando Get-UICulture nos computadores remotos Server01 e Server02, digite:

invoke-command -computername Server01, Server02 {get-UICulture}

A saída é retornada ao seu computador.

LCID    Name     DisplayName               PSComputerName
----    ----     -----------               --------------
1033    en-US    English (United States)   server01.corp.fabrikam.com
1033    en-US    English (United States)   server02.corp.fabrikam.com

Executar um script

Para executar um script em um ou mais computadores remotos, use o parâmetro FilePath do cmdlet Invoke-Command. O script deve estar ativado ou acessível no seu computador local. Os resultados são retornados ao seu computador local.

Por exemplo, o comando a seguir executa o script DiskCollect.ps1 nos computadores remotos Server01 e Server02.

invoke-command -computername Server01, Server02 -filepath c:\Scripts\DiskCollect.ps1

Estabelecer uma conexão persistente

Para executar uma série de comandos relacionados que compartilham dados, crie uma sessão no computador remoto e use o cmdlet Invoke-Command para executar comandos na sessão que você criar. Para criar uma sessão remota, use o cmdlet New-PSSession.

Por exemplo, o comando a seguir cria uma sessão remota no computador Server01 e outra sessão remota no computador Server02. Ele salva os objetos da sessão na variável $ s.

$s = new-pssession -computername Server01, Server02

Agora que as sessões foram estabelecidas, você pode executar qualquer comando nelas. E como as sessões são persistentes, você pode coletar dados em um comando e usá-los em um comando subsequente.

Por exemplo, o comando a seguir executa um comando Get-Hotfix nas sessões na variável $ s e salva os resultados na variável $ h. A variável $ h é criada em cada uma das sessões em $ s, mas não existe na sessão local.

invoke-command -session $s {$h = get-hotfix}

Agora você pode usar os dados na variável $ h em comandos subsequentes, como o seguinte. Os resultados são exibidos no computador local.

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }

5
Esta é a maneira nativa de fazê-lo e deve ser a resposta aceita IMHO.
precisa

O SSH usa a porta 22 no servidor para conectar-se. Você poderia me ajudar a verificar a porta que esta solução do PowerShell usa?
Lucas

11
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/... 5985-5986 são os padrões, mas como a maioria das coisas, você pode especificar outra porta
Shanteva

4

Tente tunnellier do Bitvise. Esse é um cliente ssh. Há também um servidor ssh para conectar-se a uma máquina Windows. Os dois permitem que você faça conexões muito seguras, além de coisas mais avançadas, como proxy da Web ou encapsulamento de portas.


Infelizmente, o servidor SSH não é freeware.
Harry Johnston


2

Você pode tentar o psexec, que fornece um shell remoto sobre o serviço de compartilhamento de arquivos (ou como isso é chamado). Há também winexe se você deseja usar o Linux como cliente.


1

Eu realmente gosto da idéia do PowerShell, embora a configuração possa demorar alguns minutos no servidor e no cliente.

Além da resposta completa do Shanteva, que sugere o uso do PowerShell, você também deve dar uma olhada aqui no site howtogeek sobre como realmente habilitar (e permitir) uma conexão remota ao servidor PowerShell. Há um pouco de configuração necessária no computador servidor.

Duas coisas importantes que você precisa fazer: (Não preciso mencionar que você precisa fazer todas as configurações 'como administrador', certo? Basta abrir o PowerShell / cmd 'Como administrador')

  • Primeiro, ative o serviço WINRM (o aplicativo do Windows que processa comandos remotos) no SERVIDOR .

No computador servidor, abra o PowerShell e execute:

Enable-PSRemoting -Force

Há também outra maneira de fazer isso. Você pode abrir um prompt de comando e executar:

winrm -quickconfig

Pode haver muito mais configurações para mudar. Não há necessidade por enquanto.

  • Segundo, vale ressaltar que o cliente e o servidor estão sempre tentando se autenticar. O servidor deseja garantir que o cliente realmente tenha permitido o acesso ao servidor ou não. Por esse motivo, você fornecerá algumas informações de autenticação ao servidor (semelhante ao SSH, talvez você esteja fornecendo nome de usuário / senha). Por outro lado, o cliente deseja garantir que o servidor seja confiável. Podem ser usados ​​esquemas diferentes, como confiar em um servidor que fornece um certificado público inteligente ou confiar com base no endereço IP ou talvez apenas confiar em todos !! Novamente, temos o mesmo procedimento no SSH, onde um servidor pode fornecer algumas informações de autenticação. (Vamos esquecer os detalhes do SSH por enquanto.)

Se os dois computadores estiverem no mesmo 'domínio' (um grupo de computadores aos quais todos têm regras e funções diferentes), o procedimento parece simples (não tentei isso).

MAS, como você provavelmente deseja acessar seu servidor pela Internet (tecnicamente chamada de rede WAN), existem algumas complicações e é necessário alterar algumas configurações para permitir a conexão com o servidor remoto. No computador CLIENT, ative o serviço WINRM. O procedimento é semelhante ao que fizemos no servidor acima. Basta executar o comando:

Enable-PSRemoting -Force

(Novamente, digno de nota! Algumas referências dizem que o computador cliente e o servidor devem estar em redes 'Privadas', ou a coisa toda não funcionará. Estou recebendo mensagens de erro quando executo o comando acima, mas tudo funciona. Não tenho certeza desse fato. Verifique a página da Web mencionada.)

Em seguida, execute no computador CLIENT no PowerShell:

Set-Item wsman:\localhost\client\trustedhosts *

O que significa que o cliente confiará em todos os servidores (hosts). Por fim, execute isso (no CLIENTE novamente, enfatizo):

Restart-Service WinRM

Você está pronto para ir. Verifique o restante da resposta de Shanteva. No computador CLIENT, execute, por exemplo:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Ele solicitará uma senha e o console remoto será aberto, com a seguinte aparência:

[12.34.56.78]: PS C:\Users\Administrator\Documents>

Em seguida, basta digitar comandos como você faz para SSH.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.