Windows-Entsprechung von ssh - Herstellen einer Verbindung zu einem Remotecomputer und Zugreifen auf die Befehlszeile

19

Es fällt mir schwer, eine Lösung zu finden, um ein Framework, das für * nix-Maschinen entwickelt wurde, auf Windows zu erweitern. Das Framework läuft derzeit von einem * nix-Server und ssh auf andere * nix-Server und führt eine Reihe verschiedener Befehle aus, wie das Überprüfen von Protokolldateien, das Synchronisieren von Dateien aus der Quellcodeverwaltung, das Zurücksenden von Protokollen an die Quellcodeverwaltung usw. stecken bleibt, wie man sich mit den entfernten Windows-Rechnern verbindet und auf die Kommandozeile zugreift. Die Verbindung kann auch von einem anderen Windows-Computer kommen, sie muss nicht von einem Unix-Computer gestartet werden, sondern kann von Windows zu Windows anstatt von Unix zu Windows gehen.

Hier ist ein Beispiel, wie Befehle derzeit auf Unix-Systemen ausgeführt werden. So etwas befindet sich in einer Schleife, die eine Liste von Servernamen durchläuft. Ich brauche so etwas, um auf Windows-Computern zu laufen.

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

Außerdem würde ich es vorziehen, kein Tool eines Drittanbieters zu verwenden (mein Budget beträgt ungefähr 0 USD). Ich habe PsExec und ein paar andere ausprobiert, aber es sieht so aus, als ob Sie Administratorzugriff benötigen oder Benutzer übergeben / im Klartext übergeben müssen.


quelle
Standardmäßig kann ein Benutzer ohne Administratorrechte keinen Code auf einem Remotecomputer ausführen. Möglicherweise müssen Sie Ihre eigene Lösung erstellen. Gibt es einen bestimmten Kontext, in dem der Code ausgeführt werden muss? Sollen die Befehle jedes Mal gleich ausgeführt werden?
Harry Johnston
Während Sie MobaSSH als Server installieren und Putty als Client verwenden oder Psexec verwenden könnten, um mehr oder weniger zu tun (was meiner Erfahrung nach verpönt ist), ist es in der Windows-Welt nicht das Äquivalent, eine Shell zu verwenden Sie müssen sich jedoch auf die Unterstützung der Befehlsebene für die Remote-Ausführung verlassen, unabhängig davon, ob es sich um einen Legacy-Befehl oder eine PowerShell in Kombination mit Netzwerkfreigaben und zugeordneten Laufwerken handelt.
Shanteva

Antworten:

14

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

Schamlos kopiert:

Windows PowerShell-Remoting

Mit Windows PowerShell-Remoting, das das WS-Verwaltungsprotokoll verwendet, können Sie jeden Windows PowerShell-Befehl auf einem oder mehreren Remotecomputern ausführen. Damit können Sie dauerhafte Verbindungen herstellen, interaktive 1: 1-Sitzungen starten und Skripts auf mehreren Computern ausführen. Um Windows PowerShell-Remoting verwenden zu können, muss der Remotecomputer für die Remoteverwaltung konfiguriert sein. Nachdem Sie Windows PowerShell-Remoting konfiguriert haben, stehen Ihnen viele Remoting-Strategien zur Verfügung. Der Rest dieses Dokuments listet nur einige davon auf.

Starten Sie eine interaktive Sitzung

Verwenden Sie das Cmdlet Enter-PSSession, um eine interaktive Sitzung mit einem einzelnen Remotecomputer zu starten. Geben Sie beispielsweise Folgendes ein, um eine interaktive Sitzung mit dem Server01-Remotecomputer zu starten:

Enter-PSSession Server01

In der Eingabeaufforderung wird der Name des Computers angezeigt, mit dem Sie verbunden sind. Von da an werden alle Befehle, die Sie an der Eingabeaufforderung eingeben, auf dem Remotecomputer ausgeführt und die Ergebnisse auf dem lokalen Computer angezeigt.

Geben Sie Folgendes ein, um die interaktive Sitzung zu beenden:

Exit-PSSession

Führen Sie einen Remote-Befehl aus

