15 votos

Convertir bash script en un ejecutable binario independiente compilado, no en texto

Quiero hacer un Bash script ejecutable por el kernel. Ya he utilizado el chmod +x comando y #!/bin/bash para hacerlo ejecutable y funciona, pero lo que quiero hacer es que sea un ejecutable sin intérprete, como un ejecutable de una aplicación compilada.

¿Hay alguna forma de hacerlo? Todo lo que necesito es una manera de hacer por Bash script ejecutable desde el propio kernel de MacOS y no necesito especificar un shebang. Tampoco quiero que nadie pueda abrirlo con text edit o similar y pueda ver el código.

1 votos

Esta es la misma pregunta que hiciste y que se cerró. apple.stackexchange.com/questions/402870/

7 votos

Como se ha dicho, es imposible. Los bash scripts son, por definición, archivos de texto que le dicen a bash qué hacer, no ejecutables binarios que serían cargados por el kernel. Dependiendo de su objetivo real, podría haber una manera de lograrlo, pero tendría que explicar lo que realmente está tratando de lograr (ver Problema XY ).

2 votos

¿Tiene que ser un bash script? Hay otros lenguajes que son más adecuados para producir binarios compilados o pseudocódigo.

16voto

Jose Chavez Puntos 645

Yo echaría un vistazo a un proyecto llamado shc (Shell scriptcompilador).

https://github.com/neurobin/shc

Toma un shell script y lo compila en código fuente C. El código fuente C puede entonces ser compilado con un compilador C estándar en un ejecutable binario.

Esto le permite ejecutar el script que ha hecho sin que el contenido del shell script sea revelado inmediatamente en texto claro. Sería un ejecutable binario como tantos otros.

Puede llevar un poco de prueba y error conseguir que tu script específico sea analizado por shc dependiendo de las características avanzadas que estés usando en tu script de bash, pero esto debería llevarte a la mayor parte del camino.

Tenga en cuenta que el programa realmente sólo encripta su shell script y lo integra dentro del binario. Cuando se ejecuta el binario, el script se descifra y se ejecuta utilizando de nuevo el shell ordinario. Para los programadores sería trivial romper esto para revelar el contenido de su script, pero para ocultar el contenido de script del usuario doméstico medio quizás sería suficiente.

Si tiene instalado HomeBrew, puede instalar shc ejecutando el siguiente comando en el Terminal:

brew install shc

Entonces es sólo cuestión de correr shc para convertir tu script en un binario:

shc -U -f myscript.sh -o mybinary

El comando mybinary es entonces el producto final.

9voto

David Anderson Puntos 2189

Como jksoegaard ya publicado, existe el comando shc . A continuación se muestra un ejemplo de cómo instalar y utilizar este comando. He probado esta respuesta utilizando MacOS Big Sur.

Aquí están los pasos Solía instalar shc.

  1. Abrir Terminal pulsando command + space y a continuación escriba terminal y golpear Enter clave.

  2. Instalar homebrew primero.

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
  3. Instalar shc .

    brew install shc

A continuación se muestra un listado del archivo de prueba script llamado hello.sh .

#!/bin/bash
osascript -e 'display dialog "Hi There"' >/dev/null'

Aquí están los pasos He utilizado para crear y probar el ejecutable.

  1. Introduzca el siguiente comando para compilar el script utilizando shc .

    shc -f hello.sh
  2. Introduzca el siguiente comando para renombrar el ejecutable.

    mv hello.sh.x hello
  3. Introduzca el comando a probar.

    ./hello

    A continuación se muestra el cuadro de diálogo resultante.


Anexo

A continuación se muestra el resultado de la ejecución de los comandos.

Last login: Thu Oct  8 06:36:48 on console
dma@dmas-Mac-mini ~ % ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null 
Password:
==> You are using macOS 11.0.
==> We do not provide support for this pre-release version.
This installation may not succeed.
After installation, you will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew\'s GitHub,
Discourse, Twitter or IRC. You are responsible for resolving any issues you
experience while you are running this pre-release version.

