Você está na página 1de 32

CursodeShellScript

Instrutor:TefiloEmlioSoeirodosSantos Macap 2009

Sumrio
1 Fundamentos 1.1 Introduo 1.2 Conceito 1.3 OqueissopodeFazerpormim? 1.4 EstruturabsicadeumShellscript 1.5 Requisitosparaexecuodeumscript 1.6 Comandosteis 2 Variveis 2.1 Definindoeexibindovariveis 2.2 Arrays 2.3 VariveisdeAmbiente 2.4 Argumentos 3 Condicionais 3.1 If 3.2 Case 4 Estruturaderepetio 4.1 for 4.2 while 4.3 until 5 Operaesmatemticas 5.1 Comnmerosinteiros 5.2 Compontosflutuantes 6 Redirecionadoresesadasespeciais <,<<,>,>>,|,1,2 7 Expressesregulares 7.1 Ocircunflexo^ 7.2 OCifro$ 7.3 Alista[] 7.4 Oponto. 7.5 Aschaves{} 7.6 Ocuringa.*(AND) 7.7 Abarravertical|(OR) 7.8 Alistanegada[^] 7.9 Ointervaloentrelistas[] 7.10Osrepetidores?*+ 8 Funes 9 ProjetoedesenvolvimentodeShellscriptsparaautomatizaodetarefasgerais

10 Agendamentoetestesdosscriptsdesenvolvidos 10.1 Cron 10.2 At 11 Bibliografia

1 Fundamentos 1.1 Introduo O presente curso ser baseado na utilizao do BASH abreviao dada a BourneAgainSHell(emhomenagemaocriadordoshoriginal,StevenBourne),devido suagrandeaceitao,difusonomeiodacomunidade*NIXecompatibilidadecomo shoriginal,aKornShell(ksh)eaZShell(zsh). AfunodoShellfornecerparaousurioumainterfacedeacessoaokernel, ou seja, o Shell quem interpreta os comandos digitados, realiza as chamadas de sistemaparaquedeterminadoeventoocorranosistemaoperacional.Normalmenteo promptparaumusuriocomumsimbolizadopor$(cifro)e#(sharp)paraosuper usurio. [teo@ldapserver~]$ [root@ldapserver~]# Inseridonesteescopo,shellscriptpodeservistocomoumatimalinguagem,j que une o bash aos utilitrios do sistema operacional e sua sintaxe relativamente simples. 1.2 Conceito Shell script um recurso disponibilizado pelos sistemas *nix, utilizado para execuo de tarefas gerais do sistema, sejam elas locais ou remotas. capaz de manipular comandos e variveis do sistema; criar, incrementar ou excluir arquivos; invocaroutrosShellscripts,etc. 1.3 Oqueissopodefazerpormim? Qualquer seqncia de instrues que seriam executadas normalmente via linha de comando. Ex: atualizao de data/hora do sistema por um NTP Server; execuo de backups diversos; montagem de diretrios remotos dentro sistema; inserodedadosemumapginahospedadaemumservidorWEB;etc. 1.4 EstruturabsicadeumShellscript
#!/bin/bash ## Este Shell Script ir efetuar o backup dos emails de todos os usurios que tenham nomes entre A-I. ## Variavel responsvel por verificar os usurios de A-I e organiz-los em ordem alfabtica. USERS_SYS=$(egrep ^[a-iA-I] /etc/passwd | cut d: -f1 | sort) ## Variavel responsvel pelo caminho onde o backup local ser armazenado LOCAL_ARQUIVOS=/home/backup/emails ## Varivel responsvel por guardar a data do dia anterior no formato numeral YESTERDAY=$(date d 1 day ago +%d-%m-%Y) ## Inicio das tarefas do script

## Limpando a tela e exibindo uma mensagem clear echo e Backup dos emails de A I\n\n ##Deixa apenas com a mensagem abaixo o arquivo que vai conter os erros do comando copy echo e ### Lista dos Emails Copiados ###\n > ${LOCAL_ARQUIVOS}/copy_errors ## Verificando cada linha do resultado do comando mantido na varivel USERS_SYS for USUARIO in $USERS_SYS do cp Rf /var/spool/mail/${USUARIO} $LOCAL_ARQUIVOS 2>> ${LOCAL_ARQUIVOS}/copy_errors echo e Realizando Backup dos emails do usurio: \t$USUARIO done ## Compactar os arquivos copiados tar cjvf /home/backup/semanal/bkp-emails-${YESTERDAY}.tar.bz2 $LOCAL_ARQUIVOS 2> /dev/null

1.5 Requisitosparaaexecuodeumscript Antes de executar um script, devese adicionar a permisso de execuo ao arquivo.Ex: chmod +x meu-script.sh Depois de alterada a permisso do arquivo, um script pode ser executado de duasformas: a) Caminho absoluto: o usurio fornece o caminho hierrquico at o script desejado. Ex: supondose que o script meu-script.sh est localizado no diretrio /home/backup/scripts/, para executlo atravs do caminho absoluto,devesedigitarnoprompt: [root@ldapserver~]#/home/backup/scripts/meu-script.sh b) CaminhoRelativo:quandoousurioestnodiretrioquecontmoscript desejado,bastautilizaroindicadordediretrioatual./.Ex: [root@ldapserver~]#./meu-script.sh 1.6 Comandosteis Algunscomandosteisquepoderoserutilizadonestecurso:
Comando cat cut date diff Descrio Exibeocontedodearquivo Extraicampo Exibeadata Comparaarquivos Opescomuns ns dfc d+ i,Nr,u,w

dmesg echo find finger grep head logname mount ping printf rev sort tail tar tr uniq useradd userdel wc

en name,type,atime, Localizaarquivos exec Mostrainformaesdeusurios Filtratextos E,i,v Exibeinciodeumtexto c,n Exibeologindousurioatual Montasistemadearquivos t,o,p EnviaICMPecho_requestpara c hosts Exibetexto Invertetexto Organizatexto f,n,r Exibeofinaldeumtexto c,n Arquivadocumentos c,j,f,v,x,z Modificatexto d,AZaz Removelinhasduplicadas i,d,u Adicionausurios c,g,s Removeusurios r Contapalavras c,l,L,m

Exibemensagensdokernel Exibetexto

2 Variveis Diferentedeoutraslinguagensdeprogramao,asvariveisnopossuemum tipo especfico de dados. Elas podem conter: comandos, operaes aritmticas ou lgicas, strings, nmeros inteiros ou reais, valores de sada de comandos, acumular valores,etc. 2.1 Definindoeexibindovariveis Para nomear uma varivel, no se pode iniciar o nome com nmeros, usar espaoouhfenentrepalavras.Ex:
18ANOS=Um bom whisky NOME-COMPOSTO=guarda-chuva COM ESPACO=esse nome de varivel possui um espao entre as palavras

dos Santos; DEPARTAMENTO=Departamento de Informtica e Telecomunicaes.