Verwenden Sie das Cmdlet Invoke-Command, um einen Befehl auf einem oder mehreren Remotecomputern auszuführen. Geben Sie beispielsweise Folgendes ein, um den Befehl Get-UICulture auf den Remotecomputern Server01 und Server02 auszuführen:

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

Die Ausgabe wird an Ihren Computer zurückgegeben.

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

Führen Sie ein Skript aus

Verwenden Sie zum Ausführen eines Skripts auf einem oder mehreren Remotecomputern den Parameter FilePath des Cmdlets Invoke-Command. Das Skript muss auf Ihrem lokalen Computer installiert oder verfügbar sein. Die Ergebnisse werden an Ihren lokalen Computer zurückgegeben.

Mit dem folgenden Befehl wird beispielsweise das Skript "DiskCollect.ps1" auf den Remotecomputern "Server01" und "Server02" ausgeführt.

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

Stellen Sie eine dauerhafte Verbindung her

Wenn Sie eine Reihe verwandter Befehle ausführen möchten, die Daten gemeinsam nutzen, erstellen Sie eine Sitzung auf dem Remotecomputer und verwenden Sie dann das Cmdlet Invoke-Command, um Befehle in der von Ihnen erstellten Sitzung auszuführen. Verwenden Sie zum Erstellen einer Remotesitzung das Cmdlet New-PSSession.

Mit dem folgenden Befehl wird beispielsweise eine Remotesitzung auf dem Computer Server01 und eine weitere Remotesitzung auf dem Computer Server02 erstellt. Es speichert die Sitzungsobjekte in der Variablen $ s.

$s = new-pssession -computername Server01, Server02

Nachdem die Sitzungen eingerichtet wurden, können Sie einen beliebigen Befehl in ihnen ausführen. Und da die Sitzungen persistent sind, können Sie Daten in einem Befehl erfassen und in einem nachfolgenden Befehl verwenden.

Der folgende Befehl führt beispielsweise einen Befehl Get-Hotfix in den Sitzungen in der Variablen $ s aus und speichert die Ergebnisse in der Variablen $ h. Die Variable $ h wird in jeder Sitzung in $ s erstellt, ist jedoch in der lokalen Sitzung nicht vorhanden.

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

Jetzt können Sie die Daten in der Variablen $ h in nachfolgenden Befehlen wie dem folgenden verwenden. Die Ergebnisse werden auf dem lokalen Computer angezeigt.

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }
Shanteva
quelle
5
Dies ist der native Weg, dies zu tun, und sollte meiner Meinung nach die akzeptierte Antwort sein.
Gregory Higley
SSH verwendet Port 22 auf dem Server, um eine Verbindung herzustellen. Können Sie mir bitte helfen, den Port zu überprüfen, den diese PowerShell-Lösung verwendet?
Luke
1
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/… 5985-5986 sind die Standardeinstellungen, aber wie bei den meisten Dingen können Sie einen anderen Port angeben
Shanteva
4

Versuchen Sie tunnellier von Bitvise. Das ist ein SSH-Client. Es gibt auch einen SSH-Server für die Verbindung mit einem Windows-Computer. Die beiden ermöglichen es Ihnen, sehr sichere Verbindungen zusammen mit fortgeschritteneren Dingen wie einem Web-Proxy oder Port-Tunneling herzustellen.


quelle
Leider ist der SSH-Server keine Freeware.
Harry Johnston
4

Installieren Sie den OpenSSH-Port für Windows - er ist kostenlos und bietet sowohl Client als auch Server.

Eugene Mayevski 'Rückruf
quelle
1
Es gibt jedoch Sicherheitsprobleme - da Cygwin verwendet wird, ist es nicht mehrbenutzersicher. (Sofern meine Informationen nicht veraltet sind?)
Harry Johnston
1
Microsoft arbeitet daran, es ordnungsgemäß auf Windows zu portieren. Aber es scheint ein ziemlich langsamer Fortschritt zu sein: blogs.msdn.microsoft.com/powershell/2017/12/15/…
Martin Brown
2

Versuchen Sie es mit psexec, das Ihnen eine Remote-Shell über den Dateifreigabedienst bietet (oder wie auch immer dies heißt). Es gibt auch winexe, wenn Sie Linux als Client verwenden möchten.