==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following existing directories will be made group writable:
/usr/local/bin
==> The following existing directories will have their owner set to dma:
/usr/local/bin
==> The following existing directories will have their group set to admin:
/usr/local/bin
==> The following new directories will be created:
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/sbin
/usr/local/share
/usr/local/var
/usr/local/opt
/usr/local/share/zsh
/usr/local/share/zsh/site-functions
/usr/local/var/homebrew
/usr/local/var/homebrew/linked
/usr/local/Cellar
/usr/local/Caskroom
/usr/local/Homebrew
/usr/local/Frameworks
==> The Xcode Command Line Tools will be installed.
==> /usr/bin/sudo /bin/chmod u+rwx /usr/local/bin
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/bin
==> /usr/bin/sudo /usr/sbin/chown dma /usr/local/bin
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/bin
==> /usr/bin/sudo /bin/mkdir -p /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /usr/sbin/chown dma /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/mkdir -p /Users/dma/Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Users/dma/Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown dma /Users/dma/Library/Caches/Homebrew
==> Searching online for the Command Line Tools
==> /usr/bin/sudo /usr/bin/touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
==> Installing Command Line Tools for Xcode-12.0
==> /usr/bin/sudo /usr/sbin/softwareupdate -i Command\ Line\ Tools\ for\ Xcode-12.0
Software Update Tool

Finding available software

Downloading Command Line Tools for Xcode
Downloaded Command Line Tools for Xcode
Installing Command Line Tools for Xcode
Done with Command Line Tools for Xcode
Done.
==> /usr/bin/sudo /bin/rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
Password:
==> /usr/bin/sudo /usr/bin/xcode-select --switch /Library/Developer/CommandLineTools
==> Downloading and installing Homebrew...
HEAD is now at f84b9a027 Merge pull request #8878 from reitermarkus/upgrade-casks
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
Already up-to-date.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh
dma@dmas-Mac-mini ~ % brew install shc
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 4 formulae.

Warning: You are using macOS 11.0.
We do not provide support for this pre-release version.
You will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew's GitHub,
Discourse, Twitter or IRC. You are responsible for resolving any issues you
experience while you are running this pre-release version.

==> Downloading https://homebrew.bintray.com/bottles/shc-4.0.3.catalina.bottle.tar.gz
######################################################################## 100.0%
==> Pouring shc-4.0.3.catalina.bottle.tar.gz

3 votos

No es necesario instalar primero homebrew: shc compila desde el código fuente fácilmente

2 votos

Tal vez, pero no tenía instalado un compilador. Instalar Brew lo hizo por mí. Ver la parte del Apéndice de mi respuesta. Podría estar equivocado, pero asumo que esto tomó menos espacio que la instalación de todo Xcode.

2 votos

Lo único que hay que tener instalado es Herramientas de línea de comandos para Xcode para compilar directamente desde código fuente e instalar como se muestra en Instalar en github.com/neurobin/shc que al instalar Homebrew si no están ya instalados.

6voto

Douglas Puntos 10417

Bash es técnicamente un interpretado idioma no está compilado; no es posible compilarlo.

Bash es el intérprete de comandos del sistema operativo GNU.

Sin embargo, es posible ofuscarlo para que las miradas indiscretas no puedan mirar su script.

Utilice openssl para codificar el archivo.

He creado un simple archivo Zsh script llamado arraytest.sh que se ejecutará en Zsh (es lo que tenía disponible en este momento). No voy a publicar el shell script, en su lugar, voy a publicar la codificación base64.

En mi ordenador, ejecuto el siguiente comando en mi script y obtengo los siguientes resultados:

% openssl base64 < arraytest.sh

IyEvYmluL3pzaAoKZGVjbGFyZSAtQSBwcm9ncz0oW2dzXT0iR2hvc3RzY3JpcHQi
IFtic109IkJ1bGxzaGl0IiBbYWJdPSJWb2RrYSIpCgoKbGV0IGFzaXplPSR7I3By
b2dzW0BdfQpsZXQgYnNpemU9JGFzaXplLTEKbGV0IGk9MQpmb3IgeCBpbiAiJHtw
cm9nc1tAXX0iOwpkbwogIGlmIFsgJGkgLWVxICRic2l6ZSBdICAgCiAgdGhlbgog
ICBwcmludGYgIiR4IGFuZCAiCiAgZWxpZiBbICRpIC1sZSAkYnNpemUgXSAmJiBb
ICRpIC1nZSAxIF0KICB0aGVuCiAgICBwcmludGYgIiR4LCAiCiAgZWxzZQogICAg
cHJpbnRmICIkeCIKICBmaQogICgoaSsrKSkKZG9uZQoKcHJpbnRmICIuXG4iCmVj
aG8gRG9uZS4KCg==

Esa salida debe guardarse en un archivo. Llamémoslo myencodedscript . Puedes copiarlo y pegarlo en un nuevo archivo. No tienes que hacerlo ejecutable. Una vez que hayas copiado ese script en tu portapapeles, ejecuta el comando