Porquestesdeboasprticasdeuso,asvariveisdevemserdeclaradascomo nomeemmaisculo,poisobashcasesensitive. Paraatribuirumvaloraumavarivel,usaseosinaldeigualdade=.Ex:PI=3.14; COR_SOL=Amarelo; IDADE=23. Se o valor da varivel for uma string que contenha espao, devese colocar a stringentreaspasduplasousimples.Ex:NOME_COMPLETO=Teofilo Emilio Soeiro

Paraexibirocontedodeumavarivel,bastausarocomandoechoseguidodo nome da varivel desejada, sendo que este nome deve ser precedido do smbolo $ (cifro).Ex:echo $NOME_COMPLETO; echo $PI. Caso haja necessidade de exibir uma mensagem para ilustrar o valor da varivel,usaseaspasduplas.Ex:echo A cor do Sol : $COR_SOL; echo Eu Trabalho no $DEPARTAMENTO do Tribunal de Justia do Estado do Amap Existeaindaapossibilidadedesedesejartratarasadadavarivel,adicionando valores a ela. Essa operao pode ser realizada com a utilizao de chaves {}. Ex: ImagineavarivelOBJETO=pente;paraimprimirapalavrapentear,bastadigitar: echo ${OBJETO}ar; para imprimir a palavra despenteado, basta digitar: echo des${OBJETO}ado. Acompanheabaixoalgumaspossibilidadesdeexibiodeumavariveleoseu resultado:
# Valor inicial da varivel. myvar=abc echo Teste 1 echo $myvar echo ${myvar} echo {$myvar} echo Teste 2 echo myvar echo myvar echo $myvar echo \$myvar echo Teste 3 echo $myvardef echo ${myvar}def echo Teste 4 echo $myvar$myvar echo ${myvar}${myvar}

# abc # abc # {abc} # myvar # myvar # abc # $myvar # linha vazia, pois a varivel $myvardef no existe # abcdef # abcabc # abcabc

echo Teste 5 # Alterando o valor da varivel, com espaos myvar=a b c echo $myvar echo $myvar echo Teste 6 echo myvar echo $myvar echo ${myvar} echo \$myvar echo \${myvar} #a b c --> como apresentado na varivel # a b c --> utilizando apenas um espao entre os caracteres # myvar # $myvar # ${myvar} # \$myvar # \${myvar}

Ao utilizar o comando echo com a opoe, podese utilizar os caracteres especiaisdescritosnatabelaabaixo:


Opo \n \t \c
aps o texto

Descrio Iniciaotextonumanovalinha Iniciaotextoapsumespao(TAB) Iniciaotextodaprximalinhaapartirdocaractere\c

echo e \n\nTexto pulando Linhas!\n

Salta duas linhas antes e uma

echo e \tTexto tabulado # Insere um TAB antes do texto echo e \nHoje : \c # Exibiria o segundo texto a partir no lugar do caractere \c echo Uma bela manh de domingo 2.2 Arrays Sovariveisquepodemarmazenarvriosvalores.Suadeclaraofeitacom ousodeparntesesapsosinaldeigualdadeeosvaloresdevemserseparadospor um espao em branco. Ex: SEMANA=(domingo segunda terca quarta quinta sexta sabado); MARCA=(suzuki honda dafra yamaha). Para exibir um dos valores do array, devese informar o valor do ndice que correspondeposiodovalordesejadodentrodoarray,lembrandoquetodoarray comea com o ndice 0 (zero). Ex: tomandose como base a varivel SEMANA, para mostrar o valor domingo, devese usar o valor de ndice zero dentro de colchetes, como segue: echo ${SEMANA[0]}; se desejar mostrar o valor quinta, use: echo ${SEMANA[4]}.
SEMANA=(domingo segunda terca quarta quinta sexta sabado) 0 1 2 3 4 5 6

Valor do ndice para a varivel 2.3 VariveisdeAmbiente Sovariveisenxergadasdequalquerlugardosistemaepodemserutilizadas tantoporprogramas,quantoporscriptsoucomandosdiretosnoshell.Paracriaruma varivel de ambiente, utilize o comando export diretamente no shell, conforme exemploabaixo:
export MINHA_VARIAVEL=Valor da varivel

Este comando criar a varivel de ambiente, porm se o computador for reiniciadoavarivelnoaparecermais.Sequiserqueavarivelsejapersistenteno sistema,adicioneocomandodecriaodavarivelnofimdoarquivo:/etc/profile. Para obter a lista completa de variveis de ambiente, digite o comando set diretamentenoShell.

2.4 Argumentos Os argumentos so informaes passadas para comandos e/ou scripts que visamcomplementarumaoperao. Existemduasformasessenciaisdepassarestesvaloresparaoscript: a) Comocomandoread:usaseocomandoreadseguidodonomedavarivel para aguardar que determinada informao seja inserida pelo usurio em determinadomomentodaexecuodoscript.Ex:readNOME_COMPLETO; readIDADE; b) Diretamente pelo Shell: no prompt do Shell, aps digitar o comando ou script que deseja executar, separe os argumentos com espaos. Ex: ./meu_script.shargumento1argumento2argumento3 Obashdispedasseguintesvariveisparaodevidotratamentodeargumentos passadosdiretamentepeloshell:
Varivel $# $@ $? Funo Quantidadetotaldeargumentospassados Listacomosargumentospassados Valor de retorno do ltimo comando executado (0 se o comando foi realizado com sucesso ou maior igual a 1 se houvererro) ONmerodoProcessodoShellatual.ParaoShellscript,esta varivelindicaoPIDsoboqualeleestsendoexecutado Comandoexecutado Primeiroargumento,segundoargumento,...

$$ $0 $1,$2,...

Umexemploparaelucidaraaplicaodessasvariveisseria:
#!/bin/bash echo Voce digitou $# argumentos para o script $0 echo O primeiro argumento digitado foi: $1 echo O segundo argumento digitado foi: $2 echo O terceiro argumento digitado foi: $3 echo A lista completa de argumentos : $@ echo O PID do Shell script : $$

Imagine que esse cdigo pertence ao script: meu_script.sh. Se o script for invadodessaforma:./meu_script.shargumento1TefiloSantos3qualquercoisa; teremosaseguintesada:

Voce digitou 5 argumentos para o script ./meu_script O primeiro argumento digitado foi: argumento1 O segundo argumento digitado foi: Tefilo Santos O terceiro argumento digitado foi: 3 A lista completa de argumentos : argumento1 Tefilo Santos 3 qualquer coisa O PID do Shell script : 3358

3 Condicionais 3.1 If Usadoemoperaesunriasebinrias.Suasintaxebsica:


if [ CONDIO ] then Comando fi

Existe a possibilidade de aninhar condicionais com: if else if, onde o comandoelif(mostradoabaixo)podeserinterpretadocomo:elseif.


if [ CONDIO_01 ] then Comando ... elif [ CONDIO_02 ] then Comando ... else Comando ... fi

#!/bin/bash

Acompanheumexemplodousodaestruturamostradaacima:

ANIMAL=Cachorro if [ $ANIMAL = Coelho ]; then echo O animal escolhido foi o Coelho elif [ $ANIMAL = Mula ]; then echo O animal escolhido foi a Mula else echo $ANIMAL - no coelho nem mula fi

