15 votes

Convertir un script bash en un exécutable binaire autonome compilé, pas en texte

Je veux rendre un script Bash exécutable par le noyau. J'ai déjà utilisé la commande chmod +x et #!/bin/bash pour le rendre exécutable et cela fonctionne, mais ce que je veux faire est le rendre exécutable sans un interprète, comme un exécutable d'une application compilée.

Y a-t-il un moyen de le faire? Tout ce dont j'ai besoin est un moyen de rendre mon script Bash exécutable depuis le noyau de macOS lui-même et je n'ai pas besoin de spécifier un shebang. Je ne veux pas non plus que quelqu'un puisse l'ouvrir avec un éditeur de texte ou similaire et voir le code.

1 votes

C'est la même question que vous avez posée qui a été fermée! apple.stackexchange.com/questions/402870/…

7 votes

Comme indiqué, c'est impossible. Les scripts bash sont, par définition, des fichiers texte qui indiquent à bash ce qu'il doit faire, et non des exécutables binaires qui seraient chargés par le noyau. Selon votre objectif réel, il pourrait y avoir un moyen d'y parvenir, mais vous devriez expliquer ce que vous essayez réellement de réaliser (voir problème XY).

2 votes

Doit-il s'agir d'un script bash? Il existe d'autres langages plus adaptés pour produire un binaire compilé ou du pseudo-code.

2voto

Jose Chavez Points 645

Une approche intéressante pour résoudre ce problème pourrait être d'utiliser le point de contrôle du processus ou l'hibernation du processus.

Cela impliquerait essentiellement d'ajouter un délai de sommeil initial au début de votre script bash. Démarrez l'interpréteur bash comme d'habitude, le script dort - et ensuite vous "hibernez" le processus. Cela enregistrerait en gros son état dans un fichier binaire sur le disque.

Plus tard, vous pourrez reprendre le fichier (sur n'importe quel ordinateur), ce qui reprendrait l'exécution de votre programme.

C'est une méthode qui ne nécessite pas de réimplémenter le langage shell bash. En revanche, il existe un risque que cela ne fonctionne pas avec de grands scripts ou similaires, où les descripteurs de fichier devraient être automatiquement rouverts pour que bash lise à nouveau le script (ce qui va à l'encontre de l'objectif de cette question).

Le seul problème maintenant est que je ne connais pas d'outil d'hibernation de processus pour macOS actuellement. Vous devriez probablement commencer par en construire un (ou en porter un). Vous pourriez regarder des solutions pour d'autres systèmes d'exploitation, comme par exemple les outils Linux CRIU, CryoPID et ckpt.

Un moyen très détourné d'obtenir quelque chose de similaire à cela serait d'utiliser un système de virtualisation tel que VMware ou même quelque chose comme Docker sur Mac. Exécutez le script à l'intérieur de Docker par exemple, mettez en pause votre conteneur lorsque le script dort (le conteneur est alors en pause). Ensuite, supprimez le script shell du stockage - et plus tard, vous pourriez restaurer le conteneur pour reprendre l'exécution.

0 votes

Si vous savez comment programmer dans n'importe quel langage compilé à l'avance, et que vous connaissez les appels système POSIX, il n'est probablement pas très difficile de les réimplémenter en C par exemple. Surtout si vous n'avez pas peur d'imposer certaines limites de taille fixes sur la taille des tampons que vous capturez depuis un pipe, si vous avez même besoin d'émuler foo=$(prog) du tout. Mais oui, c'est une idée astucieuse de le faire de cette manière.

0 votes

Portage vers perl pourrait être beaucoup plus facile; il peut effectuer des tâches semblables à celles des scripts shell, parfois avec une syntaxe similaire. Et il y a un outil perl->exécutable. metacpan.org/pod/distribution/B-C/script/perlcc.PL. De mémoire, il y en avait un qui fonctionnait en vidant l'interpréteur perl après l'analyse; c'est pourquoi ta réponse m'a fait y penser. Mais il semble que perlcc soit plus sophistiqué de nos jours.

0 votes

Oui, j'ai utilisé un tel outil pour l'un de mes programmes Perl dans les années 90 je pense... cependant dans tous les cas, vous seriez vraiment en train de programmer en C ou en Perl - et alors ce n'est plus un script bash. Sur un Mac moderne, il est probablement plus facile d'utiliser le PHP inclus si vous voulez emprunter cette voie - mais c'est vraiment un jeu de balle différent.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X