Baixe o app para aproveitar ainda mais
Prévia do material em texto
Fundamentos em Linux Douglas Rafael Silva 2022 2 Fundamentos em Linux Douglas Rafael Silva © Copyright do Instituto de Gestão e Tecnologia da Informação. Todos os direitos reservados. 3 Sumário Capítulo 1. Um pouco de história, FHS e instalação do sistema .................... 6 1.1 Um pouco de história e distribuições ................................................. 6 1.2 Padrão de hierarquia do sistema de arquivos (FHS) ........................... 8 1.3 Instalação VirtualBox e Putty .............................................................. 9 1.4 Instalação do CentOS 7 ..................................................................... 13 1.5 Instalação de pacotes .rpm ............................................................... 26 1.6 Gerenciador de pacotes “yum” ......................................................... 27 Capítulo 2. Comandos básicos ...................................................................... 29 2.1 Conhecendo o shell e explorando o sistema de arquivos................. 29 2.2 Pedindo ajuda e curingas do shell ..................................................... 30 2.3 Gerenciando arquivos e diretórios .................................................... 32 2.4 Leitor de texto ................................................................................... 33 2.5 Compressão de arquivos ................................................................... 35 2.6 Editor de texto Vi............................................................................... 36 2.7 Variáveis de ambiente ....................................................................... 37 2.8 Tipos de arquivos e Links .................................................................. 39 Capítulo 3. Redirecionamentos e Filtros ...................................................... 41 3.1 Redirecionamentos >, >>, tee e pipe ................................................ 41 3.2 Comandos head, tail e sort ............................................................... 41 4 3.3 Comandos find, locate e xargs .......................................................... 42 3.4 Comandos cut, awk, tr, sed e grep .................................................... 44 Capítulo 4. Shell Script .................................................................................. 46 4.1 Introdução a shell script (aspas, crase e $) ....................................... 46 4.2 Passando parâmetros para o script................................................... 47 4.3 Loop “for” .......................................................................................... 48 4.3.1 Loop “for” (Parte 1) ...................................................................... 48 4.3.2 Loop “for” (Parte 2) ...................................................................... 50 4.4 Condicionais (if, else, elif) e o comando read ................................... 51 4.5 Variável especial $? && e || ............................................................. 52 4.6 Gerando logs ..................................................................................... 54 4.7 Condicional “case” ............................................................................ 54 4.8 Loop com “while” e ‘funções” ........................................................... 55 Capítulo 5. Gerenciamento de processos ..................................................... 57 5.1 PID, processo init e load average ...................................................... 57 5.2 Comandos ps, kill, killall e pkill .......................................................... 58 5.3 Processos em foreground, background e prioridades ...................... 59 Capítulo 6. Comandos básicos de rede ......................................................... 61 6.1 Verificando as interfaces e adicionando IP ....................................... 61 6.2 Rotas .................................................................................................. 62 5 6.3 Fixando as configurações de rede ..................................................... 63 6.4 Resolução de nomes ......................................................................... 64 6.5 Verificando conexões (netstat, telnet e nc) ...................................... 65 Capítulo 7. Gerenciamento de usuários e grupos ........................................ 66 7.1 Gerenciamento de usuários .............................................................. 66 7.2 Gerenciamento de grupos................................................................. 67 Capítulo 8. Permissões de arquivos e diretórios .......................................... 69 8.1 Definindo permissões de arquivos e diretórios ................................ 69 8.2 Alterando os donos de arquivos ....................................................... 70 8.3 Atributos especiais ............................................................................ 70 Referências ........................................................................................................ 73 6 Capítulo 1. Um pouco de história, FHS e instalação do sistema 1.1 Um pouco de história e distribuições Antes do surgimento do Linux, já existiam alguns sistemas operacionais proprietários, como o DOS e o Unix. O Unix nasceu nos anos 60 através de um projeto da Empresa AT&T. Seus principais programadores foram Ken Thompson e Dennis Ritchie (criador da linguagem C). Em meados dos anos 70, o Unix tornou-se um sistema efetivamente disponível no meio acadêmico, o que permitiu a sua evolução e o surgimento de variações. No entanto, na década seguinte, o Unix parou de compartilhar o código fonte com universidades. Então, um professor chamado Andrew S. Tanenbaum, em 1987, decidiu criar um sistema operacional baseado no Unix com um único propósito de ensinar. O sistema foi chamado de Minix. Inspirado no trabalho de Tanenbaum, um estudante universitário finlandês chamado Linus Torvalds desenvolveu um sistema operacional baseado no Minix/Unix em 1991. Linus criou uma interface de linha de comando, uma ferramenta para salvar dados em disco e um compilador para instalar novos programas. A ideia de Linus era criar um sistema operacional e compartilhar o código-fonte do sistema para que outros programadores contribuíssem. O que o Linus Torvalds criou foi o Kernel (núcleo) do Sistema, responsável por realizar a comunicação entre hardware e software. No entanto, a distribuição do sistema completo, com ferramentas e utilitários, deu-se pela junção do Kernel Linux, criado por Linus, com programas desenvolvidos pelo projeto chamado GNU. GNU é a sigla para um nome: "GNU is Not Unix” (GNU Não é Unix). É um projeto que Richard Stallman iniciou em 1984. O projeto GNU já desenvolvia diversos projetos de software livre que rodavam no Unix. A ideia inicial de Richard Stallman era fazer com 7 que o próprio GNU desenvolvesse um núcleo para o sistema operacional, mas não havia uma versão estável até aquele momento. Quando o Linus Torvalds lançou o Linux em 1991, ele foi incorporado aos programas do projeto GNU e distribuído com a licença GPL (GNU General Public License), criada em 1989 com Richard Stallman como principal autor. Diante disso, muitos dizem que o correto seria chamarmos o sistema de GNU/Linux, e não somente Linux. A GPL tem como principal foco o software livre, que consiste em 4 liberdades essenciais: a liberdade de executar o software como quiser para qualquer objetivo, a liberdade de estudar como funciona o software e modificá-lo conforme sua necessidade e a liberdade de redistribuir e distribuir cópias de suas versões modificadas. Devido a essa liberdade, temos tantas versões diferentes do GNU/Linux, que chamamos de distribuições. Distribuições contêmo Kernel mais os aplicativos mantidos por uma empresa ou comunidade. Existem distribuições com foco em atender usuário final, servidores web, executar containers, segurança etc. No entanto, apesar das diferenças entre distribuições para diversos objetivos, possuem características comuns, que mantêm um padrão entre elas. Dessa forma, aprendendo administrar o sistema como um todo, fica mais fácil migrar entre distribuições. O principal projeto para o esforço em manter certos padrões é o Linux Standard Base (LSB). Figura 1 – TUX Fonte: Mascote oficial do kernel Linux – Imagens Google 8 1.2 Padrão de hierarquia do sistema de arquivos (FHS) Os arquivos no Linux são organizados em uma estrutura de diretórios hierárquica, em que cada diretório tem um propósito. O FHS (Filesystem Hierarchy Standard) é o padrão que define o conteúdo desses diretórios. Foram listados abaixo os principais diretórios com seus respectivos objetivos: ▪ / → Raiz de toda a hierarquia do sistema de arquivos. ▪ /boot → Arquivos utilizados para boot do sistema. ▪ /bin → Programas essenciais para todos os usuários. ▪ /sbin → Programas essenciais de root. ▪ /lib → Bibliotecas para programas do /bin/ e /sbin/. ▪ /usr → Programas não essenciais, bibliotecas e documentações. ▪ /usr/bin → Programas não essenciais para todos os usuários. ▪ /usr/sbin → Programas não essenciais de root. ▪ /usr/lib → Bibliotecas para programas do /usr/bin e /usr/sbin. ▪ /dev → Dispositivos (Exemplo: arquivos do tipo bloco – HD’s). ▪ /var → Arquivos variáveis como filas de e-mail e logs. ▪ /home → Diretório padrão dos usuários. ▪ /root → Diretório home do root. ▪ /etc → Arquivos de configuração. 9 ▪ /mnt e /media → Pontos de montagem temporário. ▪ /opt → Programas de terceiros. ▪ /tmp → arquivos temporários. ▪ /proc → informações de processos. ▪ /sys → informações do sistema. 1.3 Instalação VirtualBox e Putty Links das ferramentas utilizadas durante as aulas práticas. VirtualBox: ▪ https://download.virtualbox.org/virtualbox/6.1.12/VirtualBox-6.1.12-139181- Win.exe https://download.virtualbox.org/virtualbox/6.1.12/VirtualBox-6.1.12-139181-Win.exe https://download.virtualbox.org/virtualbox/6.1.12/VirtualBox-6.1.12-139181-Win.exe 10 11 12 13 Putty: ▪ https://the.earth.li/~sgtatham/putty/0.74/w64/putty.exe 1.4 Instalação do CentOS 7 Link para download do CentOS 7, distribuição Linux utilizada nas aulas práticas: ‒ http://centos.itsbrasil.net/7.9.2009/isos/x86_64/CentOS-7-x86_64- Minimal-2009.iso https://the.earth.li/~sgtatham/putty/0.74/w64/putty.exe http://centos.itsbrasil.net/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso http://centos.itsbrasil.net/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso 14 15 16 17 18 19 20 21 Aguarde desaparecer o ícone de exclamação dos itens “Fonte de Instalação” e “Seleção de Software”. 22 23 24 25 26 1.5 Instalação de pacotes .rpm Distribuições baseadas no Red Hat utilizam pacotes do tipo rpm. O comando rpm verifica pacotes instalados no sistema e manipula pacotes com extensão .rpm. A desvantagem de instalar um pacote usando o comando rpm se dá porque ele não resolve dependências, sendo necessário instalar todos os pacotes dependentes antes de instalar o pacote desejado. Principais comandos: Lista pacotes instalados no sistema: ▪ rpm -qa 27 Informações sobre um pacote: ▪ rpm -qi "pacote“ Mostra arquivos referente a um pacote instalado: ▪ rpm -ql "pacote" Informa o pacote que instalou um arquivo: ▪ rpm -qf "caminho do arquivo" Instala pacote rpm (não resolve dependências): ▪ rpm -i "pacote.rpm" ▪ -v → verbose ▪ -r → mostra progresso da instalação Remove pacote: ▪ rpm -evh "pacote" 1.6 Gerenciador de pacotes “yum” O principal gerenciador de pacotes utilizado em distribuições baseadas no Red Hat é o Yum. Ao contrário do comando rpm, o Yum resolve dependências, facilitando a instalação de programas no sistema. Ele consulta repositórios pré-configurados no sistema para localizar os pacotes. Diretório de repositórios: ▪ /etc/yum.repos.d/ 28 Principais comandos: Atualiza todos os pacotes da máquina: ▪ yum update Procura pacotes nos repositórios: ▪ yum search "pacote" Instala pacote: ▪ yum install "pacote“ Parâmetro: ▪ -y → Instala sem pedir confirmação Remove pacote: ▪ yum remove "pacote" 29 Capítulo 2. Comandos básicos 2.1 Conhecendo o shell e explorando o sistema de arquivos O shell é um interpretador de comandos. Ele faz o meio de campo entre o usuário e o sistema, ou seja, é uma interface para o usuário executar programas e interagir com o sistema. Também é um ambiente de programação (shell script) muito utilizado para automatizar tarefas. Em ambientes Desktop, além do shell, existe uma interface gráfica para interação. No entanto, em ambientes corporativos, na maioria dos casos, a única forma de interação com o sistema é através do shell para administração de servidores. Existem alguns tipos de shell, porém o mais utilizado atualmente é o “BASH”. Acessando os diretórios: ▪ Exemplos: ‒ cd /var → usando caminho absoluto ‒ cd log → usando caminho relativo ‒ cd /var/log → caminho absoluto O caminho absoluto sempre vai começar com o “/”. Ou seja, é o caminho completo de um arquivo ou diretório. O caminho relativo depende do diretório atual. Informa o diretório atual: ▪ pwd. ‒ . → representa o diretório atual ‒ .. → representa um diretório anterior 30 Acessando um diretório anterior: cd O diretório /home por padrão armazena os diretórios dos usuários. ▪ Exemplo: /home/douglas ‒ ~ representa o home do usuário. ‒ cd ~/Downloads é igual a cd /home/douglas/Downloads ‒ cd sem informar qualquer diretório retorna para o home do usuário. Listando arquivos: ls ▪ Principais parâmetros do ls: ‒ -l → lista longa, mostra mais informações sobre os arquivos ‒ -t → organiza pela data de modificação ‒ -r → organiza de forma reversa ‒ -d → lista somente o diretório sem o conteúdo do mesmo. ‒ -a → lista arquivos ocultos No Linux, arquivos ocultos são iniciados com “.” 2.2 Pedindo ajuda e curingas do shell Dicas: ▪ Sempre que aprender um novo comando, explore sua documentação utilizando os comandos man e help; ‒ man ls 31 ‒ ls --help ▪ Acostume-se a utilizar atalhos do shell e o Tab para acelerar a digitação dos comandos. ▪ Tab auto completa comandos e caminhos dos arquivos/diretórios. Atalhos mais usados: ▪ Ctrl+L → limpa a tela (igual ao comando clear) ▪ Ctrl+R → realiza busca no histórico de comandos (history) ▪ Ctrl+U → recorta a linha inteira ▪ Ctrl+W → recorta a palavra à esquerda ▪ Ctrl+K → recorta do cursor até o fim da linha ▪ Ctrl+Y → cola o trecho recortado Curingas do shell: ▪ * → qualquer coisa ▪ ? → um caractere qualquer ▪ [ ] → qualquer um dos caracteres listados ou um intervalo ▪ { } → strings específicas separadas por “,” Os curingas do shell podem ser utilizados para qualquer comando. Alguns exemplos usando o ls: 32 ▪ ls -l /dev/sda* ▪ ls -l /dev/sd? ▪ ls -l /dev/sda[13] ▪ ls -l /dev/sd{a,a5} 2.3 Gerenciando arquivos e diretórios Cria diretório: ▪ mkdir [caminho absoluto ou relativo] Cria árvore de diretórios: ▪ mkdir -p /diretorio1/dir2/dir3 ▪ tree /diretorio => visualiza toda a àrvore de diretório Cria um arquivo vazio: ▪ toucharquivo.txt Copia arquivos: ▪ cp [arquivo origem] [destino do arquivo] Parâmetros: ▪ -i → interativo, pede uma confirmação antes de sobrescrever. ▪ -r → cópia recursiva. ▪ -p → preserva atributos (data de modificação, permissões etc.). 33 ▪ -a → cópia recursiva e preserva permissões do arquivo. Move e/ou renomeia arquivos: ▪ mv [arquivo ou diretório de origem] [destino]. ▪ Origem e destino no mesmo diretório o arquivo é renomeado. Parâmetros: ▪ -i → interativo, pede uma confirmação antes de sobrescrever um arquivo. ▪ -f → força sobrescrever o arquivo de destino. Remove arquivos e diretórios: ▪ rm arquivo.txt Parâmetros: ▪ -i → interativo, pede uma confirmação antes de remover. ▪ -f → força remoção do arquivo. ▪ -r → remove diretório de forma recursiva. Remove diretório vazio: ▪ rmdir [diretório] 2.4 Leitor de texto Concatena arquivos e imprime na saída padrão: ▪ cat arquivo1 arquivo2 34 Informando somente um arquivo, é impresso na tela: ▪ cat [arquivo1] Alguns parâmetros: ▪ -n → enumera todas as linhas. ▪ -b → enumera as linhas, exceto linhas em branco (igual o comando nl). Lê um arquivo de texto de forma paginada: ▪ less [arquivo] Opção de busca: ▪ / → realiza buscas dentro do arquivo. ▪ n → mostra a próxima busca encontrada. ▪ N → retorna busca anterior encontrada. ▪ q → para sair. Mostra quantidade de linhas, palavras e bytes de um arquivo: ▪ wc [arquivo] Parâmetro: ▪ -l → quantidade de linhas. ▪ -w → quantidade de palavras. ▪ -c → quantidade de bytes. 35 2.5 Compressão de arquivos Empacota arquivos: ▪ tar cvf arquivo.tar arquivo1 arquivo2 Primeiro o nome do arquivo que será criado e, na sequência, os arquivos a serem empacotados. Mostra os arquivos: ▪ tar tvf arquivo.tar. ▪ c => cria. ▪ t => lista. ▪ v => verbose. ▪ f => define o nome do arquivo. Compactar arquivos com gzip: ▪ gzip arquivo.tar Descompactar arquivo gzip: ▪ gunzip arquivo.tar.gz Ou ▪ gzip -d arquivo.tar.gz Podemos unir o recurso do tar com gzip para compactar e descompactar. Compacta: 36 ▪ tar zcvf arquivo.tar.gz arquivo1 arquivo2 Descompacta: ▪ tar zxvf arquivo.tar.gz (extrai no diretório corrente). ▪ tar zxvf arquivo.tar.gz -C /home ( -C define o diretório de destino). ▪ z → invoca o gzip. ▪ x → extrai. Comandos úteis para ler arquivos compactados sem precisar extrair: “zcat” e “zgrep” 2.6 Editor de texto Vi Acessa um arquivo para edição: ▪ vi [caminho_nome-arquivo]. ▪ i → entra no modo de inserção (“o” modo de inserção na próxima linha). ▪ Esc → entra no modo de navegação. ▪ Esc : → entra no modo de comandos. Alguns comandos: ▪ :w → salva o arquivo ▪ :q → sai do arquivo sem salvar ▪ :wq → sai do arquivo salvando ou :x 37 Mais alguns comandos úteis: ▪ :%s/string_velha/nova_string => substitui string. ▪ :5,10 s/string_velha/nova_string => substitui string. Opções para o modo de navegação: ▪ / → busca (n próxima | N anterior). ▪ gg → move o cursor para primeira linha. ▪ G → move o cursor para última linha. ▪ yy → copia a linha. ▪ cc → recorta a linha. ▪ p → cola a linha. ▪ dd → apaga a linha. ▪ u → desfazer. 2.7 Variáveis de ambiente Assim como qualquer outra linguagem de programação, o shell também se utiliza de variáveis para armazenar dados em memória. Podemos aproveitar essas variáveis do shell ou criar novas para serem utilizadas em um script, por exemplo. Existem as variáveis locais e globais. As locais não são vistas por processos filhos do bash. Lista todas as variáveis: ▪ set 38 Lista somente variáveis globais (exportadas): ▪ env Define uma variável local: ▪ NOMEVAR=Valor Define uma variável global: ▪ NOMEVAR=Valor ▪ export NOMEVAR Ou ▪ export NOMEVAR=Valor Remove variável: ▪ unset NOMEVAR Imprime uma mensagem e/ou valor de uma variável: ▪ echo Fundamentos de Linux - IGTI ▪ echo $ NOMEVAR ▪ echo $HISTFILE O shell possui comandos internos, como, por exemplo, o “echo”, e utiliza a variável de ambiente PATH para localizar o caminho absoluto dos comandos externos. Verifica se um comando é interno do shell ou externo: 39 ▪ type echo Verifica o caminho absoluto de um comando, utiliza a variável PATH: ▪ which cp Mostra informações do sistema: ▪ uname -a 2.8 Tipos de arquivos e Links O comando “file” informa o tipo do arquivo: Comandos de exemplo em arquivos de tipos diferentes: ▪ file / ▪ file /dev/sda ▪ file /etc/passwd Mostra mais detalhes sobre o arquivo: ▪ stat /etc/passwd O Linux não trabalha com conceito de extensão de arquivo. Você pode usar uma extensão para facilitar a identificação do arquivo, mas, para o Linux, não faz nenhuma diferença. Hardlink são arquivos espelhados (mesmo inode), porém independentes. Comando “ln” cria um hardlink: ▪ ln [arquivo] [link] 40 Link simbólico é um atalho. Parâmetro -s cria um link simbólico: ▪ ln -s [arquivo] [link] 41 Capítulo 3. Redirecionamentos e Filtros 3.1 Redirecionamentos >, >>, tee e pipe ▪ > → redireciona a saída de um comando substituindo o conteúdo do arquivo. ▪ >> → redireciona a saída de um comando adicionando o conteúdo ao final do arquivo. ▪ 2> → redireciona a saída de erro de um comando substituindo o conteúdo do arquivo. ▪ 2>> → redireciona a saída de erro de um comando adicionando o conteúdo ao final do arquivo. ▪ 2>&1 → redireciona a saída de erro para a mesma saída padrão. ▪ | → envia a saída de um comando para entrada de outro. Comando “tee” redireciona a saída padrão para um arquivo e imprime na tela: ▪ Exemplo de concatenação de dois arquivos enviando a saída padrão para arquivo3 usando o comando “tee”: ‒ cat arquivo1 arquivo2 | tee arquivo3 3.2 Comandos head, tail e sort Mostra as 10 primeiras linhas de um arquivo: ▪ head [arquivo] Parâmetro: 42 ▪ n → define a quantidade de linhas para mostrar Mostra as 10 últimas linhas de um arquivo: ▪ tail [arquivo] Parâmetro: ▪ n → define a quantidade de linhas para mostrar. ▪ f → fica aguardando novas saídas no arquivo. 3.3 Comandos find, locate e xargs Ordena linhas de um arquivo (padrão ordenar por ordem alfabética): ▪ sort [arquivo] Parâmetro: ▪ -u → remove linhas repetidas (igual ao comando uniq). Verifica o uso de espaço em disco de arquivos e diretórios: ▪ du -sh [arquivo ou diretório] Comando muito útil para identificar diretórios com maior consume de disco: ▪ du -sh /home/* | sort -h Procura arquivos baseados pelo nome: ▪ find /etc -name services ▪ find /etc -name *.conf 43 ▪ find [diretório] [opção] [busca] Procura arquivos baseados pelo tipo: ▪ find /etc -type d (diretório) ▪ find /etc -type l (link simbólico) Procura arquivos baseados pelo tamanho: ▪ find /etc -size +100k -exec => executa uma ação baseado na saída do find: ▪ find /etc -size +100k -exec du -sh {} \; No exemplo acima, após localizar arquivos maiores que 100k, foi executado o comando du -sh em cada saída do find. Faz busca por arquivos baseado no nome: ▪ locate arquivo.txt (precisa do pacote mlocate). ▪ updatedb (antes de realizar a busca, execute o comando updatedb para atualizar a base de dados que o locate consulta). ▪ whereis cp (procura baseado no primeiro nome). xargs → executa comandos baseados na saída padrão: ▪ find /etc -size +100k | xargs ls -l ▪ mkdir ~/backup ; find /etc -size +100k | xargs -i cp {} ~/backup 44 3.4 Comandos cut, awk, tr, sed e grep Corta partes de um texto: cut -c1,2 /etc/passwd (c = caracter) cut -c1-5 /etc/passwd cut -d: -f1 /etc/passwd (d = delimitador e f = campo (field) ) cut -d: -f1,2 --output-delimiter="|" /etc/passwd awk '{print$1}' /etc/services awk -F: '{print$1" | " $6}' /etc/passwd ls /etc/*.conf | head -n3 | awk '{print "echo 3 primeiros arquivos encontrados: " $1}' Troca caracteres ou deleta: ▪ cat /etc/passwd | tr [:lower:] [:upper:] ▪ cat /etc/passwd | tr -d [:space:] Realiza filtros e transformações em arquivos: ▪ sed -i s/velho/novo/ arquivo.txt => substitui string “velho” para “novo”. ▪ sed -n 5p arquivo.txt => imprime a linha 5 de um arquivo. ▪ sed -n 50,70p arquivo.txt => Imprime um bloco, linha 50 a 70. ▪ sed /string/d arquivo.txt => Deleta a linha que contém uma string específica. Mostra linhas filtradas por um padrão: ▪ grep root /etc/passwd 45 Parâmetros: ▪ -i → desconsidera o case sensitive. ▪ -r → busca de forma recursiva. ▪ -w → resultado somente com a palavra completa. ▪ -v → resultado exceto o que encontrar. O grep e o sed são comandos que aceitam expressões regulares. Um exemplo do grep para remover linhas em branco (quebra de linha) e comentadas: ▪ grep -v -E ‘^#|^$’ /etc/services → grep -E = egrep 46 Capítulo 4. Shell Script 4.1 Introdução a shell script (aspas, crase e $) Por convenção shell, scripts são nomeados com .sh. Exemplo: ▪ script.sh A primeira linha do arquivo deve conter um shebang “#!” seguido do interpretador de comandos que será utilizado no script: Exemplo: ▪ #!/bin/bash ▪ ; → utilizado para executar comandos sequenciais. ▪ ` ` e $() → comandos dentro de crase e $() são executados e retornam a saída do comando. A saída de um comando pode ser armazenada em uma variável. Exemplo: USUARIOS=$(ls /home) ; echo $USUARIOS ▪ \ → protege o caractere seguinte. Exemplos: ▪ echo * ▪ echo \* Diferença entre aspas simples e duplas: 47 ▪ echo “$PATH” ▪ echo ‘PATH’ ▪ echo “`pwd`” ▪ echo ‘`pwd`’ Aspas duplas protege os caracteres: $ ` 4.2 Passando parâmetros para o script Passando parâmetros para o script: O script interpreta parâmetros como $ mais um número de acordo com a sequência passada. Exemplo: Ao executar o script: ~/script.sh /backup/logs 7 ▪ $1 = /backup/logs ▪ $2 = 7 Uma forma debugar o que está sendo feito em um script é executá-lo usando o parâmetro -x do bash. ▪ bash -x script.sh → debug Script de exemplo utilizando passagem de parâmetros: 48 #!/bin/bash DIRETORIO=$1 DIAS_RETENCAO=$2 echo Realizando limpeza dos logs do diretório: $DIRETORIO echo Deletando Logs dos últimos $DIAS_RETENCAO dias. find $DIRETORIO -mtime +7 -exec rm {} \; Execução: ▪ ./script.sh /backup/logs 7 4.3 Loop “for” 4.3.1 Loop “for” (Parte 1) O “for” é utilizado para executar tarefas repetitivas (loop). Sintaxe: for VARIAVEL in LISTA → pode ser saída de um comando ` ` ou $() do “comandos” done For é muito útil no dia a dia, não somente dentro de um script. Exemplo: for servers in `cat servidores` ; do echo $servers ; curl https://servers:443 ; echo ; done 49 Para cada servidor listado no arquivo “servidores”, será armazenado o valor de cada um na variável “servers”, e, em seguida, serão executados os comandos que estiverem dentro de “do” e “done”. Nesse caso: echo $servers ; curl https://servers:443 ; echo Se, dentro do arquivo servidores, estiver: ▪ servidor1 ▪ servidor2 Será executado: echo servidor1 ; curl https:// servidor1:443 ; echo echo servidor2; curl https:// servidor2:443 ; echo Script de exemplo: #!/bin/bash for LISTA_USUARIOS in $(cat /etc/passwd | tr -d [:blank:]) do echo $LISTA_USUARIOS USUARIO=$(echo $LISTA_USUARIOS | cut -d: -f1) HOME_USUARIO=$(echo "$LISTA_USUARIOS" | cut -d: -f6) SHELL_USUARIO=$(echo "$LISTA_USUARIOS" | cut -d: -f7) echo echo -e "\n ===== $USUARIO ===== " echo "HOME: $HOME_USUARIO" echo "SHELL: $SHELL_USUARIO" echo " ==================== " done 50 4.3.2 Loop “for” (Parte 2) O comando “seq” é útil para definir uma quantidade exata de loops para qualquer fim. Exemplo: #!/bin/bash for num in `seq 10` do echo echo "Realizando teste de conexao... Tentativa $num" sleep 3 done For dentro de For: #!/bin/bash for EMP in `cat empresas` ; do for DEP in `cat departamento` ; do mkdir -p ~/backups/$EMP/$DEP done done Para cada linha dentro do arquivo empresas, o valor é armazenado na variável EMP e será executado o segundo “for”, lendo o arquivo departamento e armazenando cada linha na variável DEP. Exemplo: Arquivo empresas 51 Empresa1 Empresa2 Arquivo departamento Juridico Financeiro TI Será executado: mkdir -p ~/backups/Empresa1/Juridico mkdir -p ~/backups/Empresa1/ Financeiro mkdir -p ~/backups/Empresa1/TI mkdir -p ~/backups/Empresa2/Juridico mkdir -p ~/backups/Empresa2/ Financeiro mkdir -p ~/backups/Empresa2/TI 4.4 Condicionais (if, else, elif) e o comando read Condicionais (if, else, elif) e o comando read O comando read aguarda a entrada de dados do usuário e armazena os dados em uma variável. As condicionais if (se), else (senão) e elif (senão se) são utilizadas para tomada de decisão baseado se a condição testada for verdadeira. Script de exemplo usando read e uma estrutura de if, else e elif: #!/bin/bash echo "Verifica se um usuário existe" read -p "Informe o nome do usuário: " usuario 52 USUARIO=$(cut –d: -f1 /etc/passwd | grep -i $usuario) HOME=“/home/$(echo $usuário | tr [:upper:] [:lower:])” if [[ -n $USUARIO ]] then echo "Usuario $usuario existe!" elif [[ -d $HOME ]] then echo "Usuario nao existe mas possue um home" echo "Deletando o diretorio home..." ; sleep 2 rm -riv $HOME else echo "Usuario $usuario NAO existe!" fi 4.5 Variável especial $? && e || Variável especial $? A variável $? armazena o código de saída do último comando executado. Alguns exemplos de código de saída: ▪ 0 - executado com sucesso ▪ 1 - erros comuns ▪ 127 - comando não encontrado Sempre que o último comando tiver sucesso na execução a saída será “0”. Portanto, a variável $? é utilizada para realizar validações no script, usando a condicional if. 53 Se a saída do último comando for 0, significa que foi executado com sucesso; caso contrário, ocorreu alguma falha. echo "Criando um diretório..." ; echo read -p "Informe um caminho absoluto: " DIR echo "Criando o diretório $DIR..." ; sleep 2 mkdir $DIR if [[ $? -eq 0 ]] then echo "Diretório criado com sucesso" else echo "Falha ao criar o diretório" fi Outra maneira de checar o código de retorno do último comando e executar uma ação é utilizando && e ||: ▪ && → Somente executa o segundo comando se o primeiro foi executado com sucesso. || → Somente executa o segundo comando se o primeiro não foi executado com sucesso. #!/bin/bash echo "Criando um diretório..." ; echo read -p "Informe um caminho absoluto: " DIR echo "Criando o diretório $DIR..." ; sleep 2 mkdir $DIR && echo "Diretório criado com sucesso" || echo "Falha ao criar o diretório" 54 4.6 Gerando logs É muito importante gerar logs em todo programa, e, com o shell script, não é diferente. Para isso, basta utilizar os redirecionadores, > e >> para saída padrão e 2> e 2>> para saídas de erros. #!/bin/bash echo "======= `date "+%d/%m/%Y %H:%M"` ======" >> log.info echo "Criando um diretório..." ; echo read -p "Informe um caminho absoluto: " DIR echo "Criando o diretório $DIR..." >> log.info ; sleep 2 mkdir $DIR 2>> log.info if [[ $? -eq 0 ]] ; then echo "Diretório $DIR criado com sucesso" >> log.info fi echo ============================= >> log.info 4.7 Condicional “case” Uma outra forma de construir uma estrutura condicional é utilizando a estrutura do case. Cada opção passada é como se fosse if, elif e, por último, o asterisco (*) representa o senão. #!/bin/bash read -p "Informeo nome do usuario: " usuario echo "Consultando a base de usuários..." cut -d: -f1 /etc/passwd | grep -i $usuario if [[ $? -ne 0 ]] ; then echo "usuario $usuario nao existe" fi read -p "Deseja realizar uma nova busca? [ s/n ]" opcao case $opcao in s) $0 ;; 55 n) echo “Saindo…” ; exit ;; *) echo “opcao invalida” ;; esac 4.8 Loop com “while” e ‘funções” O while (enquanto) é uma outra maneira de realizar loops, assim como o “for”. Porém, o while é usado nos casos em que a quantidade de repetições (loop) depende de uma ação do usuário ou do retorno de um comando, por exemplo. While é a junção do if com o for: é feita uma verificação antes de realizar um comando, e esse comando é repetido enquanto a verificação for verdadeira. #!/bin/bash echo “Procura arquivos .conf..." if [[ -z $1 ]] ; then while [[ -z $diretorio ]] ; do read -p "Parametro nao informado. Informe um diretorio para consulta: " diretorio find $diretorio -iname "*.conf" done else find $1 -iname "*.conf" fi As funções são utilizadas para simplificar um programa, pois evitam repetições do código. Uma função é escrita uma vez e sempre que for necessário executar uma sequência de comandos específica, basta chamar a função para ser executada. Função Sintaxe: 56 function NOME_FUNCAO () { comandos } NOME_FUNCAO () { comandos } busca_conf () { find $1 -iname "*.conf" } if [[ -z $1 ]] ; then while [[ -z $diretorio ]] ; do read -p "Parametro nao informado. Informe um diretorio para consulta: " diretorio busca_conf $diretorio done else busca_conf $1 fi 57 Capítulo 5. Gerenciamento de processos 5.1 PID, processo init e load average Todos os processos do sistema possuem um identificador único => PID e possuem um processo pai => PPID. O primeiro processo executado no sistema, e pai de todos os outros, é o processo init (systemd) de PID = 1. Lista processos em forma de árvore: pstree ▪ -p → mostra ID do processo. Monitora todos os processos do sistema: top. Opção útil: ▪ 1 → mostra o consumo de cada processador. ▪ q → para sair. Load average valor normal é relativo para cada máquina. Mostra 1, 5 e 15 últimos minutos. ▪ Shift+M => ordena por consumo de memória. ▪ Shift+C => ordena por consumo de cpu. Mostra o tempo que o servidor está ligado → uptime. Mostra o uso de memória → free -m. Busca processo por nome: 58 ▪ pidof “nome exato do processo” ▪ pgrep “parte do nome do processo” 5.2 Comandos ps, kill, killall e pkill Processos em execução do usuário no terminal corrente: ps. ▪ -u → mostra mais informações relacionadas a usuário. ▪ -x → mostra processos que não foram iniciados diretamente em seu terminal. ▪ -a → mostra os processos de todos os usuários. Envia sinais para processos: kill. ▪ kill -l → lista todos os sinais. Quando executamos Crtl+C estamos enviando o sinal 2) SIGINT (interrupção). ▪ 15) SIGTERM => termina processo. ▪ 9) SIGKILL => termina processo de forma abrupta. Duas maneiras de enviar sinais para os processos: ▪ kill -s SIGTERM “PID_PROCESSO” ▪ kill -15 “PID_PROCESSO” Mata processo por nome: ▪ killall “nome exato do processo” ▪ pkill “parte do nome do processo” 59 5.3 Processos em foreground, background e prioridades Foreground (fg) e Background (bg): ▪ fg → prende o terminal. ▪ bg → libera o terminal para execução de comandos. Lista jobs com seu id (processos em Background): jobs. Executa um comando enviando para background: ▪ [ Comando ] & Retorna um comando para Foreground: ▪ fg “id do job” ▪ Crtl+Z => envia um sinal de stop para o processo. Envia processos nos jobs para background: ▪ bg "id do job“ Mata o processo pelo id do job: ▪ kill %"id do job" Prioridades dos processos: ▪ PR → Prioridade ( 0 até 39 ) ▪ NI → Nice ( -20 até +19 ) ▪ nice -n -20 “comando" 60 ▪ nice -n 15 “comando“ ▪ renice -n -8 “pid" ▪ renice -n 8 “pid" 61 Capítulo 6. Comandos básicos de rede 6.1 Verificando as interfaces e adicionando IP Pacotes para gerenciamento de rede: ▪ net-tools (descontinuado): Comandos → ifconfig e route ▪ iproute: Comando → ip Lista as interfaces: ▪ ip address show ▪ ifconfig Baixa interfaces: ▪ ip link set "interface" down ▪ ifconfig "interface" down Sobe interfaces: ▪ ip link set "interface" up ▪ ifconfig "interface" up Define um IP: ▪ ip addr add "IP/MASK" dev "interface" 62 ▪ ifconfig "interface" "IP" netmask "mascara“ Deleta um IP de uma interface: ▪ ip addr del "IP/MASK" dev "interface“ ▪ ifconfig "interface" delete "IP" Define novos IP's em uma interface: ▪ ip addr add "IP/MASK" dev "interface" ▪ ifconfig "interface":"num" "IP" netmask "mascara" 6.2 Rotas Lista as rotas: ▪ ip route show ▪ route Deleta rota default: ▪ ip route del default ▪ route del default Cria rota default: ▪ ip route add default via "IP“ ▪ route add default gw "IP" Adiciona rota: 63 ▪ ip route add "rede/mask" via "IP" dev "interface“ ▪ route add -net "REDE" gw "IP" Deleta rota: ▪ ip route del "rede/mask" via "IP" dev "interface“ ▪ route del -net "REDE" gw "IP" 6.3 Fixando as configurações de rede Configurando IP e Máscara: ▪ /etc/sysconfig/network-scripts/ifcfg-xxx ▪ IPADDR=192.168.1.10 ▪ NETMASK=255.255.255.0 Reinicia as interfaces de rede: ▪ systemctl restart network Fixar rota default: ▪ /etc/sysconfig/network ▪ GATEWAY=192.168.1.1 Fixar rota: ▪ /etc/sysconfig/network-scripts/route-xxx ▪ 192.168.2.0/24 via 192.168.2.1 dev enp0xx 64 6.4 Resolução de nomes Configuração dos servidores de DNS: ▪ /etc/resolv.conf ▪ nameserver => aponta o servidor de DNS Resolução de Nomes: ▪ /etc/hosts ▪ Apontamento de IP -> nome (por padrão, é consultado antes do DNS) Precedência da resolução de nomes é configurada no arquivo: ▪ /etc/nsswitch.conf Comandos úteis: pacote bind-utils. Resolução de nomes e dns reverso: ▪ host [endereco] ▪ dig [endereco] ▪ nslookup [endereco] Verifica conectividade: ▪ ping [endereco] ▪ -c => define a quantidade de pacotes 65 6.5 Verificando conexões (netstat, telnet e nc) Conexões – netstat, telnet e nc. Mostra conexões ativas: ▪ netstat Parâmetros: ▪ -n → não resolve nome ▪ -a → todas as conexões (all) ▪ -t → tcp ▪ -u → udp ▪ -p → pid do processo Testa conexões: ▪ telnet [endereco] ▪ nc –v [endereco] Abre uma porta no servidor (útil para testar conectividade com alguma porta): ▪ nc -l -p “Porta” 66 Capítulo 7. Gerenciamento de usuários e grupos 7.1 Gerenciamento de usuários Usuários são armazenados no arquivo /etc/passwd. 7 campos separados por “:”. ▪ Nome: Senha: UID: GID: Descrição: Home: Shell O Campo “Senha” com x indica que as senhas estão armazenadas no arquivo: /etc/shadow. Criar usuário: ▪ useradd "nome do usuario" Opções: ▪ -s → shell ▪ -c → comentário ▪ -m → solicita a criação de um home ▪ -d → home ▪ -g → grupo primário ▪ -G → grupo secundário Definir senha do usuário: ▪ passwd "usuario" 67 Remove usuário: ▪ userdel "nome do usuario" Opção: ▪ -r → remove o home do usuário Modifica usuário: ▪ usermod "opcoes" "nome do usuario“ (Mesmas opções do useradd). 7.2 Gerenciamento de grupos Grupos são armazenados no arquivo /etc/group. 4 campos separados por “:”. ▪ Grupo: Senha: ID: Usuários O Campo “Senha” com x indica que as senhas estão armazenadas no arquivo: /etc/gshadow. Criar grupo: ▪ groupadd "nome grupo" Altera o grupo primário de um usuário: ▪ usermod -g "grupo" "usuario" Altera o grupo secundário de um usuário: ▪ usermod -G "grupo" "usuario" Adiciona usuário em um grupo: 68▪ usermod -a -G "grupo" "usuario" Mostra o UID e todos GID que usuário pertence: ▪ id "usuario" Mostra os grupos de um usuário: ▪ groups "usuario" ▪ getent pode ser usado para consultar /etc/passwd e /etc/group ▪ getent passwd "usuario" ▪ getent group "grupo" 69 Capítulo 8. Permissões de arquivos e diretórios 8.1 Definindo permissões de arquivos e diretórios - r w - r - - r - - root root Usuário Dono → Grupo Dono → Outros O primeiro caractere representa o tipo do arquivo e os demais conforme as cores. ▪ r = leitura (read) ▪ w = escrita (write) ▪ x = execução (execute) ▪ Arquivo → ler (r), escrever (w) e executar (x) ▪ Diretório → listar (r) criar e remover (w) e acessar (x) ▪ u → usuário g → grupo o → outros a → todos ▪ = -> define ▪ + -> adiciona ▪ - -> remove Modificar permissões: ▪ chmod u=rw,g=rw,o=r arquivo.txt ▪ chmod a=rw arquivo.txt 70 ▪ r = leitura (read) → 4 ▪ w = escrita (write) → 2 ▪ x = execução (execute) → 1 Modificar permissões de forma octal: ▪ chmod 644 arquivo.txt Parâmetro: ▪ -R => define permissões de forma recursiva ▪ Comando stat mostra as permissões das duas formas 8.2 Alterando os donos de arquivos Alterar usuário e grupo dono: ▪ chown usuário “arquivo ou diretório”. ▪ chown usuário:grupo “arquivo ou diretório”. ▪ chown :grupo “arquivo ou diretório”. ▪ chgrp grupo “arquivo ou diretório”. ▪ -R → altera de forma recursiva. 8.3 Atributos especiais Atributos especiais: ▪ SUID → utiliza a permissão do usuário dono. 71 ▪ SGID → cria arquivos e diretórios herdando o mesmo grupo dono. ▪ Stick → somente quem criou um arquivo no diretório consegue apagar e renomear. r w s r – x r – x root root /bin/passwd S – sem permissão de execução s – com permissão de execução T – sem permissão de execução t – com permissão de execução Adicionar os atributos especiais: chmod u+s “arquivo” chmod g+s “arquivo” chmod o+t “arquivo” SUID → 4 SGID → 2 Stick → 1 chmod 4644 “arquivo” umask → máscara usada para definir permissões de novos arquivos e diretórios umask 0022 72 0777 - 0022 -------- 0755 → Diretório 0644 → Arquivo 73 Referências SIQUEIRA, Luciano. Certificações LPI-1 101 102 Linux. 6. ed. [S. l.]: Alta Books, 2019. GUIA FOCA LINUX. Guia Foca Online Iniciantes. Página inicial. Disponível em: https://www.guiafoca.org/. Acesso em: 03 jan. 2022. https://www.guiafoca.org/
Compartilhar