Ocomando iftambmpossuirecursosespeciaispararealizaodetestescom arquivos,comparaesdestrings,operadoresnumricosebooleanosdisponibilizando recursosqueaumentamaprodutividadedoscript. Para realizar testes com arquivos, utilizase os operadores exibidos na tabela abaixo:
Opo barquivo carquivo darquivo earquivo farquivo garquivo harquivo karquivo parquivo rarquivo sarquivo uarquivo warquivo xarquivo Oarquivo Descrio Verdadeirosearquivoexisteeforumarquivodeblocoespecial. Verdadeiro se arquivo existe e for um arquivo de caractere especial. Verdadeirosearquivoexisteeforumdiretrio. Verdadeirosearquivoexiste. Verdadeirosearquivoexisteeforumarquivoregular. VerdadeirosearquivoexisteetenhaoSGIDbitativado. Verdadeirosearquivoexisteeforumlinksimblico. Verdadeirosearquivoexisteetenhao"sticky"bitativado. Verdadeirosearquivoexisteeforumnamedpipe. Verdadeirosearquivoexisteepuderserlido. Verdadeiro se arquivo existe e tenha um tamanho maior que zero. VerdadeirosearquivoexisteetenhaoSUIDbitativado. Verdadeirosearquivoexisteepuderserescrito. Verdadeirosearquivoexisteeforexecutvel. VerdadeirosearquivoexisteeforprpriopeloefetivouserID.

Imagineoseguintecenrio:Verificarseodiretrio/home/backup/pgsqlexiste, ecasonoexista,omesmodeversercriado.
if ! [ -d /home/backup/pgsql ]; then mkdir /home/backup/pgsql ; fi

Osinaldeexclamaoantesdacondioindicanegao. Ascomparaesdestringssuportadasestodescritasnatabelaabaixo:
Opo zstring nstring string1=string2 string1!=string2 Descrio Verdadeirosestringtivercomprimentozero. Verdadeirosestringtivercomprimentodiferentedezero. Verdadeiroseasstringsforemiguais. Verdadeiroseasstringsnoforemiguais.

Umexemplodeusodaopozpodeservistadentrodoseguintecontexto:no teste de contedo de uma varivel, caso ela esteja nula (comprimento igual a zero), exibirumamensagemnotificando,seno,exibirseucontedo:
if [ -z $CESTA_DE_FRUTAS ]; then echo A cesta de Frutas est vazia else echo Existem os seguintes itens na cesta: $CESTA_DE_FRUTAS ; fi

Osoperadoresnumricosexistentesestodescritosnatabelaabaixo:
Operao int1eqint2 int1neint2 int1ltint2 int1leint2 int1gtint2 int1geint2 Descrio Verdadeiroseint1forigualaint2. Verdadeiroseint1noforigualaint2. Verdadeiroseint1formenorqueint2. Verdadeiroseint1formenorouigualaint2. Verdadeiroseint1formaiorqueint2. Verdadeiroseint1formaiorouigualaint2.

Para ilustrar o uso da operao ne, imagine o valor de retorno de um comandoqualquer,expressopelavarivel$?.Seovalorfordiferentedezero,significa que houve algum erro, caso contrrio, o comando foi realizado com sucesso como seguenoexemplo:
if [ $? ne 0 ]; then echo Houve um erro else echo O comando foi realizado com sucesso! fi

Osoperadoresbooleanospodemserexpressadosdeduasformas:
Operao [expr1]&&[expr2] [expr1]||[expr2] Descrio Verdadeiroseambosexpr1eexpr2foremverdadeiros. Verdadeiro se qualquer uma expr1 ou expr2 forem verdadeiros.


Operao !expr [expr1aexpr2] [expr1oexpr2] Descrio Verdadeiroseexprforfalsa(funcionacomonegao). Verdadeiroseambosexpr1eexpr2foremverdadeiros. Verdadeiro se qualquer uma expr1 ou expr2 forem verdadeiros.

if [ $COR_SOL = Amarelo ] && [ $COR_CEU = Azul ]; then echo O Cu azul e sol amarelo; fi if [ $COR_SOL = Amarelo -a $COR_CEU = Azul ]; then echo O Cu azul e sol amarelo; fi

Adiferenabsicaentreosdoismtodosestnasintaxedosmesmos:

Outradiferenaquevalesercitadaqueosoperadores&&e||soutilizados commuitafreqnciaquandoenvolvemcomandosdiretamentenoshell. Imagineaseguintesituao:aoenviardoisicmp_echo_request(ping)parauma mquina da rede e ela no responder, exibir uma mensagem notificando que a mquinaestforadoar,casocontrrioexibirumamensagemdesucesso.

[root@ldapserver ~]# ping c2 192.168.0.2 && echo Sucesso na comunicao!\ || echo A maquina est fora do ar!

3.2 Case A condicional case mais simples de implementar que o IF. Porm, seus recursossomaislimitados.Suaestruturabsica:
case $VARIAVEL in Valor1) comandos ;; Valor2) comandos ;; esac

Para extrair o mximo do comando case, podese utilizar alguns recursos especiais,comosegueabaixo: *)indicaqualquervalorquepossaserassumidopelavarivel,incluindoovazio. Executaroscomandosqueoseguemsenenhumacondioanteriorforsatisfeita; *dim) indica qualquer valor para a varivel que termine com dim. Ex: se o valor da varivel for Aladim, os comandos referentes a esta condio sero executados; Valor1|Valor2|Valor3)executaroscomandosreferentesacondiosepelo menos um dos valores indicados forem idnticos ao contedo da varivel. Nesse contexto,abarravertical|atualcomooperadorlgicoOU; [az][09])executaroscomandosreferentesacondioseovalordavarivel for composto por dois caracteres, sendo o primeiro uma letra de A a Z (sem case sensitive)eosegundoumnmerode0a9.Ex:seacondiofor[ad]edo,ospossveis valoresdavariveisadmitidosseriam:aedo,bedo,cedo,dedo; Acompanheabaixoumexemplodeaplicaodocomandocase,ondeavarivel $1(primeiroargumento)servirdebaseparaascondies:
case $1 in start) echo iniciando o script de backup dos servidores de banco de dados ;; stop) echo Parando o script de backup ;; restart) echo reiniciando o script de backup ;; *) echo Use o comando `basename $0` com uma das seguintes opes: start|stop|restart ;; esac

4 Estruturasderepetio 4.1 for O comando for utilizado normalmente para executar um nmero determinadodeinstrues.Podeserexpressodeduasformas:
for ((VARIAVEL=valor_Inicial;VARIAVEL<=valor_final;VARIAVEL++)) # Para os que so acostumados com o FOR do C/C++ do Comandos ... done for VARIAVEL in seqncia # Mtodo mais utilizado do Comandos ... done Exemplo das duas formas de uso do FOR podem ser vistas abaixo: for ((I=10;I>=1;I--)) do echo e \t $I done for I in 10 9 8 7 6 5 4 3 2 1 do echo $I done

