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.
Ofusca el código
Sin herramientas de terceros
Plataforma cruzada (probado desde el host de MacOS al remoto de FreeBSD)
No es necesario establecer el bit de ejecución ( chmod +x
)
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.
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.
0 votos
Como dice @GordonDavisson, esto parece un problema X-Y. ¿Puede usted aclarar por qué ¿quieres un ejecutable? ¿Ofuscación de código? ¿Rendimiento? ¿Imposibilidad de realizar cambios? ¿Posibilidad de ejecutarlo sin un shell instalado? ¿Posibilidad de tener un icono y estar en el Dock? ¿Posibilidad de ejecutarse con un doble clic? (Probablemente haya diferentes soluciones dependiendo de sus necesidades reales).