aprendendo shell script
Transcrição
aprendendo shell script
APRENDENDO SHELL SCRIPT 2013 CEDUP – FERNANDO MATTAR A MAIOR PARTE DOS USUÁRIOS CLASSIFICAM SHELL SCRIPT COMO UMA LINGUAGEM DE FÁCIL APRENDIZAGEM. O PRIMEIRO PASSO É, SABER O QUE SE DESEJA FAZER, ENTÃO VER QUAL O CÓDIGO QUE EXECUTA ESTE COMANDO EM SHELL E AÍ CRIAR. Aprendendo Shell Script Aprendendo Shell Script Antes de saber o que é um script em shell, é importante saber o que é um Shell. Na linha de comandos de um shell, podemos utilizar diversos comandos um após o outro, ou mesmo combiná-los numa mesma linha. Se colocarmos diversas linhas de comandos em um arquivo texto simples, teremos em mãos um Shell Script, ou um script em Shell, já que Script é uma descrição geral de qualquer programa escrito em linguagem interpretada, ou seja, não compilada. Outros exemplos de linguagens para scripts são o PHP, Perl, Python, JavaScript e muitos outros. Podemos então ter um script em php, um script perl e assim em diante. Uma vez criado, um Shell Script pode ser reutilizado quantas vezes for necessário. Seu uso, portanto, é indicado na automação de tarefas que serão realizadas mais de uma vez. Todo sistema Unix e similares são repletos de scripts em shell para a realização das mais diversas atividades administrativas e de manutenção do sistema. Os arquivos de lote (batch - arquivos *.bat) do windows são também exemplos de Scripts, já que são escritos em linguagem interpretada e executados por um Shell do Windows, em geral o command.com ou hoje em dia o cmd.exe. Os Shells do Unix, porém, são inumeras vezes mais poderosos que o interpretador de comandos do windows, podendo executar tarefas muito mais complexas e elaboradas. O Shell mais comum e provavelmente o que possui mais scripts escritos para ele é também um dos mais antigos e simples, o sh. Este shell está presente em todo o sistema tipo Unix, incluído o Linux, FreeBSD, AIX, HP-UX,OpenBSD, Solaris, NetBSD, Irix, etc. Por ser o shell nativo mais comum é natural que se prefira escrever scripts para ele, tornando o script mais facilmente portável para outro sistema. Os Shells não estão diretamente associados a um ou outro tipo de Unix, embora várias empresas comerciais tenham suas próprias versões de Shell. No software livre o Shell utilizado em um sistema em geral é exatamente o mesmo utilizado em outro. Por exemplo, o bash encontrado no Linux é o mesmo shell bash encontrado no FreeBSD e pode também facilmente ser instalado no Solaris, Windows através do Cygwin ou outros sistemas Unix comerciais para passar a ser utilizado como interface direta de comandos ou como interpretador de scripts. O mesmo acontece com o tcsh e vários outros shells desenvolvidos no modelo de software livre. Comandos Básicos do Shell Antes de começarmos a programas devemos conhecer nossos diretórios e os comandos que nosso Shell e capaz de processar e qual finalidade de cada comando. Página 1 Aprendendo Shell Script Estrutura de Diretórios Esta estrutura é muito parecida sistemas Linux/BSD e, observando-se a lógica, é possível entender as pastas que não estão nesta lista como por exemplo as que estão dentro do /usr/local (que tem a mesma estrutura do /usr). /root - Diretório HOME do Superusuário. /home - Diretório HOME dos usuários comuns. /bin - Comandos utilizados durante o boot e por usuários comuns. /sbin - Como os comandos do /bin só que não são utilizados pelos usuários comuns. /proc - Sistema de arquivos virtual (na memória) com dados do Kernel. /boot - Arquivos utilizados durante a inicicialização do sistema e o Kernel. /dev - Dispositivos (modem, mouse, teclado, etc..). /etc - Arquivos de configurações do sistema. /etc/skel - Padrão de arquivos para o diretório HOME de novos usuários. /etc/sysconfig - Arquivos de configuração do sistema para os dispositivos. /mnt - Local onde são montados discos e volumes temporários (disquete, outros HDs, CD-ROM, etc..). /tmp - Arquivos temporários do sistema utilizados antes da inicialização do sistema ter sido concluída. /var - Contém arquivos que são modificados com o decorrer do uso do sistema (e-mail , temporários, filas de impressão, manuais). /var/lib - Bibliotecas que mudam enquanto o sistema está rodando. /var/local - Arquivos variáveis de programas que estão rodando. /var/lock - Travas para indicar que um programa está utilizando um determinado dispositivo. /var/log - Arquivos de log do sistema (erros, logins, etc..) /var/run - Arquivos importantes ao sistema úteis até o próximo boot (atualizações de softwares e kernel). /var/spool - Diretório de filas de impressão, e-mail e outros /var/tmp - Arquivos temporários dos programas /var/catman - Um cache para manuais que são formatados na hora de serem utilizados. /lib - Bibliotecas compatilhadas necessárias pelos programas do sistema. /lib/modules - Modulos externos do kernel para dispositivos e funções. /usr - Contém arquivos de todos os programas e bilbiotecas para o uso dos usuários do Linux. /usr/bin - Executáveis em geral. /usr/sbin - Executávies de administração do sistema não necessários pelo kernel, como por exemplo servidores. /usr/include - Arquivos para serem utilizados em linguagens de programação. /usr/lib - Bibliotecas dos executávies encontrados no /usr/bin /usr/local - Arquivos de programas instalados localmente (apenas para alguns usuários). /usr/man - Manuais /usr/info - Documentos de Informações /usr/X11R6 - Arquivos do X Window System e seus aplicativos. Página 2 Aprendendo Shell Script Comandos e suas Funções Comandos do Sistema de Arquivos: São comandos para lidar com o sistema de arquivos (HDs, drives e partições de rede). badblocks - Utilizado para encontrar defeitos físicos no HD. cfdisk - Similar ao fdisk só que com uma interface melhorada. df - Mostra o espaço livre no disco. dosfsck Verifica e repara sistemas FAT do DOS. du - Mostra o espaço que ocupa um diretório e os arquivos internos. dump - Usado para fazer o backup de um sistema ext2. O complemento deste comando é o restore. dumpe2fs - Faz o backup de blocos do HD e grupos. e2fsck - Verifica um volume ext2 em busca de erros. e2label - Muda o nome de uma partição ext2. fdisk - Usado para criar, editar e apagar partições no HD. fdformat - Formata um disquete. mount - Usado para "montar" um sistema de arquivos. O complemento deste comando é o umount. restore - Usado para restaurar um sistema ext2. umount - Desmonta o sitema de arquivos. O complemento é o comando mount. cdrecord - Grava CDs. cdparanoia - Grava CDs de audio. Manipulação de arquivos e diretórios cd - Muda para um diretório. Se você não especificar nada ele muda para seu diretório HOME. chmod - Muda as permissões para acesso aos arquivos e diretórios (Escrita, Leitura, etc..) chown - Muda o propritário e grupo de um arquivo ou diretório. chgrp - Muda o grupo de um arquivo ou diretório. cp - Copia os arquivos de um diretório/pasta para outro diretório/pasta. dir - Lista o conteúdo de um diretório (preferir o comando "ls"). find - Procura arquivos com determinadas características na árvore de diretórios. ln - Cria um link simbólico para um arquivo. ls - Lista os arquivos de um diretório. mc - Midinght Commander. Um gerenciador de arquivos completo para o console. MUITO BOM! mkdir - Cria um diretório. mv - Move ou renomeia um arquivo. rm - Exclui arquivos. rmdir - Exclui um diretório vazio. vdir - Lista o conteúdo de um diretório. wheris - Localiza o executável, código fonte e manual de um comando. ghomemover_console - Programa escrito por Daniel Brooke Peig que faz a mudança de diretórios alterando as referências a arquivos. Página 3 Aprendendo Shell Script Edição e visualização de arquivos ed - Editor de Texto emacs - Editor de texto mais completo. gitview - Visualizador de arquivos Hexadecimais. head - Mostra as primeiras linhas de um arquivo. jed - Editor joe - Editor less - Usado para visualizar arquivos. more - Usado para visualizar arquivos. pico - Editor de textos simples. tail - Mostra as últimas linhas de um arquivo. vi - Editor com uma interface de linha de comando. Compressão de arquivos, backup e restauração ar - Cria, modifica e extrai arquivos. bunzip2 - Descompactador de arquivos bZIP2. bzip2 - Compactador de arquivos bZIP2. bzip2recover - Recupera arquivos bzip2 danificados. compress - Comprime informações. gunzip - Descompacta um arquivo GZip. gzip - Compacta arquivos no formato GZip. rpm - Instalador de programas (pacotes) do RedHat. tar - Compacta grupos de arquivos. uncompress - Descompacta informações. unzip - Descompacta arquivos ZIP. zip - Compactador de arquivos ZIP. Gerenciamento de processos e aplicativos gitps - Um gerenciador de processos com interface gráfica. killall - Fecham todos os processos por nome. sa - Mostra informações sobre os processos que estão sendo executados pelos usuários. top - Mostra os processos que estão ocupando a manior quantidade de recursos do sistema. CTRL-C - Fecha o programa em questão. & - No final de cada comando faz com que o aplicativo rode em background. Gerenciamento de processos e aplicativos gitps - Um gerenciador de processos com interface gráfica. killall - Fecham todos os processos por nome. sa - Mostra informações sobre os processos que estão sendo executados pelos usuários. top - Mostra os processos que estão ocupando a manior quantidade de recursos do sistema. CTRL-C - Fecha o programa em questão. Página 4 Aprendendo Shell Script & - No final de cada comando faz com que o aplicativo rode em background. Rede domainname - Mostra ou ajusta o nome de domínio do sistema. hostname - Usado para mostrar ou atualizar o nome do micro na rede. finger - Mosta informações sobre um determinado usuário. ftp - Programa de transferência de arquivos. ifconfig - Configura a interface de rede. netconf - Interface gráfica do RedHat para confiurar a rede. netconfig - Outra interface gráfica para a configuração da rede. netstat - Mostra informações sobre as conexões à rede. ping - Manda um echo ICMP para um determinado sistema da rede. rcp - Copia arquivos entre diferentes hosts da rede. rlogin - Inicia um terminal em um Host remoto. route - Mostra e manipula a tabela de roteamento. rsh - Executa um comando em um host da rede. rup - Mostra o status de um sistema na rede. showmount - Mostra informações de sistemas NFS monstados sobre a rede. telnet - Interface para o protocolo Telnet. traceroute - Mostra o caminho dos pacotes até um determinado host. Comunicações e e-mail mailx - E-Mail. lynx - Browser de Internet para o console. pine - Programa para e-maisl, notícias e mensagens na rede. sendmail - Muito popular, envia e-mails. smail - Outro famosos sistema de e-mails mais fácil de usar que o sendmail. talk - Permite a conversa entre dois micros. tin - Leitor de Notícias. Modos de execução do sistema exit - Termina o shell. halt - Congela o sistema . logout - Faz o logout do usuário. poweroff - Desliga o computador. reboot - Reinicia o computador. startx - Inicia o X-Window System. Configuração do sistema kernelcfg - Interface gráfica para a configuração do Kernel em Sistemas RedHat. Página 5 Aprendendo Shell Script linuxconf - Sistema de configurações gerais do RedHat. mouseconfig - Aplicativo RedHat para a configuração do mouse. printtool - Aplicativo do RedHat para a configuração de impressão. quota - Mostra o uso do disco e seus limites. samba - Utilizado para ligar/desligar/reiniciar o Samba (cliente de redes Microsoft). setserial - Muda/Mostra informações sobre as portas seriais. setup - Configura os dispositivos e os sistemas de arquivos. timeconfig - Utilitário da RedHat para a configuração do relógio. sndconfig - Utilitário RedHat para a configuração da placa de som. Informações do sistema df - Mostra o espaço livre em disco. du - Mostra o uso do disco. free - Mostra a memória livre do disco. lspci - Lista os dispositivos PCI. pnpdump - Mostra informações sobre os dispositivos ISA. pstree - Mostra a árvore de processos. tload - Imprime um gráfico com os recursos do sistema. vmstat - Mostra as estatísticas da memória virtual. Gerenciamento de usuários adduser - Adiciona um usuário ao sistema. groupadd - Cria um novo grupo. groupdel - Apaga um grupo. groupmod - Modifica um grupo. groups - Imprime os grupos de um usuário. logname - Mostra o login name do usuário. passwd - Muda a senha. smbclient - Cliente para redes SAMBA. smbmount - Monta um sistema de arquivos SAMBA (Windows). su - Muda o usuário para único. sulogin - Login do modo de único usuário. useradd - Adiciona um usuário. userdel - Apaga um usuário e seus arquivos. usermod - Modifica um usuário. w - Mostra os usuários logados e o que estão fazendo. wall - Manda uma mensagem para todos no terminal. Página 6 Aprendendo Shell Script O Seu Primeiro Shell Script Nosso primeiro Shell Script chamaremos de sistema, que consistira em fazer ele executar 3 comandos em um mesmo script. Não esqueça de sempre utilizar letras minúsculas e evite usar acentos, símbolos e espaço em branco no nome do seu Shell Script. Para criamos nosso primeiro Shell Script utilizaremos qualquer editor de texto que tivermos a mão, para iniciamos temos que identificar que esse arquivo não é um arquivo comum para isso temos que colocar um cabeçalho que o sistema interprete como sendo um script e não um arquivo de texto qualquer. As informações que colocaremos no cabeçalho será o tipo de Shell que estamos utilizando como mostra asseguir: #!/bin/bash Observação: Após o diretório /bin informamos que tipo de Shell utilizaremos se no caso fosse (Bourne Shell) utilizariamos o sh no lugar do bash, no caso se utilizariamos o (Korn Shell) no lugar do bash seria ksh (Korn Shell), assim como tantos outros que existem mais utilizaremos o bash. Iremos criar um script que nos de as seguintes informações: Data do nosso sistema, espaço livre em disco e o usuário conectado o script ficaria dessa forma: #!/bin/bash date df who Com estas informações nosso script fará o que nos propomos a fazer mais iremos salvar ele com o nome de sistema.sh, mais falta fazer ele se tornar um executável para o sistema isso obtivemos através do comando chmod como mostro a seguir: chmod +x sistema.sh Agora podemos executar nosso script basta digitar o seguinte comando: ./sistema.sh Página 7 Aprendendo Shell Script Problemas que podem ocorrer na execução do script Comando não encontrado O Shell não encontrou seu script. Verifique se o comando que você esta chamando tem exatamente o mesmo nome do seu script. Lembre-se que no Unix/Linux as letras maiúsculas e minúsculas são diferentes, então o comando SISTEMA é diferente do comando sistema. Caso o nome esteja correto, verifique se ele está no PATH do sistema. O comando que verifica o PATH é: echo $PATH esse comando mostra quais são os diretórios conhecidos, mova seu script para dentro deles, ou chame-o passando o caminho completo ou basta entrar no diretório que ele está e executar o comando que chama seu script. ./sistema.sh (dentro do diretório corrente) /tmp/scripts/sistema.sh (indicando o caminho completo para execução) Permissão negada O Shell encontrou seu script, mas ele não é um executável, use o comando chmod para torna-lo um executável como mostra a seguir: chmod +x ./sistema.sh Erro de Sintaxe O Shell encontrou e executou seu script, porém ele tem erros. Um script só é executado quando sua sintaxe está 100% correta. Verifique os seus comandos, geralmente o erro é algum caracter a mais, um comandos errados ou aspas que foram abertas e não foram fechadas. A própria mensagem informa o numero da linha onde o erro foi encontrado. Página 8 Aprendendo Shell Script Melhorando o Script para o usuário Executar os três comandos seguindo resulta em um bolo de texto na tela, misturando as informações e dificultando o entendimento. É preciso trabalhar um pouco a saída do script, tornando-a mais amigável. O comando echo serve para mostrar mensagens na tela ou pular linhas na tela. Que tal anunciar cada comando antes de executá-lo? #!/bin/bash echo “Data e Horário:” date echo echo “Uso do Disco:” df echo echo “Usuário Conectado:” who Para usar co comando echo, basta colocar o texto entre “aspas”. Se nenhum texto for colocado, uma linha em branco é mostrada, mais não esqueça de fechar as aspas pois caso esqueça isso ira gerar um erro de sintaxe. Página 9 Aprendendo Shell Script Conceito de Variáveis em Shell Script As variáveis são posições na memória do computador onde ficam armazenadas n temporariamente algum valor para ser usadas por programas ou scripts que no Linux são precedidas pelo caractere dólar $. No Linux existem dois tipos de variáveis: Variáveis do sistema – criadas e gerenciadas pelo próprio Linux e são definidas em letras MAIÚSCULAS, onde visualiza-las pelos comandos printenv e env tais como: HOME, USER ou USERNAME, SHELL e etc Variáveis definidas pelo usuário – criadas e gerenciadas pelo usuário e são definidas em letras minúsculas ou MAIÚSCULAS. Variáveis do sistema Você pode ver as variáveis do sistema com os comandos printenv, env e set como mostra o exemplo abaixo: $ printenv Página 10 Aprendendo Shell Script $ env Algumas variáveis do sistema SHELL - Exibe o nome do shell HOME - Exibe o diretório home do usuário USER ou USERNAME - Exibe o nome do usuário LOGNAME - Exibe o login do usuário LANG - Exibe o idioma do sistema OSTYPE - Exibe a arquitetura do sistema Você também pode exibir qualquer variável ambiente do sistema com o comando echo como mostra o exemplo abaixo: echo $HOME echo $PATH Obs: Nunca esqueça que variáveis do sistema tem que ter seus caracteres em maiúsculo. Página 11 Aprendendo Shell Script Variáveis definidas pelo usuário O nome de variáveis podem começar com uma letra do alfabeto (a, b, c, …) ou com underline_, sendo que o shell é sensitive case, ou seja, diferencia minúsculo de maiúsculo, portanto A é diferente de a. Para exibir o valor de uma variável através do comando echo é necessário especificar o sinal de dólar $ antes do nome da variável ($a). Outro detalhe é que não é permitido espaços em branco (a =10 ou a= 10 ou a = 10) ou iniciar uma variável com um valor numérico (1a=10) , abaixo seguem exemplos de variáveis O bash reconhece uma variável quando ela começa com $, ou seja, a diferença entre ‘palavra’ e ‘$palavra’ é que a primeira é uma palavra qualquer, e a outra uma variável. Para definir uma variável, utilizamos a seguinte sintaxe: $ variavel=valor_da_variavel O ‘valor’ será atribuído a ‘variável ‘. Valor pode ser uma frase, números, e até outras variáveis e comandos. O valor pode ser expressado entre as aspas (“”), apóstrofos (”) ou crases (“). As aspas vão interpretar as variáveis que estiverem dentro do valor, os apóstrofos lerão o valor literalmente, sem interpretar nada, e as crases vão interpretar um comando e retornar a sua saída para a variável. OBS: \(barra) invertida com a variável ao seu lado(\$A), retorna o próprio nome da variável no momento da execução do script como mostra o script abaixo: Página 12 Aprendendo Shell Script Exemplo de código com variável de ambiente: #!/bin/bash variavel="Eu estou logado como usuário $user" echo $variavel variavel="Meu diretório atual é o `pwd`" echo $variavel Se você quiser criar um script em que o usuário deve interagir com ele, é possível que você queira que o próprio usuário defina uma variável, e para isso usamos o comando read, que dará uma pausa no script e ficarará esperando o usuário digitar algum valor e teclar enter como mostra o exemplo: #!/bin/bash echo “Qual seu o dia do aniversário?” read RESPOSTA echo “Você faz aniversário no dia” echo $RESPOSTA Variáveis especiais $0 – Exibe o nome do programa ou script que está sendo executado $? – Exibe o estado de saída do último comando executado $$ – Exibe o número do processo do script que está sendo executado $# – Exibe o número de parâmetros fornecido para um comando $! – Exibe o número do último processo que está sendo executado em background $* – Exibe todos os parâmetros separados por espaços em branco $@ – Idêntico ao anterior ($*) $- – Opções correntes definidas pelo shell Página 13 Aprendendo Shell Script $_ – Armazena o valor do último parâmetro do comando anterior $1 a $9 – Exibe a posição do parâmetro de 1 a 9 echo $PWD – Caminho para a directoria actual. echo $UID - ID do utilizador que iniciou a Shell echo $SHLVL – Numero de sessões Shell abertas. echo $REPLY - Contém o último input recebido pela função read não suportado pelo ?SH? echo $RANDOM – Cria um número aleatório entre 0 e 32767 não suportado pelo ?SH? echo $PATH – Caminhos de pesquisa para comandos das Shell. echo $HOME – Caminho para a HOME do utilizador actual. Exemplos: Manipulação de string com variáveis. É possível fazer também referência a valores de variáveis entre { } para separar a variável e dos caracteres especiais. Veja abaixo: $variavel - Exibe o valor da variável ${variavel} – Idêntico ao anterior ${#variavel} – Exibe o total de caracteres da variável ${variavel:-texto} – Se a variável não for definida retorna o texto ${variavel:posiçãoX} – Retorna o texto a partir da posição (posiçãoX) ${variavel:posiçãoX:quantidadeX} – Retorna a quantidade (quantidadeX) de caracteres a partir da posição (posiçãoX) ${variavel#texto} – Recorta o texto do inicio string ${variavel%texto} – Recorta o texto do fim string ${variavel/texto/novo} – Substitui texto por um texto novo somente uma vez ${variavel//texto/novo} – Substitui texto por um texto novo sempre Página 14 Aprendendo Shell Script Exemplos: Outro Exemplo: Outro Exemplo: Página 15