Академический Документы
Профессиональный Документы
Культура Документы
2009
Sumrio
Introduo.............................................................................................................................................3 Shell.................................................................................................................................................3 Scripts..............................................................................................................................................3 Shell Scripting..................................................................................................................................4 Primeiro Script .....................................................................................................................................4 Organizando.....................................................................................................................................4 Hello World......................................................................................................................................4 Nomenclatura de ShellScripts..........................................................................................................5 Executando o ShellScript.................................................................................................................5 Possveis erros..................................................................................................................................6 Aprimorando o script............................................................................................................................7 Perfumaria........................................................................................................................................7 Entrada pelo teclado.........................................................................................................................7 Variveis...........................................................................................................................................8 Controle de fluxo..................................................................................................................................8 Comando TEST e IF-ELIF-ELSE-FI...............................................................................................8 CASE.............................................................................................................................................10 Loops..................................................................................................................................................11 Lao FOR.......................................................................................................................................11 Lao while......................................................................................................................................12 Funes...............................................................................................................................................13 Exemplos de Scripts na Prtica..........................................................................................................13 Script backup 1..............................................................................................................................13 Scritp backup 2..............................................................................................................................14 Script backup 3..............................................................................................................................15 Download ......................................................................................................................................16 Automatizao de tarefas...................................................................................................................18 Sintaxe do cron..............................................................................................................................19 Agendando backup........................................................................................................................19 Agendando download....................................................................................................................19 Bibliografia.........................................................................................................................................20
Introduo
Shell
Shell, tambm conhecida como prompt de comandos o interpretador de comandos de um sistema operacional. Sua funo interpretar os comandos que o operador insere, via teclado, devolvendo os resultados no monitor ou outro dispositivo de sada. Todos os sistemas operacionais possuem uma ou mais Shell. No mundo Unix, existem quatro Shells mais comuns, que so:
Bourne Shell: Shell padro para Unix, executado pelo /bin/sh. Foi desenvolvido por Stephen Bourne em 1975; Korn Shell: um melhoramento do Bourne Shell, executado por /bin/ksh ; C Shell: uma Shell com sintaxe parecida com a linguagem C. No tem portabilidade com o Bourne Shell, mas comum em sistemas BDS1. executado por /bin/csh Bourne Again Shell: o Shell desenvolvido pelo projeto GNU, largamente utilizado por sistemas GNU/Linux. executado por /bin/bash. Nosso minicurso ser baseado neste interpretador.
O sistema operacional Windows2 tambm tem um interpretador de comandos, chamado prompt de comandos que lembra o DOS2. Neste sistema, podem ser criados programas de lote que so anlogos, mas no portveis, com Shell scripts.
Scripts
Scripts, ou scripting, uma tcnica de programao, onde o programa escrito no precisa ser compilado para rodar. Todos os comandos do script so interpretados por um interpretador prprio para cada linguagem. Normalmente as linguagens baseadas em script tem uma estrutura de programao bastante simples. Podemos citar algumas das linguagens de script, no entanto, h uma variedade muito grande disponvel:
Shell Scripting
Shell Scripting so scripts criados em linguagem Shell. Estes scripts so ento interpretados e executados pelo interpretador determinado pelo programador. Um ShellScript nada mais do que um arquivo com comandos em Shell, logicamente ordenados, para se obter um resultado til. Uma vez criado, um ShellScript pode ser reutilizado quantas vezes for necessrio. Seu uso, portanto, indicado na automao de tarefas que sero realizadas mais de uma vez. Todo sistema Unix e similares so repletos de scripts em Shell para a realizao das mais diversas atividades administrativas e de manuteno do sistema. [Wikipedia,2009] Estes scritps so largamente utilizados em gerenciamento de computadores, automatizao de backups, automatizao de tarefas, etc. Exemplos:
backup da rede que dever rodar na madrugada; inicio de compartilhamento de arquivos via torrent inicia as 0h at as 7h25min; limpeza de disco, e outros;
No arquivo do ShellScript, uma linha especial sempre a primeira linha deve ser includa identificado qual interpretador ser utilizado por aquele script. Desta forma, posso escrever um script em Korn Shell e distribuir, tendo certeza que o mesmo rodar normalmente.
#!/bin/bash para Bourne Shell Again #!/bin/sh para Bourne Shell #!/bin/csh - para C Shell
Se no for declarado qual interpretador ser usado pelo ShellScript que est sendo escrito, o mesmo ir procurar pelo interpretador padro. Porm se o cdigo ShellScript no for do padro, no rodar corretamente.
Primeiro Script
Organizando
Para organizar o resto do minicurso, iremos criar um diretrio especfico para armazenar todos os ShellScripts. Na home do usurio padro criar um diretrio scripts supondo que o usurio padro aluno:
$ mkdir /home/aluno/scripts
Hello World
O primeiro script desta apostila, tem a intenso de experimentar o elementar do Shell script. A funo do programa imprimir na tela uma mensagem. Salve o arquivo no diretrio criado no item anterior com o nome olamundo. #!/bin/bash echoOlaMundo! ShellScript 1: olamundo
Nomenclatura de ShellScripts
As nicas regras para nomenclatura de ShellScripts so:
No usar caracteres especiais como espao, acentuao, caracteres diferentes como @%&*;
Os arquivos no precisam ter extenso (em contraposio ao Windows), no entanto o criador do script PODE se utilizar de extenses para facilitar a organizao. Neste minicurso, no usaremos extenso.
Tabela 1: permisses rwx para Unix Like Na tabela abaixo, vemos uma captura de tela de um terminal, mostrando as permisses, o dono e o grupo dos arquivos e diretrio.
jose@aragogue:~/scripts$ ls -l drwxr-xr-x 2 jose casa 4096 Out 26 13:22 diretorio -rwxr-xr-x 1 jose casa 22 Out 25 22:41 teste -rwxr-xr-x 1 jose casa 18 Out 25 22:41 teste~
Tabela 2: ls -l Para ALTERAR as permisses, o comando utilizador chmod . Podemos atribuir ou retirar permisses para cada nvel de acesso Usurio, Grupo ou Outros. Este comando tem algumas variaes, e nesta apostila apresentamos o formato mais simples. Considerando ShellScript olamundo criado no primeiro exemplo, vamos s permisses.
Permitir leitura,escrita e execuo ao Usurio $ chmod u+rwx olamundo Permitir somente leitura e execuo ao Grupo $ chmod u+rx-w olamundo Permitir somente leitura aos Outros $ chmod u+r-xw olamundo
jose@aragogue:~/scripts$ ls -l drwxr-xr-x 2 jose casa 4096 Out 26 13:22 diretorio -rwxr-xr-- 1 jose casa 22 Out 25 22:41 olamundo
Tabela 3: ls -l aps modificaes
Um pouco de segurana
No recomendado criar ShellScript com usurio root, e nem com setuid3 ativado. Esta prtica REPRESENTA UM ALTO RISCO DE SEGURANA AO SISTEMA. Este risco est na possibilidade de um usurio malicioso modificar o contedo do ShellScript para obter acesso privilegiado no autorizado no sistema. Se precisar criar um ShellScritp como root, deve-se usar permisses restritivas, bloqueando RWX para Grupo e Outros.
Executando
Para executar qualquer arquivo, scritp ou binrio, precisamos do curinga ./ antes do arquivo. Ento no caso do nosso ShellScritp fica assim:
aluno@cefet:~/scripts$ ./olamundo
Possveis erros
1. bash: ./teste: Arquivo ou diretrio no encontrado - Significa que o ShellScript (ou programa) que voc est tentando executar no existe ou no est no diretrio em que voc est.
2. bash: ./olamundo: Permisso negada - Significa o usurio que voc est usando (logado) no tem permisso de executar o ShellScriot ou ainda o ShellScript (ou programa) que voc esta tentando executar no tem permisso de execuo.
Verifique as permisses do arquivo devero ser -rwxrr-- ; Verifique se voc o dono do arquivo.
Introduo ao Shell Scripting 3. bash: ./olamundo: /bin/asdf: bad interpreter Significa que vc est identificando um interpretador errado ou inexistente nesta mquina.
4. ./olamundo: line 3: echor: command not found - Significa que o ShellScript que voc est tentando executar est com um erro de sintaxe e o Shell no consegue executar. Normalmente o Shell informa qual erro esta ocorrendo e em alguns casos informa at o nmero da linha onde est o erro.
Aprimorando o script
Perfumaria
At agora, verificamos o bsico pra criar um ShellScript e roda-lo. Nesta sesso iremos aprimorar o script melhorando sua interface com o usurio. Certamente, esta interface ir depender da aplicao do script, havendo situaes em que no so recomendadas, por exemplo quando um ShellScript alimentador de outro ShellScript ou programa. No entanto, em determinadas situaes, pode ser interessante colocar mensagens de aviso ao operador. Como no script abaixo, que mostra as mensagens de texto e o resultado dos comandos. #!/bin/bash echoOlaMundohojedia: date echoEstecomputdorsechama: hostname ShellScript 2: olamundo2 Os comandos date e hostname retornam respectivamente a data e o nome do computador. Normalmente todos os comandos do Shell possuem parmetros modificadores (switches) que do um resultado diferente. Por exemplo, podemos querer mostrar a data no formato dia ms ano. Para isso, usamos os modificadores do comando date.
date +%d/%m/%Y
Vale salientar que todos os comandos de Shell podero ser testados antes em um terminal.
Introduo ao Shell Scripting #!/bin/bash echo Hoje dia: `date +%d/%m%Y` echo Digite seu nome: read ShellScript 3: olamundo3
Variveis
Em Shell script utilizamos variveis da mesma foram que em outras linguagens, armazenando valores em tempo de execuo. A diferenas mais expressivas so:
variveis no precisam ser declaradas; podem ser criadas em qualquer parte do cdigo; possuem tipagem fraca, ou seja, uma varivel ser do tipo texto, numrica ou boolean, no havendo detalhamentos como no C (float, unsigned int, double, etc);
#!/bin/bash dia=`date +%d` mes=`date +%m` ano=`date +%Y echo Hoje dia $dia de $mes no ano de $ano Tabela 4: script mostra-data
Controle de fluxo
Como outras linguagens, ShellScripts possuem sistemas de controle de fluxo. Nesta seo faremos uma breve abordagem aos mecanismos de controle de fluxo de ShellScripts. Muito mais pode ser estudado sobre os mesmos, bastando aos leitores procurarem na bibliografia de apoio.
Introduo ao Shell Scripting Testes com Variveis Comando -lt -gt -le -ge -eq -ne = != -n -z O que testa Menor que ? Maior que ? Menor ou igual ? Maior ou igual ? Igual ? Diferente ? String igual ? String diferente ? String no vazia ? String vazia ? -d -f -r -s -w -nt -ot -ef -a -o Teste com Arquivos Comando O que testa diretrio ? arquivo ? Permisso leitura ? Maior que zero ? Permisso escrita ? Mais recente ? Mais velho ? Mesmo arquivo ? AND OR
O ShellScript abaixo faz uso do comando test para verificar se um arquivo informado por linha de comando existe e um arquivo ou diretrio. Neste exemplo apresentado o conceito de entrada de variveis por linha de comando, frequentemente utilizado. Parmetros passados por linha de comando so enumerados dentro do ShellScript por variveis numeradas $1 o primeira varivel, $2 a segunda varivel passadas por linha de comando. No h limite de variveis passadas por comando. #!/bin/bash #carrega em arq o argumento passado if test -z $1; then echo "Informe parmetro: (./testa <arquivo>)" exit else arq=$1 fi #testa se arquivo existe if test -f $arq; then echo $1 um arquivo ! elif test -d $arq; then echo $1 um diretrio ! else echo Entrada invlida - no arquivo nem diretorio fi ShellScript 4: testa-arquivo
No prximo exemplo testaremos nmeros. Neste exemplo, os nmeros sero entrados no programa pelo comando read. #!/bin/bash var=5 echo Digite um numero read num #testa o numero if [ $num -lt $var ]; then echo "Vc informou um numero menor que 5 (less then)." elif [ $num -gt $var ]; then echo "Vc informou um numero maior que 5 (greater then)." elif [ $num -eq $var ]; then echo "Vc informou um numero igual que 5 (equal)." fi ShellScript 5: testa-numero
CASE
O case uma estrutura de controle de fluxo para situaes em que temos diversas opes de escolha. Sua sintaxe mais simples que o uso de diversos IF-ELSE-IF. No prximo exemplo, escolhemos uma entre diversas opes. O CASE faz a anlise das escolhas e retorna o caso correspondente. #!/bin/bash echo "Escolha uma opo:" echo " 1 - quem sou eu ?" echo " 2 - quem esta logado?" echo " 3 - Data" echo " 4 - Calendrio" read n case $n in #testa a varivel n para as 4 opes de escolha em um case 1) whoami ;; 2) who ;; 3) date ;; 4) cal ;; esac ShellScript 6: escolha1 Jos de Figueiredo deb.gnulinux@gmail.com 10
Loops
Lao FOR
Executa determinada operao quantas vezes forem necessrios at que determinada condio seja satisfeita.
FOR
de 1 a 10.
#!/bin/bash #para cada ocorrncia de n imprime a mensagem for n in 1 2 3 4 5 6 7 8 9 10 do echo Ola nmero $n done ShellScript 7: laco1
FOR
de arquivos em um diretrio.
#!/bin/bash #mostra os arquivos e diretrios de /etc for n in /etc/* do echo $n done ShellScript 8: laco2
FOR
#!/bin/bash #mostra os arquivos e diretrios de /etc for (( i = 0 ; i <=5 ; i++ )) do echo Ol nmero $i done ShellScript 9: laco3
11
Lao while
Executa enquanto o teste enquanto a escolha for verdadeira. Este ShellScript uma adaptao utilizando o case e o while. O while executar at que o usurio escolha a opo 0. #!/bin/bash n=5 #ATRIBUI QUALQUER VALOR A N DIFERENTE DAS OPOES ABAIXO while [ $n -ne 0 ] #SE N = 0 ENCERRA O PROGRAMA SAENO FICA NO LOOP do printf "\n->Escolha uma opo:\n" #MOSTRA AS OPES PARA O USUARIO echo " 1 - quem sou eu ?" echo " 2 - quem esta logado?" echo " 3 - Data" echo " 4 - Calendario" echo " 0 - Sair" read n #LE VARIVAEL N #testa a variavel n para as 4 opoes em um case case $n in 1) echo '-----' whoami echo '-----' ;; 2) echo '-----' who echo '-----' ;; 3) echo '-----' date echo '-----' ;; 4) echo '-----' cal echo '-----' ;; esac done # FECHA LOOP ShellScript 10: laco4
12
Funes
um mecanismo utilizado para modularizar e organizar do cdigo. Usada normalmente para evitar duplicao de cdigo. Uma funo deve ser declarada antes de sua utilizao normalmente no incio do script. A sintaxe bsica pode ser vista no quadro abaixo. #!/bin/bash # declara a funo function ola() { echo "Funo que diz ola mundo!" } # executa a funo ola ShellScript 11: funcao-ola
Script backup 1
O ShellScript a seguir tem por objetivo fazer cpias de pastas em arquivos tar. O TAR largamente utilizado em sistemas Unix Like, serve para botar vrios arquivos dentro de um s funcionado como um arquivador. O arquivo resultante do tar tambm pode ser compactado com diversos compactadores como gzip, bzip2 e outros. Isto confere ao TAR uma aplicabilidade muito grande. No nosso primeiro script de backup, Armazenar em um arquivo de backup, temos um sistema simples de mensagem, a escolha de um local de armazenamento e a escolha de uma home de algum usurio.
13
Introduo ao Shell Scripting #!/bin/bash echo echo echo echo '-------------------------' 'Backup de '`whoami` '-------------------------' 'rodando...'
local=/backup tar -cvzf $local/backup1.tgz /home/`whoami` ShellScript 12: backup1 O tar no ser discutido nesta apostila, sendo rapidamente comentado:
criar em modo verbose (mostrando tudo) e compactando com gzip no arquivo /backup/backup1.tgz tudo que tem em /home/aluno
Scritp backup 2
Incrementando o script de backup. Nesta segunda verso do script de backup, vamos:
Modularizamos o script, utilizando variveis; Criar arquivos identificados por data; Armazenar o registro de log da sada do tar em um arquivo de log, que tambm identificado por data.
#!/bin/bash echo '-------------------------' echo 'Backup de '`whoami` echo 'Rodando...' local=/backup destino=$local/backup-`date +%d-%m-%y`.tgz origem=/home/`whoami` log=$local/backup-`date +%d-%m-%y`.log tar --create --verbose --bzip2 --file $destino $origem > $log 2>&1 echo 'Feito!' echo '-------------------------' ShellScript 13: backup2
14
Script backup 3
Roda o backup e salva em um servidor FTP (Servidor NAS) que dever estar disponvel na rede, com usurio e senha conhecidos. Para fins de teste, usaremos um servidor ftp local, com usurio bkp e senha backup.
#!/bin/bash # chama script de ftp function enviar (){ comando=$local/envia-ftp logftp=$local/envio-ftp-`date +%d-%m-%y`.log echo '$$$$$$$$$$$$$$$$$$$$$$$$$' echo 'Enviando ... ' cd $local $comando $arquivo > $logftp 2>&1 echo 'Feito !' echo '$$$$$$$$$$$$$$$$$$$$$$$$$' } echo '-------------------------' echo 'Backup de '`whoami` echo 'Rodando...' local=/backup arquivo=backup-`date +%d-%m-%y`.tgz destino=$local/$arquivo origem='/home/`whoami`/scripts' log=$local/backup-`date +%d-%m-%y`.log tar --create --verbose --bzip2 --file $destino $origem > $log 2>&1 echo 'Feito!' echo '-------------------------' # Executa funo enviar enviar ShellScript 14: backup3 Jos de Figueiredo deb.gnulinux@gmail.com 15
#!/bin/bash #!/bin/sh HOST='localhost' USER='bkp' PASSWD='backup' ftp -n $HOST <<END_SCRIPT quote USER $USER quote PASS $PASSWD put $1 quit END_SCRIPT exit 0 ShellScript 15: envia-ftp
Download
O prximo script utilizado para automatizar downloads rodando em horrios alternativos automaticamente. O mesmo script pode ser adaptado para download com bittorrent.
16
Introduo ao Shell Scripting #!/bin/bash ALVO=http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/debian-503-i386-CD-1.iso DWDIR=/home/`whoami`/download/ CMD='wget -t 0 -cb ' LOG=' -o download.log 2>&1' PIDFILE=$DWDIR/download.pid #export "http_proxy='http://teste:teste@192.168.168.1.251:8080'" dw_start() { echo 'Iniciando download...' echo 'Para ver o log use: tail -f /home/'`whoami`'/download/download.log' cd $DWDIR $CMD $ALVO $LOG } dw_stop() { echo 'Encerrando...' PID=`ps -A | grep wget | awk '{print $1}'` kill -9 $PID } case "$1" in start) dw_start ;; stop) dw_stop ;; restart) dw_stop dw_start ;; force-reload) dw_stop dw_start ;; *) echo "Uso: $0 {start|stop|restart|force-reload}" ;; esac
17
Automatizao de tarefas
Normalmente os scripts so criados para automatizar procedimentos e tarefas. Neste caso, precisamos de um agendador de tarefas para disparar os scripts nos horrios que planejamos. Por exemplo: backup de dados as 20h e download da 0h at as 7h. Em sistemas Unix Like, dispomos do cron ( /usr/sbin/cron ) que, nada mais do que um agendador de tarefas que usa um conceito de tabela por usurios, ou seja, cada usurio tem a sua prpria agenda de tarefas. As modificaes na tabela de tarefas so feitas pelo comando crontab.
Modificar a tabela de tarefas do usurio $ crontab -e Listar a tabela de tarefas do usurio $ crontab -l
Ao executar crontab -e, estamos na verdade, executando um editor de textos que edita a tabela de agendas diretamente. Veja na figura abaixo:
18
Sintaxe do cron
O cron tem uma sintaxe bastante simples, da direita para a esquerda, temos:
de segunda a sexta: 1-5 no campo dia da semana; a cada 30 minutos: */30 no campo minutos a cada 10 minutos: */10 no campo minutos todos os dias da semana, todos os meses e todos os dias : * * *
Agendando backup
30 21 * * 1-5 /home/aluno/scripts/backup1 rodar o script backup1 as 21:30, todos os dias do ms, de segunda a sexta-feira
Agendando download
30 23 * * * /home/aluno/scripts/download start inicia o script download as 23:30 todos os dias 30 7 * * * /home/aluno/scripts/download stop encerra o script download as 7:30 todos os dias
19
Bibliografia
1.Robbins, Arnold. Classic Shell Scripting, Porto Alegre, Bookman 2008, 2.http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html 3.http://www.linuxquestions.org/questions/programming-9/bash-sort-files-by-date-in-file-name443623/ 4.http://aurelio.net/Shell/canivete.html 5.http://www.ppgia.pucpr.br/~maziero/doku.php/unix:Shell_scripts 6.http://www.vivaolinux.com.br/artigo/Introducao-ao-uso-de-Shell-Script?pagina=2 7.http://pt.wikipedia.org/wiki/Linguagem_interpretada 8.http://users.ox.ac.uk/~martinw/unix/chap15.html 9.http://www.devin.com.br/Shell_script/comment-page-2/ 10.http://www.inf.ufpr.br/afms03/Shell3.html 11.http://pt.wikipedia.org/wiki/Shell_script 12.http://freeos.com/guides/lsst/
20