% pbpaste > myencodedscript

Ahora, debería tener un archivo llamado myencodedscript . A continuación, para ejecutarlo, hay que volver a pasar esa codificación por openssl para decodificarlo y luego canalizarlo a tu shell.

% cat myencodedscript | openssl base64 -d | zsh

Debe ejecutar el script y generar la salida de un array asociativo.

Entonces, ¿cómo puedes hacer que esto sea autónomo?

#!/bin/zsh
#
#Script Name:  encoded_script.sh

code="IyEvYmluL3pzaAoKZGVjbGFyZSAtQSBwcm9ncz0oW2dzXT0iR2hvc3RzY3JpcHQi
IFtic109IkJ1bGxzaGl0IiBbYWJdPSJWb2RrYSIpCgoKbGV0IGFzaXplPSR7I3By
b2dzW0BdfQpsZXQgYnNpemU9JGFzaXplLTEKbGV0IGk9MQpmb3IgeCBpbiAiJHtw
cm9nc1tAXX0iOwpkbwogIGlmIFsgJGkgLWVxICRic2l6ZSBdICAgCiAgdGhlbgog
ICBwcmludGYgIiR4IGFuZCAiCiAgZWxpZiBbICRpIC1sZSAkYnNpemUgXSAmJiBb
ICRpIC1nZSAxIF0KICB0aGVuCiAgICBwcmludGYgIiR4LCAiCiAgZWxzZQogICAg
cHJpbnRmICIkeCIKICBmaQogICgoaSsrKSkKZG9uZQoKcHJpbnRmICIuXG4iCmVj
aG8gRG9uZS4KCg=="

echo "$code" | openssl base64 -d | zsh

Guarda ese script como encoded_script.sh y lo convierte en ejecutable y lo ejecuta con el comando ./encoded_script.sh

Bonificación...

(Esto supone un escenario como el de un administrador que necesita ejecutar un script discretamente en 1 o más máquinas a su cargo).

Si quieres ocultar realmente esto de las "miradas indiscretas", utiliza este comando de una sola línea:

% openssl base64 < script.sh | ssh user@hostname.domain ' openssl base64 -d | bash'

Esto codificará el script, lo canalizará a través de una conexión SSH donde decodificará el script y lo pasará al intérprete de la shell.

green check Ofusca el código
green check Sin herramientas de terceros
green check Plataforma cruzada (probado desde el host de MacOS al remoto de FreeBSD)
green check No es necesario establecer el bit de ejecución ( chmod +x )
green check Gatekeeper en MacOS es discutible ya que no es una aplicación que deba ser notariada o permitida explícitamente por el usuario.

Obviamente necesitas una cuenta en el remoto y aunque es bueno, pero no obligatorio, habilitar las claves SSH para no tener que introducir una contraseña, especialmente si estás ejecutando esto en un lote de máquinas.


Nota: Esto se hizo en Zsh con un array asociativo. Puede funcionar en Bash pero necesitarás al menos la versión 4 de Bash para que funcione correctamente. Tampoco hay nada nefasto en el script. Imprimirá 3 palabras y luego, en una nueva línea, la palabra "Done" para indicar que el scriptha terminado.

Si quieres verificar que el código es realmente mío, crea un archivo llamado myencodedscript en vi Pegue el código (sin comillas), asegúrese de pulsar la "I" de "Insertar" antes de pegarlo, guárdelo y emita el comando y compruebe el hash de abajo

% shasum -a 256 myencodedscript
d4fc6ce35480b0ace6ed0e1c910f1f40079a106b1914d767fa17ada02a422f88  myencodedscript

Sólo funcionará si utiliza el mismo nombre de archivo. He probado esta plataforma cruzada en MacOS y en FreeBSD. Si no obtienes el mismo hash, házmelo saber.

3 votos

El OP, entre otras cosas, dice "tampoco quiero que nadie pueda abrirlo con text edit o similar y pueda ver el código" y lo que propones no lo cubre realmente porque, no sólo se puede abrir el e.g. encoded_script.sh También se puede ver lo que hay en él y también fácilmente descifrar el codificado texto para ver lo que dice también.

2 votos

@user3439894 Supongo que el hecho de que yo diga que lo que él quiere no es posible pero yo digo "Sin embargo, es posible ofuscar para que las miradas indiscretas no puedan mirar tu script" no tiene ninguna importancia?

