Führen Sie den Befehl / das Skript in Windows 10 von einem Linux-Computer aus remote aus

4652
ThisGuy

Mein Ziel ist es, ein einfaches AutoHotKey-Skript auf einem Windows 10-Computer von einem Ubuntu-Host innerhalb desselben privaten Netzwerks zu starten. Nach dem Googeln fand ich winexe, was sich so anhielt, als könnte er tun, was ich will, aber nach vielen Versuchen konnte ich keine Verbindung zu Windows 10 herstellen ("Verbindung konnte nicht hergestellt werden - NT_STATUS_CONNECTION_RESET", weiteres Googeln half nicht). Als zweite Lösung habe ich einen SSH-Server auf einem Windows-Computer (Bitvise SSH-Server) installiert. Jetzt kann ich mich von Ubuntu aus via ssh bei Windows einloggen oder einfach Befehle auf einem Windows-Rechner ausführen:

$ ssh user@windowsmachine command 

Dies funktioniert für reguläre Befehle wie DIR, MKDIR, ... aber nicht für AutoHotKey-Skripts. ZB mit

$ ssh user@windowsmachine 'C:\path\to\script.ahk' 

Auf Windows-Computern passiert nichts (lokal gestartet, dieses Testskript zeigt nur ein Begrüßungsfeld an). Die folgenden Versuche funktionieren auch nicht:

$ ssh user@windowsmachine '"C:\Program Files\AutoHotkey\AutoHotkey.exe" C:\path\to\script.ahk' $ ssh user@windowsmachine 'cmd.exe /c C:\path\to\script.ahk' 

UPDATE: Der Trick funktioniert fast. Zum Beispiel wird calc.exe gestartet:

$ ssh user@windowsmachine calc.exe 

Wenn ich jedoch notepad.exe oder eine andere Anwendung starte, sehe ich sie im Taskmanager als Hintergrundprozesse und ohne GUI. (Ich weiß nicht, was ich über calc. Exe so spekuliert habe, dass es normal läuft). Ich habe es auch geschafft, das Problem mit winexe zu beheben, aber die Situation ist absolut dieselbe wie bei ssh - mit Ausnahme von calc.exe werden alle GUI-Apps als Hintergrundprozesse gestartet. Dieses Problem wird hier diskutiert . Unter dem Strich ist es also ein enormer Aufwand, GUI-Apps unter Windows 10 von einem Linux-Host auszuführen. Ich habe also gerade eine eigene kleine Client-Server-App in Qt 5 geschrieben, die einen bestimmten Port überwacht und entsprechende Apps / Scripts ausführt, wenn ein benutzerdefinierter Befehl von einem anderen Host empfangen wird.

0
Sie wissen nicht genau, was Ihre Skripte tun, aber könnte es sein, dass das erste Testskript nicht funktionierte, weil es eine grafische Anwendung war? Linux-Linux-SSH-Verbindungen müssen zuerst den Befehl "export display =: 0" ausführen, um eine GUI-App auf dem Remote-Bildschirm korrekt zu starten Blaine vor 6 Jahren 0
Ja, das ahk-Skript befasst sich mit Grafiken (Popup-Fenster). "Export DISPLAY =: 0" hat aber nicht geholfen. ThisGuy vor 6 Jahren 0
Um es klar zu sagen: Ich möchte, dass das Meldungsfeld in der Windows-Maschine erscheint, nicht in Linux;) ThisGuy vor 6 Jahren 0
Ok, der Trick funktioniert aber sehr selektiv. Calc.exe kann nicht gestartet werden ThisGuy vor 6 Jahren 0
interessant ... ja, der Exportbefehl bedeutet im Grunde "diese Shell unter dem Display der Remote-Maschine ausführen". Kann nicht verstehen, warum es nicht mit einem Skript funktionieren würde ... Blaine vor 6 Jahren 0
Haben Sie versucht, diese exakten Befehle in Windows auszuführen, um sicherzustellen, dass sie tatsächlich auf dem lokalen Computer funktionieren? (korrekte Syntax und Whatnot) Blaine vor 6 Jahren 0
Zum Beispiel werden notepad.exe und calc.exe normalerweise von Windows ausgeführt (Win + R), aber nur calc.exe kann normal über ssh gestartet werden, während notepad.exe nur als Hintergrund-App über ssh gestartet wird ( keine GUI sichtbar). ThisGuy vor 6 Jahren 0
seltsam. Nun, zumindest gibt es ein viel engeres Problem, das Sie noch einmal lesen müssen Blaine vor 6 Jahren 0
Ich habe es geschafft, das Problem mit Winexe zu beheben, aber die Situation ist absolut die gleiche wie bei ssh - mit Ausnahme von calc.exe werden alle GUI-Apps als Hintergrundprozesse gestartet. Hier ist ein ähnliches Problem: https://serverfault.com/questions/501539/use-winexe-to-start-a-windows-process. Unter dem Strich ist es also kaum möglich, eine GUI-App über winexe auszuführen ... ThisGuy vor 6 Jahren 0

