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

19

J'ai du mal à trouver une solution pour étendre un framework conçu pour les machines * nix à Windows. Le framework fonctionne actuellement à partir d'un serveur * nix et de ssh vers d'autres serveurs * nix et exécute un tas de commandes différentes comme la vérification des fichiers journaux, la synchronisation des fichiers depuis le contrôle de code source, la soumission des journaux au contrôle de code source, etc. bloqué est de savoir comment se connecter aux machines Windows distantes et accéder à la ligne de commande. La connexion peut également provenir d'une autre machine Windows, elle n'a pas besoin de démarrer à partir d'une machine Unix, elle peut passer de Windows à Windows au lieu d'Unix à Windows.

Voici un exemple de la façon dont les commandes sont actuellement exécutées sur les systèmes Unix. Quelque chose comme ça est dans une boucle qui passe par une liste de noms de serveurs. J'ai besoin d'obtenir quelque chose comme ça pour fonctionner sur des 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 transmettre des utilisateurs / passer en texte brut.


la source
De par leur conception, un utilisateur non administrateur ne peut normalement pas exécuter de code sur une machine distante. Vous devrez peut-être créer votre propre solution. Existe-t-il un contexte spécifique dans lequel le code doit s'exécuter? Les commandes doivent-elles être exécutées à chaque fois?
Harry Johnston
Bien que vous puissiez installer MobaSSH en tant que serveur et utiliser du mastic en tant que client, ou utiliser psexec pour faire plus ou moins ce que vous voulez (ce qui est mal vu dans mon expérience), l'idiome équivalent dans le monde Windows n'est pas d'utiliser un shell à tous, mais de compter sur la prise en charge au niveau des commandes pour l'exécution à distance, qu'il s'agisse d'une commande héritée ou d'un PowerShell combiné avec des partages réseau et des lecteurs mappés.
Shanteva

Réponses:

14

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

Copié-collé sans vergogne:

Windows PowerShell Remoting

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. Après avoir configuré la communication à distance Windows PowerShell, de nombreuses stratégies de communication à distance sont à votre disposition. Le reste de ce document n'en énumère que quelques-uns.

Démarrer 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

L'invite de commandes change pour afficher le nom de l'ordinateur auquel vous êtes connecté. À partir de là, toutes les commandes que vous tapez à l'invite s'exécutent sur l'ordinateur distant et les résultats s'affichent sur l'ordinateur local.

Pour terminer la session interactive, tapez:

Exit-PSSession

Exécutez une commande à distance

Pour exécuter une commande sur un ou plusieurs ordinateurs distants, utilisez l'applet de commande 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 à 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 l'applet de commande 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 distante, utilisez l'applet de commande New-PSSession.

Par exemple, la commande suivante crée une session distante sur l'ordinateur Server01 et une autre session distante 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 suivante.

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, comme la suivante. Les résultats sont affichés sur l'ordinateur local.

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }
Shanteva
la source
5
C'est la manière native de le faire et devrait être la réponse acceptée à mon humble avis.
Gregory Higley
SSH utilise le port 22 sur le serveur pour se connecter, pourriez-vous m'aider à vérifier le port utilisé par cette solution PowerShell?
Luke
1
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/… 5985-5986 sont les valeurs par défaut, mais comme la plupart des choses, vous pouvez spécifier un autre port
Shanteva
4

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


la source
Malheureusement, le serveur SSH n'est pas un logiciel gratuit.
Harry Johnston
4

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

Rappel d'Eugene Mayevski
la source
1
Il existe cependant des problèmes de sécurité - car il utilise Cygwin, il n'est pas sécurisé pour plusieurs utilisateurs. (Sauf si mes informations sont obsolètes?)
Harry Johnston
1
Microsoft travaille à le porter correctement sur Windows. Mais cela semble être une progression assez lente: blogs.msdn.microsoft.com/powershell/2017/12/15/…
Martin Brown
2

Vous pouvez essayer psexec qui vous donne un shell distant sur le service de partage de fichiers (ou comment cela s'appelle). Il existe également winexe si vous souhaitez utiliser Linux comme client.

julien
la source
1

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

Mis à part la réponse complète de Shanteva, qui suggère l'utilisation de PowerShell, vous devriez également jeter un coup d'œil ici sur le site Web howtogeek pour savoir comment activer (et autoriser) une connexion à distance au serveur PowerShell. Il y a un peu de configuration requise sur l'ordinateur serveur.

Deux choses importantes que vous devez faire: (Je n'ai pas besoin de mentionner que vous devez effectuer toutes les configurations "en tant qu'administrateur" non? Ouvrez simplement PowerShell / cmd "En tant qu'administrateur")

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

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

Enable-PSRemoting -Force

Il existe également une autre manière de procéder. 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 convient de noter que le client et le serveur essaient toujours de s'authentifier mutuellement. Le serveur veut s'assurer que le client a effectivement autorisé l'accès au serveur ou non. Pour cette raison, vous allez fournir des informations d'authentification au serveur (similaire à SSH, vous fournissez peut-être un nom d'utilisateur / mot de passe). Inversement, le client veut s'assurer que le serveur est fiable. Différents schémas peuvent être utilisés, comme faire confiance à un serveur qui fournit un certificat public intelligent ou faire confiance en fonction de l'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 assignés), la procédure semble être simple (je n'ai pas essayé cela).

MAIS, comme vous voulez probablement accéder à votre serveur via Internet (techniquement appelé le réseau WAN), il y a quelques complications et vous devez changer une configuration pour permettre la connexion au serveur distant. Sur l' ordinateur CLIENT, activez le service WINRM. La procédure est similaire à ce que nous avons fait pour le serveur ci-dessus. Exécutez simplement la commande:

Enable-PSRemoting -Force

(Encore une fois! Certaines références disent que l'ordinateur client et l'ordinateur serveur doivent être sur des réseaux «privés», ou le tout ne fonctionnera pas. Je reçois des messages d'erreur pour cela lorsque j'exécute la commande ci-dessus mais tout fonctionne . Je ne suis pas sûr de ce fait. Consultez la page Web susmentionnée.)

Exécutez ensuite sur 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, exécutez ceci (sur le CLIENT encore une fois, je 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 qui ressemble à:

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

Saisissez ensuite les commandes comme vous le faites pour SSH.

Ali Nakisaee
la source