Wie führt man mit wsl.exe ein Linux-CLI-Tool aus einem Tcl/Tk-Skript in Windows 10 aus?

Wie führt man mit wsl.exe ein Linux-CLI-Tool aus einem Tcl/Tk-Skript in Windows 10 aus?

Für eine Hardwaretestanwendung muss ich innerhalb eines Tcl/Tk-Skripts einige externe CLI-Anwendungen ausführen und mit ihnen interagieren, beispielsweise einen Linux-Ping an eine bestimmte lokale IP-Adresse.

Unter Windows 7 (und vor ein paar Jahren auch XP) habe ich dies in einer Cygwin-Umgebung mit Cygwins Tcl8.5 und Expect 5.45 mit gutem Erfolg getan. Ich konnte eine Bash starten und dann mit „ping“, „ls“, „touch“ und mehreren anderen Tools kommunizieren, indem ich die Expect-Befehle von Tcl verwendete. Wenn ich die Bash anschließend mit „exit“ schließe, wird der Shell-Prozess beendet und ich konnte dies mit anderen Befehlen so oft wie nötig wiederholen.

Unter Linux (Debian Stretch) laufen dieselben Tcl-/Tk-Skripte reibungslos, einschließlich der Interaktion mit allen externen Apps.

Gemäß der Unternehmensrichtlinie bin ich nun verpflichtet, dies alles unter Windows 10 zum Laufen zu bringen. Ich habe mich über das Windows-Subsystem für Linux (WSL) informiert, mit Kollegen darüber gesprochen und es auf meinem Computer mit einem Ubuntu 18.04 WSL-Image sowie auch mit ActiveState Tcl 8.5 (Windows-Version) und Expect 5.45 über Teapot installiert.

Die Tcl-Skripte selbst werden wie erwartet ausgeführt und umfassen eine Wish-GUI, serielle Kommunikation und sogar Ethernet-Kommunikation von/zur eingebetteten DUT-Hardware. Allerdings kann ich über die wsl.exe-Schnittstelle immer noch keine externen Programme wie Ping und einige andere Linux-CLI-Apps starten oder mit ihnen kommunizieren.

Starte ich die wsl.exe manuell, per Klick im Windows Explorer oder aus einer (Windows CMD-)Eingabeaufforderung, erhalte ich im virtuellen Terminal die Bash-Eingabeaufforderung und kann wie erwartet alle benötigten Tool-Befehle interaktiv eintippen.

Aber was auch immer ich versuche, wsl.exe aus meinen Tcl-Skripten heraus zu starten, mit dem (Expect-) 'spawn'-Befehl oder einfach:

exec C:\\Windows\\system32\\wsl.exe $lnxcmd $params ,

Für wsl.exe erhalte ich entweder die Meldung „Datei nicht gefunden“ oder überhaupt keine Antwort.

Was ist der Trick, um wsl.exe auszuführen und ein Linux-Programm aus einem Tcl-Skript heraus, das in der Windows-Domäne ausgeführt wird, „programmgesteuert“ auszuführen und damit zu interagieren (stdin/stdout/stderr werden von Expect behandelt)?

Sogar ein Aufruf von '% dir C:\Windows\system32\ws*.exe' aus der %-Shell-Eingabeaufforderung des Tcl-Interpreters (tclsh85 oder wish85) zeigt kein einziges Ergebnis, obwohl die Datei WSL.EXE definitiv in diesem Windows-Systemordner vorhanden ist?

Antwort1

Aber was auch immer ich versuche, wsl.exe aus meinen Tcl-Skripten heraus zu starten, mit dem (Expect-) 'spawn'-Befehl oder einfach:

exec C:\Windows\system32\wsl.exe $lnxcmd $params ,

Für wsl.exe erhalte ich entweder die Meldung „Datei nicht gefunden“ oder überhaupt keine Antwort.

Vielleicht ist Ihr Pfad falsch, ich verwende kein Tcl/tk, aber soweit ich das hier lesen kann:https://www.tcl.tk/man/tcl8.3/TclCmd/filename.htm#M26 Die Art und Weise, wie Sie Ihren Pfad schreiben, ist nicht gut.

Wenn Sie darüber hinaus einen Linux-Befehl an WSL senden möchten, schlage ich die Verwendung des Parameters -e vor:wsl -e ping 192.168.1.1

verwandte Informationen