Ich automatisiere viele Prozesse unter Windows mithilfe von Batchdateien und Putty.
Z. B. ( login_server7.bat ):
start C:\Users\Jack\Documents\putty.exe -ssh 1.1.1.1 -l user123 -pw "bleh"
Wie kann ich ein Ubuntu-Terminal starten und nach dem Öffnen einer Datei automatisch einen Befehl ausführen?
Anstatt das Ubuntu-Terminal manuell zu öffnen und meine Befehle einzugeben?
Ich kann sonst nichts zu diesem Thema finden. Grüße
Antwort1
Die ausführbare Datei von WSL ist C:\Windows\System32\wsl.exe
. Sie können einfach wsl
in die Windows-Eingabeaufforderung eingeben und werden bei der Standard-WSL-Instanz angemeldet. Oder geben Sie ein, wsl -h
um eine Liste aller verfügbaren Optionen zu erhalten. In Batchdateien können Sie Folgendes verwenden:
C:\Windows\System32\wsl.exe <your script or command>
Oder wenn Sie den Befehl als Root ausführen müssen:
C:\Windows\System32\wsl.exe sudo <your script or command>
Wahrscheinlich ist es korrekter, zu verwenden wsl -e -- <command>
, aber das obige funktioniert für mich gut. Hier ist ein ausführlicheres Beispiel:Ubuntu 18.04 auf WSL-Cron-Daemon läuft nach dem Neustart nicht.
Antwort2
Wie in ps4080
der Antwort von erwähnt, ist die richtige Vorgehensweise wsl -e -- <command>
(oder normalerweise wsl -e <command>
).
Allerdings gibt es bei dieser Technik tatsächlich einige Nuancen, auf die Sie stoßen könnten, und es ist gut zu wissen, was bei jedem einzelnen Zauberspruch passiert, damit Sie bei Bedarf den richtigen verwenden können:
wsl <command>
- Führt die Standard-Shell für den aktuellen Benutzer aus
- ... als Shell ohne Anmeldung und ohne interaktive Funktion
- ... in dem vom besitzenden Windows-Prozess übergebenen Verzeichnis
- Läuft
<command>
in dieser Shell
Abhängig von Ihrer Shell können Sie dies wie folgt sehen wsl ps -eH
:
PID TTY TIME CMD
1 ? 00:00:00 init
18 ? 00:00:00 init
19 ? 00:00:00 init
20 pts/0 00:00:00 fish
28 pts/0 00:00:00 ps
Beachten Sie, dass dies schwierig zu erkennen ist, wenn es bash
sich um Ihre Standard-Shell handelt, da -c
dies zu einem impliziten führt exec
.
Die Tatsache, dass dies im Verzeichnis des entsprechenden Windows-Prozesses ausgeführt wird, kann praktisch sein, da Sie Folgendes tun können:
wsl ls -lh
... in PowerShell, um „menschenlesbare“ Dateigrößen zu erhalten, wasüberraschend schwierig zu machenansonsten.
Der schwierigste Teil davon ist der zweite Qualifizierer. WSL führt Ihre Shell als nicht-loginierte, nicht-interaktive Shell aus, wenn sie auf diese Weise gestartet wird. Das bedeutet, dass ~/.bashrc
und~/.bash_profile
nichtbeim Start als Quelle verwendet. Dies kann zu Verwirrung führen, wenn versucht wird, einen Befehl auszuführen, der erfordert, dass etwas in den Startdateien getan wird (z. B. das Festlegen einer Umgebungsvariablen).
wsl -e <command>
- Läuft
<command>
alsdie Muschel - ... in dem vom Eigentümerprozess übergebenen Verzeichnis
Dadurch -e
wird Ihre Standard-Shell vollständig umgangen.
> wsl ps -eH
PID TTY TIME CMD
1 ? 00:00:00 init
7 ? 00:00:00 init
8 ? 00:00:00 init
9 pts/0 00:00:00 ps
Das kann seinleichteffizienter, da Sie den Start-Overhead der Shell vermeiden, aber es ist normalerweise nicht der Rede wert.
wsl -e bash -lic <command>
- Läuft
bash
als Ihre Shell (unabhängig davon, ob es die Standard-Shell ist oder nicht) - Erzwingt eine Anmeldung, interaktive Shell (
-li
), so dass~/.bashrc
und~/.bash_profile
(und/oder andere) als Quelle verwendet werden - ... in dem vom besitzenden Windows-Prozess übergebenen Verzeichnis
- Läuft
<command>
in dieser Shell
Dies ist die zu verwendende Version, wenn der Befehl etwas aus Ihrer Startkonfiguration benötigt.