2 votos

Técnicamente no es que porque un lenguaje sea "un lenguaje interpretado" ahora mismo, no pueda convertirse en un lenguaje compilado más adelante. Así que decir que no es posible basándose en eso es un poco escaso.

3voto

john Puntos 11

No sé si esto hará lo que quieres pero la aplicación gratuita Ornitorrinco tomará una línea de comandos script y la convertirá en una aplicación para Mac. También funciona con Python, Perl y otros . Puedes leerlo en el enlace que te he puesto para ver si hace lo que quieres. Nota: Usando mi método es posible ver el script original.

0 votos

El OP, entre otras cosas, dice "Tampoco quiero que nadie pueda abrirlo con text edit o similar y pueda ver el código" y mientras Ornitorrinco crea una paquete de aplicaciones Sin embargo, el shell script que se le pasa sigue estando en forma legible para el ser humano dentro del paquete de aplicaciones en, por ejemplo name.app/Contents/Resources/$script .

0 votos

Intenté mirar el código pero no pude encontrar el archivo legible para humanos. no digo que no esté ahí sólo que no lo encontré y lo tuve en cuenta. lo comprobaré de nuevo. Gracias.

0 votos

Volví a entrar en la aplicación pero todavía no pude encontrar un archivo original script. Si sabes dónde puede estar en el directorio de archivos de la aplicación, por favor, házmelo saber. He comprobado ccontents/MacOS y el único archivo es el archivo ejecutable que parece estar en formato binario o en otro formato ilegible. También revisé Contents/Resources y tampoco estaba allí.

3voto

user3439894 Puntos 5883

Como no está del todo claro qué es lo que realmente buscas, lo que voy a sugerir es lo siguiente:

  • Crea a partir de un bash script un paquete de aplicaciones con una sola estructura ejecutable binario que no contiene en forma legible para el ser humano ninguna de las scriptcódigo utilizado para crearlo.
  • Se ejecuta como un ordinario MacOS paquete de aplicaciones que se ejecuta como el nombre de paquete de aplicaciones .
  • No se abre Terminal durante su ejecución.

Dicho esto, todavía se puede interpretar porque si se mira el Archivos y puertos abiertos en Monitor de actividad por ejemplo nombre.app paquete de aplicaciones , /bin/bash está en la lista.

Hay un GitHub proyecto denominado bashapp que establece:

bashapp toma como entrada un bash script y genera un ejecutable binario y una estructura de directorios de la aplicación OS X y una estructura de directorios de la aplicación OS X. Esto permite a los desarrolladores proporcionar Finder clickable bash sin que aparezcan terminales, etc. Útil para el lanzamiento, servicio , etc.

También proporciona una encriptación sencilla del código fuente como medio para ofuscar el bash script. Puede especificar su propia clave, o dejar que bashapp genere una clave aleatoria de tamaño aleatoria para usted, de no menos de 32 bytes de longitud.

Deberá tener Herramientas de línea de comandos para Xcode instalado para compilar el bashapp ejecutable que crea el paquete de aplicaciones . Ver: Cómo instalar herramientas de línea de comandos en Mac OS X (sin Xcode) O en Terminal correr: xcode-select --install

Dicho esto, hubo una cosa molesta en que el Azulejos de muelle para el aplicación rebota en el Muelle mientras se ejecuta. Una solución para esto es que no se muestre en el Muelle ejecutando lo siguiente en Terminal :

defaults write '/path/to/$name.app/Contents/Info.plist' LSUIElement -bool yes

Cambiar /path/to/$name.app según corresponda.

0 votos

Esta es una herramienta muy interesante, sin embargo hay un problema cuando se trata de distribuir la aplicación - Gatekeeper. Esta aplicación no se ejecutará en MacOS 10.14+ sin algún tipo de intervención.

0 votos

@Allan, RE: "Esta aplicación no funcionará en MacOS 10.14+ sin algún tipo de intervención". -- Me parece que esa afirmación no es cierta porque he probado una aplicación creado con bashapp en MacOS High Sierra y se ejecutó en MacOS Catalina sin problemas. Dicho esto, no se mencionó explícitamente la distribución del archivo en el PO, por lo que no es un problema en este punto AFAIC.

0 votos

En qué mejora tu respuesta con respecto a "El OP, entre otras cosas, dice "Tampoco quiero que nadie pueda abrirlo con text edit o similar y pueda ver el código." ", comentario que has dejado debajo de las otras respuestas aquí? :-)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X