seaseqnciaforcrescente,podeseutilizarocomandoseqparadeixarmais resumidaalinhadecomando:
for I in `seq 1 100` # O comando SEQ apenas IMCREMENTA valores do echo $I done

Ocomandofortambmutilizadoparaexecutarinstruesbaseadasnasada deoutroscomandos. Imagine a seguinte tarefa: redefinir o proprietrio e grupo de 2.000 arquivos encontrados no diretrio /var/spool/mail/ baseado no nome dos usurios que esto cadastradosnosistema(/etc/passwd).
for USUARIO in `cat /etc/passwd | cut d: -f1` # Comandos externos entre apstrofos do chown $USUARIO:$USUARIO /var/spool/mail/$USUARIO done

Nessa situao, o comando for vai armazenar na varivel USUARIO o valor correspondente a cada linha da sada do comando cat /etc/passwd | cut d: f1, executandoocomandodealteraodeproprietriodoarquivo,adotandocomobase queoarquivotemomesmonomequeestargravadonavarivelUSUARIO. OBS:ooperador$(comando)temamesmafunodosapstofros`comando`, onde tudo o que estiver dentro dos mesmos interpretado como comando e/ou aplicativo externo. Ex: para executar um comando qualquer, basta informar o seu nome,seoseucaminhoestivercontidoemalgumavariveldeambiente(ex:$PATH). Casocontrrio,deverserfornecidoocaminhoabsolutodoaplicativo:
FIREWALL=$(iptables); FIREWALL=`iptables`; Ou BKP=$(/home/backup/scripts/emails.sh); BKP=`/home/backup/scripts/emails.sh`;

4.2 while Estrutura utilizada para repetir determinado bloco de instrues por uma quantidadeindefinidadevezes,devendosatisfazerseumacondioparaqueoloop encerre.Suaestruturabsica:
while [ Condio ]; do Comandos ... done

Umaformadeempregarowhileserianaexibiodeummenuaousurio:
while [ $OPCAO != 3 ]; do clear echo 1... Analisar LOGS do firewall echo 2... Gerar relatrios de acessos a internet echo 3... Sair do Script echo e \n\n Informe o nmero da opo desejada: read OPCAO done

4.3 until Deformaanlogaaowhile,ountilrealizaumdeterminadoblocodecomando atquesuacondiosejasatisfeita.Suaestruturabsica:


until [ Condio ]; do Comandos ... done

Imaginequesedesejaqueousurioinformealetrasparasairdoprograma. Esseprocedimentopoderiaserrealizadocomaseguintelinhadecdigo:
until [ $OPCAO = s ]; do echo Deseja sair do script? s/n:

read OPCAO done

5 Operaesmatemticas 5.1 Comnmerosinteiros Sero mostrados dois mecanismos de operao com nmeros inteiros, conformesegue: $(()):indicadoparaoperaesaritmticaselgicas:
Operao SOMA=$((3+2)) Descrio Armazenaoresultadodaadionavarivel$SOMA. Armazena o resultado da subtrao na varivel SUBTRAC=$((51)) $SUBTRAC. Armazena o resultado da multiplicao na varivel MULTIP=$((3*4)) $MULTIP. DIVISAO=$((21/3)) Armazenaoresultadodadivisonavarivel$DIVISAO. Armazena o resultado da exponenciao na varivel EXPON=$((4^5)) $EXPON. MOD=$((7%3)) Armazenaorestodadivisonavarivel$MOD. Armazenaovalor1navarivel$RESULTseoresultadoda RESULT=$((8>8)) operaoMAIORforverdadeiro. Armazenaovalor1navarivel$RESULTseoresultadoda RESULT=$((8>=8)) operaoMAIORouIGUALforverdadeiro. Armazenaovalor1navarivel$RESULTseoresultadoda RESULT=$((8<8)) operaoMENORforverdadeiro. Armazenaovalor1navarivel$RESULTseoresultadoda RESULT=$((8<=8)) operaoMENORouIGUALforverdadeiro.

expr:indicadoparaoperaesaritmticaselgicas.Suaprincipaldiferenado operador $(( )), que no operador expr fazse necessrio escapar (preceder um smbolooucaractereespecialcomabarrainvertida\)oscaracteres*,>,>=,<e<=. Almdisso,ooperadorexprumcomandoexterno.Logo,parautilizlonecessrio colocaraexpressoentreapstofros``ouusarooperador$().
Operao SOMA=`expr3+2` SUBTRAC=`expr51` MULTIP=`expr3\*4` DIVISAO=`expr21/3` MOD=`expr7%3` RESULT=`expr8\>8` Descrio Armazenaoresultadodaadionavarivel$SOMA. Armazena o resultado da subtrao na varivel $SUBTRAC. Armazena o resultado da multiplicao na varivel $MULTIP. Armazena o resultado da diviso na varivel $DIVISAO. Armazenaorestodadivisonavarivel$MOD. Armazena o valor 1 na varivel $RESULT se o resultadodaoperaoMAIORforverdadeiro.

RESULT=`expr8\>=8` RESULT=`expr8\<8` RESULT=`expr8\<=8`

Armazena o valor 1 na varivel $RESULT se o resultado da operao MAIOR ou IGUAL for verdadeiro. Armazena o valor 1 na varivel $RESULT se o resultadodaoperaoMENORforverdadeiro. Armazena o valor 1 na varivel $RESULT se o resultado da operao MENOR ou IGUAL for verdadeiro.

5.2 Compontosflutuantes Umadasmelhoresemaiscompletasferramentasparatrabalharcomnmeros inteirosepontosflutuantes(nmerosreais)obc. De modo antnimo aos operadores j apresentados aqui, o bc necessita receber a operao de um arquivo ou da sada do comando echo. Acompanhe o exemplo,pressupondoqueoarquivo/root/calculopossuioseguintecontedo:3.257 +6.213.
SOMA=$(cat /root/calculo | bc) echo $SOMA # 9.470

O mesmo clculo poderia ser realizado diretamente, se os valores fossem informadosnocomandoecho:


SOMA=$(echo 3.257 + 6.213 | bc) echo $SOMA # 9.470

Algumasdasoperaesdisponveisdocomandobc,so:
Operao SOMA=$(echo3.256+2.856|bc) SUBTRAC=$(echo5.11.002|bc) MULTIP=$(echo3.75*4.89|bc) DIVISAO=$(echo21.33/3.1|bc) EXPON=$(echo4.22^5|bc) MOD=$(echo7.2%3.1|bc) RESULT=$(echo8.2>8.001|bc) Descrio Armazena o resultado da adio na varivel$SOMA. Armazena o resultado da subtrao na varivel$SUBTRAC. Armazena o resultado da multiplicao navarivel$MULTIP. Armazena o resultado da diviso na varivel$DIVISAO. Armazena o resultado da exponenciaonavarivel$EXPON. Armazenaorestodadivisonavarivel $MOD. Armazenaovalor1navarivel$RESULT se o resultado da operao MAIOR for verdadeiro. Armazenaovalor1navarivel$RESULT se o resultado da operao MAIOR ou IGUALforverdadeiro.

