Je cherche un moyen d'avoir un binaire exécutable câblé dans un script. Quelque chose comme ça :
#!/bin/bash
...some shell code
execute binary:
>>>
binary
code
...
<<<
...some more shell code possibly
J'ai trouvé cette solution, qui utilise uuencode
et c'est bon. Mais cela dépend de shrutils
, qui semblent être un plus, car ils ne sont pas inclus par défaut sur ma Debian.
J'ai pensé à avoir le binaire encodé avec base64
puis le décoder et d'une manière ou d'une autre en cours d'exécution, éventuellement sans créer de fichiers temporaires. Je me souviens qu'il y avait une bibliothèque qui était responsable de l'exécution des choses, mais j'ai oublié ce que c'était.
Il serait peut-être préférable d'avoir une construction aussi simple que cette exécution :
$ <(base64 out | base64 -d)
bash: /dev/fd/63: Permission denied
Réponse acceptée :
Que diriez-vous :
unpack() {
tail +9 "$0" > /tmp/xxx.$$
chmod +x /tmp/xxx.$$
}
unpack
/tmp/xxx.$$ <add args here>
rm /tmp/xxx.$$
exit
<add the binary here>
Si vous n'aimez pas avoir des données binaires dans le script, vous pouvez les encoder et remplacer cat
par le décodeur associé.
Notez que vous devez remplacer le +9
par le numéro de ligne où le binaire commence au cas où vous modifiez le script pour qu'il soit de longueur différente.
Si votre tail
l'implémentation ne prend pas en charge l'argument +9
, essayez -n +9
à la place.
Si vous craignez de saboter un fichier /tmp existant, essayez d'utiliser mktemp(1)
pour créer le nom de fichier tmp.
Notez que cette méthode a été utilisée par les scripts de mise à niveau pour le SunPro
suite de compilateurs qui comprenait l'archive tar compressée avec toute la mise à niveau et du code shell pour gérer la gestion autour de cela.