+ Responder ao Tópico



  1. #1
    Sempre na luta Avatar de jacksonezidio
    Ingresso
    Jun 2008
    Localização
    São Paulo - SP
    Posts
    208
    Posts de Blog
    1

    Cool Dica - 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: [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

  2. #2
    Moderador Avatar de minelli
    Ingresso
    Aug 2006
    Localização
    Pres. Venceslau - SP | Pres. Prudente - SP
    Posts
    1.412
    Posts de Blog
    10

    Padrão Re: Dica - Como transformar o seu shell script em um binário usando o shc

    Parece exelente, parabéns.