RESULT=$(echo8>=8.56745|bc)

RESULT=$(echo8.9<8|bc)

RESULT=$(echo8.001<=8|bc)

RESULT=$(echo8.01==8.1|bc)

RESULT=$(echo8.001!=8|bc)

Armazenaovalor1navarivel$RESULT se o resultado da operao MENOR for verdadeiro. Armazenaovalor1navarivel$RESULT se o resultado da operao MENOR ou IGUALforverdadeiro. Armazenaovalor1navarivel$RESULT seoresultadodaoperaoIGUALDADE forverdadeiro. Armazenaovalor1navarivel$RESULT seoresultadodaoperaoIGUALDADE forfalso.

Nasoperaeslgicascomocomandobc,oresultado1indicaverdadeiroe0 indicafalso. 6 Redirecionadoresesadasespeciais 6.1 Redirecionadores>e>> Osmbolo>redirecionaasadapadrodeumcomandooulistadecomandos (tudo o que exibido na tela) para um arquivo, criandoo se o mesmo no existir e sobrescrevendoseucontedoseomesmoexistir.Ex:
ls l /var/lib > /root/conteudo-lib { ls l /var/lib/ ; echo configurao das interfaces de rede ; ifconfig -a ; } > /home/backup/scripts/MeuLog.txt

J o smbolo >>redireciona a sada padro de um comando ou lista de comandos(tudooqueexibidonatela)paraumarquivo,criandooseomesmono existireadicionandooresultadoaofimdoarquivoseomesmoexistir.Ex:


ls l /var/log >> /root/conteudo-dir-logs { cat /etc/grub.conf ; echo configurao do firewall ; iptables -nL ; } >> /home/backup/scripts/MeuLog.txt

6.2 Redirecionadores<e<< O smbolo < serve para fornecer a entrada para um comando interativo executado no script ou no shell, como: wc, mail, etc. Ex: Passar o texto do arquivo /home/teo/lista_aprovados.txtparaoemailgigateo@hotmail.com.
mail gigateo@hotmail.com < /home/teo/lista_aprovados.txt Josmbolo<<ouHereDocumentsfazcomqueoShellointerpretecomo

umainstruoparaleraentradaparaumdeterminadodocumentooulinhasatque sejaencontradaalinhacomodelimitadorespecificado.Deumaformamaisgenrica, esse redirecionador repassa para o comando, todo o texto existente entre os

delimitadores,comoseestaslinhasestivessemsendodigitadasnoteclado.Suasintaxe bsica:
comando << delimitador documento ... delimitador

ftp 192.168.4.120 << EOC # Sigla usada como delimitador user backup # Fornecer o nome do usurio safebkp_m@ster # Senha do usurio backup cd uploads/emails/ # mudando para o diretrio uploads/emails do servidor put /home/backup/emails/bkp_emails_19-09-2008.tar.bz2 # enviando o arquivo especificado. EOC #Delimitador que indica o fim do bloco de entrada para o comando FTP.

Ex: Imagine a necessidade de conectar na mquina 192.168.4.120 via FTP e enviar o arquivo: /home/backup/emails/bkp_emails_19092008.tar.bz2 para a pasta uploads/emails/doreferidoservidor.

6.3 Pipeline| O pipeline | de grande valia, pois transforma a sada padro de um comando em entrada padro para outro comando. Ex: exibir todos os logins de usurios contidos no arquivo /etc/passwd que comecem usam bash como shell, organizandoasadaemordemalfabticareversa(dezparaa).
cat /etc/passwd | grep bash | cut d: -f1 | sort -r

6.4 Sadasespeciais1,2 Assadasespeciaissoutilizadasparamanipularinformaesdeprocessos.So elas: 1 STDOUT ou sada padro: indica todo o contedo que retorna como resultado de um comando (normalmente o que exibido na tela) que executado comsucesso.Podeseredirecionar,porexemplo,asadapadrodocomandopingc2 10.20.30.40paraumarquivo,comocomando:
ping c2 10.20.30.40 1> /root/teste_ping ; ou simplesmente ping c2 10.20.30.40 > /root/teste_ping

