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 /optAcesse o diretório:
# cd /optDescompacte:
# tar zxf shc-3.8.7.tgzEntre no diretório criado:
# cd shc-3.8.7Dando um "ls" no diretório tive o seguinte resultado:
tecnico:/opt/shc-3.8.7# lsCHANGES 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# makeVocê terá um resultado como esse:
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
cc -Wall -O6 shc.c -o shc
*** �Do you want to probe shc with a test script?
*** Please try... make testtecnico:/opt/shc-3.8.7#
tecnico:/opt/shc-3.8.7# make testPode 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# lsEle gerou dois arquivos:
debian-config.sh teste.sh.x troca_rede.sh troca_rede.sh.x.c
teste.sh teste.sh.x.c troca_rede.sh.x
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:
Veja o resultado no seu terminal!tecnico:/home/jackson/scripts# ./teste.sh.x
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.shAcima 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.
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
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
Opa, salvo a hora, sera muito útil pra mim este shc.
ResponderExcluirBoa!!
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
ResponderExcluirUma 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...
ResponderExcluirPelo menos comigo não funcionou!