Bash est techniquement un langage interprété, il n'est pas compilé; il n'est pas possible de le compiler.
Bash est le shell, ou interpréteur de commandes, pour le système d'exploitation GNU.
Cependant, il est possible de l'obfusquer pour que les regards curieux ne puissent pas lire votre script.
Utilisez openssl pour encoder le fichier.
J'ai créé un simple fichier script Zsh appelé arraytest.sh
qui s'exécutera dans Zsh (c'est ce que j'avais disponible à ce moment-là). Je ne vais pas poster le script shell réel, à la place, je vais poster l'encodage en base64.
Sur mon ordinateur, j'exécute la commande suivante sur mon script et obtiens les résultats suivants:
% openssl base64 < arraytest.sh
IyEvYmluL3pzaAoKZGVjbGFyZSAtQSBwcm9ncz0oW2dzXT0iR2hvc3RzY3JpcHQi
IFtic109IkJ1bGxzaGl0IiBbYWJdPSJWb2RrYSIpCgoKbGV0IGFzaXplPSR7I3By
b2dzW0BdfQpsZXQgYnNpemU9JGFzaXplLTEKbGV0IGk9MQpmb3IgeCBpbiAiJHtw
cm9nc1tAXX0iOwpkbwogIGlmIFsgJGkgLWVxICRic2l6ZSBdICAgCiAgdGhlbgog
ICBwcmludGYgIiR4IGFuZCAiCiAgZWxpZiBbICRpIC1sZSAkYnNpemUgXSAmJiBb
ICRpIC1nZSAxIF0KICB0aGVuCiAgICBwcmludGYgIiR4LCAiCiAgZWxzZQogICAg
cHJpbnRmICIkeCIKICBmaQogICgoaSsrKSkKZG9uZQoKcHJpbnRmICIuXG4iCmVj
aG8gRG9uZS4KCg==
Cet sortie doit être enregistrée dans un fichier. Appelons-le monscriptencodé
. Vous pouvez le copier et le coller dans un nouveau fichier. Vous n'avez pas besoin de le rendre exécutable. Une fois que vous avez copié ce script dans votre presse-papiers, exécutez la commande suivante
% pbpaste > monscriptencodé
Maintenant, vous devriez avoir un fichier appelé monscriptencodé
. Ensuite, pour l'exécuter, vous devez renvoyer cet encodage via openssl
pour le décoder, puis le rediriger vers votre shell.
% cat monscriptencodé | openssl base64 -d | zsh
Cela devrait exécuter le script et générer une sortie à partir d'un tableau associatif.
Alors, comment pouvez-vous rendre cela autonome?
#!/bin/zsh
#
#Nom du Script: script_encodé.sh
code="IyEvYmluL3pzaAoKZGVjbGFyZSAtQSBwcm9ncz0oW2dzXT0iR2hvc3RzY3JpcHQi
IFtic109IkJ1bGxzaGl0IiBbYWJdPSJWb2RrYSIpCgoKbGV0IGFzaXplPSR7I3By
b2dzW0BdfQpsZXQgYnNpemU9JGFzaXplLTEKbGV0IGk9MQpmb3IgeCBpbiAiJHtw
cm9nc1tAXX0iOwpkbwogIGlmIFsgJGkgLWVxICRic2l6ZSBdICAgCiAgdGhlbgog
ICBwcmludGYgIiR4IGFuZCAiCiAgZWxpZiBbICRpIC1sZSAkYnNpemUgXSAmJiBb
ICRpIC1nZSAxIF0KICB0aGVuCiAgICBwcmludGYgIiR4LCAiCiAgZWxzZQogICAg
cHJpbnRmICIkeCIKICBmaQogICgoaSsrKSkKZG9uZQoKcHJpbnRmICIuXG4iCmVj
aG8gRG9uZS4KCg=="
echo "$code" | openssl base64 -d | zsh
Enregistrez ce script sous le nom de script_encodé.sh
, rendez-le exécutable puis exécutez-le avec la commande ./script_encodé.sh
Bonus...
(Cela suppose un scénario où un administrateur doit exécuter un script discrètement sur une ou plusieurs machines sous sa responsabilité.)
Si vous voulez vraiment cacher cela aux "regards curieux", utilisez cette commande en une seule ligne:
% openssl base64 < script.sh | ssh utilisateur@hôte.domaine ' openssl base64 -d | bash'
Cela va encoder le script, le rediriger à travers une connexion SSH où il décode le script et le passe à l'interpréteur de commandes.
Obfusque le code
Aucun outil tiers nécessaire
Multiplateforme (testé de l'hôte macOS au distant FreeBSD)
Pas besoin de définir le bit exécutable (chmod +x
)
Gatekeeper sur macOS est rendu inopérant car ce n'est pas une application qui doit être notariée ou explicitement autorisée par l'utilisateur.
Évidemment, vous avez besoin d'un compte sur le distant et, bien que pratique, mais pas obligatoire, des clés SSH activées pour ne pas avoir à entrer un mot de passe, surtout si vous exécutez ceci sur un lot de machines.
Note: Cela a été fait en Zsh avec un tableau associatif. Cela peut fonctionner en Bash mais vous aurez besoin d'au moins la version 4 de Bash pour fonctionner correctement. Il n'y a rien de malveillant dans le script. Il affichera 3 mots et ensuite, sur une nouvelle ligne, le mot "Terminé" pour indiquer que le script est terminé.
Si vous voulez vérifier que le code vient vraiment de moi, créez un fichier appelé monscriptencodé
dans vi
, collez le code (sans guillemets), assurez-vous d'appuyer sur "I" pour "Insérer" avant de coller, enregistrez-le et exécutez la commande et vérifiez le hachage ci-dessous
% shasum -a 256 monscriptencodé
d4fc6ce35480b0ace6ed0e1c910f1f40079a106b1914d767fa17ada02a422f88 monscriptencodé
Cela fonctionnera uniquement si vous utilisez le même nom de fichier. J'ai testé ceci sur plusieurs plates-formes sur macOS et sur FreeBSD. Si vous n'obtenez pas le même hachage, faites-le moi savoir.
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.
0 votes
Comme le dit @GordonDavisson, cela ressemble à un problème X-Y. Pouvez-vous préciser pourquoi vous voulez un exécutable ? Obfuscation du code ? Performance ? Incapacité à apporter des modifications ? Capacité à s'exécuter sans installation de shell ? Capacité à avoir une icône et à être dans le Dock ? Capacité à s'exécuter en double-cliquant ? (Il y a probablement différentes solutions en fonction de vos besoins réels.)