OBS:oValor1nessecasopodeseromitido. 2STDERRousadadeerrospadro:indicatodoocontedoqueretornacomo errodocomando(normalmentetambmexibidonatela).Podeseredirecionar,por exemplo, a sada de erro padro do comando ls /root/*lost (desde que no exista nenhumarquivooudiretrioquesatisfaaessecritriodelistagem)paraumarquivo, comocomando:
ls /root/*lost 2> /root/erros_ls

Esealgumquiserenviarasduassadasparamesmoarquivo?Nessemomento usaseocaractere&paraauxiliarnessatarefa:

ping c1 10.20.30.40 > /root/teste_ping 2>&1 ; ou ping c1 10.20.30.40 &> /root/teste_ping

7 ExpressesRegulares Uma Expresso Regular (ER) um mtodo formal de pesquisa, onde so empregadossmbolos,caracteresalfanumricosecaracterescomfunesespeciais metacaracteres,paraformarexpressesquefuncionamcomopadresdetexto. NomundodasERs,dizsequeumdeterminadotextocasoucomaexpresso, se o mesmo obedecer rigorosamente s condies da expresso. Ex: a expresso regular[cjt]uca,podecasarcom:cuca,juca,tuca. ExistevrioscomandoquesuportamousodeERs,como:awk,sed,grep.Ser utilizadoocomandogrepEousimplesmenteegrepparailustraraaplicaodos seguintesmetacaracteresemalgumasERs. 7.1 Ocircunflexo^ Indica o incio de uma linha. Ex: para pesquisar todas as linhas do arquivo /etc/passwdquecomecemcomapalavraroot,usaseaseguinteER:
egrep ^root /etc/passwd

OBS: Por questes de boas prticas, devemse colocar as ERs entre aspas simples. 7.2 Ocifro$ Indica o fim de uma linha. Ex: para pesquisar todas as linhas do arquivo /etc/inittabqueterminemcomapalavratty1,usaseaseguinteER:
egrep tty1$ /etc/inittab

AUniodosdoismetacaracteres^$,indicaumalinhaembranco(omesmoque umcomeoseguidodeumfimdelinha).
egrep ^$ /etc/inittab

7.3 ALista[] Serve para delimitar os caracteres que podem aparecer em determinada posio.Ex:parabuscarapalavraAdamastor,podendoestacomearounocomletra maiscula:
egrep [Aa]damastor /etc/passwd

OBS:pormaisextensaquesejaalista,amesmaindicaapenasumcaractere.Ex: todasaslinhasdoarquivo/etc/shadowqueiniciemcomumaconsoanteminscula: egrep ^[bcdfghjklmnpqrstvwxyz] /etc/shadow

7.4 Oponto. Indica UM caractere qualquer (letra, smbolo, nmers, espao, TAB). Ex: pesquisartodososnomesnoarquivo/etc/passwdquetenhamumavogalnasegunda letra:
egrep ^.[aeiou] /etc/passwd

O ponto pode ser usado tambm para pesquisar linhas de tamanho fixo. Ex: pesquisartodasaslinhasdoarquivo/etc/passwdquecontm31caracteres:
egrep ^...............................$ /etc/passwd

7.5 Aschaves{} Indicaumaquantidadederepetiesdocaractere(oumetacaractere)anterior. Ex:pararesumiroexemploanteriorusandoaschaves,bastadigitar:


egrep ^.{31}$ /etc/passwd

possvel informar intervalos de repetio com o valor mnimo e mximo, bastandoutilizarumavrgulaentreosvalores.Ex:procurartodasaslinhasdoarquivo /etc/cups/cupsd.confquetenhamde15a35caracteres:
egrep ^.{15,35}$ /etc/cups/cupsd.conf

Seovalormximoforomitido,ointervaloserinfinito.Ex:procurartodosos usuriosnoarquivo/etc/passwdquepossuamoUIDouGIDde3dgitosoumais:
egrep [0123456789]{3,} /etc/passwd

7.6 Ocuringa.*(AND) Indicado para pesquisar dois trechos especficos numa mesma linha, sem se preocuparcomoqueexisteentreeles.Deummodogeral,elesignificaqualquercoisa, incluindoonada.Ex:pesquisartodasaslinhasdoarquivo/etc/openldap/slapd.conf queiniciemcomapalavraincludeeterminemcomapalavraschema:
egrep ^include.*schema$ /etc/openldap/slapd.conf

7.7 Abarravertical|(OR) Indicadoparapesquisarumapalavraououtra.Suasintaxebsica:


(palavra1|palavra2|palavra3|palavraN)

Imagineaseguintesituaohipottica:pesquisartodososusuriosdosistema quepossuamsenhascriptografadas(todasaslinhasdoarquivo/etc/shadowqueno possuamoscaracteres!!ou*,seguidosdocaractere:).


egrep v (!!|\*): /etc/shadow

Aopovdocomandoegrepsignifica:inversodebusca,ondetodasaslinhas quenocorrespondamaopadrodepesquisasoselecionadas. OBS:ocaractere*interpretadocomoumcaractereespecial,necessitando queomesmosejaescapadoparaquesirvacomopadrodepesquisa. 7.8 Alistanegada[^] Usadoquandosedesejaquedeterminadoscaracteresquecompemumalista noapareamnoresultadodapesquisa. Imagine o exemplo fornecido anteriormente: todas as linhas do arquivo /etc/shadowqueiniciemcomumaconsoanteminscula:
egrep ^[bcdfghjklmnpqrstvwxyz] /etc/shadow

Podeserealizaraseguintebusca:todasaslinhasdoarquivo/etc/shadowque noiniciemcomumavogalminscula:
egrep ^[^aeiou] /etc/shadow

OBS:aonegarumalista,todososoutroscaracteresseropermitidos(smbolos, nmeros,letras,espaosembranco,TAB). 7.9 Ointervaloentrelistas[] Aumenta o poder de uso da lista, fazendo com que qualquer caractere que estejanumadeterminadafaixasejapesquisado. [09]:todososnmerosde0a9; [az]:todooalfabetominsculo; [AZ]:todooalfabetomaisculo; [azAZ09]:todososcaracteresqueestejamnoalfabetominsculo,maisculo, enmeros. Imagineaseguintesituao:pesquisartodososnomesdeusurionoarquivo /etc/passwdquecomecemcomAaJ,maisculoouminsculoequecontenhampelo menos3nmerosde0a9:
egrep ^[a-jA-J].*[0-9]{3,} /etc/passwd

Existe a possibilidade de usar as classes de caractere POSIX como listas pr definidas.


Classe [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] Descrio Todososcaracteresalfanumricos.Equivalea[azAZ09] Todososcaracteresalfabticos.Equivalea[azAZ] EncontraumespaoouumTAB Encontracaracteresdecontrole Todososcaracteresdecimais.Equivalea[09]

[:graph:] [:lower:] [:print:] [:space:] [:upper:] [:xdigit:]

Caracteres exibveis. Todos os caracteres na faixa de 33126 da tabela ASCII. O mesmo que [:print:], mas excluindo os caracteres deespao Todooalfabetominsculo.Equivalea[az] Caracteres exibveis. Todos os caracteres na faixa de 32126 da tabela ASCII. O mesmo que [:graph:], mas adicionando os caracteresdeespao Encontracaracteresdeespaoembranco(espaoouTAB) Todooalfabetomaisculo.Equivalea[AZ] Dgitoshexadecimais.Equivalea[09AFaf]

OBS:geralmenteasclassesrequeremousodeparntesesoucolchetesduplos:
egrep [[:digit:]] /etc/krb5.conf

7.10Osrepetidores?*+ Sometacaracteresquetmfunessemelhantesschaves,pormsuasintaxe maisprtica.Acompanhenatabelaabaixo,osmetacaracteresesuaequivalnciaao usodaschaves:


Meta Nome Equivalente ? Opcional {0,1} * Asterisco {0,} + Mais {1,} Descrio Podeaparecerouno(opcional) Podeapareceremqualquerquantidade Deveaparecernomnimoumavez

Exemplodeaplicaodometacaractere+:exibirtodososendereosIP(linha quecontenhampelomenosumnmeroseguidodeumponto)queestiveremincludos noarquivo/etc/hosts:


egrep [0-9]+\. /etc/hosts

OBS:ocaractere.interpretadocomoumcaractereespecial,necessitando queomesmosejaescapadoparaquesirvacomopadrodepesquisa. Cuidado para no confundir os curingas do Shell com os metacaracteres. Os curingas so usado nas linhas de comandos e os metacaracteres so utilizados por programas,como:sed,grep,awk. A tabelaabaixo mostra a equivalncia dos curingas do Shell comparados com algunsmetacaracteres:
Shell ? * {,} ERs . .* (|)

Ex:Comandosdigitadosdiretamentenoshell:

$ ls *conf $ ls arquivo??.txt
arquivo e .txt

#lista qualquer nome que contenha conf no final #lista qualquer arquivo que contenha dois caracteres entre #lista apenas os arquivos index.php ou index.html.

$ ls index.{php,html}

8 Funes So pequenas rotinas escritas para facilitar a execuo e o entendimento do script.Suaestruturabsica:


functionnome_da_funo{ Comandos ... } Ou nome_da_funcao(){ Comandos ... }

Paraexecutarumafunodentrodoscript,bastadigitaroseunome:
#!/bin/bash Func () { echo Executado Pela funo Func() } # Fim da Funo Func # Chamando a funo Func

Por padro, uma varivel declarada dentro de uma funo vista por todo o script(globaldentrodoscript).Porm,necessitasequeafunosejaexecutadaantes doseuusoporoutrocomponentedoscript. Acompanheoseguintescript:
#!/bin/bash Func () { VARIAVEL=Dentro de uma funo } # Fim da Funo echo Varivel = $VARIAVEL # Exibir: Varivel =

Func # Chamando a funo Func echo Varivel = $VARIAVEL # Exibir: Varivel = Dentro da funo

Atravsdocomando:localantesdadeclaraodeumavarivelpossvelque elasejavistaapenasdentrodafunoqueacontm. Acompanheoseguintescript:


#!/bin/bash Func () {

VARIAVEL1=Global local VARIAVEL2=Somente dentro da funo } # Fim da Funo # Exibir: Varivel1 = # Exibir: Varivel2 =

echo Varivel1 = $VARIAVEL1 echo Varivel2 = $VARIAVEL2 Func # Chamando a funo Func

echo Varivel = $VARIAVEL1 # Exibir: Varivel1 = Global echo Varivel2 = $VARIAVEL2 # Exibir: Varivel2 =

Existemdoiscomandosfundamentaisparacontroledovalorderetornodeuma funo(statusdesada).Soeles:exitereturn. exit: encerra imediatamente a execuo do script e grava o valor fornecido comostatusnavarivel$?,deformasemelhanteasfunesescritasemC.
#!/bin/bash Primeira_funcao () { If [ $# -eq 2 ]; then echo Minha funo contm $# Parmetros else echo Precisa ter exatamente dois Parmetros echo e \n \nEncerrando o script exit 1 fi } # Fim da Funo

## Iniciando o script echo Chamando a funo: Primeira_funcao () Primeira_funcao $@ echo A funo terminou # No ser executado, por causa do comando exit echo Encerrando o script # No ser executado, por causa do comando exit

return:terminaafunoegravaumnmerointeirocomostatusdesadapara avarivel$?.
#!/bin/bash Primeira_funcao () { if [ $# -eq 2 ]; then echo Minha funo contm $# Parmetros else echo Precisa ter exatamente dois Parmetros

echo e \n\nEncerrando a funo return 1 fi echo e \nEste comando ser executado echo e Somente se forem passados DOIS Parmetros } # Fim da Funo

## Iniciando o script echo Chamando a funo: Primeira_funcao () Primeira_funcao $@ if [ $? eq 0 ]; then echo e \n\nFuno Executada com Sucesso! else echo e \n\nErros na Execuo da Funo! fi

Noscriptacima,foramaproveitadasasvariveis $@e $#pararepassarparaa funo a lista de parmetros fornecidos no momento da execuo do mesmo, onde casosejampassadosdoisparmetros,serexibidaaseguintesada:
Chamando a funo: Primeira_funcao () Minha primeira funo contm 2 Parmetros

Este comando ser executado Somente se forem passados DOIS Parmetros Funo Executada com sucesso!

Caso seja informado qualquer outro nmero de parmetros, ser exibida a seguintesada:
Chamando a funo: Primeira_funcao () Precisa ter exatamente dois parmetros Encerrando a Funo Erros na execuo da Funo!

9 Projeto e desenvolvimento de Shell scripts para automatizao de tarefas gerais Nessa fase, devero ser respondidas algumas perguntas que sero determinantesnosucessodoscript: a) Oqueprecisosolucionar?Entenderedelimitaroescopodoproblemaaser solucionado;

b) Quais os recursos que preciso utilizar para atingir a soluo objetivada? Verificar se o sistema j possui os recursos necessrios ou se ser necessrioinstalaroutrosprogramas,pacotese/oudependncias; c) H limitaes de recursos? Certificarse que os recursos disponveis atendemnantegraacomplexidadedoproblema.Casonegativo,adequaro scriptparaasoluomaisprximapossveldaquelaesperada; d) Comoutilizarosrecursosdisponveisdamelhormaneirapossvel?Verificar nos manuais dos comandos a serem utilizados, a sintaxe e os parmetros (quandoaplicvel)quemelhorseadquamasoluo; e) Quais sero os possveis erros que o script poder gerar? Executar teste com as linhas de comandos mais crticas e analisar se o resultado gerado correspondeaoesperado; f) O que ser feito com as mensagens geradas? Definir um destino para as mensagens provenientes da STDOUT e STDERR, a fim de evitar que informaes importantes sejam perdidas ou informaes desnecessrias sejamexibidase/ougravadas. Acompanheabaixooprojetodeumscriptqueserrealizadobaseadoemuma situaohipottica: O administrador do sistema, ao tentar executar uma cpia do arquivo /etc/passwd,trocouocomandocppelorm,ocasionandoumaparadacrticaemalguns serviosprovidospelaempresa. Ao verificar os arquivos de backup realizados, constatou que no existia uma cpiadoarquivoquefoiapagado. QuandooadministradorestavasepreparandoparapassarnoRH,lembrouque tinha guardado um arquivo com todos os logins e nomes completos dos usurios do sistemadelimitadopelocaractere:. Baseado nesse arquivo, ele seguiu os passos descritos anteriormente, da seguinteforma: a) O que preciso solucionar? Refazer o arquivo /etc/passwd e manter meu emprego; b) Quaisosrecursosqueprecisoutilizarparaatingirasoluoobjetivada?Ele sabe que ao utilizar o comando cat, consegue exibir todo o contedo do arquivocomasinformaesbsicasqueelepossuiacercadosusurios.O comandoforlhepermitetratarlinhaalinhadessearquivo.Comoeleno possui os UIDs e GIDs, ter de usar o comando useradd para gerar essas informaes.Parafiltrarasinformaesporcolunas,sernecessrioutilizar

ocomandocut.Comooarquivodesenhas(/etc/shadow)nofoialterado, nosernecessriomudarassenhasdosusurios; c) H limitaes de recursos? Alguns usurios que sero recriados precisam tersuaShellpadropara/sbin/nologin; d) Como utilizar os recursos disponveis da melhor maneira possvel? O comando cat e for podem ser utilizados sem parmetros. O comando useraddnecessitadoparmetrocparagravaronomecompletodecada usurio. O comando cut, necessita dos parmetros d (para indicar o delimitador)ef(paraindicaronmerodocampo); e) Quaisseroospossveiserrosqueoscriptpodergerar?Antesdeutilizaro comandouseradd,testarseoscamposrealmenteestosendofiltradosda maneira correta (podese utilizar o comando echo), para no incluir informaeserradasouindesejadasnonovoarquivodeusurios; f) Oqueserfeitocomasmensagensgeradas?Senohouvernecessidadede manter alguma das informaes geradas durante a execuo do script, as mesmaspodemserredirecionadasparao/dev/null. Depossedetodoocontedoexibidoataquialiadoaosseusconhecimentos deLinux,chegouhoradesolucionaralgunsproblemasqueserodescritosnositens aseguir:qualquersemelhanaentreosproblemasmostradosaquicomsuarealidade nosermeracoincidncia! 9.1 Montagem de um compartilhamento localizado num servidor Windows Server2003 Verificar se o compartilhamento \\Ip.Do.Servidor.Windows\arquivos est montado no diretrio /mnt/srv-win2003 do servidor Linux. Se estiver, o script encerra. Caso contrrio, o mesmo dever ser montado e uma mensagem de Alerta contendo a data e hora do fato dever ser adicionada cumulativamente no arquivo /var/log/mnt_srv-win2003.log. OBS: para resoluo deste exerccio, imagine que o usurio: bkplinux com a senha: TimeIsMoneyOhYeah est devidamente criado no servidor Windows Server 2003 e tem acesso ao compartilhamento. No esquea que o tipo de sistema de arquivosderedepadrodoWindowsServer2003ocifs. 9.2 Criaootimizadadecontasdeemail Desenvolver um script para criar contas de email no servidor Linux. O script deverprimeiramenteleronomecompletodapessoaecertificarqueelarealmente no tem email criado. Se tiver, o script retorna uma notificao e encerra. Caso contrrio,deverserinformadoologin(emailpropriamentedito)eacontadeverser criada com as informaes repassadas, repassando, no entanto, o Shell padro: /sbin/nologin(porrazesdesegurana).Antesdeencerrar,deverosergravadosno finaldoarquivo/var/log/emails-criados.log:ologindapessoaquecriouacontade

email, a data e hora do evento, o alm do endereo IP da mquina dessa pessoa. O arquivodelogdevesercriadodeformaqueningumpossaapaglo(nemmesmoo root). OBS: para resoluo deste exerccio, imagine que as contas de emails do servidorsosuascontasdeusurionosistema,queomtododeautenticaopadro viaPAM,onomecompletodousurioinseridosemabreviaesnemacentoseo operadordecontasdeemailnecessitaseconectarviaSSHnoservidorparaefetuaros devidosprocedimentos. 9.3 MonitoramentodeHOSTS Desenvolverumscriptqueleiaoarquivo/home/backup/scripts/servers-list, onde cada linha desse arquivo contm um endereo IP de mquinas que devem ser monitoradas constantemente. O script deve enviar quatro solicitaes do tipo icmp_echo_request (ping) para cada servidor designado no arquivo. Ao final da execuodoscript,casoalgumamquinanorespondaaoteste,deversergravada cumulativamente no arquivo /var/log/monit-servers.log uma mensagem que siga o seguinte modelo: s 18:12 do dia 29-09-2008 o Servidor 192.168.4.25 no respondeu ao comando Ping (alterando as informaes que forem necessrias). Dever ainda enviar a lista com as mesmas informaes que so adicionadas ao arquivodelogparaoemail:bugs@meudominio.gov.br. 9.4 BackuporganizadodeumServidordearquivo Oscriptdeverfazerbackupdeumcompartilhamentolocalizadonumservidor de arquivos para o seguinte diretrio localizado no servidor Linux: /home/backup/FileServer/MsAtual/DD-MM-AAAA, onde MsAtual corresponde aonomedomsatual(dejaneiroadezembro)eDDMMAAAAcorrespondeadata atual no formato numeral: DiaMsAno. O arquivo de backup gerado dever ser no formato.tar.bz2(utilizeosprogramasnecessriosparaobtertalformato). OBS: Para resoluo deste exerccio, imagine que o compartilhamento e o ponto de montagem so os mesmos fornecidos no item 9.1, o diretrio /mnt/srvwin2003 se encontra devidamente montado e que a estrutura /home/backup/FileServer/MsAtualesttotalmentecriada. 9.5 ManutenodeContasdeemail Oscriptdeverlistartodososusuriosquenoutilizamseusemailshmaisde 60 dias. Feito isso, dever ser feito backup do diretrio /home/USUARIO e /var/spool/mail/USUARIO para a pasta: /home/backup/emails/inativos/DD-MMAAAA.tar.gz.Depoisderealizadoesteprocedimento,ascontasdeveroserexcludase uma notificao dever ficar gravada no arquivo /var/log/emailsinativos.log, informandoonomedaconta,dataehoraqueamesmafoiexcluda. OBS:Pararealizaodesteexerccio,imaginequeesteservidordeemailsegue omesmopadrodescritonoitem9.2,ascontasdeusuriodevemserexcludascoma opo apague tambm o HOME do usurio e um possvel critrio para determinar a inatividadedoemailoltimoacessoasuacaixadeentrada.

10 Agendamentoetestesdosscriptsdesenvolvidos Altimaemelhorfaseoagendamento,poisserapartirdelequeosscripts sero executados de forma automtica, baseados em critrios de data e hora que supramanecessidadedecadacaso. 10.1 Cron O cron um dos mais utilizados agendadores de tarefa para Linux, quando o assuntoexecuoperidicadetarefas.Suasintaxebsica: Minuto Hora Dia Ms DiaSemana /caminho/absoluto/comando Ex1:executaroscript/home/backup/scripts/tarefa.sh,todososdiasdomsde setembro,s19:50: 50 19 * 9 * /home/backup/scripts/tarefa.sh Ex2:executarocomandontpdate 10.20.0.2acada30minutos: */30 * * * * /usr/sbin/ntpdate 10.20.0.2 Ex3: executar o script /root/bkpespecial.sh s 07:30 do dia 27 de qualquer ms,desdeque27sejasbado: 30 07 27 * 6 /root/bkp-especial.sh OBS:nocampoDiaSemana,ovalor0e7referemsedomingo. Parainteragircomocron,ousurioutilizaocomandocrontab.Suasprincipais opesso: Crontabe:entranomododeedio.aformaqueousuriotemdeincluir, alterar ou excluir uma tarefa que ser executada pelo cron (seguindo o padro mostradoanteriormente). Crontabl:listatodasastarefasagendadaspelousurio. 10.2 At Outroexcelenteagendadordetarefas.Seudiferencialemrelaoaocronque o at indicado para situaes onde se necessite executar determinado comando ou scriptumanicavez. Suasintaxebsica: # at HH:mm MM/DD/AAAA at > comando ctrl+d # Para salvar o agendamento

