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.
# 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
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
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.
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
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.
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.
ResponderExcluirEu 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...
Amigo Marcos, como sempre uma excelente contribuição para a postagem. Um forte abraço!
Excluir