Equivalente di Windows di SSH: come connettersi a una macchina remota e accedere alla riga di comando?


19

Sto avendo difficoltà a trovare una soluzione per estendere un framework che è stato progettato per macchine * nix su Windows. Il framework attualmente gira da un server * nix e ssh è fuori ad altri server * nix ed esegue una serie di comandi diversi come il controllo dei file di registro, la sincronizzazione dei file dal controllo del codice sorgente, l'invio dei registri al controllo del codice sorgente, ecc. bloccato su come connettersi ai computer remoti di Windows e accedere alla riga di comando. La connessione può provenire anche da un altro computer Windows, non deve iniziare da un computer unix, può passare da Windows a Windows anziché da Unix a Windows.

Ecco un esempio di come vengono attualmente eseguiti i comandi sui sistemi unix. Qualcosa del genere è in un ciclo che passa attraverso un elenco di nomi di server. Ho bisogno di ottenere qualcosa di simile per funzionare su macchine Windows.

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

Inoltre, preferirei non utilizzare uno strumento di terze parti (il mio budget è di circa $ 0). Ho controllato PsExec e un paio di altri, ma sembra che tu abbia bisogno dell'accesso di amministratore o debba passare utenti / passare in chiaro.


In base alla progettazione, un utente non amministrativo non può normalmente eseguire codice su un computer remoto. Potrebbe essere necessario creare la tua soluzione. Esiste un contesto specifico in cui il codice deve essere eseguito? I comandi devono essere eseguiti sempre ogni volta?
Harry Johnston,

Mentre potresti installare MobaSSH come server e usare putty come client, o usare psexec per fare tutto ciò che vuoi di più o di meno (cosa che mi è disapprovato nella mia esperienza), l'idioma equivalente nel mondo di Windows non è usare una shell in tutto, ma fare affidamento sul supporto a livello di comando per l'esecuzione remota, sia che si tratti di un comando legacy o di PowerShell combinato con condivisioni di rete e unità mappate.
Shanteva,

Risposte:


14

Utilizzare il Remoto Powershell: https://msdn.microsoft.com/en-us/powershell/scripting/core-powershell/running-remote-commands

Spudoratamente copiato e incollato:

Remoting di Windows PowerShell

Il telecomando di Windows PowerShell, che utilizza il protocollo WS-Management, consente di eseguire qualsiasi comando di Windows PowerShell su uno o più computer remoti. Ti consente di stabilire connessioni permanenti, avviare sessioni interattive 1: 1 ed eseguire script su più computer. Per utilizzare il telecomando di Windows PowerShell, il computer remoto deve essere configurato per la gestione remota. Dopo aver configurato il remoting di Windows PowerShell, sono disponibili molte strategie di remoting. Il resto di questo documento ne elenca solo alcuni.

Inizia una sessione interattiva

Per avviare una sessione interattiva con un singolo computer remoto, utilizzare il cmdlet Enter-PSSession. Ad esempio, per avviare una sessione interattiva con il computer remoto Server01, digitare:

Enter-PSSession Server01

Il prompt dei comandi cambia per visualizzare il nome del computer a cui si è connessi. Da quel momento in poi, tutti i comandi digitati al prompt vengono eseguiti sul computer remoto e i risultati vengono visualizzati sul computer locale.

Per terminare la sessione interattiva, digitare:

Exit-PSSession

Esegui un comando remoto

Per eseguire qualsiasi comando su uno o più computer remoti, utilizzare il cmdlet Invoke-Command. Ad esempio, per eseguire un comando Get-UICulture sui computer remoti Server01 e Server02, digitare:

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

L'output viene restituito al tuo computer.

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

Esegui uno script

Per eseguire uno script su uno o più computer remoti, utilizzare il parametro FilePath del cmdlet Invoke-Command. Lo script deve essere attivo o accessibile sul computer locale. I risultati vengono restituiti al computer locale.

Ad esempio, il comando seguente esegue lo script DiskCollect.ps1 sui computer remoti Server01 e Server02.

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

Stabilire una connessione persistente

Per eseguire una serie di comandi correlati che condividono dati, creare una sessione sul computer remoto, quindi utilizzare il cmdlet Invoke-Command per eseguire i comandi nella sessione creata. Per creare una sessione remota, utilizzare il cmdlet New-PSSession.

Ad esempio, il comando seguente crea una sessione remota sul computer Server01 e un'altra sessione remota sul computer Server02. Salva gli oggetti della sessione nella variabile $ s.

$s = new-pssession -computername Server01, Server02

