web-dev-qa-db-fra.com

L'équivalent Windows de ssh - comment se connecter à une machine distante et accéder à la ligne de commande?

J'ai du mal à trouver une solution pour étendre un cadre conçu pour les machines * nix aux fenêtres. La structure s’exécute actuellement d’un serveur * nix et de ssh vers d’autres serveurs * nix et exécute un grand nombre de commandes différentes, telles que la vérification des fichiers journaux, la synchronisation des fichiers depuis le contrôle de source, la soumission des journaux au contrôle de source, etc. Restez connecté pour savoir comment vous connecter aux machines Windows distantes et accéder à la ligne de commande. La connexion peut aussi provenir d’une autre machine Windows, elle n’a pas besoin de démarrer à partir d’une machine unix, elle peut aller de windows en windows au lieu d’unix pour windows.

Voici un exemple de la façon dont les commandes sont actuellement exécutées sur les systèmes Unix. Quelque chose comme ceci est dans une boucle qui passe par une liste de noms de serveurs. J'ai besoin de quelque chose comme ça pour fonctionner sur les machines Windows.

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

De plus, je préférerais ne pas utiliser un outil tiers (mon budget est d'environ 0 $). J'ai vérifié PsExec et quelques autres, mais il semble que vous ayez besoin d'un accès administrateur ou que vous deviez passer les utilisateurs/passer en texte brut.

18
user797963

Utilisez Powershell Remoting: https://msdn.Microsoft.com/en-us/powershell/scripting/core-powershell/running-remote-commands

Copié-collé sans vergogne:

Remoting Windows PowerShell

La communication à distance Windows PowerShell, qui utilise le protocole WS-Management, vous permet d'exécuter n'importe quelle commande Windows PowerShell sur un ou plusieurs ordinateurs distants. Il vous permet d'établir des connexions persistantes, de démarrer des sessions interactives 1: 1 et d'exécuter des scripts sur plusieurs ordinateurs. Pour utiliser la communication à distance Windows PowerShell, l'ordinateur distant doit être configuré pour la gestion à distance. Une fois que vous avez configuré la communication à distance Windows PowerShell, de nombreuses stratégies de communication à distance sont disponibles. Le reste de ce document en énumère quelques-uns.

Commencer une session interactive

Pour démarrer une session interactive avec un seul ordinateur distant, utilisez l'applet de commande Enter-PSSession. Par exemple, pour démarrer une session interactive avec l'ordinateur distant Server01, tapez:

Enter-PSSession Server01

La commande Invite change pour afficher le nom de l'ordinateur auquel vous êtes connecté. À partir de ce moment, toutes les commandes que vous tapez à l'invite sont exécutées sur l'ordinateur distant et les résultats sont affichés sur l'ordinateur local.

Pour mettre fin à la session interactive, tapez:

Exit-PSSession

Exécuter une commande à distance

Pour exécuter une commande sur un ou plusieurs ordinateurs distants, utilisez la cmdlet Invoke-Command. Par exemple, pour exécuter une commande Get-UICulture sur les ordinateurs distants Server01 et Server02, tapez:

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

La sortie est renvoyée sur votre ordinateur.

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

Exécuter un script

Pour exécuter un script sur un ou plusieurs ordinateurs distants, utilisez le paramètre FilePath de la cmdlet Invoke-Command. Le script doit être sur ou accessible à votre ordinateur local. Les résultats sont renvoyés sur votre ordinateur local.

Par exemple, la commande suivante exécute le script DiskCollect.ps1 sur les ordinateurs distants Server01 et Server02.

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

Établir une connexion persistante

Pour exécuter une série de commandes associées qui partagent des données, créez une session sur l'ordinateur distant, puis utilisez l'applet de commande Invoke-Command pour exécuter des commandes dans la session que vous créez. Pour créer une session à distance, utilisez la cmdlet New-PSSession.

Par exemple, la commande suivante crée une session à distance sur l'ordinateur Server01 et une autre session à distance sur l'ordinateur Server02. Il enregistre les objets de session dans la variable $ s.

$s = new-pssession -computername Server01, Server02

Maintenant que les sessions sont établies, vous pouvez y exécuter n’importe quelle commande. Et comme les sessions sont persistantes, vous pouvez collecter des données dans une commande et les utiliser dans une commande ultérieure.

Par exemple, la commande suivante exécute une commande Get-Hotfix dans les sessions de la variable $ s et enregistre les résultats dans la variable $ h. La variable $ h est créée dans chacune des sessions dans $ s, mais elle n'existe pas dans la session locale.

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

Vous pouvez maintenant utiliser les données de la variable $ h dans les commandes suivantes, telles que la suivante. Les résultats sont affichés sur l'ordinateur local.

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

Essayez tunnellier de Bitvise. C'est un client ssh. Il y a aussi un serveur ssh pour se connecter à une machine Windows. Les deux systèmes vous permettent d’établir des connexions très sécurisées avec des fonctionnalités plus avancées telles qu'un proxy Web ou un tunneling de port.

4
cdmdotnet

Installez le port OpenSSH pour Windows - c'est gratuit et fournit à la fois le client et le serveur.

Vous pouvez essayer psexec qui vous donne un shell distant via le service de partage de fichiers (ou quel que soit le nom de celui-ci). Il y a aussi winexe si vous voulez utiliser Linux comme client.

2
Julian

J'aime beaucoup l'idée de PowerShell, bien que la configuration puisse prendre quelques minutes sur le serveur et le client.

Outre la réponse complète de Shanteva, qui suggère l'utilisation de PowerShell, vous devez également consulter Ici sur le site Web howtogeek pour savoir comment activer (et autoriser) une connexion à distance au serveur PowerShell. Une légère configuration est requise sur l’ordinateur serveur.

Deux choses importantes que vous devez faire: (Je n'ai pas besoin de mentionner que vous devez faire chaque configuration en tant qu'administrateur, n'est-ce pas? Ouvrez simplement PowerShell/cmd en tant qu'administrateur)

  • Tout d’abord, activez le service WINRM (l’application Windows qui traite les commandes distantes) sur le SERVEUR.

Sur l’ordinateur serveur, ouvrez PowerShell et exécutez:

Enable-PSRemoting -Force

Il y a aussi une autre façon de faire cela. Vous pouvez ouvrir une invite de commande et exécuter:

winrm -quickconfig

Il pourrait y avoir beaucoup plus de configurations à changer. Pas besoin pour l'instant.

  • Deuxièmement, il est à noter que le client et le serveur essaient toujours de s’authentifier mutuellement. Le serveur veut s'assurer que le client a effectivement autorisé ou non l'accès au serveur. Dans ce but, vous allez fournir des informations d'authentification au serveur (similaire à SSH, vous pouvez peut-être fournir le nom d'utilisateur/mot de passe). Inversement, le client veut s’assurer que le serveur est un serveur de confiance. Différents schémas peuvent être utilisés, tels que faire confiance à un serveur fournissant un certificat public intelligent ou basé sur une adresse IP ou peut-être simplement faire confiance à tout le monde! Encore une fois, nous avons la même procédure sur SSH où un serveur peut fournir des informations d’authentification. (Oublions juste les détails SSH pour l'instant.)

Si les deux ordinateurs sont sur le même "domaine" (un groupe d'ordinateurs auxquels chacun a des règles et des rôles différents), la procédure semble être simple (je n'ai pas essayé cela).

MAIS, comme vous souhaitez probablement accéder à votre serveur via Internet (techniquement appelé réseau WAN, _), il existe certaines complications et vous devez modifier certaines configurations pour autoriser la connexion au serveur distant. Sur l'ordinateur CLIENT, activez le service WINRM. La procédure est similaire à celle décrite précédemment pour le serveur. Il suffit de lancer la commande:

Enable-PSRemoting -Force

(Encore une fois, il convient de noter! Certaines références indiquent que l’ordinateur client et l’ordinateur serveur doivent se trouver sur des réseaux "privés", sinon tout cela ne fonctionnera pas. Je reçois des messages d’erreur lorsque je lance la commande ci-dessus, mais tout fonctionne. Je ne suis pas sûr de ce fait. Consultez la page Web susmentionnée.)

Ensuite, exécutez l'ordinateur CLIENT dans PowerShell:

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

Ce qui signifie que le client fera confiance à tous les serveurs (hôtes). Enfin, lancez ceci (sur le CLIENT encore une fois, je le souligne):

Restart-Service WinRM

Vous êtes prêt à partir. Vérifiez le reste de la réponse de Shanteva. Sur l'ordinateur client, exécutez par exemple:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Il vous demandera un mot de passe et la console distante s'ouvre. Elle ressemble à ceci:

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

Puis entrez simplement les commandes comme vous le faites pour SSH.

1
Ali Nakisaee