Pesquisar este blog

Carregando...

sexta-feira, 14 de janeiro de 2011

Como transformar o seu shell script em um binário usando o shc

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: jacksonezidio@gmail.com" -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: jacksonezidio@gmail.com
Bom, é isso, espero que seja útil para alguém! :D
 

3 comentários:

  1. Opa, salvo a hora, sera muito útil pra mim este shc.
    Boa!!

    ResponderExcluir
  2. Parabéns. Excelente dica! Para quem usa FreeBSD, o SHC está disponível no ports, conforme pode ser conferido em http://www.freebsd.org/cgi/url.cgi?ports/misc/shc/pkg-descr

    ResponderExcluir
  3. Uma observação importante é que não funciona para qualquer tipo de script. Por exemplo, se você usa dialog no script já não vai funcionar...
    Pelo menos comigo não funcionou!

    ResponderExcluir