Ora che le sessioni sono state stabilite, è possibile eseguire qualsiasi comando in esse. E poiché le sessioni sono persistenti, è possibile raccogliere dati in un comando e utilizzarli in un comando successivo.

Ad esempio, il comando seguente esegue un comando Get-Hotfix nelle sessioni nella variabile $ s e salva i risultati nella variabile $ h. La variabile $ h viene creata in ciascuna delle sessioni in $ s, ma non esiste nella sessione locale.

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

Ora puoi usare i dati nella variabile $ h nei comandi successivi, come quello seguente. I risultati vengono visualizzati sul computer locale.

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

5
Questo è il modo nativo per farlo e dovrebbe essere la risposta accettata IMHO.
Gregory Higley,

SSH utilizza la porta 22 sul server per connettersi, potresti aiutarmi a controllare la porta da utilizzare con questa soluzione PowerShell?
Luca,

1
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/… 5985-5986 sono i valori predefiniti, ma come la maggior parte delle cose, è possibile specificare un'altra porta
Shanteva,

4

Prova tunnellier da Bitvise. Questo è un client SSH. C'è anche un server SSH per la connessione a una macchina Windows. I due consentono di effettuare connessioni molto sicure insieme a cose più avanzate come un proxy Web o il tunneling delle porte.


Sfortunatamente il server SSH non è freeware.
Harry Johnston,


2

Potresti provare psexec che ti fornisce una shell remota sul servizio di condivisione file (o comunque si chiama). C'è anche winexe se vuoi usare Linux come client.


1

Mi piace molto l'idea di PowerShell, anche se la configurazione potrebbe richiedere un paio di minuti su server e client.

Oltre alla risposta completa di Shanteva, che suggerisce l'uso di PowerShell, dovresti anche dare un'occhiata qui sul sito Web howtogeek su come abilitare (e consentire) effettivamente una connessione remota al server PowerShell. È necessaria una leggera configurazione sul computer server.

Due cose importanti che devi fare: (Non devo dire che devi fare tutte le configurazioni 'come amministratore' giusto? Basta aprire PowerShell / cmd 'Come amministratore')

  • Innanzitutto, abilitare il servizio WINRM (l'applicazione Windows che elabora i comandi remoti) sul SERVER .

Sul computer server, aprire PowerShell ed eseguire:

Enable-PSRemoting -Force

C'è anche un altro modo di farlo. È possibile aprire un prompt dei comandi ed eseguire:

winrm -quickconfig

Potrebbero esserci molte più configurazioni da modificare. Non c'è bisogno per ora.

  • In secondo luogo, è interessante notare che il client e il server cercano sempre di autenticarsi reciprocamente. Il server vuole assicurarsi che il client abbia effettivamente consentito l'accesso al server o meno. Per questo motivo, fornirai alcune informazioni di autenticazione al server (simile a SSH, potresti fornire Username / Password). Al contrario, il client vuole assicurarsi che il server sia affidabile. È possibile utilizzare diversi schemi, ad esempio la fiducia in un server che fornisce un certificato pubblico intelligente o la fiducia basata sull'indirizzo IP o forse la fiducia di tutti !! Ancora una volta abbiamo la stessa procedura su SSH in cui un server può fornire alcune informazioni di autenticazione. (Dimentichiamo solo i dettagli SSH per ora.)

Se entrambi i computer si trovano sullo stesso "dominio" (un gruppo di computer a cui ognuno ha regole e ruoli diversi assegnati), la procedura sembra essere semplice (non l'ho provato).

MA, poiché probabilmente desideri accedere al tuo server tramite Internet (tecnicamente chiamato rete WAN), ci sono alcune complicazioni e devi modificare alcune configurazioni per consentire la connessione al server remoto. Sul computer CLIENT abilitare il servizio WINRM. La procedura è simile a quella che abbiamo fatto per il server sopra. Basta eseguire il comando:

Enable-PSRemoting -Force

(Ancora una volta degno di nota! Alcuni riferimenti dicono che il computer client e il computer server devono essere su reti "private", o il tutto non funzionerà. Ricevo messaggi di errore per questo quando eseguo il comando sopra ma tutto funziona trova Non ne sono sicuro. Controlla la suddetta pagina web.)

Quindi eseguire sul computer CLIENT in PowerShell:

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

Ciò significa che il client si fiderà di tutti i server (host). Infine, esegui questo ( sottolineo di nuovo sul CLIENTE ):

Restart-Service WinRM

Sei pronto per andare. Controlla il resto della risposta di Shanteva. Sul computer CLIENT, eseguire ad esempio:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Chiederà una password e si aprirà la console remota che assomiglia a:

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

Quindi inserisci i comandi come fai per SSH.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.