Dica Linux: programando em Shell Script

Estes dias atrás estava organizando os meus backups e encontrei alguns arquivos do meu antigo servidor pessoal, da época em que ele contava com o Debian como sistema operacional. No meio das diversas pastas e arquivos encontrei alguns scripts que eu usava para automatizar as instalações que eu fazia do Debian (que na época estava na versão 6), o que achei interessante compartilhar com os meus leitores pois acredito que poderá ser útil em muitas situações. Todos os detalhes aqui!



Do mesmo modo que é possível criar scripts em arquivos .BAT no MS-DOS e no Windows, o Linux também oferece a possibilidade de criar "sistemas inteiros" utilizando shell script com uma flexibilidade ainda maior. Para facilitar a compreensão segmentei o script em partes com a explicação dos conceitos de cada um destes blocos. 



#!/bin/bash
# Script de automatização de instalação by Michael Rigo

clear
echo 'Configurar o sources.list e atualizar a lista de pacotes? (s/n)'
read sources
if [ "$sources" = "s" ]; then
echo 'Adicionando repositórios...'
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo deb http://ftp.br.debian.org/debian/ squeeze main non-free contrib >> /etc/apt/sources.list
echo deb-src http://ftp.br.debian.org/debian/ squeeze main non-free contrib >> /etc/apt/sources.list
echo deb http://security.debian.org/ squeeze/updates main non-free contrib >> /etc/apt/sources.list
echo deb-src http://security.debian.org/ squeeze/updates main non-free contrib >> /etc/apt/sources.list
echo deb http://ftp.br.debian.org/debian/ squeeze-updates main >> /etc/apt/sources.list
echo deb http://ftp.br.debian.org/debian/ squeeze-proposed-updates non-free contrib main >> /etc/apt/sources.list
echo deb-src http://ftp.br.debian.org/debian/ squeeze-proposed-updates non-free contrib main >> /etc/apt/sources.list
echo deb-src http://ftp.br.debian.org/debian/ squeeze-updates main >> /etc/apt/sources.list
echo 'Atualizando a lista de pacotes...'
apt-get update
fi



Um script em Bash deve começar com a primeira linha #!/bin/bash a qual indica que deverá ser usado o interpretador de comandos Bash para executar o script. A segunda linha é um comentário (exceto pela primeira linha, todas as demais que iniciam com # são comentários). O comando clear limpa a tela, o echo imprime na tela o texto entre os simbolos ' ' e o read lê a resposta digitada em uma variável que chamei de sources.

Em seguida há um teste if para ver se o conteúdo da variável sources é "s", em caso positivo o script gera o arquivo /etc/apt/sources.list que indica ao Debian (e derivados) os seus canais de software. O comando mv renomeia o sources.list original, enquanto que o echo também permite escrever em arquivos de texto quando usado em conjunto com a instrução >>. Por fim o script atualiza a lista de pacotes (apt-get update), e o fi indica o final do bloco de comandos condicional (iniciados pelo if).

Lembro apenas que fiz este script para o Debian 6 (Squeeze), caso você for utilizá-lo como exemplo para versões mais novas do Debian e derivados como o Ubuntu será necessário alterar o script para os repositórios utilizados por estas versões.


clear
echo 'Configurar a montagem do(s) compartilhamento(s) de rede? (s/n)'
read net
while [ $net = 's' ]
do
    echo 'Digite o IP do servidor: (def. 192.168.0.1)'
    read ip
    if [ "$ip" = "" ]; then
      ip='192.168.0.1'
    fi
    echo 'Qual é o nome do compartilhamento?'
    read comp
    echo 'Qual o nome do usuário para configurar?'
    read user
    echo 'Qual é a senha do usuário?'
    read senha
    echo 'Configurando o ponto de montagem e permissões...'
    mkdir /media/$comp
    chown $user -R /media/$comp
    chmod 775 -R /media/$comp
    cp /etc/fstab /etc/fstab.bk2
    echo //$ip/$comp /media/$comp cifs uid=$user,gid=users,username=$user,password=$senha,umask=000,iocharset=utf8,file_mode=0777,dir_mode=0777,rw,defaults 0 0 >> /etc/fstab
    echo 'Revise as alterações no arquivo FSTAB'
    sleep 3
    nano /etc/fstab
    echo 'Montando compartilhamentos'
    mount -a
    echo 'Configurar outros compartilhamentos? (s/n)'
    read net
    clear
done



A novidade aqui é que temos um laço de repetição: enquanto a variável net valer "s", o sistema irá repetir os procedimentos entre os comandos do e done. Este código lê alguns parâmetros (IP, compartilhamento, usuário e senha), cria e ajusta as permissões das pastas onde os mesmos serão montados (respectivamente os comandos mkdir, chown e chmod), faz uma cópia de segurança do arquivo /etc/fstab e insere no mesmo a linha para a montagem do compartilhamento (utilizando as variáveis ip, comp, user e senha).

Em seguida o script abre o arquivo /etc/fstab para revisão e tenta montar o compartilhamento configurado (o comando mount -a). O comando sleep interrompe a execução do script pelo tempo indicado em segundos.


clear
echo 'Atualizar o sistema? (s/n)'
read atualiza
clear
echo 'Reiniciar o sistema após o término? (s/n)'
read rei
if [ "$atualiza" = "s" ]; then
   apt-get upgrade -y
fi
if [ "$rei" = "s" ]; then
   reboot
fi



Terminando o script, é perguntado se os pacotes devem ser atualizados (o comando apt-get upgrade -y) e se após o procedimento o sistema deve ser reinicializado.

O script pode ser feito com o seu editor de textos favorito e salvo com qualquer nome e extensão (ao contrário do MS-DOS e Windows onde a extensão BAT indica que o arquivo é um script). Apenas é necessário informar o sistema que o seu script é um arquivo executável (ambos os comandos devem ser executados como root):

# chmod +x nome_script.extensão

Para rodar o script use o seguinte comando:

# ./nome_script.extensão

Finalizando, este é apenas um pequeno exemplo do poder e da flexibilidade do interpretador de comandos Bash. Depois que você pegar o jeito é possível fazer scripts realmente abrangentes que permitem automatizar praticamente todos os aspectos e configurações do sistema.

Veja também:

Meu pequeno servidor doméstico (Parte 3 - Sistema Operacional e Serviços)
Instalando o Xubuntu 14.10 e derivados

Comentários

  1. Existem outros shells além do Bash. Entre os mais famosos: zsh (Z shell), ksh (KornShell) e Dash. Então nada impede que eu coloque um #!/bin/zsh num script. Em geral, quando queremos um script o mais portável possível, usamos simplesmente #!/bin/sh e evitamos qualquer opção/sintaxe não-POSIX dentro dos comandos executados. As distribuições usam como shell padrão (/bin/sh) diferentes shells. Debian/Ubuntu usam o Dash. Fedora/openSUSE usam o Bash. E podemos esperar qualquer coisa das outras (até mesmo o ash do BusyBox...). Por isso é preciso nivelar por baixo ao usar #!/bin/sh num script.

    Eu não abro mão de um shell que tenha pelo menos três recursos: [[, here strings (<<<) e expansão de parâmetros em variáveis. Isso é suportado por todos os shells "modernos": Bash, zsh e ksh. (nem sempre com a mesma sintaxe, contudo)

    Mas, voltando, podemos considerar que o Bash estará sempre presente. Afinal até no Mac OS X é o padrão...

    ResponderExcluir
    Respostas
    1. Amigo Marcos, como sempre uma excelente contribuição para a postagem. Um forte abraço!

      Excluir

Postar um comentário