web-dev-qa-db-fra.com

Comment compiler un script shell Linux pour être un exécutable autonome * binaire * (c'est-à-dire pas seulement par exemple chmod 755)?

Je recherche un ensemble d'outils open source gratuit qui compilera divers langages de script "classiques", par exemple Korn Shell, ksh, csh, bash etc. en tant qu'exécutable - et si le script appelle d'autres programmes ou exécutables, pour qu'ils soient inclus dans le seul exécutable.

Les raisons:

  1. Obscurcir le code pour la livraison à un client afin de ne pas révéler notre propriété intellectuelle - pour la livraison sur une client propre machine/systèmes pour lesquels je n'ai aucun contrôle sur les autorisations que je peux définir concernant l'accès, donc le fichier du programme doit être binaire, de sorte que le fonctionnement ne peut pas être facilement vu en le visualisant dans un éditeur de texte ou une visionneuse hexdump.

  2. Pour créer un programme simple et simplement déployé pour le client sans/ou un minimum de dépendances externes.

Je préférerais quelque chose de simple sans avoir besoin de gestionnaire de paquets car:

  1. Je ne peux pas compter sur les connaissances du client pour exécuter les instructions de (dé) conditionnement et

  2. Je ne peux pas me fier aux politiques régissant leurs machines concernant l'installation de packages (et en fait de tiers).

L'approche préférée la plus simple est de pouvoir compiler en code machine approprié un seul exécutable qui s'exécutera hors de la boîte sans aucune dépendance.

41
therobyouknow

La solution qui répond pleinement à mes besoins serait SHC - un outil gratuit, ou CCsh un outil commercial. Les deux compilent des scripts Shell en C, qui peuvent ensuite être compilés à l'aide d'un compilateur C.

Liens sur SHC:

Liens sur CCsh:

39
therobyouknow

Vous pouvez utiliser ceci: http://megastep.org/makeself/

Cela génère un script Shell qui extrait automatiquement une archive tar.gz intégrée dans le répertoire temporaire, puis peut exécuter une commande arbitraire lors de l'extraction.

À l'aide de cet outil, vous ne pouvez fournir qu'un seul script Shell au client.

Ce script extraira ensuite vos ofbsh scripts et fichiers binaires obscurcis dans/tmp, et les exécutera de manière transparente.

5
SirDarius

Vous pouvez obscurcir les scripts Shell avec quelque chose comme ofbsh . Cependant, vous ne regrouperez pas facilement d'autres programmes dans un seul exécutable pour Unix. Normalement, l'approche pour l'installation serait de grouper un package pour le gestionnaire de packages de votre plate-forme (par exemple rpm,deb,pkg ) ou de fournir un tarball à démêler dans le répertoire approprié.

Si vous avez besoin d'un fichier exécutable qui décompresse le contenu, vous pourrez peut-être utiliser une archive Shell. Jetez un oeil aux documents pour shar (1) et voyez si cela obtiendra ce que vous voulez

Si vous avez vraiment besoin d'une capacité de script pour coller plusieurs programmes C ensemble, jetez un œil au langage Tcl. Il a une API qui est conçue pour envelopper trivialement les programmes C qui s'attendent à voir argv[] paramètres de style. Vous pouvez même incorporer les morceaux de code C dans un interpréteur Tcl personnalisé et le coller avec divers scripts Tcl.

Si vous avez vraiment besoin de le rendre opaque, vous pouvez crypter les scripts tcl et envelopper le tout dans quelque chose qui décrypte les scripts tcl dans un tampon, puis exécute l'interpréteur Tcl sur eux. Tcl peut accepter des scripts à partir d'un fichier ou d'un char* buffer, pour que les scripts non chiffrés n'aient jamais à frapper le système de fichiers.

shc

J'ai modifié l'original source et mis à niveau vers une nouvelle version avec quelques ajouts de fonctionnalités et corrections de bugs. C'est ici .

Exemple d'utilisation:

shc -f script.sh -o binary_name

script.sh sera compilé en un binaire nommé nom_binaire

Notez que vous devez toujours installer le shell requis sur votre système pour exécuter cet exécutable.

3
Jahid

Options qui s'offrent à vous:

  • Écrivez une logique dans votre code qui, lorsque le code est exécuté pour la première fois sur une boîte, vérifie si tous les packages requis existent. Et s'ils ne le font pas, le code ira automatiquement chercher les packages lui-même et les installera ... sans demander à l'utilisateur de faire quoi que ce soit. La seule question que l'utilisateur doit se poser est "Est-ce que je peux continuer l'installation des packages susmentionnés? (O/N)". Tout ce qui est en dehors de cela est trop.

  • Une fois que le code ci-dessus est terminé (oui, je suis conscient que ce n'est peut-être pas si simple pour vous de coder cela, ou peut-être que je ne connais pas vos capacités de codage), copiez et collez votre code terminé dans un site comme kinglazy.com et un fichier exécutable réel sera généré pour vous.

Il y a quelques avantages de cette option particulière:

  • Oui, vous pourrez exécuter la version cryptée de votre script sans exposer aucune information propriétaire.
  • Personne ne peut essayer de "visualiser" votre script, car s'ils le font, ils ne verront rien d'autre qu'un jargon crypté et indéchiffrable qui n'aura pas de sens pour eux.
  • Personne ne peut tenter de modifier votre script, car s'ils le font, le script deviendra immédiatement inutilisable.
  • Personne ne peut exécuter un débogueur sur votre script pour voir comment cela fonctionne. S'ils le font, le script sera abandonné.
  • De plus, personne ne peut créer de copies de votre script sur le même serveur. S'ils le font, cela échouera et ne fonctionnera pas. Il permettra uniquement aux utilisateurs de créer des liens symboliques vers l'emplacement d'origine de l'endroit où vous souhaitez que le script soit.

Il se peut que je manque certaines choses dans ce que vous avez demandé, mais je pense que ce qui précède satisfait une bonne partie de ce que vous vouliez.

Je ne sais pas si cela fonctionne sur d'autres scripts, mais c'est certainement le cas pour les scripts Shell.

1
Blessed

arx est un excellent bundler, et vous pourrez peut-être intégrer un obscurcisseur dans son flux de travail.

1
vdm