1 votes

Comment puis-je automatiser l'envoi de commandes de Windows à Linux (WSL/Ubuntu) ?

Je voudrais automatiser la compilation de mon programme pour Linux par le biais de WSL sous Ubuntu 20 afin de pouvoir mettre en place une tâche IDE côté Windows qui fera la compilation pour moi sur Linux. J'ai pensé à faire une application win32 pour lancer l'exécutable Ubuntu et envoyer des commandes à son stdin comme si je les entrais manuellement, mais comme Ubuntu est UWP, je ne pense pas que ce soit possible ? Les paramètres de l'automatisation script seraient le chemin du répertoire du fichier source principal, le nom du fichier source principal, et n'importe où de 1 à 4-5 autres commutateurs. Je m'attends à ce que l'automatisation soit silencieuse. Exemple de commandes automatisées :

cd /mnt/<provided path>
compiler -switch1 -switch2 -switch3 -out <provided executable file name> <provided source file name>

Le compilateur serait accessible de n'importe où grâce à la variable d'environnement définie dans .bashrc.

1voto

DuncG Points 439

WSL permet d'exécuter très facilement des applications à partir de l'autre environnement - dans les deux sens. Dans Windows, vous pouvez utiliser C:\Windows\System32\bash.exe pour lancer toute commande utilisant Bash dans votre WSL GNU/Linux.

Par exemple - script :

c:\Windows\System32\bash.exe -c "/mnt/c/Temp/your-bash-cmd.sh"

type C:\Temp\your-bash-cmd.sh | c:\Windows\System32\bash.exe

Ou les commandes à exécuter :

c:\Windows\System32\bash.exe -c "ls -al ; echo DONE"

Prenez note d'utiliser le bon chemin du système de fichiers approprié pour chaque environnement, et que les scripts passés de Windows à Bash devront être encodés avec des sauts de ligne Linux.

1voto

NotTheDr01ds Points 5135

Honnêtement, j'ai voté pour le bash.exe réponse après l'avoir parcouru trop rapidement, avant de réaliser qu'il recommandait (l'obsolète) bash.exe . Je vais donc fournir ce que j'espère être une "meilleure réponse".

Notez que bash.exe est répertorié par Microsoft comme un "commandement historique" ce qui, à mon avis, est juste un cran au-dessus de "déprécié".

Actuellement, le la manière recommandée de lancer une instance WSL est avec le wsl.exe (ou simplement wsl lorsqu'il est appelé depuis PowerShell, CMD, ou scripts sous l'un ou l'autre des interpréteurs). Par exemple (en utilisant l'option bash.exe exemples de la question précédente) :

Étant donné un fichier /mnt/c/Temp/your_script.sh (défini comme exécutable, bien sûr) contenant :

#!/usr/bin/env bash
echo Hello
cd /home
pwd

Puis wsl -e "/mnt/c/Temp/your_script.sh" (dans PowerShell) exécuterait ce fichier et aurait pour résultat :

Hello
/home

El -e (également --exec ) à wsl exécute la commande qui suit. comme le Shell par défaut. S wsl -e ls ferait une liste de répertoire sans jamais invoquer bash (ou même sh ).

La méthode shebang-in-a-script est une façon d'exécuter les commandes sur bash mais vous pouvez également invoquer une commande (ou des commandes) comme :

wsl -e bash -c "echo Hello; cd /home; pwd"

Notez, cependant, que :

echo "echo Hello; cd /home; pwd" | wsl

Will no fonctionnent, du moins dans PowerShell, puisque PowerShell a la fâcheuse "fonctionnalité" d'ajouter un retour chariot ( \r ) à toute sortie canalisée vers un exécutable de la console tel que wsl.exe .

Parmi les autres caractéristiques, wsl.exe peut aussi :

  • Lancer ou exécuter une commande dans une instance WSL différente, si vous avez installé plus d'une distribution ou instance (par ex. wsl -d kali )
  • Lancez ou exécutez une commande en tant qu'utilisateur différent sans mot de passe (par ex. wsl -u root visudo )

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X