#  > Desenvolvimento >  > Linguagens de Programação >  >  Dica - Como transformar o seu shell script em um binário usando o shc

## jacksonezidio

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' "[email protected]"
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' "[email protected]"
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!  :Big Grin: 

Artigo original no meu blog:
Tecnologia em Redes e Servidores: Como transformar o seu shell script em um binário usando o shc

----------


## minelli

Parece exelente, parabéns.

----------

