Essa vai ser uma dica rápida para quem já teve necessidade ou já imaginou ser possível compilar um shell script. Será que tem como já que o script não é compilável (é um script!)??
Em caso de soluções comerciais, seria ótimo esconder o código fonte, ou em casos que seja necessário passar senha de root e você não queira que nenhum espertinho olhe seu script e capture a senha do root.
Na verdade o esquema que vou apresentar é transformar o código do shell script em código fonte de linguagem C e a partir daí compilá-lo gerando um binário!
Já utilizo essa solução à um tempinho e realmente funciona, vamos lá.
O nome do programa que faz isso é o shc e foi desenvolvido por Francisco Javier Rosales García, sua página web é: http://www.datsi.fi.upm.es/~frosal/
Se você usa Debian ou derivado pode instalar com:# aptitude install shc
Ou se preferir faça o download no aqui nesse link -> http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
Mova para o diretório /opt com:# mv shc-3.8.7.tgz /opt
Acesse o diretório:# cd /opt
Descompacte:# tar zxf shc-3.8.7.tgz
Entre no diretório criado:# cd shc-3.8.7
Dando um "ls" no diretório tive o seguinte resultado:tecnico:/opt/shc-3.8.7# ls
CHANGES Copying Makefile match pru.sh shc.1 shc-3.8.7.c shc.c shc.html shc.README test.bash test.csh test.ksh
Vamos gerar o binário:
tecnico:/opt/shc-3.8.7# make
Você terá um resultado como esse:tecnico:/opt/shc-3.8.7# make
cc -Wall -O6 shc.c -o shc
*** �Do you want to probe shc with a test script?
*** Please try... make test
tecnico:/opt/shc-3.8.7#
Você tem a opção de rodar um teste para saber se o shc vai rodar legal na sua distro, apenas digitando-se o comando "make test", como em:tecnico:/opt/shc-3.8.7# make test
Pode seguir as instruções que logo acabam os testes.
Agora a parte interessante, usando o shc.
Sintaxe básica:tecnico:/home/jackson/scripts# shc -r -v -f teste.sh
A opção "-r" gera um binário que mais "compatível" com os diferentes sitemas *nix.A opção "-v" ativa o modo verbose, o qual te mostra o progresso na tela do shell.A opção "f" indica qual o script a ser compilado. Vou compilar um script com o nome "teste.sh", acompanhe:tecnico:/home/jackson/scripts# shc -vf teste.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc teste.sh.x.c -o teste.sh.x
shc: strip teste.sh.x
shc: chmod go-r teste.sh.x
Bom, script compilado, vamos dar um "ls" no diretório:tecnico:/home/jackson/scripts# ls
debian-config.sh teste.sh.x troca_rede.sh troca_rede.sh.x.c
teste.sh teste.sh.x.c troca_rede.sh.x
Ele gerou dois arquivos:
teste.sh.x -> binário gerado
teste.sh.x.c -> código fonte gerado
Agora só executar o binário gerado como um script normal:tecnico:/home/jackson/scripts# ./teste.sh.x
Veja o resultado no seu terminal!
Agora uma coisa bem interessante, já imaginou poder fazer com que o binário não seja executado após uma data previamente definida?
Imagina que você criou um binário mas não quer que ele funcione mais após o dia 13 de janeiro de 2011, isso é possível passando mais um parâmetro para o shc.
Vejamos um exemplo, vou dizer ao shc que se for dia 13 de janeiro de 2010 ele não poderá mais ser executado:
tecnico:/home/jackson/scripts# shc -v -e 13/01/2011 -m "Prazo de funcionalidade expirado! - contate o desenvolvedor: [email protected]" -f teste.sh
shc -e Thu Jan 13 01:00:00 2011
shc -e Thu Jan 13 01:00:00 2011
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc teste.sh.x.c -o teste.sh.x
shc: strip teste.sh.x
shc: chmod go-r teste.sh.x Acima eu usei a opção "-e" para indicar qual a data de expiração e a opção "-m" para definir a frase que será exibida ao usuário.
Logo abaixo temos a tentativa de execução:tecnico:/home/jackson/scripts# ./teste.sh.x
./teste.sh.x: has expired!
Prazo de funcionalidade expirado! - contate o desenvolvedor: [email protected] Bom, é isso, espero que seja útil para alguém!
Artigo original no meu blog:
Tecnologia em Redes e Servidores: Como transformar o seu shell script em um binário usando o shc