Ex:Paraagendaroscript/home/teo/bkp-especial.shparaserexecutadodia 30desetembrode2008,as19:45. # at 19:45 09/30/2008 at> /home/teo/bkp-especial.sh Ctrl+d Astarefasagendadasficamlocalizadasnodiretrio/var/spool/at/.Paralistar astarefasagendadas,usaseocomandoatqouat l.Ex: # at l 1 2008-09-30 19:45 a root 2 2008-10-01 07:15 a teo Sedesejarapagarumatarefaagendada,usecomandoatrmouatdseguido do nmero correspondente ao agendamento. Ex: para remover o primeiro agendamentodoexemploanterior,podeserealizar: # at d 1; Ou # atrm 1;

11 Bibliografia BURTCH,KenO.LinuxShellscriptingwithbash.Indiana.SamsPublishing,2004. COPPER,Mendel.AdvancedBashScriptingGuide:Anindepthexplorationof theartofShellscripting.Revision1.8,2003. JARGAS, Aurlio Marinho. Conhecendo as expresses Regulares. Disponvel: http://aurelio.net(capturadoem20deagostode2008). TAYLOR,Dave.WickedCoolShellscripts:101scriptsforLinux,MacOSX,and UnixSystems.SanFrancisco.NoStarchPress,2004. VEERARAGHAVAN, Sriranga. Sams Teach Yourself Shell Programming in 24 Hours.Indiana.SamsPublishing,1999. WELCH, John C.; ANDERSON, Micah; FOSTERJOHNSON, Eric. Beginning Shell script.Indiana.WileyPublishing,2005.