1 Antwort auf die Frage

1
hanjo

Windows verwendet Sitzungen, um den Benutzern GUI-Anwendungen anzuzeigen. Ihr SSH-Server ist wahrscheinlich ein Windows-Dienst, der vom SYSTEM-Benutzer in der Sitzung 0 ausgeführt wird. Dies ist ohne grafische Anzeige. Daher werden die GUIs der Anwendungen, die Sie starten, nicht angezeigt.

Sie können dies mit dem Sysinternals Process Explorer überprüfen . Klicken Sie nach dem Start (als Administrator) mit der rechten Maustaste auf die Spaltenleiste, klicken Sie auf "Spalten auswählen" und fügen Sie "Sitzung", "Zugriff auf die Benutzeroberfläche", "Benutzername" und "Integritätsgrad" hinzu. Diese Informationen zeigen Ihnen für jeden Prozess, in dem die Anwendung ausgeführt wird ("Sitzung"), ob ein Fenster angezeigt wird ("UI-Zugriff"), unter welchem ​​Konto ein Konto ausgeführt wird ("Benutzername") und mit welchen Berechtigungen ( "Integritätslevel", hoch bedeutet als Admin ).

Wenn Sie in Ihrer Benutzersitzung eine Anwendung von Ihrem SSH-Server ausführen möchten, können Sie dies mit einem anderen Sysinternals-Dienstprogramm namens PsExec : tunpsexec -i <session number> -accepteula <application to execute> . Wenn Sie möchten, dass der Prozess mit Ihrem normalen Benutzer ausgeführt wird, können Sie auch den Parameter verwenden -uund die Berechtigungen mit -lentfernen, wenn Sie dies wünschen. Überprüfen Sie die laufende Hilfe psexec -?.

Um Ihre Sitzungsnummer herauszufinden, können Sie den Befehl auch ausführen qwinsta. Auf diese Weise benötigen Sie die Process Explorer GUI-Anwendung nicht.

Führen Sie zum Beispiel den Rechner aus, um den Rechner auszuführen: Führen Sie in einer SSH-Sitzung den folgenden Befehl aus qwinsta:

C:\>qwinsta SESSIONNAME USERNAME ID STATE TYPE DEVICE services 0 Disc console john.doe 1 Active 

Ihre Sitzung, die Sie verwenden möchten, ist also 1in diesem Beispiel (es kann für Sie anders sein). Dann ausführen psexec -i 1 -accepteula calc.exe. Der Rechner sollte jetzt auf Ihrem Desktop erscheinen. ( -accepteulaDies ist bei der ersten Ausführung der Anwendung unbedingt erforderlich. Ohne diese wird die Anwendung die Lizenzvereinbarung in einem GUI-Fenster anzeigen, die natürlich aus den oben genannten Gründen nicht angezeigt wird. Bei nachfolgenden Aufrufen Sie können den Parameter ignorieren, da das GUI-Fenster nach der Übernahme nicht mehr angezeigt wird.

Wenn Sie dem autohotkey.exeBefehl den psexecoben beschriebenen Befehl voranstellen, würde ich davon ausgehen, dass das Skript funktioniert, aber ich kann es nicht selbst testen, da ich die Anwendung nicht kenne.