julianisch
quelle
1

Ich mag die Idee von PowerShell sehr, obwohl die Konfiguration auf dem Server und dem Client einige Minuten dauern kann.

Neben der vollständigen Antwort von Shanteva, die die Verwendung von PowerShell vorschlägt, sollten Sie auf der HowTogeek-Website unter Hier nachlesen, wie eine Remoteverbindung zum PowerShell-Server tatsächlich aktiviert (und zugelassen) wird. Auf dem Servercomputer ist etwas Konfiguration erforderlich.

Zwei wichtige Dinge, die Sie tun müssen: (Ich muss nicht erwähnen, dass Sie jede Konfiguration als Administrator ausführen müssen. Öffnen Sie einfach PowerShell / cmd als Administrator.)

  • Aktivieren Sie zunächst den WINRM-Dienst (die Windows-Anwendung, die Remotebefehle verarbeitet) auf dem SERVER .

Öffnen Sie auf dem Server-Computer PowerShell und führen Sie Folgendes aus:

Enable-PSRemoting -Force

Es gibt auch einen anderen Weg, dies zu tun. Sie können eine Eingabeaufforderung öffnen und Folgendes ausführen:

winrm -quickconfig

Es könnten viel mehr Konfigurationen geändert werden. Das brauche ich jetzt nicht.

  • Zweitens ist es bemerkenswert, dass der Client und der Server immer versuchen, sich gegenseitig zu authentifizieren. Der Server möchte sicherstellen, dass der Client tatsächlich Zugriff auf den Server hat oder nicht. Aus diesem Grund werden Sie dem Server einige Authentifizierungsinformationen bereitstellen (ähnlich wie bei SSH geben Sie möglicherweise Benutzername / Passwort an). Umgekehrt möchte der Client sicherstellen, dass der Server vertrauenswürdig ist. Es können verschiedene Schemata verwendet werden, z. B. das Vertrauen auf einen Server, der ein intelligentes öffentliches Zertifikat bereitstellt, oder das Vertrauen auf der Grundlage der IP-Adresse oder einfach das Vertrauen auf alle !! Wieder haben wir das gleiche Verfahren für SSH, bei dem ein Server einige Authentifizierungsinformationen bereitstellen kann. (Vergessen wir vorerst nur die SSH-Details.)

Befinden sich beide Computer in derselben "Domäne" (einer Gruppe von Computern, denen unterschiedliche Regeln und Rollen zugewiesen sind), scheint das Verfahren einfach zu sein (das habe ich nicht ausprobiert).

ABER, da Sie wahrscheinlich über das Internet (technisch als WAN-Netzwerk bezeichnet) auf Ihren Server zugreifen möchten, treten einige Probleme auf, und Sie müssen einige Einstellungen ändern, um die Verbindung zum Remote-Server zuzulassen. Aktivieren Sie auf dem CLIENT- Computer den WINRM-Dienst. Die Vorgehensweise ist ähnlich wie oben für den Server. Führen Sie einfach den Befehl aus:

Enable-PSRemoting -Force

(Nochmals bemerkenswert! Einige Referenzen besagen, dass sich der Client-Computer und der Server-Computer in "privaten" Netzwerken befinden müssen, sonst funktioniert das Ganze nicht. Ich erhalte dazu Fehlermeldungen, wenn ich den obigen Befehl ausführe, aber alles funktioniert Ich bin mir da nicht sicher. Überprüfen Sie die oben genannte Webseite.)

Führen Sie dann auf dem CLIENT- Computer in PowerShell Folgendes aus:

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

Dies bedeutet, dass der Client allen Servern (Hosts) vertraut. Führen Sie zum Schluss Folgendes aus (auf dem KUNDEN möchte ich nochmals betonen):

Restart-Service WinRM

Sie sind bereit zu gehen. Überprüfen Sie den Rest von Shantevas Antwort. Führen Sie auf dem CLIENT-Computer beispielsweise Folgendes aus:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Es wird nach einem Passwort gefragt und die Remote-Konsole wird geöffnet. Sie sieht folgendermaßen aus:

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

Dann geben Sie einfach Befehle wie bei SSH ein.

Ali Nakisaee
quelle