Aprender Linux é uma das habilidades mais valiosas na indústria tecnológica. Ele pode ajudá-lo a concluir tarefas mais rápido e de forma mais eficiente. Muitos dos servidores poderosos e supercomputadores do mundo funcionam com Linux.

Enquanto o capacita em seu papel atual, aprender Linux também pode ajudá-lo a mudar para outras carreiras tecnológicas como DevOps, Cibersegurança e Computação em Nuvem.

Neste manual, você vai aprender os fundamentos da linha de comando do Linux, e depois passar para tópicos avançados como scripting de shell e administração de sistemas. Se você for novo em Linux ou tiver usado por anos, este livro tem algo para você.

Aviso Importante: Todos os exemplos neste livro são demonstrados em Ubuntu 22.04.2 LTS (Jammy Jellyfish). A maioria das ferramentas de linha de comando é mais ou menos a mesma em outras distribuições. No entanto, algumas aplicações de UI e comandos podem ser diferentes se você estiver trabalhando em outra distribuição Linux.

Sumário

Parte 1: Introdução ao Linux

1.1. Começando com o Linux

O que é o Linux?

Linux é um sistema operacional de código aberto baseado no sistema operacional Unix. Foi criado por Linus Torvalds em 1991.

Sistema operacional de código aberto significa que o código fonte do sistema operacional está disponível ao público. Isso permite que qualquer pessoa modifique o código original, personalize-o, e distribua o novo sistema operacional aos usuários potenciais.

Por que você deveria aprender sobre Linux?

No cenário atual de centros de dados, Linux e o Microsoft Windows são os principais concorrentes, com Linux detendo uma grande parte.

Aqui estão algumas razões convincentes para aprender Linux:

  • Dada a prevalência do Linux em hospedagem, existe uma grande chance de sua aplicação ser hospedada no Linux. Portanto, aprender Linux como desenvolvedor torna-se cada vez mais valioso.

  • Com a computação em nuvem se tornando a norma, as chances são altas que suas instâncias em nuvem dependam de Linux.

  • Linux serve de base para muitos sistemas operacionais para a Internet das Coisas (IoT) e aplicações móveis.

  • No IT, existem muitas oportunidades para aqueles habilitados com Linux.

O que significa que Linux é um sistema operacional de código aberto?

O que é código aberto? Software de código aberto é software cujo código-fonte é acessível livremente, permitindo que qualquer pessoa o utilize, modifique e distribua.

Sempre que um código-fonte é criado, ele é automaticamente considerado protegido por direitos autorais, e sua distribuição é governada pelo detentor dos direitos autorais por meio de licenças de software.

Em contraste com o código aberto, software proprietário ou de código fechado restringe o acesso ao seu código-fonte. Somente os criadores podem visualizar, modificar ou distribuí-lo.

O Linux é primordialmente de código aberto, o que significa que seu código-fonte é livremente disponível. Qualquer pessoa pode visualizar, modificar e distribuí-lo. Desenvolvedores de qualquer lugar do mundo podem contribuir para sua melhoria. Isso estabelece a base da colaboração, que é um aspecto importante do software de código aberto.

Esta abordagem colaborativa levou à adoção generalizada do Linux em servidores, desktops, sistemas embarcados e dispositivos móveis.

O aspecto mais interessante do Linux ser de código aberto é que qualquer pessoa pode adaptar o sistema operacional de acordo com suas necessidades específicas sem ser restrito por limitações proprietárias.

O Chrome OS usado por Chromebooks é baseado no Linux. O Android, que fornece energia a muitos smartphones globalmente, também é baseado no Linux.

O que é um Núcleo Linux?

O núcleo é o componente central de um sistema operacional que gerencia o computador e suas operações de hardware. Ele lida com operações de memória e tempo da CPU.

O núcleo atua como uma ponte entre os aplicativos e o processamento de dados a nível de hardware usando comunicação entre processos e chamadas de sistema.

O kernel é carregado na memória primeiro quando um sistema operacional é iniciado e permanece lá até que o sistema é desligado. Ele é responsável por tarefas como gerenciamento de disco, gerenciamento de tarefas e gerenciamento de memória.

Se você está curioso sobre o que o kernel do Linux se parece, aqui está o link do GitHub.

O que é uma distribuição Linux?

Até este ponto, você sabe que pode reutilizar o código do kernel Linux, modificá-lo e criar um novo kernel. Você pode ainda combinar diferentes utilidades e software para criar um sistema operacional completamente novo.

Uma distribuição Linux, ou distro, é uma versão do sistema operacional Linux que inclui o kernel Linux, ferramentas de sistema e outro software. sendo open source, uma distribuição Linux é um esforço colaborativo envolvendo várias comunidades de desenvolvimento independentes de código aberto.

O que significa que uma distribuição é derivada? Quando você diz que uma distribuição é ” derivada ” de outra, a nova distro é construída sobre a base ou fundamento da distro original. Essa derivação pode incluir o uso do mesmo sistema de gerenciamento de pacotes ( mais sobre isso mais tarde ), versão do kernel e, às vezes, as mesmas ferramentas de configuração.

Atualmente, existem milhares de distribuições Linux para escolher, oferecendo diferentes objetivos e critérios para seleção e suporte ao software fornecido por suas distribuições.

As distribuições variam de uma à outra, mas elas geralmente têm várias características comuns:

  • Uma distribuição consiste em um kernel Linux.

  • Ela suporta programas no espaço de usuário.

  • Uma distribuição pode ser pequena e de propósito único ou incluir milhares de programas de código aberto.

  • Deve ser fornecida alguma maneira de instalar e atualizar a distribuição e seus componentes.

Se você olhar para a Linha do Tempo das Distribuições Linux, você verá duas distribuições principais: Slackware e Debian. Várias distribuições são derivadas delas. Por exemplo, Ubuntu e Kali são derivadas de Debian.

Quais são as vantagens da derivação? Existem várias vantagens de derivação. As distribuições derivadas podem aproveitar a estabilidade, segurança e os grandes repositórios de software da distribuição mãe.

Ao construir sobre uma estrutura existente, os desenvolvedores podem concentrar inteiramente seu foco e esforço nas funcionalidades especializadas da nova distribuição. Os usuários das distribuições derivadas podem beneficiar da documentação, suporte comunitário e recursos já disponíveis para a distribuição mãe.

Algumas distribuições Linux populares são:

  1. Ubuntu: Uma das distribuições Linux mais amplamente utilizadas e populares. É amigável para o usuário e recomendado para iniciantes. Saiba mais sobre o Ubuntu aqui.

  2. Linux Mint: Baseado no Ubuntu, o Linux Mint oferece uma experiência amigável ao usuário com foco em suporte multimídia. Saiba mais sobre o Linux Mint aqui.

  3. Arch Linux: Popular entre usuários experientes, o Arch é uma distribuição leve e flexível destinada a usuários que preferem uma abordagem de faça você mesmo. Saiba mais sobre o Arch Linux aqui.

  4. Manjaro: Baseado no Arch Linux, o Manjaro oferece uma experiência amigável ao usuário com software pré-instalado e ferramentas fáceis de gerenciamento do sistema. Saiba mais sobre o Manjaro aqui.

  5. Kali Linux: O Kali Linux oferece um conjunto abrangente de ferramentas de segurança e é principalmente focado em cibersegurança e hacking. Saiba mais sobre o Kali Linux aqui.

Como instalar e acessar o Linux

A melhor maneira de aprender é aplicar os conceitos conforme você avança. Nesta seção, aprenderemos como instalar o Linux em sua máquina para que você possa acompanhar. Você também aprenderá como acessar o Linux em uma máquina com Windows.

Recomendo que você siga um dos métodos mencionados nesta seção para obter acesso ao Linux e poder acompanhar.

Instale o Linux como o sistema operacional principal

Instalar o Linux como o sistema operacional principal é a maneira mais eficiente de usar o Linux, pois você pode usar todo o poder de sua máquina.

Nesta seção, você aprenderá como instalar o Ubuntu, que é uma das distribuições Linux mais populares. Eu deixei de fora outras distribuições por enquanto, pois quero manter as coisas simples. Você sempre pode explorar outras distribuições quando estiver familiarizado com o Ubuntu.

  • Passo 1 – Baixe o arquivo iso do Ubuntu: Acesse o site oficial aqui e baixe o arquivo iso. Certifique-se de selecionar uma versão estável que seja rotulada como “LTS”. LTS significa Suporte de Longo Prazo, o que significa que você pode obter atualizações gratuitas de segurança e manutenção por um longo período de tempo (geralmente 5 anos).

  • Passo 2 – Crie um pendrive inicializável: Existem vários softwares que podem criar um pendrive inicializável. Eu recomendo usar o Rufus, pois é bastante fácil de usar. Você pode baixá-lo aqui.

  • Passo 3 – Inicie pelo pendrive: Uma vez que seu pendrive bootável estiver pronto, insira-o e inicie pelo pendrive. O menu de boot depende do seu laptop. Você pode pesquisar o menu de boot para o modelo do seu laptop no Google.
  • Passo 4 – Siga as instruções. Assim que o processo de boot começar, selecione tente ou instale o ubuntu.

    O processo levará algum tempo. Assim que a GUI aparecer, você pode selecionar o idioma e o layout do teclado e continuar. Insira seu login e nome. Lembre-se das credenciais, pois você precisará delas para fazer login em seu sistema e acessar privilégios completos. Aguarde a conclusão da instalação.

  • Passo 5 – Reinicie: Clique em reiniciar agora e remova o pendrive.

  • Passo 6 – Login: Acesse com as credenciais que você digitou anteriormente.

E pronto! Agora você pode instalar aplicativos e personalizar sua área de trabalho.

Para instalação avançada, você pode explorar os seguintes tópicos:

  • Particionamento do disco.

  • Configurar memória de troca para ativar a hibernação.

Acessando o terminal

Uma parte importante deste manual é aprender sobre o terminal onde você executará todos os comandos e verá a magia acontecer. Você pode procurar o terminal pressionando a tecla “windows” e digitando “terminal”. Você pode fixar o Terminal na doca onde outros aplicativos estão localizados para acesso fácil.

💡 A tecla de atalho para abrir o terminal é ctrl+alt+t

Você também pode abrir o terminal de dentro de uma pasta. Clique com o botão direito onde você está e clique em “Abrir no Terminal”. Isso abrirá o terminal no mesmo caminho.

Como usar o Linux em uma máquina Windows

Às vezes, você pode precisar executar o Linux e o Windows lado a lado. Felizmente, existem algumas formas de você obter o melhor dos dois mundos sem precisar de diferentes computadores para cada sistema operacional.

Nesta seção, você explorará algumas formas de usar o Linux em uma máquina Windows. Alguns deles são baseados no navegador ou na nuvem e não precisam de instalação de SO antes de usá-los.

Opção 1: “Dual-boot” Linux + Windows Com o modo de boot dual, você pode instalar o Linux ao lado do Windows no seu computador, permitindo que você escolha qual sistema operacional usar ao iniciar.

Isso exige que você partitione seu disco rígido e instale o Linux em uma partição separada. Com este método, você só pode usar um sistema operacional de cada vez.

Opção 2: Usar o Windows Subsystem for Linux (WSL) O Windows Subsystem for Linux fornece uma camada de compatibilidade que permite que você execute nativamente arquivos executáveis de Linux no Windows.

Usar o WSL tem algumas vantagens. A configuração do WSL é simples e não é tempo-consumindo. É leve em comparação com as VMs onde você tem que alocar recursos da máquina anfitriã. Você não precisa instalar nenhum ISO ou imagem de disco virtual para as máquinas Linux, que tendem a ser arquivos pesados. Você pode usar o Windows e o Linux lado a lado.

Como instalar o WSL2

Primeiro, habilite a opção Windows Subsystem for Linux nas configurações.

  • Vá para o Início. Procure por “Ativar ou desativar funcionalidades do Windows.”

  • Marque a opção “Windows Subsystem for Linux” se não estiver marcada.

  • Agora, abra seu prompt de comando e forneça os comandos de instalação.

  • Abra o Prompt de Comando como administrador:

  • Execute o comando abaixo:

wsl --install

Este é o resultado:

Nota: Por padrão, o Ubuntu será instalado.

  • Assim que a instalação estiver completa, será necessário reiniciar sua máquina com Windows. Portanto, reinicie sua máquina com Windows.

Após reiniciar, você pode ver uma janela como esta:

Assim que a instalação do Ubuntu estiver completa, você será solicitado a inserir seu nome de usuário e senha.

E, é isso! Você está pronto para usar o Ubuntu.

Inicie o Ubuntu pesquisando no menu Iniciar.

E aqui temos sua instância do Ubuntu iniciada.

Opção 3: Usar uma Máquina Virtual (VM)

Uma máquina virtual (VM) é uma emulação de software de um sistema de computador físico. Isso permite que você execute vários sistemas operacionais e aplicativos em uma única máquina física simultaneamente.

Você pode usar software de virtualização como o Oracle VirtualBox ou VMware para criar uma máquina virtual executando o Linux dentro do seu ambiente Windows. Isso permite que você execute o Linux como um sistema operacional convidado ao lado do Windows.

O software de VM fornece opções para alocar e gerenciar recursos de hardware para cada VM, incluindo núcleos de CPU, memória, espaço em disco e largura de banda de rede. Você pode ajustar essas alocações com base nas exigências dos sistemas operacionais convidados e aplicativos.

Aqui estão algumas das opções comuns disponíveis para virtualização:

Opção 4: Use uma Solução Baseada no Navegador

Soluções baseadas no navegador são particularmente úteis para testes rápidos, aprendizado ou acesso a ambientes Linux a partir de dispositivos que não têm o Linux instalado.

Você pode usar editores de código online ou terminais baseados na web para acessar o Linux. Observe que geralmente você não tem privilégios de administração completos nestes casos.

Editores de código online

Os editores de código online oferecem editores com terminais Linux integrados. Embora seu propósito principal seja a programação, você também pode utilizar o terminal Linux para executar comandos e realizar tarefas.

Replit é um exemplo de um editor de código online, onde você pode escrever seu código e acessar o shell Linux ao mesmo tempo.

Terminais Linux baseados na web:

Os terminais Linux online permitem que você acesse uma interface de linha de comando Linux diretamente do seu navegador. Esses terminais fornecem uma interface baseada na web para um shell Linux, permitindo que você execute comandos e trabalhe com utilitários Linux.

Um exemplo é o JSLinux. A captura de tela abaixo mostra um ambiente Linux pronto para usar:

Opção 5: Use uma Solução Baseada na Nuvem

Em vez de rodar o Linux diretamente na sua máquina Windows, você pode considerar usar ambientes Linux baseados na nuvem ou servidores privados virtuais (VPS) para acessar e trabalhar com Linux remotamente.

Serviços como Amazon EC2, Microsoft Azure ou DigitalOcean oferecem instâncias Linux que você pode conectar a partir do seu computador Windows. Note que alguns desses serviços oferecem faixas gratuitas, mas geralmente não são grátis a longo prazo.

Parte 2: Introdução ao Shell Bash e aos Comandos do Sistema

2.1. Começando com o Shell bash

Introdução ao shell bash

A linha de comando do Linux é fornecida por um programa chamado shell. Ao longo dos anos, o programa shell evoluiu para atender a várias opções.

Diferentes usuários podem ser configurados para usar diferentes shells. No entanto, a maioria dos usuários prefere manter o shell padrão atual. O shell padrão para muitos distros Linux é o GNU Bourne-Again Shell (bash). O Bash é o sucessor do shell Bourne (sh).

Para descobrir seu shell atual, abra seu terminal e digite o seguinte comando:

echo $SHELL

Quebra do comando:

  • O comando echo é usado para imprimir no terminal.

  • A variável $SHELL é uma variável especial que contém o nome do shell atual.

Na minha configuração, a saída é /bin/bash. Isso significa que estou usando o shell bash.

# saída
echo $SHELL
/bin/bash

O Bash é muito poderoso pois pode simplificar certas operações que são difíceis de realizar eficientemente com uma GUI (ou Interface Gráfica de Usuário). Lembre-se que a maioria dos servidores não tem uma GUI, e é melhor aprender a usar os poderes de uma interface de linha de comando (CLI).

Terminal vs Shell

Os termos “terminal” e “shell” são frequentemente usados como sinônimos, mas eles se referem a partes diferentes da interface de linha de comando.

O terminal é a interface que você usa para interagir com o shell. O shell é o interpretador de comandos que processa e executa seus comandos. Você aprenderá mais sobre shells na Parte 6 do manual.

O que é um prompt?

Quando um shell é usado interativamente, ele exibe um $ quando está esperando por um comando do usuário. Isso é chamado de prompt do shell.

[username@host ~]$

Se o shell estiver executando como root (você aprenderá mais sobre o usuário root mais tarde), o prompt é alterado para #.

[root@host ~]#

2.2. Estrutura de Comando

Um comando é um programa que executa uma operação específica. Assim que você tiver acesso ao shell, você pode digitar qualquer comando após o símbolo $ e verá a saída no terminal.

Geralmente, os comandos do Linux seguem essa sintaxe:

command [options] [arguments]

Aqui está o desconstrução da sintaxe acima:

  • comando: Este é o nome do comando que você quer executar. ls (listar), cp (copiar) e rm (remover) são comandos comuns do Linux.

  • [opções]: Opções, ou símbolos de flag, frequentemente precedidos de um hífen (-) ou de dois hífens (–), modificam o comportamento da instrução. Elas podem mudar como a instrução opera. Por exemplo, ls -a usa a opção -a para exibir arquivos ocultos no diretório atual.

  • [argumentos]: Argumentos são as entradas para as instruções que necessitam de um. Estes podem ser nomes de arquivo, nomes de usuário ou outros dados que a instrução vai agir sobre. Por exemplo, na instrução cat access.log, cat é a instrução e access.log é a entrada. Como resultado, a instrução cat exibe o conteúdo do arquivo access.log.

Opções e argumentos não são obrigatórios para todas as instruções. Algumas instruções podem ser executadas sem nenhuma opção ou argumento, enquanto outras podem necessitar de um ou ambos para funcionar corretamente. Você pode sempre recorrer ao manual da instrução para verificar as opções e argumentos que ela suporta.

💡Dica: Você pode visualizar o manual de um comando usando o comando man.

Você pode acessar a página de manual para ls com man ls, e será exibido assim:

As páginas de manual são uma ótima forma rápida de acessar a documentação. Recomendo fortemente consultar as páginas de manual dos comandos que você usa com mais frequência.

2.3. Comandos do Bash e Atalhos do Teclado

Quando você está no terminal, você pode acelerar suas tarefas usando atalhos.

Aqui estão alguns dos atalhos de terminal mais comuns:

Operação Atalho
Procurar o comando anterior Seta para Cima
Ir para o início da palavra anterior Ctrl+Seta para Esquerda
Limpar caracteres do cursor até o fim da linha de comando Ctrl+K
Completar comandos, nomes de arquivos e opções Pressionar Tab
Ir para o início da linha de comando Ctrl+A
Exibe a lista de comandos anteriores history

2.4. Identificando-se: O Comando whoami

Você pode obter o nome de usuário com o qual você está logado usando o comando whoami. Este comando é útil quando você está trocando entre diferentes usuários e quer confirmar o usuário atual.

Só após o sinal $, digite whoami e pressione Enter.

whoami

Esta é a saída que eu obtive.

zaira@zaira-ThinkPad:~$ whoami
zaira

Parte 3: Entendendo Seu Sistema Linux

3.1. Descobrindo Seu SO e Especificações

Imprimir informações do sistema usando o comando uname

Você pode obter informações detalhadas do sistema usando o comando uname.

Quando você fornece a opção -a, ele imprime todas as informações do sistema.

uname -a
# saída
Linux zaira 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb  9 13:32:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

Na saída acima,

  • Linux: Indica o sistema operacional.

  • zaira: Representa o nome de host da máquina.

  • 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2: Fornece informações sobre a versão do kernel, data de construção e alguns detalhes adicionais.

  • x86_64 x86_64 x86_64: Indica a arquitetura do sistema.

  • GNU/Linux: Representa o tipo de sistema operacional.

Encontre detalhes da arquitetura do CPU usando o Comando lscpu

O comando lscpu no Linux é usado para exibir informações sobre a arquitetura do CPU. Quando você executa lscpu no terminal, ele fornece detalhes como:

  • A arquitetura do CPU (por exemplo, x86_64)

  • Modos de operação do CPU (por exemplo, 32-bit, 64-bit)

  • Ordem de byte (por exemplo, Little Endian)

  • Número de CPUs (número de CPUs), e assim por diante

    Vamos tentar:

lscpu
# saída
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
Vendor ID:               AuthenticAMD
  Model name:            AMD Ryzen 5 5500U with Radeon Graphics
    Thread(s) per core:  2
    Core(s) per socket:  6
    Socket(s):           1
    Stepping:            1
    CPU max MHz:         4056.0000
    CPU min MHz:         400.0000

Foi muito lote de informações, mas útil também! Lembre-se que você pode sempre passar pelas informações relevantes usando sinais específicos. Veja o manual do comando com man lscpu.

Parte 4: Gerenciando arquivos a partir da linha de comando

4.1. A Hierarquia do Sistema de Arquivos do Linux

Todos os arquivos no Linux são armazenados em um sistema de arquivos. Ele segue uma estrutura de árvore invertida porque a raiz está no topo.

O / é o diretório raiz e o ponto de partida do sistema de arquivos. O diretório raiz contém todos os outros diretórios e arquivos no sistema. O caractere / também serve como separador de diretórios em nomes de caminho. Por exemplo, /home/alice forma um caminho completo.

A imagem abaixo mostra a hierarquia completa do sistema de arquivos. Cada diretório serve a um propósito específico.

Note que esta não é uma lista exaustiva e diferentes distribuições podem ter configurações diferentes.

Aqui está uma tabela que mostra o propósito de cada diretório:

Localização Propósito
/bin Binários de comandos essenciais
/boot Arquivos estáticos do carregador de inicialização, necessários para iniciar o processo de inicialização.
/etc Configuração do sistema específica do host
/home Diretórios home dos usuários
/root Diretório home do usuário administrativo root
/lib Bibliotecas compartilhadas essenciais e módulos do kernel
/mnt Ponto de montagem para montar um sistema de arquivos temporariamente
/opt Pacotes de software adicionais
/usr Software instalado e bibliotecas compartilhadas
/var Dados variáveis que também são persistentes entre inicializações
/tmp Arquivos temporários acessíveis a todos os usuários

💡 Dica: Você pode aprender mais sobre o sistema de arquivos usando o comando man hier.

Você pode verificar seu sistema de arquivos usando o comando tree -d -L 1. Você pode modificar a flag -L para alterar a profundidade da árvore.

tree -d -L 1
# saída
.
├── bin -> usr/bin
├── boot
├── cdrom
├── data
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── snap
├── srv
├── sys
├── tmp
├── usr
└── var

25 directories

Esta lista não é exaustiva e diferentes distribuições e sistemas podem estar configuradas de forma diferente.

4.2. Navegando no Sistema de Arquivos do Linux

Caminho absoluto vs caminho relativo

O caminho absoluto é o caminho completo do diretório raiz até o arquivo ou diretório. Ele sempre começa com um /. Por exemplo, /home/john/documents.

O caminho relativo, por outro lado, é o caminho do diretório atual até o arquivo ou diretório de destino. Ele não começa com um /. Por exemplo, documents/work/project.

Localizar o diretório atual usando o comando pwd

É fácil perder o caminho no sistema de arquivos do Linux, especialmente se você estiver novo na linha de comando. Você pode localizar o diretório atual usando o comando pwd.

Aqui está um exemplo:

pwd
# output
/home/zaira/scripts/python/free-mem.py

Mudar de diretórios usando o comando cd

O comando para mudar de diretório é cd e significa “mudar diretório”. Você pode usar o comando cd para navegar para um diretório diferente.

Você pode usar um caminho relativo ou um caminho absoluto.

Por exemplo, se você quiser navegar pela estrutura de arquivos abaixo (seguindo as linhas vermelhas):

e você está parado em “home”, o comando seria assim:

cd home/bob/documents/work/project

Algumas outras shortcuts cd comumente usadas são:

Comando Descrição
cd .. Voltar um diretório
cd ../.. Voltar dois diretórios
cd ou cd ~ Ir para o diretório home
cd - Ir para o caminho anterior

4.3. Gerenciando Arquivos e Diretórios

Ao trabalhar com arquivos e diretórios, você pode querer copiar, mover, remover e criar novos arquivos e diretórios. Aqui estão alguns comandos que podem ajudá-lo com isso.

💡Dica: Você pode diferenciar entre um arquivo e uma pasta olhando para a primeira letra na saída do ls -l. Um '-' representa um arquivo e um 'd' representa uma pasta.

Criando novos diretórios usando o comando mkdir

Você pode criar um diretório vazio usando o comando mkdir.

# cria um diretório vazio chamado "foo" na pasta atual
mkdir foo

Você também pode criar diretórios recursivamente usando a opção -p.

mkdir -p tools/index/helper-scripts
# saída do tree
.
└── tools
    └── index
        └── helper-scripts

3 directories, 0 files

Criando novos arquivos usando o comando touch

O comando touch cria um arquivo vazio. Você pode usá-lo assim:

# cria um arquivo vazio "file.txt" na pasta atual
touch file.txt

Os nomes de arquivo podem ser encadeados se você quiser criar vários arquivos em um único comando.

# cria arquivos vazios "file1.txt", "file2.txt" e "file3.txt" na pasta atual

touch file1.txt file2.txt file3.txt

Remoção de arquivos e diretórios usando o comando rm e rmdir

Você pode usar o comando rm para remover tanto arquivos quanto diretórios não vazios.

Comando Descrição
rm file.txt Remove o arquivo file.txt
rm -r directory Remove o diretório directory e seu conteúdo
rm -f file.txt Remove o arquivo file.txt sem pedir confirmação
rmdir directory Remove um diretório vazio

🛑 Observe que você deve usar a flag -f com cuidado, pois você não será questionado antes de apagar um arquivo. Também tenha cuidado ao executar comandos rm na pasta root, pois isso poderia resultar na remoção de arquivos importantes do sistema.

Copiando arquivos usando o comando cp

Para copiar arquivos no Linux, use o comando cp.

  • Sintaxe para copiar arquivos:cp source_file destination_of_file

Este comando copia um arquivo chamado file1.txt para uma nova localização de arquivo /home/adam/logs.

cp file1.txt /home/adam/logs

O comando cp também cria uma cópia de um arquivo com o nome fornecido.

Este comando copia um arquivo chamado file1.txt para outro arquivo chamado file2.txt na mesma pasta.

cp file1.txt file2.txt

Movendo e renomeando arquivos e pastas usando o comando mv

O comando mv é usado para mover arquivos e pastas de um diretório para o outro.

Sintaxe para mover arquivos:mv arquivo_fonte diretório_destino

Exemplo: Mova um arquivo chamado file1.txt para uma pasta chamada backup:

mv file1.txt backup/

Para mover uma pasta e seu conteúdo:

mv dir1/ backup/

Renomear arquivos e pastas no Linux também é feito com o comando mv.

Sintaxe para renomear arquivos:mv nome_antigo nome_novo

Exemplo: Renomeie um arquivo de file1.txt para file2.txt:

mv file1.txt file2.txt

Renomeie uma pasta de dir1 para dir2:

mv dir1 dir2

4.4. Localizando Arquivos e Pastas Usando o Comando find

O comando find permite que você procure eficientemente por arquivos, pastas, e dispositivos de caractere e bloco.

A seguir, a sintaxe básica do comando find:

find /path/ -type f -name file-to-search

Onde,

  • /caminho é o caminho onde o arquivo é esperado ser encontrado. Este é o ponto de partida para a busca de arquivos. O caminho também pode ser / ou . que representam a raiz e o diretório atual, respectivamente.

  • -type representa os descritores de arquivo. Eles podem ser qualquer um dos seguintes:
    fArquivo regular, como arquivos de texto, imagens e arquivos ocultos.
    dDiretório. Estas são as pastas em consideração.
    lLigação simbólica. As ligações simbólicas apontam para ficheiros e são semelhantes a atalhos.
    cDispositivos de caracteres. Os ficheiros que são utilizados para aceder a dispositivos de caracteres são chamados ficheiros de dispositivos de caracteres. Os drivers se comunicam com dispositivos de caracteres enviando e recebendo caracteres únicos (bytes, octetos). Exemplos incluem teclados, placas de som e o rato.
    bDispositivos de bloco. Os ficheiros que são utilizados para aceder a dispositivos de bloco são chamados ficheiros de dispositivos de bloco. Os drivers comunicam com dispositivos de bloco enviando e recebendo blocos inteiros de dados. Os exemplos incluem USB e CD-ROM

  • -name é o nome do tipo de arquivo que você quer procurar.

Como procurar arquivos por nome ou extensão

Suppose que precisamos encontrar arquivos que contenham “style” em seu nome. Vamos usar esse comando:

find . -type f -name "style*"
#output
./style.css
./styles.css

Agora vamos dizer que queremos encontrar arquivos com uma extensão particular como .html. Vamos modificar o comando dessa forma:

find . -type f -name "*.html"
# output
./services.html
./blob.html
./index.html

Como procurar arquivos ocultos

Um ponto no início do nome do arquivo representa arquivos ocultos. Normalmente são ocultos, mas podem ser visualizados com ls -a no diretório atual.

Podemos modificar o comando find conforme mostrado abaixo para procurar por arquivos ocultos:

find . -type f -name ".*"

Listar e encontrar arquivos ocultos

ls -la
# conteúdo da pasta
total 5
drwxrwxr-x  2 zaira zaira 4096 Mar 26 14:17 .
drwxr-x--- 61 zaira zaira 4096 Mar 26 14:12 ..
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bash_history
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bash_logout
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bashrc

find . -type f -name ".*"
# saída do find
./.bash_logout
./.bashrc
./.bash_history

A cima, você pode ver uma lista de arquivos ocultos no meu diretório pessoal.

Como procurar arquivos de log e arquivos de configuração

Arquivos de log normalmente têm a extensão .log e podemos os encontrar assim:

 find . -type f -name "*.log"

Do mesmo modo, podemos procurar arquivos de configuração assim:

 find . -type f -name "*.conf"

Como procurar outros arquivos por tipo

Podemos procurar arquivos de bloco de caracteres fornecendo c a -type:

find / -type c

Do mesmo modo, podemos encontrar arquivos de bloco de dispositivo usando b:

find / -type b

Como procurar diretórios

No exemplo abaixo, estamos encontrando as pastas usando a flag -type d.

ls -l
# listar conteúdo da pasta
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 hosts
-rw-rw-r-- 1 zaira zaira    0 Mar 26 14:23 hosts.txt
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 images
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:23 style
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 webp 

find . -type d 
# saída do find de diretório
.
./webp
./images
./style
./hosts

Como procurar arquivos por tamanho

Uma funcionalidade incrivel do comando find é listar arquivos com base the um tamanho particular.

find / -size +250M

Aqui, estamos listando arquivos que excedem 250MB.

Outras unidades incluem:

  • G: GigaBytes.

  • GB: GigaBytes.

  • KB: KiloBytes

  • b: bytes.

Somente substitua pela unidade correspondente.

find <directory> -type f -size +N<Unit Type>

Como procurar arquivos por tempo de modificação

Usando a bandeira -mtime, você pode filtrar arquivos e pastas com base no tempo de modificação.

find /path -name "*.txt" -mtime -10

Por exemplo,

  • -mtime +10 significa que você está procurando um arquivo modificado há 10 dias.

  • -mtime -10 significa menos de 10 dias.

  • -mtime 10 Se você omitir + ou –, significa exatamente 10 dias.

4.5. Comandos básicos para visualização de arquivos

Concatenar e exibir arquivos usando o comando cat

O comando cat no Linux é usado para exibir o conteúdo de um arquivo. Também pode ser usado para concatenar arquivos e criar novos arquivos.

Aqui está a sintaxe básica do comando cat:

cat [options] [file]

A forma mais simples de usar cat é sem nenhuma opção ou argumento. Isso exibirá o conteúdo do arquivo no terminal.

Para visualizar o conteúdo de um arquivo chamado file.txt, você pode usar o seguinte comando:

cat file.txt

Isso exibirá todos os conteúdos do arquivo de uma vez no terminal.

Visualizando arquivos de texto interativamente usando less e more

Enquanto o cat exibe o arquivo inteiro de uma vez, less e more permitem visualizar o conteúdo de um arquivo interativamente. Isso é útil quando você quer rolar por um grande arquivo ou buscar conteúdo específico.

A sintaxe do comando less é:

less [options] [file]

O comando more é semelhante a less, mas tem menos recursos. Ele é usado para exibir o conteúdo de um arquivo de tela por vez.

A sintaxe do comando more é:

more [options] [file]

Para ambos os comandos, você pode usar a barra de espaço para rolar uma página para baixo, a tecla Enter para rolar uma linha para baixo, e a tecla q para sair do visualizador.

Para mover-se para trás, você pode usar a tecla b, e para avançar, você pode usar a tecla f.

Exibindo a última parte dos arquivos usando tail

Às vezes, você pode precisar visualizar apenas as últimas linhas de um arquivo em vez de todo o arquivo. O comando tail no Linux é usado para exibir a última parte de um arquivo.

Por exemplo, tail file.txt exibirá as últimas 10 linhas do arquivo file.txt por padrão.

Se você quiser exibir um número diferente de linhas, você pode usar a opção -n seguida pelo número de linhas que você quer exibir.

# Exiba as últimas 50 linhas do arquivo file.txt
tail -n 50 file.txt

💡Dica: Outro uso do tail é sua opção de seguimento (-f). Esta opção permite que você visualize o conteúdo de um arquivo conforme ele é escrito. Esta é uma ferramenta útil para visualizar e monitorar arquivos de log em tempo real.

Exibindo o início de arquivos usando head

Assim como o tail exibe a parte final de um arquivo, você pode usar o comando head no Linux para exibir o início de um arquivo.

Por exemplo, head file.txt exibirá as primeiras 10 linhas do arquivo file.txt por padrão.

Para alterar o número de linhas exibidas, você pode usar a opção -n seguida pelo número de linhas que você quer exibir.

Contando palavras, linhas e caracteres usando wc

Você pode contar palavras, linhas e caracteres em um arquivo usando o comando wc.

Por exemplo, executando wc syslog.log dei a seguinte saída:

1669 9623 64367 syslog.log

No output acima,

  • 1669 representa o número de linhas no arquivo syslog.log.

  • 9623 representa o número de palavras no arquivo syslog.log.

  • 64367 representa o número de caracteres no arquivo syslog.log.

Então, o comando wc syslog.log contou 1669 linhas, 9623 palavras e 64367 caracteres no arquivo syslog.log.

Comparando arquivos linha a linha usando o diff

Comparar e encontrar diferenças entre dois arquivos é uma tarefa comum no Linux. Você pode comparar dois arquivos mesmo na linha de comando usando o comando diff.

A sintaxe básica do comando diff é:

diff [options] file1 file2

Aqui estão dois arquivos, hello.py e also-hello.py, que vamos comparar usando o comando diff:

# conteúdo de hello.py

def greet(name):
    return f"Hello, {name}!"

user = input("Enter your name: ")
print(greet(user))
# conteúdo de also-hello.py

more also-hello.py
def greet(name):
    return fHello, {name}!

user = input(Enter your name: )
print(greet(user))
print("Nice to meet you")
  1. Verifique se os arquivos são idênticos ou não
diff -q hello.py also-hello.py
# Saída
Files hello.py and also-hello.py differ
  1. Veja como os arquivos se diferem. Para isso, você pode usar o sinalizador -u para ver uma saída unificada:
diff -u hello.py also-hello.py
--- hello.py    2024-05-24 18:31:29.891690478 +0500
+++ also-hello.py    2024-05-24 18:32:17.207921795 +0500
@@ -3,4 +3,5 @@

 user = input(Enter your name: )
 print(greet(user))
+print("Nice to meet you")

— hello.py 2024-05-24 18:31:29.891690478 +0500

  • No acima saída:
  • --- hello.py 2024-05-24 18:31:29.891690478 +0500 indica o arquivo sendo comparado e seu timestamp.
  • +++ also-hello.py 2024-05-24 18:32:17.207921795 +0500 indica o outro arquivo sendo comparado e seu timestamp.
  • @@ -3,4 +3,5 @@ mostra os números das linhas onde as mudanças ocorrem. Neste caso, indica que as linhas 3 a 4 no arquivo original foram mudadas para as linhas 3 a 5 no arquivo modificado.
  • user = input(Enter your name: ) é uma linha do arquivo original.
  • print(greet(user)) é outra linha do arquivo original.
  1. +print("Nice to meet you") é a linha adicional no arquivo modificado.
diff -y hello.py also-hello.py
Para ver o diff em formato side-by-side, você pode usar o sinalizador -y:
def greet(name):                        def greet(name):
    return fHello, {name}!                        return fHello, {name}!

user = input(Enter your name: )                    user = input(Enter your name: )
print(greet(user))                        print(greet(user))
                                        >    print("Nice to meet you")

# Saída

  • Na saída:
  • Ambas as linhas que são iguais em ambos os arquivos são exibidas lado a lado.

Linhas que são diferentes são mostradas com um símbolo > indicando que a linha está presente apenas em um dos arquivos.

Parte 5: Os fundamentos da edição de texto no Linux

As habilidades de edição de texto usando a linha de comando são das habilidades mais cruciais no Linux. Nesta seção, você aprenderá a usar dois editores de texto populares no Linux: Vim e Nano.

Sugiro que você mestre qualquer um dos editores de texto de sua escolha e fique com ele. Isso economizará seu tempo e o tornará mais produtivo. Vim e nano são escolhas seguras, pois estão presentes na maioria das distribuições Linux.

5.1. Dominando o Vim: O Guia Completo

Introdução ao Vim

  • O Vim é uma ferramenta popular de edição de texto para a linha de comando. O Vim vem com suas vantagens: é poderoso, personalizável e rápido. Aqui estão algumas razões por que você deveria considerar aprender Vim:
  • A maioria dos servidores é acessada via CLI, então na administração de sistemas, você não necessariamente tem o luxo de uma GUI. Mas o Vim tem sua ajuda – ele sempre estará lá.
  • O Vim utiliza uma abordagem centralizada no teclado, já que está projetado para ser usado sem um mouse, o que pode aumentar significativamente a velocidade das tarefas de edição assim que você aprender os atalhos do teclado. Isto também o torna mais rápido que ferramentas de interface gráfica.
  • Algumas ferramentas do Linux, por exemplo, editar tarefas do cron, funcionam no mesmo formato de edição que o Vim.

O Vim é adequado para todos – iniciantes e usuários avançados. O Vim suporta buscas de strings complexas, destaque de buscas e muito mais. Através de plugins, o Vim fornece funcionalidades extendidas a desenvolvedores e Administradores de Sistemas, incluindo final de código, destaque de sintaxe, gerenciamento de arquivos, controle de versão e muito mais.

O Vim tem duas variações: Vim (vim) e Vim tiny (vi). O Vim tiny é uma versão menor do Vim que carece de algumas funcionalidades do Vim.

Como começar a usar vim

vim your-file.txt

Comece a usar o Vim com este comando:

your-file.txt pode ser um novo arquivo ou um arquivo existente que você deseja editar.

Navegando no Vim: Masterar o movimento e os modos de comando

No início dos CLI, as telas de computador não tinham setas. Portanto, a navegação era feita usando o conjunto de teclas disponíveis, hjkl sendo uma delas.

Beendo keyboard-centric, usar as teclas hjkl pode aumentar muito a velocidade das tarefas de edição de texto.

Nota: Embora as setas funcionem perfeitamente, você pode ainda experimentar com as teclas hjkl para navegar. Algumas pessoas acham que esta é uma forma eficiente de navegação.

💡Dica: Para lembrar a sequência hjkl, use isto: hang back, jump down, kick up, leap forward.

Os três modos do Vim

  1. Você precisa saber os 3 modos de operação do Vim e como alternar entre eles. As seqüências de teclas comportam-se de forma diferente em cada modo de comando. Os três modos são os seguintes:
  2. Modo de comando.
  3. Modo de edição.

Modo visual.

Modo de comando. Quando você inicia o Vim, você aterrissa no modo de comando por padrão. Este modo permite que você acesse outros modos.

⚠ Para alternar para outros modos, você precisa estar no modo de comando primeiro

Modo de edição

Este modo permite que você faça alterações no arquivo. Para entrar no modo de edição, pressione I enquanto no modo de comando. Note a mudança de '-- INSERT' no final da tela.

Modo visual

  • Este modo permite trabalhar em um único caractere, um bloco de texto ou linhas de texto. Vamos quebrá-lo em etapas simples. Lembre-se, use as combinações abaixo quando estiver no modo de comando.
  • Shift + V → Selecionar múltiplas linhas.
  • Ctrl + V → Modo de bloco

V → Modo de caractere

O modo visual é útil quando você precisa copiar e colar ou editar linhas em massa.

Modo de comando estendido.

O modo de comando estendido permite executar operações avançadas como pesquisa, definição de números de linha e realce de texto. Cobriremos o modo estendido na próxima seção.

Como manter o rumo? Se você esquecer o modo atual, basta pressionar ESC duas vezes e você voltará ao Modo de Comando.

Editando eficientemente no Vim: Copiar/colar e pesquisar

1. Como copiar e colar no Vim

  • Copiar e colar é conhecido como ‘yank’ e ‘put’ nos termos do Linux. Para copiar e colar, siga estas etapas:
  • Selecione o texto no modo visual.
  • Pressione 'y' para copiar/yank.

Move o cursor para a posição necessária e pressione 'p'.

2. Como procurar por texto no Vim

Qualquer série de strings pode ser procurada no Vim usando o / no modo de comando. Para procurar, use /string-a-procurar.

No modo de comando, digite :set hls e pressione enter. Procure usando /string-a-procurar. Isso irá realçar as pesquisas.

Vamos procurar algumas strings:

3. Como sair do Vim

  • Primeiro, vá para o modo de comando (pressionando escape duas vezes) e use essas flags:
  • Sair sem salvar → :q!

Sair e salvar → :wq!

Atalhos no Vim: Fazendo a Edição Mais Rápida

  • Nota: Todos esses atalhos funcionam apenas no modo de comando.
  • Ctrl+u: Mover meio-página para cima
  • P: Colar acima do cursor
  • :%s/old/new/g: Substitui todas as ocorrências de old por new no ficheiro
  • :q!: Sair sem salvar

Ctrl+w seguido por h/j/k/l: Navegar entre janelas divididas

5.2. Mestre em Nano

Iniciando com Nano: O editor de texto amigável

Nano é um editor de texto amigável que é fácil de usar e perfeito para iniciantes. É pré-instalado em quase todas as distribuições Linux.

nano

Para criar um novo arquivo usando Nano, use o comando a seguir:

nano filename

Para começar a editar um arquivo existente com Nano, use o comando a seguir:

Lista de atalhos de teclas em Nano

Vamos estudar os atalhos de teclas mais importantes em Nano. Você usará os atalhos de tecla para executar várias operações como salvar, sair, copiar, colar e muito mais.

Escrever em um arquivo e salvar

Uma vez que abrir o Nano usando o comando nano, você pode começar a escrever texto. Para salvar o arquivo, pressione Ctrl+O. Você será solicitado a inserir o nome do arquivo. Pressione Enter para salvar o arquivo.

Sair do nano

Você pode sair do Nano pressionando Ctrl+X. Se você tiver alterações não salvas, o Nano irá perguntar se você deseja salvar as alterações antes de sair.

Copiar e colar

Para selecionar uma região, use ALT+A. Uma marcação irá aparecer. Use as setas para selecionar o texto. Uma vez selecionado, saia da marcação com ALT+^.

Para copiar o texto selecionado, pressione Ctrl+K. Para colar o texto copiado, pressione Ctrl+U.

Recortar e colar

Selecione a região com ALT+A. Uma vez selecionado, recorte o texto com Ctrl+K. Para colar o texto recortado, pressione Ctrl+U.

Navegação

Use Alt \ para ir para o início do arquivo.

Use Alt / para ir para o final do arquivo.

Ver números de linha

Quando você abre um arquivo com nano -l filename, você pode ver os números de linha no lado esquerdo do arquivo.

Pesquisando

Você pode procurar por um número de linha específico com ALt + G. Insira o número da linha na(prompt) e pressione Enter.

Você também pode iniciar a busca por uma string com CTRL + W e pressione Enter. Se você quiser buscar para trás, pode pressionar Alt+W após iniciar a busca com Ctrl+W.

  • Resumo das teclas de atalho no Nano
  • Ctrl+G: Exibir o texto de ajuda
  • Ctrl+J: Justificar o parágrafo atual
  • Ctrl+V: Rolar para baixo uma página
  • Ctrl+\: Pesquisar e substituir

Alt+E: Refazer a última operação desfeita

Parte 6: Bash Scripting

6.1. Definição de Bash scripting

Um bash script é um ficheiro que contém uma sequência de comandos que são executados pelo programa bash linha a linha. Permite-lhe executar uma série de acções, tais como navegar para um diretório específico, criar uma pasta e iniciar um processo utilizando a linha de comandos.

Ao salvar comandos em um script, você pode repetir a mesma sequência de etapas várias vezes e executá-las rodando o script.

6.2. Vantagens de Scripting em Bash

Scripting em Bash é uma ferramenta poderosa e versátil para automatizar tarefas de administração de sistema, gerenciar recursos do sistema e realizar outras tarefas rotineiras em sistemas Unix/Linux.

  • Algumas vantagens de script de shell são:
  • Automatização: Scripts de shell permitem a automatização de tarefas e processos repetitivos, economizando tempo e reduzindo o risco de erros que podem ocorrer com execução manual.
  • Portabilidade: Scripts de shell podem ser executados em várias plataformas e sistemas operacionais, incluindo Unix, Linux, macOS, e até mesmo Windows através do uso de emuladores ou máquinas virtuais.
  • Flexibilidade: Os scripts de shell são altamente personalizáveis e podem ser facilmente modificados para atender a requisitos específicos. Eles também podem ser combinados com outras linguagens de programação ou utilitários para criar scripts mais poderosos.
  • Acessibilidade: Os scripts de shell são fáceis de escrever e não requerem ferramentas ou software especiais. Eles podem ser editados usando qualquer editor de texto, e a maioria dos sistemas operacionais possui um interpretador de shell embutido.
  • Integração: Os scripts de shell podem ser integrados com outras ferramentas e aplicativos, como bancos de dados, servidores web e serviços de nuvem, permitindo tarefas de automação e gerenciamento de sistemas mais complexos.

Depuração: Os scripts de shell são fáceis de depurar, e a maioria dos shells possui ferramentas de depuração e relatório de erros embutidas que ajudam a identificar e corrigir problemas rapidamente.

6.3. Visão geral do Bash Shell e da Interface de Linha de Comando

As palavras “shell” e “bash” são frequentemente usadas como sinônimos. Mas há uma diferença sutil entre ambas.

O termo “shell” se refere a um programa que fornece uma interface de linha de comando para interagir com um sistema operacional. Bash (Bourne-Again SHell) é uma das shells Unix/Linux mais comumente usadas e é a shell padrão em muitas distribuições Linux.

Até agora, as ordens que você entrou estavam basicamente sendo digitadas em uma “shell”.

Embora Bash seja um tipo de shell, também existem outras shells disponíveis, como shell Korn (ksh), shell C (csh) e shell Z (zsh). Cada shell tem sua própria sintaxe e conjunto de recursos, mas todas compartilham o objetivo comum de fornecer uma interface de linha de comando para interagir com o sistema operacional.

ps
# output:

    PID TTY          TIME CMD
  20506 pts/0    00:00:00 bash <--- the shell type
  20931 pts/0    00:00:00 ps

Você pode descobrir o tipo de shell que está usando usando o comando ps:

Em resumo, enquanto “shell” é um termo abrangente que se refere a qualquer programa que fornece uma interface de linha de comando, “Bash” é um tipo específico de shell que é amplamente usado em sistemas Unix/Linux.

Nota: Nesta seção, nós vamos usar a “shell bash”.

6.4. Como criar e executar scripts Bash

Convenções de nomenclatura de scripts

De acordo com as convenções de nome, os scripts bash terminam com .sh. No entanto, os scripts bash funcionam perfeitamente bem sem a extensão sh.

Adicionando o Shebang

Scripts Bash começam com um shebang. Shebang é uma combinação de bash # e bang ! seguido pelo caminho do shell bash. Esta é a primeira linha do script. Shebang diz ao shell para executá-lo através do shell bash. Shebang é simplesmente um caminho absoluto para o interpretador bash.

#!/bin/bash

Abaixo está um exemplo da declaração shebang.

which bash

Você pode encontrar o caminho do seu shell bash (que pode variar do acima) usando o comando:

Criando seu primeiro script bash

Nosso primeiro script solicita ao usuário que insira um caminho. Em retorno, seu conteúdo será listado.

vim run_all.sh

Crie um arquivo chamado run_all.sh usando qualquer editor de sua escolha.

#!/bin/bash
echo "Today is " `date`

echo -e "\nenter the path to directory"
read the_path

echo -e "\n you path has the following files and folders: "
ls $the_path

Adicione os seguintes comandos em seu arquivo e salve:

  1 Vamos dar uma olhada mais profunda no script linha por linha. Estou exibindo o mesmo script novamente, mas desta vez com números de linha.
  2 echo "Today is " `date`
  3
  4 echo -e "\nenter the path to directory"
  5 read the_path
  6
  7 echo -e "\n you path has the following files and folders: "
  8 ls $the_path
  • #!/bin/bash
  • Linha #1: O shebang (#!/bin/bash) aponta para o caminho do shell bash.
  • Linha #2: O comando echo exibe a data e hora atuais no terminal. Note que o date está entre crases.
  • Linha #4: Queremos que o usuário insira um caminho válido.
  • linha #5: O comando read lê a entrada e armazena-a na variável the_path.

linha #8: O comando ls leva a variável com o caminho armazenado e mostra os arquivos e pastas atuais.

Executando o script bash

chmod u+x run_all.sh

Para tornar o script executável, atribua os direitos de execução ao seu usuário usando este comando:

  • Aqui,
  • chmod modifica a propriedade de um arquivo para o usuário atual: u.
  • +x adiciona os direitos de execução ao usuário atual. Isso significa que o usuário que é o proprietário pode agora executar o script.

run_all.sh é o arquivo que nós desejamos executar.

  • Você pode executar o script usando qualquer um dos métodos mencionados:
  • sh run_all.sh
  • bash run_all.sh

./run_all.sh

Vamos ver isso em ação 🚀

6.5. Conceitos Básicos de Scripting Bash

Comentários em scripting bash

Os comentários começam com um # no scripting bash. Isso significa que qualquer linha que comece com um # é um comentário e será ignorado pelo interpretador.

Os comentários são muito úteis na documentação do código, e é uma boa prática adicioná-los para ajudar os outros a entender o código.

Estes são exemplos de comentários:
# Este é um exemplo de comentário

# Ambas essas linhas serão ignoradas pelo interpretador

Variáveis e tipos de dados em Bash

Variáveis permitem que você armazene dados. Você pode usar variáveis para ler, acessar e manipular dados ao longo do seu script.

Não há tipos de dados em Bash. Em Bash, uma variável é capaz de armazenar valores numéricos, caracteres individuais ou strings de caracteres.

  1. Em Bash, você pode usar e definir os valores das variáveis da seguinte forma:
country=Netherlands

Atribuir o valor diretamente:

same_country=$country

2. Atribuir o valor com base na saída obtida de um programa ou comando, usando substituição de comando. Note que $ é necessário para acessar o valor de uma variável existente.

Isto atribui o valor de country para a nova variável same_country.

country=Netherlands
echo $country
Para acessar o valor da variável, adicione $ ao nome da variável.
Netherlands
new_country=$country
echo $new_country
# saída
Netherlands

# saída

Acima, você pode ver um exemplo de atribuição e impressão de valores de variáveis.

Convenções de nomenclatura de variáveis

  1. Em scriptings Bash, o seguinte são as convenções de nomenclatura de variáveis:
  2. Os nomes das variáveis devem começar com uma letra ou um underscore (_).
  3. Os nomes das variáveis podem conter letras, números, e underscores (_).
  4. Os nomes das variáveis são sensíveis a maiúsculas e minúsculas.
  5. Os nomes das variáveis não devem conter espaços ou caracteres especiais.
  6. Use nomes descritivos que refletem o propósito da variável.

Evite usar palavras-chave reservadas, como if, then, else, fi, e assim por diante como nomes de variáveis.

name
count
_var
myVar
MY_VAR

Aqui estão alguns exemplos de nomes de variáveis válidos em Bash:

E aqui estão alguns exemplos de nomes de variáveis inválidos:

2ndvar (variable name starts with a number)
my var (variable name contains a space)
my-var (variable name contains a hyphen)

# nomes de variáveis inválidos

Seguindo essas convenções de nomenclatura ajuda a tornar os scripts do Bash mais legíveis e fáceis de manter.

Entrada e saída em scripts do Bash

Coletando entrada

  1. Nesta seção, vamos discutir alguns métodos para fornecer entrada aos nossos scripts.

Lendo a entrada do usuário e armazenando-a em uma variável

#!/bin/bash
echo "What's your name?"
read entered_name
echo -e "\nWelcome to bash tutorial" $entered_name

Podemos ler a entrada do usuário usando o comando read.

2. Lendo de um arquivo

while read line
do
  echo $line
done < input.txt

Este código lê cada linha de um arquivo chamado input.txt e a imprime no terminal. Vamos estudar os laços while mais tarde nesta seção.

3. Argumentos de linha de comando

Em um script do bash ou função, $1 denota o argumento inicial passado, $2 denota o segundo argumento passado, e assim por diante.

#!/bin/bash
echo "Hello, $1!"

Este script recebe um nome como argumento de linha de comando e imprime uma saudação personalizada.

Fornecemos Zaira como nosso argumento para o script.

Output:

Exibindo saída

  1. Aqui discutiremos alguns métodos para receber saída dos scripts.
echo "Hello, World!"

Imprimindo no terminal:

Isso imprime o texto “Hello, World!” no terminal.

echo "This is some text." > output.txt

2. Escrevendo em um arquivo:

Isso escreve o texto “This is some text.” em um arquivo chamado output.txt. Note que o operador > sobrescreve um arquivo se já tiver algum conteúdo.

echo "More text." >> output.txt

3. Anexando em um arquivo:

Este acrescenta o texto “Mais texto.” ao final do arquivo output.txt.

ls > files.txt

4. Redirecionando saída:

Este lista os arquivos na pasta atual e grava a saída em um arquivo chamado files.txt. Você pode redirecionar a saída de qualquer comando para um arquivo desta maneira.

Você aprenderá sobre redirecionamento de saída em detalhes na seção 8.5.

Instruções condicionais (if/else)

Expressões que produzem um resultado booleano, seja verdadeiro ou falso, são chamadas de condições. Existem várias formas de avaliar condições, incluindo if, if-else, if-elif-else, e condições aninhadas.

if [[ condition ]];
then
    statement
elif [[ condition ]]; then
    statement 
else
    do this by default
fi

Sintaxe:

Sintaxe das instruções condicionais do bash

if [ $a -gt 60 -a $b -lt 100 ]

Podemos usar operadores lógicos como AND -a e OR -o para fazer comparações que tenham mais significado.

Esta instrução verifica se ambas as condições são true: a é maior que 60 AND b é menor que 100.

#!/bin/bash

Vamos ver um exemplo de um script Bash que usa if, if-else, e if-elif-else para determinar se um número inserido pelo usuário é positivo, negativo, ou zero:

echo "Please enter a number: "
read num

if [ $num -gt 0 ]; then
  echo "$num is positive"
elif [ $num -lt 0 ]; then
  echo "$num is negative"
else
  echo "$num is zero"
fi

# Script para determinar se um número é positivo, negativo, ou zero

O script primeiro pede ao usuário que insira um número. Em seguida, ele usa uma estrutura de decisão `if` para verificar se o número é maior que `0`. Se sim, o script exibe que o número é positivo. Se o número não for maior que `0`, o script passa para a próxima instrução, que é uma estrutura `if-elif`.

Aqui, o script verifica se o número é menor que `0`. Se sim, o script exibe que o número é negativo.

Finalmente, se o número não é nem maior que `0` nem menor que `0`, o script usa uma instrução `else` para exibir que o número é zero.

Veja funcionando 🚀

Laços e decisões em Bash

Laço While

Laços While verificam uma condição e executam o laço até que a condição permaneça `true`. Precisamos fornecer uma instrução de contador que incrementa o contador para controlar a execução do laço.

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done

No exemplo abaixo, `(( i += 1 ))` é a instrução de contador que incrementa o valor de `i`. O laço executará exatamente 10 vezes.

Laço For

O laço `for`, tal como o laço `while`, permite que você execute declarações específicas de vezes. Cada laço difere em sua sintaxe e uso.

#!/bin/bash

for i in {1..5}
do
    echo $i
done

No exemplo abaixo, o laço iterará 5 vezes.

Decisões Case

case expression in
    pattern1)
        No Bash, as instruções de caso são usadas para comparar um valor dado contra uma lista de padrões e executar um bloco de código baseado no primeiro padrão que corresponde. A sintaxe para uma instrução de caso no Bash é a seguinte:
        ;;
    pattern2)
        # código a executar se a expressão corresponde ao padrão1
        ;;
    pattern3)
        # código a executar se a expressão corresponde ao padrão2
        ;;
    *)
        # código a executar se a expressão corresponde ao padrão3
        ;;
esac

# código a executar se nenhuma das padrões acima corresponder à expressão

Aqui, “expressão” é o valor que queremos comparar, e “padrão1”, “padrão2”, “padrão3” e assim por diante são os padrões que queremos compará-los contra.

O dois-pontos duplo “;;” separa cada bloco de código para executar em cada padrão. O asterisco “*” representa o caso padrão, que é executado se nenhum dos padrões especificados corresponder à expressão.

fruit="apple"

case $fruit in
    "apple")
        echo "This is a red fruit."
        ;;
    "banana")
        echo "This is a yellow fruit."
        ;;
    "orange")
        echo "This is an orange fruit."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac

Vejamos um exemplo:

Neste exemplo, já que o valor de fruta é maça, o primeiro padrão corresponde, e o bloco de código que exibe This is a red fruit. é executado. Se o valor de fruta fosse ao invés banana, o segundo padrão corresponderia e o bloco de código que exibe This is a yellow fruit. seria executado, e assim por diante.

Se o valor de fruta não corresponder a nenhum dos padrões especificados, o caso padrão é executado, que exibe Unknown fruit.

Parte 7: Gerenciando Pacotes de Software no Linux

O Linux vem com vários programas embutidos. Mas você pode precisar instalar novos programas com base nas suas necessidades. Você também pode precisar atualizar as aplicações existentes.

7.1. Pacotes e Gerenciamento de Pacotes

O que é um pacote?

Um pacote é uma coleção de arquivos que são agrupados juntos. Esses arquivos são essenciais para que um programa em particular rode. Esses arquivos contêm os arquivos executáveis do programa, bibliotecas e outros recursos.

Além dos arquivos necessários para a execução do programa, os pacotes também contêm scripts de instalação, que copiam os arquivos para onde eles são necessários. Um programa pode conter muitos arquivos e dependências. Com pacotes, é mais fácil gerenciar todos os arquivos e dependências de uma só vez.

Qual é a diferença entre código fonte e binário?

Os programadores escrevem código fonte em uma linguagem de programação. Esse código fonte é então compilado em código de máquina que o computador pode entender. O código compilado é chamado de código binário.

Quando você baixa um pacote, pode obter o código fonte ou o código binário. O código fonte é o código legível por humanos que pode ser compilado em código binário. O código binário é o código compilado que o computador pode entender.

Os pacotes de código fonte podem ser usados em qualquer tipo de máquina se o código fonte for compilado corretamente. Binário, por outro lado, é código compilado que é específico para um tipo particular de máquina ou arquitetura.

uname -m
Você pode encontrar a arquitetura de sua máquina usando o comando uname -m.
x86_64

# saída

Dependências de pacotes

Os programas frequentemente compartilham arquivos. Em vez de incluir esses arquivos em cada pacote, um pacote separado pode fornecê-los para todos os programas.

Para instalar um programa que precisa desses arquivos, você também deve instalar o pacote que os contém. Isso é chamado de dependência de pacote. Especificar dependências torna os pacotes menores e mais simples, reduzindo duplicatas.

Quando você instala um programa, suas dependências também devem ser instaladas. A maioria das dependências necessárias geralmente já está instalada, mas algumas extras podem ser necessárias. Portanto, não se surpreenda se vários outros pacotes forem instalados junto com o pacote escolhido. Essas são as dependências necessárias.

Gerenciadores de pacotes

O Linux oferece um sistema de gerenciamento de pacotes abrangente para instalar, atualizar, configurar e remover software.

Com o gerenciamento de pacotes, você pode ter acesso a uma base organizada de milhares de pacotes de software, além de ter a capacidade de resolver dependências e verificar atualizações de software.

Os pacotes podem ser gerenciados usando utilitários de linha de comando que podem ser facilmente automatizados por administradores de sistema ou através de uma interface gráfica.

Canais/repositórios de software

⚠️ O gerenciamento de pacotes é diferente para diferentes distribuições. Aqui, estamos usando o Ubuntu.

Instalar software é um pouco diferente no Linux em comparação com Windows e Mac.

O Linux usa repositórios para armazenar pacotes de software. Um repositório é uma coleção de pacotes de software que estão disponíveis para instalação via um gerenciador de pacotes.

Um gerenciador de pacotes também armazena um índice de todos os pacotes disponíveis a partir de um repositório. Às vezes, o índice é recriado para garantir que esteja atualizado e saber quais pacotes foram atualizados ou adicionados ao canal desde a última verificação.

O processo genérico de download de software a partir de um repositório se parece com algo assim:

  1. Se falarmos especificamente sobre o Ubuntu,
  2. O índice é buscado usando apt update. (apt é explicado na próxima seção).
  3. Os arquivos necessários/dependências solicitados de acordo com o índice usando apt install
  4. Pacotes e dependências instalados localmente.

Atualize dependências e pacotes quando necessário usando apt update e apt upgrade

Em distribuições baseadas em Debian, você pode registrar a lista de repositórios (repositories) em /etc/apt/sources.list.

7.2. Instalando um Pacote via Linha de Comando

O comando apt é uma poderosa ferramenta de linha de comando, que trabalha com a “Advanced Packaging Tool (APT)” do Ubuntu.

apt, juntamente com os comandos incluídos nele, fornece as ferramentas para instalar novos pacotes de software, atualizar pacotes de software existentes, atualizar o índice de lista de pacotes e até mesmo atualizar todo o sistema Ubuntu.

Para visualizar os logs de instalação usando apt, você pode visualizar o arquivo /var/log/dpkg.log.

A seguir estão as aplicações do comando apt:

Instalar pacotes

sudo apt install htop

Por exemplo, para instalar o pacote htop, você pode usar o seguinte comando:

Atualizar o índice de lista de pacotes

sudo apt update

O índice de lista de pacotes é uma lista de todos os pacotes disponíveis nos repositórios. Para atualizar o índice de lista local, você pode usar o seguinte comando:

Atualizar os pacotes

Pacotes instalados no seu sistema podem receber atualizações contendo correções de bugs, patchs de segurança e novas funcionalidades.

sudo apt upgrade

Para atualizar os pacotes, você pode usar o seguinte comando:

Remover pacotes

sudo apt remove htop

Para remover um pacote, como htop, você pode usar o seguinte comando:

7.3. Instalar um Pacote por um Método Avançado Gráfico – Synaptic

Se você não está confortável com a linha de comando, você pode usar uma aplicação GUI para instalar pacotes. Você pode obter os mesmos resultados que a linha de comando, mas com uma interface gráfica.

Synaptic é uma aplicação de gerenciamento de pacotes GUI que ajuda a listar os pacotes instalados, seu status, atualizações pendentes e assim por diante. Ela oferece filtros personalizados para ajudá-lo a encontrar resultados de busca mais precisos.

Também pode clicar com o botão direito do mouse em um pacote e visualizar detalhes adicionais, como as dependências, o mantenedor, o tamanho e os arquivos instalados.

7.4. Instalar pacotes baixados de um site na Internet

Você pode querer instalar um pacote que baixou de um site da Internet, em vez de de um repositório de software. Esses pacotes são chamados de arquivos .deb.

cd directory
sudo dpkg -i package_name.deb

Usandodpkgpara instalar pacotes:dpkg é uma ferramenta de linha de comando usada para instalar pacotes. Para instalar um pacote com dpkg, abra o Terminal e digite o seguinte:

Nota: Substitua “diretório” pelo diretório onde o pacote está armazenado e “nome_do_pacote” pelo nome do arquivo do pacote.

Alternativamente, você pode clicar com o botão direito do mouse, selecionar “Abrir Com Outro Aplicativo” e escolher um aplicativo de interface gráfica de sua preferência.

💡 Dica: Em Ubuntu, você pode ver uma lista de pacotes instalados com dpkg --list.

Parte 8: Tópicos Avançados do Linux

8.1. Gerenciamento de Usuários

Pode haver múltiplos usuários com níveis de acesso diferentes em um sistema. Em Linux, o usuário root tem o nível máximo de acesso e pode realizar qualquer operação no sistema. Usuários regulares têm acesso limitado e somente podem realizar operações para as quais têm permissão.

O que é um usuário?

Uma conta de usuário fornece separação entre diferentes pessoas e programas que podem executar comandos.

Humanos identificam usuários por um nome, já que os nomes são fáceis de trabalhar. Mas o sistema identifica usuários the um número único chamado de ID de Usuário (UID).

Quando usuários humanos logram no sistema usando o nome de usuário fornecido, eles precisam usar uma senha para autorizarem-se.

As contas de usuário formam as fundações da segurança do sistema. A propriedade de arquivos está também associada às contas de usuário e impõe controle de acesso aos arquivos. Cada processo tem uma conta de usuário associada que fornece um nível de controle para os administradores.

  1. Existem três tipos principais de contas de usuário:
  2. Superusuário: O superusuário tem acesso total ao sistema. O nome do superusuário é root. Ele tem um UID de 0.
  3. Usuário do sistema: O usuário do sistema tem contas de usuário usadas para executar serviços do sistema. Essas contas são usadas para executar serviços do sistema e não estão destinadas à interação humana.

Usuário regular: Os usuários regulares são usuários humanos que têm acesso ao sistema.

id
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),24(cdrom),27(sudo),30(dip)... output truncated

O comando id exibe o ID de usuário e o ID de grupo do usuário atual.

id username

Para visualizar a informação básica de outro usuário, passe o nome de usuário como um argumento para o comando id.

ps -u
Para visualizar informações relacionadas a usuários para processos, use o comando ps com a flag -u.
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  16968  3920 ?        Ss   18:45   0:00 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    18:45   0:00 [kthreadd]

# Saída

Por padrão, os sistemas usam o arquivo /etc/passwd para armazenar informações de usuários.

root:x:0:0:root:/root:/bin/bash

Aqui está uma linha do arquivo /etc/passwd:

  1. O arquivo /etc/passwd contém as seguintes informações sobre cada usuário:
  2. Nome de usuário: root – O nome de usuário da conta de usuário.
  3. Senha: x – A senha do usuário em formato criptografado que é armazenada no arquivo /etc/shadow por questões de segurança.
  4. ID de usuário (UID): 0 – O identificador numérico único da conta de usuário.
  5. ID do grupo (GID): 0 – O identificador primário do grupo da conta de usuário.
  6. Informações do usuário: root – O nome real da conta de usuário.
  7. Diretório pessoal: /root – O diretório pessoal da conta de usuário.

Shell: /bin/bash – O shell padrão para a conta de usuário. Um usuário do sistema pode usar /sbin/nologin se as entradas interativas não forem permitidas para esse usuário.

O que é um grupo?

Um grupo é uma coleção de contas de usuário que compartilham acesso e recursos. Os grupos têm nomes de grupo para os identificar. O sistema identifica os grupos the um número único chamado ID de grupo (GID).

Por padrão, as informações sobre os grupos são armazenadas no arquivo /etc/group.

adm:x:4:syslog,john

Aqui está uma entrada do arquivo /etc/group:

  1. Aqui é a análise das colunas na entrada dada:
  2. Nome do grupo: adm – O nome do grupo.
  3. Senha: x – A senha do grupo é armazenada no arquivo /etc/gshadow por motivos de segurança. A senha é opcional e parece vazia se não for definida.
  4. Grupo ID (GID): 4 – Identificador numérico único para o grupo.

Membros do grupo: syslog,john – Lista de nomes de usuário que são membros do grupo. Neste caso, o grupo adm tem dois membros: syslog e john.

Nesta entrada específica, o nome do grupo é adm, o ID do grupo é 4, e o grupo tem dois membros: syslog e john. O campo senha é normalmente definido como x para indicar que a senha do grupo está armazenada no arquivo /etc/gshadow.

  • Os grupos são divididos em ‘principal’ e ‘complementares’.
  • Grupo Principal: Cada usuário é atribuído a um grupo principal por padrão. Este grupo normalmente tem o mesmo nome do usuário e é criado quando a conta de usuário é criada. Os arquivos e diretórios criados pelo usuário normalmente pertencem a este grupo principal.

Grupos Complementares: Estes são grupos extras aos quais um usuário pode pertencer, além do seu grupo primário. Os usuários podem ser membros de vários grupos complementares. Esses grupos permitem que um usuário tenha permissões para recursos compartilhados entre esses grupos. Eles ajudam a fornecer acesso a recursos compartilhados sem afetar as permissões de arquivo do sistema e mantendo a integridade da segurança. Enquanto um usuário deve pertencer a um único grupo primário, afiliação a grupos complementares é opcional.

Controle de acesso: encontrar e entender as permissões de arquivo

A propriedade de arquivo pode ser visualizada usando o comando ls -l. A primeira coluna na saída do comando ls -l mostra as permissões do arquivo. Outras colunas mostram o dono do arquivo e o grupo ao qual o arquivo pertence.

Vamos olhar mais de perto na coluna modo:

  • Modo define duas coisas:
  • Tipo de arquivo: O tipo de arquivo define o tipo do arquivo. Para arquivos regulares que contêm dados simples é em branco -. Para outros tipos de arquivos especiais o símbolo é diferente. Para um diretório, que é um arquivo especial, é d. Arquivos especiais são tratados de forma diferente pelo SO.

Classes de permissão: O próximo conjunto de caracteres define as permissões para o usuário, grupo e outros, respectivamente.
Usuário: Este é o proprietário do arquivo e o proprietário do arquivo pertence a esta classe.
Grupo: Os membros do grupo do arquivo pertencem a esta classe
Outros: Qualquer usuário que não faça parte das classes de usuário ou grupo pertence a esta classe.

💡Dica: A propriedade do diretório pode ser visualizada usando o comando ls -ld.

Como ler as permissões simbólicas ou as permissões rwx

  • A representação rwx é conhecida como representação simbólica de permissões. No conjunto de permissões,
  • r representa ler. É indicado no primeiro caractere da tripla.
  • w representa escrever. É indicado no segundo caractere da tripla.

x representa execução. É indicado no terceiro caractere da tripla.

Leitura:

Para arquivos normais, as permissões de leitura permitem que o arquivo seja aberto e lido apenas. Os usuários não podem modificar o arquivo.

Similarmente para diretórios, as permissões de leitura permitem a listagem do conteúdo do diretório sem qualquer modificação no diretório.

Escrita:

Quando os arquivos têm permissões de escrita, o usuário pode modificar (editar, excluir) o arquivo e salvá-lo.

Para pastas, as permissões de escrita permitem que um usuário modifique seu conteúdo (criar, excluir e renomear os arquivos dentro dela), e modificar o conteúdo de arquivos para os quais o usuário tem permissões de escrita.

Exemplos de permissões no Linux

  • Agora que sabemos como ler as permissões, vamos ver alguns exemplos.
  • -rw-rw-r--: Um arquivo que pode ser modificado por seu proprietário e grupo, mas não por outros.

drwxrwx---: Um diretório que pode ser modificado pelo proprietário e pelo grupo.

Executar:

Para arquivos, as permissões de execução permitem que o usuário execute um script executável. Para diretórios, o usuário pode acessá-los e obter detalhes sobre os arquivos no diretório.

Como alterar permissões e propriedade de arquivos no Linux usando chmod e chown

Agora que conhecemos os conceitos básicos de propriedade e permissões, vamos ver como podemos modificar permissões usando o comando chmod.

chmod permissions filename

Sintaxe dechmod:

  • onde,
  • permissões podem ser ler, escrever, executar ou uma combinação delas.

nome_do_arquivo é o nome do arquivo para o qual as permissões precisam ser alteradas. Este parâmetro também pode ser uma lista de arquivos para alterar as permissões em massa.

  1. Podemos alterar as permissões usando dois modos:
  2. Modo simbólico: este método usa símbolos como u, g, o para representar usuários, grupos e outros. Permissões são representadas como r, w, x para ler, gravar e executar, respectivamente. Você pode modificar permissões usando +, – e =.

Modo absoluto: este método representa permissões como números octais de 3 dígitos que variam de 0 a 7.

Agora, vamos ver detalhes.

Como mudar permissões usando o modo simbólico

A tabela abaixo resume a representação do usuário: REPRESENTAÇÃO DE USUÁRIO
u DESCRIÇÃO
g dono/usuário
o grupo

outro

Nós podemos usar operadores matemáticos para adicionar, remover e atribuir permissões. A tabela abaixo mostra o resumo: OPERADOR
DESCRIÇÃO +
Adiciona uma permissão a um arquivo ou diretório
Remove a permissão \=

Define a permissão se não estiver presente antes. Também substitui as permissões se definidas anteriormente.

Exemplo:

Suponha que eu tenha um script e quero torná-lo executável para o proprietário do arquivo zaira.

As permissões atuais do arquivo são as seguintes:

Vamos dividir as permissões assim:

chmod u+x mymotd.sh

Para adicionar direitos de execução (x) ao proprietário (u) usando o modo simbólico, podemos usar o comando abaixo:

Saída:

Agora, podemos ver que as permissões de execução foram adicionadas para o proprietário zaira.

  • Exemplos adicionais para alterar permissões via método simbólico:
  • Removendo permissão de leitura e escrita para grupo e outros: chmod go-rw.
  • Removendo permissões de leitura para outros: chmod o-r.
Atribuindo permissão de escrita ao grupo e substituindo a permissão existente: chmod g=w.

Como Alterar Permissões usando o Modo Absoluto

Modo absoluto utiliza números para representar permissões e operadores matemáticos para modificá-las.

A tabela abaixo mostra como podemos atribuir permissões relevantes: PERMISSÃO
CONCEDER PERMISSÃO ler
adicionar 4 escrever
adicionar 2 executar

adicionar 1

As permissões podem ser revogadas usando a subtração. A tabela abaixo mostra como você pode remover permissões relevantes. PERMISSÃO
REVOCAR PERMISSÃO ler
subtrair 4 escrever
subtrair 2 executar

subtrair 1

  • Exemplo:

Definir ler (adicionar 4) para usuário, ler (adicionar 4) e executar (adicionar 1) para grupo, e apenas executar (adicionar 1) para outros.

chmod 451 nome-do-arquivo

É assim que realizamos o cálculo:

  • Observe que isso é o mesmo que r--r-x--x.

Remover os direitos de execução de outros e grupo.

  • Para remover a execução de outros e grupo, subtraia 1 da parte de execução dos últimos 2 octetos.

Atribua leitura, escrita e execução ao usuário, leitura e execução ao grupo e somente leitura a outros.

Isso seria o mesmo que rwxr-xr--.

Como alterar a propriedade usando o comando chown

Em seguida, vamos aprender a alterar a propriedade de um arquivo. Você pode alterar a propriedade de um arquivo ou pasta usando o comando chown. Em alguns casos, alterar a propriedade requer permissões de sudo.

chown user filename
Sintaxe do chown:

Como alterar a propriedade de usuário com chown

Vamos transferir a propriedade do usuário zaira para o usuário news.

chown news mymotd.sh

Comando para alterar a propriedade: sudo chown news mymotd.sh.

Output:

Como alterar o usuário e o grupo de propriedade simultaneamente

chown user:group filename
Nós também podemos usar chown para alterar usuário e grupo simultaneamente.

Como alterar a propriedade de um diretório

chown -R admin /opt/script
Você pode alterar a propriedade recursivamente para os conteúdos em um diretório. O exemplo abaixo altera a propriedade da pasta /opt/script para permitir o usuário admin.

Como alterar a propriedade de grupo

chown :admins /opt/script
Caso precisemos apenas alterar o proprietário do grupo, podemos usar chown precedendo o nome do grupo por um dois pontos :

Como trocar entre usuários

[user01@host ~]$ su user02
Password:
[user02@host ~]$
Você pode alternar entre usuários usando o comando su.

Como obter acesso de superusuário

O superusuário ou usuário root tem o nível máximo de acesso em um sistema Linux. O usuário root pode executar qualquer operação no sistema. O usuário root pode acessar todos os arquivos e diretórios, instalar e remover software, e modificar ou sobrescrevê-las configurações do sistema.

Com grande poder vem grande responsabilidade. Se o usuário root for comprometido, alguém pode obter o controle total sobre o sistema. É recomendável usar a conta de usuário root apenas quando necessário.

[user01@host ~]$ su
Password:
[root@host ~]Se você omitir o nome de usuário, o comando su altera padrão para a conta de usuário root.

#

Outra variação do comando su é su -. O comando su altera para a conta de usuário root mas não muda as variáveis de ambiente. O comando su - altera para a conta de usuário root e muda as variáveis de ambiente para as do usuário alvo.

Executando comandos com sudo

Para executar comandos com o usuário root sem alterar a conta de usuário root, você pode usar o comando sudo. O comando sudo permite que você execute comandos com privilégios elevados.

Executar comandos com sudo é uma opção mais segura do que executar comandos como o usuário root. Isso porque, apenas um conjunto específico de usuários pode ser concedido permissão para executar comandos com sudo. Isso é definido no arquivo /etc/sudoers.

Também, sudo registra todos os comandos executados com ele, fornecendo uma trajetória de auditoria de quem executou quais comandos e quando.

cat /var/log/auth.log | grep sudo

Em Ubuntu, você pode encontrar os registros de auditoria aqui:

user01 is not in the sudoers file.  This incident will be reported.

Para um usuário que não tem acesso a sudo, ele é marcado nos logs e exibe uma mensagem como esta:

Gerenciando contas de usuário locais

Criando usuários pela linha de comando

sudo useradd username

O comando usado para adicionar um novo usuário é:

Este comando configura a pasta pessoal do usuário e cria um grupo privado designado pela identificação do usuário. Atualmente, a conta está sem uma senha válida, impedindo o usuário de fazer login até que uma senha seja criada.

Modificando usuários existentes

O comando usermod é usado para modificar usuários existentes. Aqui estão algumas das opções comuns usadas com o comando usermod:

  1. Aqui estão alguns exemplos do comando usermod em Linux:
  2. Mudar o nome de login de um usuário:
  3. Alterar o diretório pessoal de um utilizador:
  4. Adicionar um utilizador a um grupo suplementar:
  5. Alterar a shell de um utilizador:
  6. Bloquear a conta de um utilizador:
  7. Desbloquear a conta de um usuário:
  8. Definir uma data de expiração para uma conta de usuário:
  9. Alterar o ID de usuário (UID) de um usuário:
  10. Alterar o grupo primário de um usuário:
Remover um usuário the um grupo complementar:

Excluindo usuários

  • O comando userdel é usado para excluir uma conta de usuário e arquivos relacionados do sistema.
  • sudo userdel username: remove os detalhes do usuário de /etc/passwd mas mantém o diretório pessoal do usuário.
O comando sudo userdel -r username remove os detalhes do usuário de /etc/passwd e também exclui o diretório pessoal do usuário.

Alterando as senhas de usuário

  • O comando passwd é usado para alterar a senha de um usuário.

sudo passwd username: define a senha inicial ou altera a senha existente de username. Também é usado para alterar a senha do usuário logado atualmente.

8.2 Conectando a Servidores remotos via SSH

Acessar servidores remotos é uma das tarefas essenciais para os administradores de sistemas. Você pode se conectar a diferentes servidores ou acessar bases de dados através de sua máquina local e executar comandos, todos usando SSH.

O que é o protocolo SSH?

SSH significa Secure Shell. É um protocolo de rede criptográfico que permite comunicação segura entre dois sistemas.

O porto padrão para SSH é 22.

  • As duas partes envolvidas na comunicação via SSH são:
  • O servidor: a máquina que você deseja acessar.

O cliente: O sistema de que você está acessando o servidor.

  1. A conexão com um servidor segue estes passos:
  2. Iniciar Conexão: O cliente envia uma solicitação de conexão ao servidor.
  3. Excange de Chaves: O servidor envia sua chave pública ao cliente. Ambos concordam em usar os métodos de criptografia.
  4. Geração de Chave de Sessão: O cliente e o servidor usam o acordo de chave Diffie-Hellman para criar uma chave de sessão compartilhada.
  5. Autenticação do Cliente: O cliente se conecta ao servidor usando uma senha, chave privada ou outro método.

Comunicação Segura: Após a autenticação, o cliente e o servidor se comunicam de forma segura com criptografia.

Como conectar a um servidor remoto usando SSH?

O comando ssh é uma utilidade embutida no Linux e também a padrão. Ele torna o acesso a servidores bastante fácil e seguro.

Aqui, estamos falando de como o cliente faria uma conexão com o servidor.

  • Antes de conectar a um servidor, você precisa ter as seguintes informações:
  • O endereço IP ou o nome de domínio do servidor.
  • O nome de usuário e senha do servidor.

O número da porta que você tem acesso no servidor.

ssh username@server_ip

A sintaxe básica do comando ssh é:

ssh [email protected]

Por exemplo, se seu nome de usuário for john e o IP do servidor for 192.168.1.10, o comando seria:

[email protected]'s password: 
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-70-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Jun  5 10:17:32 UTC 2024

  System load:  0.08               Processes:           122
  Usage of /:   12.3% of 19.56GB   Users logged in:     1
  Memory usage: 53%                IP address for eth0: 192.168.1.10
  Swap usage:   0%

Last login: Fri Jun  5 09:34:56 2024 from 192.168.1.2
john@hostname:~$ Depois disso, você será solicitado a digitar a senha secreta. Sua tela ficará semelhante a esta:

# início para entrar em comandos

Agora você pode executar os comandos relevantes no servidor 192.168.1.10.

ssh -p port_number username@server_ip

⚠️ A porta padrão para ssh é 22, mas também é vulnerável, pois os hackers provavelmente tentarão aqui primeiro. Seu servidor pode expor outra porta e compartilhar o acesso com você. Para se conectar a uma porta diferente, use a bandeira -p.

8.3. Análise e análise avançada de logs

Arquivos de log, quando configurados, são gerados pelo seu sistema para uma variedade de razões úteis. Eles podem ser usados para rastrear eventos do sistema, monitorar o desempenho do sistema e solucionar problemas. São específicamente úteis para administradores de sistema, onde eles podem rastrear erros de aplicação, eventos de rede e atividade do usuário.

Aqui está um exemplo de um arquivo de log:
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 DEBUG Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 WARN Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 DEBUG API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated

# exemplo de arquivo de log

  • Um arquivo de log geralmente contém as seguintes colunas:
  • Data e hora: A data e hora em que o evento ocorreu.
  • Nível de log: A gravidade do evento (INFO, DEBUG, WARN, ERROR).
  • Componente: O componente do sistema que gerou o evento (Startup, Config, Database, User, Security, Network, Email, API, Session, Shutdown).
  • Mensagem: Uma descrição do evento que ocorreu.

Informação Adicional: Informações adicionais relacionadas ao evento.

Em sistemas de tempo real, arquivos de log tendem a ter milhares de linhas e são gerados a cada segundo. Eles podem ser muito detalhados, dependendo da configuração. Cada coluna em um arquivo de log é uma peça de informação que pode ser usada para rastrear problemas. Isso torna os arquivos de log difíceis de ler e entender manualmente.

É aí que entra o parsing de log. O parsing de log é o processo de extrair informações úteis de arquivos de log. Ele envolve quebrar os arquivos de log em partes menores e mais gerenciáveis e extrair as informações relevantes.

A informação filtrada também pode ser útil para criar alertas, relatórios e painéis.

Nesta seção, você explorará algumas técnicas para parsear arquivos de log no Linux.

Extração de texto usando grep

O grep é uma ferramenta embutida no bash. Ele significa “global regular expression print”. O grep é usado para corresponder a strings em arquivos.

  1. Veja alguns usos comuns do grep:
  2. Este comando busca por “search_string” no arquivo chamado filename.
  3. Este comando busca por “search_string" em todos os arquivos dentro do diretório especificado e seus subdiretórios.
  4. Este comando realiza uma busca insensível a maiúsculas e minúsculas por “search_string” no arquivo chamado filename.
  5. Este comando mostra os números de linha juntamente com as linhas correspondentes no arquivo chamado filename.
  6. Este comando conta o número de linhas que contêm “search_string” no arquivo chamado filename.
  7. Este comando exibe todas as linhas que não contêm “search_string” no arquivo chamado filename.
  8. Este comando pesquisa pela palavra inteira “palavra” no arquivo chamado filename.

Este comando permite o uso de expressões regulares estendidas para correspondência de padrões mais complexos no arquivo chamado filename.

💡 Dica: Se existirem vários arquivos em uma pasta, você pode usar o comando abaixo para encontrar a lista de arquivos que contêm as strings desejadas.
grep -l "String to Match" /path/to/directory

# encontrar a lista de arquivos que contêm as strings desejadas

Extracção de texto usando sed

sed significa “editor de stream”. Ele processa os dados de forma fluxo-wise, o que significa que lê os dados uma linha de cada vez. sed permite que você procure padrões e execute ações nas linhas que correspondem a esses padrões.

Sintaxe básica dosed:

sed [options] 'command' file_name

A sintaxe básica de sed é a seguinte:

Aqui, command é usado para executar operações como substituição, exclusão, inserção, e assim por diante, nos dados de texto. O nome do arquivo é o nome do arquivo que você deseja processar.

seduso:

1. Substituição:

sed 's/old-text/new-text/' filename

O sinalizador s é usado para substituir texto. O old-text é substituído por new-text:

sed 's/error/warning/' system.log

Por exemplo, para alterar todas as ocorrências de “error” para “warning” no arquivo de log system.log:

2. Impressão de linhas contendo um padrão específico:

sed -n '/pattern/p' filename

Usando sed para filtrar e exibir linhas que correspondem a um padrão específico:

sed -n '/ERROR/p' system.log

Por exemplo, para encontrar todas as linhas contendo “ERROR”:

3. Exclusão de linhas contendo um padrão específico:

sed '/pattern/d' filename

Você pode excluir linhas da saída que correspondem a um padrão específico:

sed '/DEBUG/d' system.log

Por exemplo, para remover todas as linhas contendo “DEBUG”:

4. Extração de campos específicos de uma linha de log:

sed -n 's/^\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p' system.log

Você pode usar expressões regulares para extrair partes das linhas. Suponha que cada linha de log comece com uma data no formato “YYYY-MM-DD”. Você poderia extrair apenas a data de cada linha:

Análise de texto com awk

O awk tem a habilidade de dividir facilmente cada linha em campos. É bem adequado para processar textos estruturados, como arquivos de log.

Sintaxe básica doawk

awk 'pattern { action }' file_name

A sintaxe básica do awk é:

Aqui, pattern é uma condição que deve ser atendida para que a ação seja executada. Se o padrão for omitido, a ação é executada em todas as linhas.

2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
  INFO
  • Nos exemplos seguintes, você usará este arquivo de log como exemplo:

Acessando colunas usandoawk

zaira@zaira-ThinkPad:~$ awk '{ print $1 }' sample.log
Os campos em awk (separados por espaços por padrão) podem ser acessados usando $1, $2, $3, e assim por diante.
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25

zaira@zaira-ThinkPad:~$ awk '{ print $2 }' sample.log
# saída
09:00:00
09:01:00
09:02:00
09:03:00
09:04:00
09:05:00
09:06:00
09:07:00
09:08:00
09:09:00
  • # saída
awk '/ERROR/ { print $0 }' logfile.log

Imprime linhas contendo um padrão específico (por exemplo, ERROR)
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)

# saída

  • Isso imprime todas as linhas que contêm “ERROR”.
awk '{ print $1, $2 }' logfile.log
Extrai o primeiro campo (Data e Hora)
2024-04-25 09:00:00
2024-04-25 09:01:00
2024-04-25 09:02:00
2024-04-25 09:03:00
2024-04-25 09:04:00
2024-04-25 09:05:00
2024-04-25 09:06:00
2024-04-25 09:07:00
2024-04-25 09:08:007
2024-04-25 09:09:00

# saída

  • Isso irá extrair os primeiros dois campos de cada linha, que neste caso seriam a data e a hora.
awk '{ count[$3]++ } END { for (level in count) print level, count[level] }' logfile.log

Resumir ocorrências de cada nível de log
 1
WARN 1
ERROR 1
DEBUG 2
INFO 6

# saída

  • A saída será um resumo do número de ocorrências de cada nível de log.
awk '{ $3="INFO"; print }' sample.log


Filtre campos específicos (por exemplo, onde o 3º campo é INFO)

2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
  INFO

# saída

Este comando irá extrair todas as linhas onde o 3º campo é “INFO”.

💡 Dica: O separador padrão no awk é um espaço. Se o seu arquivo de log usa um separador diferente, você pode especificá-lo usando a opção -F. Por exemplo, se o seu arquivo de log usa dois pontos como separador, você pode usar awk -F: '{ print $1 }' arquivo.log para extrair o primeiro campo.

Análise de arquivos de log com cut

O comando cut é um comando simples mas poderoso usado para extrair seções de texto de cada linha de entrada. Como os arquivos de log são estruturados e cada campo é delimitado por um caractere específico, como um espaço, uma tabulação, ou um delimitador personalizado, o cut faz um bom trabalho em extrair esses campos específicos.

cut [options] [file]

A sintaxe básica do comando cut é:

  • Algumas opções comumente usadas para o comando cut:
  • -d : Especifica um delimitador usado como separador de campos.
  • -f : Seleciona os campos a serem exibidos.

-c : Especifica posições de caracteres.

cut -d ' ' -f 1 logfile.log

Por exemplo, o comando abaixo extrairia o primeiro campo (separado por um espaço) de cada linha do arquivo de log:

Exemplos de usocutpara análise de logs

2024-04-25 08:23:01 INFO 192.168.1.10 User logged in successfully.
2024-04-25 08:24:15 WARNING 192.168.1.10 Disk usage exceeds 90%.
2024-04-25 08:25:02 ERROR 10.0.0.5 Connection timed out.
...

Suponha que você tenha um arquivo de log estruturado da seguinte forma, onde os campos são separados por espaço:

  1. cut pode ser usado da seguinte maneira:
cut -d ' ' -f 2 system.log

Extraindo o horário de cada entrada de log:
08:23:01
08:24:15
08:25:02
...

# Saída

  1. Este comando usa um espaço como delimitador e seleciona o segundo campo, que é o componente de tempo de cada entrada de log.
cut -d ' ' -f 4 system.log

Extraindo os endereços IP dos logs:
192.168.1.10
192.168.1.10
10.0.0.5

# Saída

  1. Este comando extrai o quarto campo, que é o endereço IP de cada entrada de log.
cut -d ' ' -f 3 system.log

Extraindo níveis de log (INFO, WARNING, ERROR):
INFO
WARNING
ERROR

# Saída

  1. Isso extrai o terceiro campo que contém o nível de log.

Combinandocutcom outros comandos:

grep "ERROR" system.log | cut -d ' ' -f 1,2 

A saída de outros comandos pode ser encaminhada para o comando cut. Digamos que você queira filtrar logs antes de cortar. Você pode usar grep para extrair linhas contendo "ERROR" e então usar cut para obter informações específicas dessas linhas:
2024-04-25 08:25:02

# Saída

  1. Este comando primeiro filtra as linhas que incluem “ERRO”, em seguida, extrai a data e a hora destas linhas.

Extraindo múltiplos campos:

cut -d ' ' -f 1,2,3 system.log` 

É possível extrair múltiplos campos de uma só vez especificando um intervalo ou uma lista separada por vírgulas de campos:
2024-04-25 08:23:01 INFO
2024-04-25 08:24:15 WARNING
2024-04-25 08:25:02 ERROR
...

# Saída

O comando acima extrai os primeiros três campos de cada entrada de log que são a data, a hora e o nível de log.

Análise de arquivos de log com sort e uniq

Ordenar e remover duplicatas são operações comuns quando se trabalha com arquivos de log. Os comandos sort e uniq são comandos poderosos usados para ordenar e remover duplicatas do input, respectivamente.

Sintaxe básica do sort

sort [options] [file]

O comando sort organiza as linhas de texto alfabeticamente ou numéricamente.

  • Algumas opções chave para o comando sort:
  • -n: Ordena o arquivo assumindo que o conteúdo é numérico.
  • -r: Inverte a ordem de ordenação.
  • -k: Especifica uma chave ou número da coluna para ordenar.

-u: Ordena e remove linhas duplicadas.

O comando uniq é usado para filtrar ou contar e relatar linhas repetidas em um arquivo.

uniq [options] [input_file] [output_file]

A sintaxe de uniq é:

  • Algumas opções-chave para o comando uniq são:
  • -c: Prefixa as linhas pelo número de ocorrências.
  • -d: Imprime apenas as linhas duplicadas.

-u: Imprime apenas as linhas únicas.

Exemplos de uso de sort e uniq juntos para análise de logs

2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-26 ERROR Connection timed out.
  1. Suponha os seguintes exemplos de entradas de log para essas demonstrações:
sort system.log

Ordenando entradas de log por data:
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.

# Saída

  1. Isso ordena as entradas de log alfabeticamente, o que efetivamente as ordena por data se a data é o primeiro campo.
sort system.log | uniq

Ordenando e removendo duplicatas:
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.

# Saída

  1. Este comando ordena o arquivo de log e o direciona para o uniq, removendo linhas duplicadas.
sort system.log | uniq -c

Contando ocorrências de cada linha:
2 2024-04-25 INFO User logged in successfully.
1 2024-04-25 WARNING Disk usage exceeds 90%.
2 2024-04-26 ERROR Connection timed out.
1 2024-04-26 INFO Scheduled maintenance.

# Saída

  1. Ordena as entradas de log e então conta cada linha única. De acordo com a saída, a linha '2024-04-25 INFO Usuário logado com sucesso.' apareceu 2 vezes no arquivo.
sort system.log | uniq -u

Identificando entradas de log únicas:

2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 INFO Scheduled maintenance.

# Saída

  1. Este comando mostra linhas que são únicas.
sort -k2 system.log

Ordenando por nível de log:
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-25 WARNING Disk usage exceeds 90%.

# Saída

Ordena as entradas com base no segundo campo, que é o nível de log.

8.4. Gerenciando Processos do Linux via Linha de Comando

  • Um processo é uma instância em execução de um programa. Um processo consiste em:
  • Um espaço de endereço de memória alocado.
  • Estados do processo.

Propriedades como propriedade, atributos de segurança e uso de recursos.

  • Um processo também tem um ambiente que consiste em:
  • Variáveis locais e globais
  • O contexto de escalonamento atual

Recursos do sistema alocados, como portas de rede ou descritores de arquivo.

Quando você executa o comando ls -l, o sistema operacional cria um novo processo para executar o comando. O processo tem um ID, um estado e executa até que o comando seja concluído.

Compreendendo a criação de processos e o ciclo de vida

Em Ubuntu, todos os processos originam-se do processo inicial do sistema chamado systemd, que é o primeiro processo iniciado pela kernel durante o boot.

O processo systemd tem um identificador de processo (PID) de 1 e é responsável pela inicialização do sistema, pelo início e gerenciamento de outros processos, e pelo tratamento de serviços do sistema. Todos os outros processos no sistema são descendentes de systemd.

Um processo pai duplica o seu próprio espaço de endereços (fork) para criar uma nova estrutura de processo (filho). Cada novo processo é atribuído um identificador de processo único (PID) para fins de rastreio e de segurança. O PID e o identificador de processo do pai (PPID) fazem parte do ambiente do novo processo. qualquer processo pode criar um processo filho.

Através da rotina de fork, um processo filho herda identidades de segurança, descritores de arquivo anteriores e atuais, privilégios de porta e recursos, variáveis de ambiente e código do programa. Um processo filho pode então executar seu próprio código de programa.

Tipicamente, um processo pai dorme enquanto o processo filho executa, definindo uma solicitação (wait) para ser notificado quando o filho termina.

Após sair, o processo filho já fechou ou descartou seus recursos e ambiente. O único recurso restante, conhecido como zumbi, é uma entrada na tabela de processos. O processo pai, assinalado acordado quando o filho sai, limpa a tabela de processos da entrada do filho, liberando assim o último recurso do processo filho. O processo pai então continua executando seu próprio código de programa.

Entender os estados de processos

Processos em Linux assumem diferentes estados durante seu ciclo de vida. O estado de um processo indica o que o processo está fazendo atualmente e como está interagindo com o sistema. Os processos transitam entre estados baseado em seu status de execução e no algoritmo de agendamento do sistema.

Os processos the um sistema Linux podem estar em um dos seguintes estados: Estado
Descrição (new)
Estado inicial quando um processo é criado via chamada de sistema fork. Executável (pronto) (R)
Processo está pronto para executar e aguardando ser agendado em um CPU. Executando (usuário) (R)
Processo está executando em modo de usuário, executando aplicações de usuário. Executando (kernel) (R)
Processo está executando em modo de kernel, manipulando chamadas de sistema ou interrupções de hardware. Dormindo (S)
Processo está aguardando um evento (por exemplo, operação de E/S) para ser concluído e pode ser acordado facilmente. Dormindo (inescavável) (D)
Processo está em um estado de dormência inescavável, aguardando uma condição específica (normalmente E/S) para ser concluída, e não pode ser interrompida por sinais. Dormindo (disco dormindo) (K)
Processo está aguardando operações de E/S de disco para serem concluídas. Dormindo (inativo) (I)
Processo está inativo, não está fazendo nenhuma tarefa, e aguardando um evento ocorrer. Parado (T)
A execução do processo foi interrompida, normalmente por um sinal, e pode ser retomada posteriormente. Zumbi (Z)

O processo concluiu a execução mas ainda tem uma entrada na tabela de processos, esperando que o seu pai leia seu status de saída.

Os processos transitem entre esses estados da seguinte forma: Transição
Descrição Fork
Cria um novo processo a partir de um processo pai, transicionando de (novo) para Executável (pronto) (R). Agendamento
O escalonador seleciona um processo executável, transicionando-o para o estado Executando (usuário) ou Executando (kernel). Executar
Processo transita de Executável (pronto) (R) para Executando (kernel) (R) quando agendado para execução. Preempção ou Reagendamento
Processo pode ser préemptado ou reagendado, retornando para o estado Executável (pronto) (R). Syscall
Processo faz uma chamada de sistema, transicionando de Executando (usuário) (R) para Executando (kernel) (R). Retorno
Processo conclui uma chamada de sistema e retorna para Executando (usuário) (R). Esperar
Processo espera por um evento, transicionando de Executando (kernel) (R) para um dos estados de Dormindo (S, D, K ou I). Evento ou Sinal
O processo é despertado por um evento ou sinal, movendo-o de um estado Dormindo de volta para Executável (pronto) (R). Suspender
O processo é suspenso, fazendo a transição de Executando (kernel) ou Executável (pronto) para Parado (T). Retomar
O processo é retomado, movendo-se de Parado (T) de volta para Executável (pronto) (R). Sair
O processo termina, fazendo a transição de Executando (usuário) ou Executando (kernel) para Zumbi (Z). Ceifar

O processo pai lê o status de saída do processo zumbi, removendo-o da tabela de processos.

Como visualizar processos

zaira@zaira:~$ ps aux
Você pode usar o comando ps juntamente com uma combinação de opções para visualizar processos em um sistema Linux. O comando ps é usado para exibir informações sobre uma seleção de processos ativos. Por exemplo, ps aux exibe todos os processos em execução no sistema.
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 168140 11352 ?        Ss   May21   0:18 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    May21   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   May21   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   May21   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<   May21   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I<   May21   0:00 [netns]
root          11  0.0  0.0      0     0 ?        I<   May21   0:00 [mm_percpu_wq]
root          12  0.0  0.0      0     0 ?        I    May21   0:00 [rcu_tasks_kthread]
root          13  0.0  0.0      0     0 ?        I    May21   0:00 [rcu_tasks_rude_kthread]
*... output truncated ....*

# Saída

  1. A saída acima mostra uma captura instantânea dos processos em execução no sistema. Cada linha representa um processo com as seguintes colunas:
  2. USUÁRIO: O usuário que é proprietário do processo.
  3. PID: O ID do processo.
  4. %CPU: O uso da CPU pelo processo.
  5. %MEM: A utilização de memória do processo.
  6. VSZ: O tamanho da memória virtual do processo.
  7. RSS: O tamanho do conjunto residente, ou seja, a memória física não trocada que uma tarefa tem usado.
  8. TTY: O terminal de controle do processo. Um ? indica que não há um terminal de controle.
  9. Ss: Líder de sessão. Este é um processo que iniciou uma sessão e é líder de um grupo de processos e pode controlar sinais do terminal. O primeiro S indica o estado de espera, e o segundo s indica que é líder de sessão.
  10. START: O tempo ou data de início do processo.
  11. TIME: O tempo total de CPU.

COMANDO: O comando que iniciou o processo.

Processos em plano de fundo e em primeiro plano

Nesta seção, você aprenderá como pode controlar tarefas executando-as em plano de fundo ou em primeiro plano.

Uma tarefa é um processo iniciado por uma shell. Quando você executa um comando no terminal, ele é considerado uma tarefa. Uma tarefa pode executar-se em primeiro plano ou em plano de fundo.

  1. Para demonstrar o controle, você primeiro criará 3 processos e então os executará em plano de fundo. Depois, você listará os processos e alternará entre o primeiro plano e o plano de fundo. Você verá como pode pausar ou encerrar completamente.

Criar Três Processos

Abra um terminal e inicie três processos de longa duração. Use o comando sleep, que mantém o processo em execução por um número especificado de segundos.
sleep 300 &
sleep 400 &
sleep 500 &

# execute o comando sleep por 300, 400 e 500 segundos

  1. O caractere & no final de cada comando move o processo para o plano de fundo.

Exibir Tarefas em Plano de Fundo

jobs

Use o comando jobs para exibir a lista de tarefas em plano de fundo.

jobs
[1]   Running                 sleep 300 &
[2]-  Running                 sleep 400 &
[3]+  Running                 sleep 500 &
  1. A saída deve parecer algo como isto:

Trazer uma Tarefa em Plano de Fundo para o Primeiro Plano

fg %1

Para trazer uma tarefa em plano de fundo para o primeiro plano, use o comando fg seguido pelo número da tarefa. Por exemplo, para trazer a primeira tarefa (sleep 300) para o primeiro plano:

  1. Isso traz a tarefa 1 para o primeiro plano.

Mover a Tarefa em Primeiro Plano de volta para o Plano de Fundo

Enquanto o trabalho está sendo executado em primeiro plano, você pode suspendê-lo e movê-lo para o plano de fundo pressionando Ctrl+Z para suspender o trabalho.

zaira@zaira:~$ fg %1
sleep 300

^Z
[1]+  Stopped                 sleep 300

zaira@zaira:~$ jobs
Um trabalho suspenso ficará assim:
[1]+  Stopped                 sleep 300
[2]   Running                 sleep 400 &
[3]-  Running                 sleep 500 &

# trabalho suspenso

Agora use o comando bg para retomar o trabalho com ID 1 em segundo plano.
# Pressione Ctrl+Z para suspender o trabalho em primeiro plano
bg %1
  1. # Então, retome-o em segundo plano
jobs
[1]   Running                 sleep 300 &
[2]-  Running                 sleep 400 &
[3]+  Running                 sleep 500 &

Exiba os trabalhos novamente

  • Neste exercício, você:
  • Iniciou três processos em segundo plano usando comandos sleep.
  • Usou o comando jobs para exibir a lista de trabalhos em segundo plano.
  • trouxe um trabalho para o primeiro plano com fg %número_do_trabalho.
  • Suspendeu o trabalho com Ctrl+Z e o moveu de volta para o plano de fundo com bg %número_do_trabalho.

Usou o comando jobs novamente para verificar o status dos trabalhos em segundo plano.

Agora você sabe como controlar os trabalhos.

Matando processos

É possível encerrar um processo não responsivo ou indesejado usando o comando kill. O comando kill envia um sinal para um ID de processo, solicitando que ele seja encerrado.

Há várias opções disponíveis com o comando kill.

kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) 
...terminated

# Opções disponíveis com o kill

  1. Aqui estão alguns exemplos do comando kill no Linux:
  2. Este comando envia o sinal padrão SIGTERM para o processo com PID 1234, solicitando que ele seja encerrado.
  3. Este comando envia o sinal padrão SIGTERM para todos os processos com o nome especificado.
  4. Este comando envia a sinal SIGKILL para o processo com PID 1234, terminando-o forçosamente.
  5. Este comando envia a sinal SIGSTOP para o processo com PID 1234, parando-o.

Este comando envia o sinal padrão SIGTERM para todos os processos do usuário especificado.

Esses exemplos demonstram várias maneiras de usar o comando kill para gerenciar processos em um ambiente Linux.

Aqui estão as informações sobre as opções e sinais do comando kill em forma de tabela: Esta tabela resume as opções e sinais mais comuns do comando kill usados no Linux para gerenciar processos. Comando / Opção Sinal
Descrição kill <pid> SIGTERM
Solicita que o processo termine graciosamente (sinal padrão). kill -9 <pid> SIGKILL
Força o processo a terminar imediatamente sem limpeza. kill -SIGKILL <pid> SIGKILL
Força o processo a terminar imediatamente sem limpeza. kill -15 <pid> SIGTERM
Envia explicitamente o sinal SIGTERM para solicitar uma terminação graciosa. kill -SIGTERM <pid> SIGTERM
Envia explicitamente o sinal SIGTERM para solicitar uma terminação graciosa. kill -1 <pid> SIGHUP
Tradicionalmente significa “desligar”; pode ser usado para recarregar arquivos de configuração. kill -SIGHUP <pid> SIGHUP
Tradicionalmente significa “desligar”; pode ser usado para recarregar arquivos de configuração. kill -2 <pid> SIGINT
Solicita que o processo termine (o mesmo que pressionar Ctrl+C no terminal). kill -SIGINT <pid> SIGINT
Solicita que o processo termine (o mesmo que pressionar Ctrl+C no terminal). kill -3 <pid> SIGQUIT
Causa o término do processo e produz um core dump para depuração. kill -SIGQUIT <pid> SIGQUIT
Causa o término do processo e produz um core dump para depuração. kill -19 <pid> SIGSTOP
Pausa o processo. kill -SIGSTOP <pid> SIGSTOP
Pausa o processo. kill -18 <pid> SIGCONT
Continua um processo pausado. kill -SIGCONT <pid> SIGCONT
Continua um processo pausado. killall <name> Varia
Envia um sinal para todos os processos com o nome fornecido. killall -9 <name> SIGKILL
Força a morte de todos os processos com o nome dado. pkill Variavel
Envia um sinal a processos com base em uma correspondência de padrão. pkill -9 SIGKILL
Força a morte de todos os processos que correspondem ao padrão. xkill SIGKILL

Utilidade gráfica que permite clicar em uma janela para matar o processo correspondente.

8.5. Streams de Entrada e Saída Padrão no Linux

  1. Ler uma entrada e escrever uma saída é uma parte essencial para entender a linha de comando e a escrita de scripts de shell. Em Linux, todos os processos têm três fluxos padrão por defeito:
  2. O descritor de arquivo para stdin é 0.
  3. Standard Output (stdout): This is the default output stream where a process writes its output. By default, the standard output is the terminal. The output can also be redirected to a file or another program. The file descriptor for stdout is 1.

Erro Padrão (stderr): Este é o stream de erro padrão onde um processo escreve suas mensagens de erro. Por padrão, o erro padrão é o terminal, permitindo que mensagens de erro sejam vistas mesmo se o stdout for redirecionado. O descritor de arquivo para stderr é 2.

Redirecionamento e Pipelines

Redirecionamento: Você pode redirecionar os streams de erro e saída para arquivos ou outros comandos. Por exemplo:
ls > output.txt

# Redirecionando stdout para um arquivo
ls non_existent_directory 2> error.txt

# Redirecionando stderr para um arquivo
ls non_existent_directory > all_output.txt 2>&1

# Redirecionando ambos stdout e stderr para um arquivo

  • Na última comando,
  • ls non_existent_directory: lista o conteúdo de um diretório chamado non_existent_directory.since este diretório não existe, `ls` gerará uma mensagem de erro.
  • > all_output.txt: O operador `>` redireciona a saída padrão (`stdout`) do comando `ls` para o arquivo `all_output.txt`. Se o arquivo não existir, ele será criado. Se já existir, seu conteúdo será sobrescrito.

2>&1:: Aqui, `2` representa o descritor de arquivo para erro padrão (`stderr`). `&1` representa o descritor de arquivo para saída padrão (`stdout`). O caractere `&` é usado para especificar que `1` não é o nome do arquivo, mas um descritor de arquivo.

Português:

Então, 2>&1 significa “redirecionar stderr (2) para onde stdout (1) está indo atualmente,” o que neste caso é o arquivo all_output.txt. Portanto, tanto a saída (se houvesse alguma) quanto a mensagem de erro do ls serão escritas em all_output.txt.

Pipelines:

ls | grep image
Você pode usar tubulações (|) para passar a saída de um comando como entrada para outro:
image-10.png
image-11.png
image-12.png
image-13.png
... Output truncated ...

# Saída

8.6 Automação no Linux – Automatize Tarefas com Jobs do Cron

O Cron é um utilitário poderoso para agendamento de tarefas disponível em sistemas operacionais semelhantes a Unix. Ao configurar o cron, você pode configurar tarefas automáticas para serem executadas diariamente, semanalmente, mensalmente, ou em outros momentos específicos. As capacidades de automação fornecidas pelo cron desempenham um papel crucial na administração de sistemas Linux.

O daemon crond (um tipo de programa de computador que funciona em segundo plano) habilita a funcionalidade do cron. O cron lê as crontab (tabelas cron) para executar scripts pré-definidos.

Usando uma sintaxe específica, você pode configurar um job do cron para agendar scripts ou outros comandos para serem executados automaticamente.

Quais são os jobs do cron no Linux?

Qualquer tarefa que você agenda através do cron é chamada de job do cron.

Agora, vamos ver como funcionam os jobs do cron.

Como controlar o acesso aos crons

Para usar jobs do cron, um administrador precisa permitir que jobs do cron sejam adicionados para usuários no arquivo /etc/cron.allow.

Se você receber uma mensagem como esta, significa que você não tem permissão para usar o cron.

Para permitir que o John use os crons, inclua seu nome no /etc/cron.allow. Crie o arquivo se ele não existir. Isso permitirá que o John crie e edite tarefas cron.

Os usuários também podem ser negados o acesso ao acesso a tarefas cron digitando seus nomes no arquivo /etc/cron.d/cron.deny.

Como adicionar tarefas cron no Linux

Primeiro, para usar tarefas cron, você precisará verificar o status do serviço cron. Se o cron não estiver instalado, você pode facilmente baixá-lo através do gerenciador de pacotes. Use isto apenas para verificar:
sudo systemctl status cron.service

# Verifique o serviço cron no sistema Linux

Sintaxe das tarefas cron

  • Os crontabs usam as seguintes flags para adicionar e listar tarefas cron:
  • crontab -e: edita entradas do crontab para adicionar, deletar ou editar tarefas cron.
  • crontab -l: lista todas as tarefas cron para o usuário atual.
  • crontab -u nomeusuario -l: lista os crons de outro usuário.

crontab -u nomeusuario -e: edita os crons de outro usuário.

Quando você lista os crons e eles existem, você verá algo como isto:
* * * * * sh /path/to/script.sh

# Exemplo de tarefa agendada

  • No exemplo acima,
* representa minuto(s) hora(s) dia(s) mês(es) dia da semana, respectivamente. Veja os detalhes desses valores abaixo: VALOR
DESCRIÇÃO Minutos 0-59
O comando será executado no minuto específico. Horas 0-23
O comando será executado na hora específica. Dias 1-31
Comandos serão executados nestes dias do mês. Meses 1-12
O mês em que as tarefas precisam ser executadas. Dias da Semana 0-6
  • Dias da semana em que os comandos serão executados. Aqui, 0 é Domingo.
  • sh representa que o script é um script bash e deve ser executado de /bin/bash.

/path/to/script.sh especifica o caminho para o script.

*   *   *   *   *  sh /path/to/script/script.sh
|   |   |   |   |              |
|   |   |   |   |      Command or Script to Execute        
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   | Day of the Week(0-6)
|   |   |   |
|   |   | Month of the Year(1-12)
|   |   |
|   | Day of the Month(1-31)  
|   |
| Hour(0-23)  
|
Min(0-59)

Abaixo está uma summary da sintaxe da tarefa agendada do cron:

Exemplos de tarefas agendadas

Abaixo estão alguns exemplos de agendamento de tarefas cron. AGENDAMENTO
VALOR AGENDADO 5 0 * 8 *
Às 00:05 em agosto. 5 4 * * 6
Às 04:05 de sábado. 0 22 * * 1-5

Às 22:00 em todos os dias da semana de segunda a sexta-feira.

Tudo bem se você não conseguir entender tudo de uma vez. Você pode praticar e gerar agendamentos de cron com o site crontab guru.

Como configurar um trabalho cron

  1. Nesta seção, vamos ver um exemplo de como agendar um script simples com um trabalho cron.
#!/bin/bash

echo `date` >> date-out.txt

Crie um script chamado date-script.sh que imprime a data e a hora do sistema e a adiciona a um arquivo. O script é mostrado abaixo:

chmod 775 date-script.sh

2. Torne o script executável, dando a ele permissões de execução.

3. Adicione o script ao crontab usando o comando crontab -e.

*/1 * * * * /bin/sh /root/date-script.sh

Aqui, agendamos para que ele seja executado a cada minuto.

cat date-out.txt
4. Verifique a saída do arquivo date-out.txt. De acordo com o script, a data do sistema deve ser impressa neste arquivo a cada minuto.
Wed 26 Jun 16:59:33 PKT 2024
Wed 26 Jun 17:00:01 PKT 2024
Wed 26 Jun 17:01:01 PKT 2024
Wed 26 Jun 17:02:01 PKT 2024
Wed 26 Jun 17:03:01 PKT 2024
Wed 26 Jun 17:04:01 PKT 2024
Wed 26 Jun 17:05:01 PKT 2024
Wed 26 Jun 17:06:01 PKT 2024
Wed 26 Jun 17:07:01 PKT 2024

# saída

Como solucionar problemas com crons

Os crons são realmente úteis, mas nem sempre funcionam como o esperado. Felizmente, existem alguns métodos eficazes que você pode usar para solucionar problemas com eles.

1. Verifique o agendamento.

Primeiro, você pode tentar verificar o agendamento que está configurado para o cron. Você pode fazer isso com a sintaxe que você viu nas seções acima.

2. Verifique os registros do cron.

Primeiro, você precisa verificar se o cron foi executado no horário pretendido ou não. No Ubuntu, você pode verificar isso a partir dos registros do cron localizados em /var/log/syslog.

Se houver uma entrada nestes registros no momento correto, significa que o cron foi executado de acordo com o agendamento definido por você.

1 Jun 26 17:02:01 zaira-ThinkPad CRON[27834]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
2 Jun 26 17:02:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
3 Jun 26 17:03:01 zaira-ThinkPad CRON[28255]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
4 Jun 26 17:03:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
5 Jun 26 17:04:01 zaira-ThinkPad CRON[28538]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)

Abaixo estão os registros do exemplo do nosso trabalho cron. Note a primeira coluna que mostra o carimbo de tempo. O caminho do script também é mencionado no final da linha. As linhas #1, 3 e 5 mostram que o script foi executado conforme o pretendido.

3. Redirecione a saída do cron para um arquivo.

Você pode redirecionar a saída do cron para um arquivo e verificar o arquivo para quaisquer erros possíveis.
* * * * * sh /path/to/script.sh &> log_file.log

# Redirecionar a saída do cron para um arquivo

8.7. Fundamentos de Rede do Linux

O Linux oferece uma série de comandos para visualizar informações relacionadas à rede. Nesta seção, discutiremos brevemente alguns dos comandos.

Veja as interfaces de rede com ifconfig

ifconfig

O comando ifconfig fornece informações sobre as interfaces de rede. Aqui está um exemplo de saída:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe4e:66a1  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)
        RX packets 1024  bytes 654321 (654.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 512  bytes 123456 (123.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 256  bytes 20480 (20.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 256  bytes 20480 (20.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# Saída

A saída do comando ifconfig mostra as interfaces de rede configuradas no sistema, juntamente com detalhes como endereços IP, endereços MAC, estatísticas de pacotes, e mais.

Essas interfaces podem ser dispositivos físicos ou virtuais.

Para extrair endereços IPv4 e IPv6, você pode usar ip -4 addr e ip -6 addr, respectivamente.

Ver atividade de rede comnetstat

O comando netstat mostra atividade de rede e estatísticas fornecendo a seguinte informação:

  1. Aqui estão alguns exemplos de uso do comando netstat na linha de comando:
  2. Exibir todas as conexões de soquete ouvindo e não ouvindo:
  3. Mostrar apenas as portas ouvindo:
  4. Exibir estatísticas de rede:
  5. Mostrar tabela de roteamento:
  6. Exibir conexões TCP:
  7. Exibir conexões UDP:
  8. Mostrar interfaces de rede:
  9. Exibir PID e nomes de programas para conexões:
  10. Mostrar estatísticas para um protocolo específico (por exemplo, TCP):

Exibir informações extendidas:

Verifique a conectividade de rede entre dois dispositivos usando ping

ping google.com

ping é usado para testar a conectividade de rede entre dois dispositivos. Ele envia pacotes ICMP para o dispositivo de destino e espera por uma resposta.

ping google.com
PING google.com (142.250.181.46) 56(84) bytes of data.
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=1 ttl=60 time=78.3 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=2 ttl=60 time=141 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=3 ttl=60 time=205 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=4 ttl=60 time=100 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 78.308/131.053/204.783/48.152 ms

ping testa se você obtém uma resposta de volta sem obter um tempo de espera expirado.

— google.com ping estatísticas —

Você pode parar a resposta com Ctrl + C.

Testando pontos de extremidade com o comando curl

  • O comando curl significa “cliente URL”. Ele é usado para transferir dados para ou de um servidor. Ele também pode ser usado para testar pontos de extremidade de API que ajudam a resolver problemas de sistema e erros de aplicação.
curl http://www.official-joke-api.appspot.com/random_joke
{"type":"general",
"setup":"What did the fish say when it hit the wall?","punchline":"Dam.","id":1}
curl -o random_joke.json http://www.official-joke-api.appspot.com/random_joke
O comando curl sem nenhuma opção usa o método GET por padrão.
  • curl -o salva a saída para o arquivo mencionado.
curl -I http://www.official-joke-api.appspot.com/random_joke
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"71-NaOSpKuq8ChoxdHD24M0lrA+JXA"
X-Cloud-Trace-Context: 2653a86b36b8b131df37716f8b2dd44f
Content-Length: 113
Date: Thu, 06 Jun 2024 10:11:50 GMT
Server: Google Frontend

# salva a saída para random_joke.json

curl -I apenas recupera as cabeçalhos.

8.8. Solução de problemas no Linux: Ferramentas e Técnicas

Relatório de atividade do sistema com sar

O comando sar no Linux é uma ferramenta poderosa para coletar, relatar e salvar informações de atividade do sistema. É parte do pacote sysstat e é amplamente usado para monitorar o desempenho do sistema ao longo do tempo.

Para usar o sar, você precisa primeiro instalar o sysstat usando sudo apt install sysstat.

Uma vez instalado, inicie o serviço com sudo systemctl start sysstat.

Verifique o status com sudo systemctl status sysstat.

sar [options] [interval] [count]

Uma vez ativo, o sistema começará a coletar várias estatísticas que você pode usar para acessar e analisar dados históricos. Vamos ver esse assunto em detalhe em breve.

sar -u 1 3
A sintaxe do comando sar é a seguinte:
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:09:26        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:09:27        all      3.78      0.00      2.18      0.08      0.00     93.96
19:09:28        all      4.02      0.00      2.01      0.08      0.00     93.89
19:09:29        all      6.89      0.00      2.10      0.00      0.00     91.01
Average:        all      4.89      0.00      2.10      0.06      0.00     92.95

Por exemplo, sar -u 1 3 exibirá estatísticas de utilização de CPU a cada segundo por três vezes.

# Saída

Aqui estão algumas casos de uso comuns e exemplos de como usar o comando sar.

O sar pode ser usado para vários propósitos:

sar -r 1 3

Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:10:46    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
19:10:47      4600104   8934352   5502124     36.32    375844   4158352  15532012     65.99   6830564   2481260       264
19:10:48      4644668   8978940   5450252     35.98    375852   4165648  15549184     66.06   6776388   2481284        36
19:10:49      4646548   8980860   5448328     35.97    375860   4165648  15549224     66.06   6774368   2481292       116
Average:      4630440   8964717   5466901     36.09    375852   4163216  15543473     66.04   6793773   2481279       139

1. Utilização de memória

Para verificar a utilização de memória (livre e usada), use:

Este comando exibe estatísticas de memória a cada segundo por três vezes.

sar -S 1 3

sar -S 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:11:20    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
19:11:21      8388604         0      0.00         0      0.00
19:11:22      8388604         0      0.00         0      0.00
19:11:23      8388604         0      0.00         0      0.00
Average:      8388604         0      0.00         0      0.00

2. Utilização do espaço de swap

Para visualizar estatísticas de utilização do espaço de swap, use:

Este comando ajuda a monitorizar o uso da memória swap, o que é crucial para sistemas que estão ficando sem memória física.

sar -d 1 3

3. Carga de dispositivos de E/S

Para relatar atividade para dispositivos de bloco e partições de dispositivos de bloco:

Este comando fornece estatísticas detalhadas sobre transferências de dados para e do dispositivo de bloco, e é útil para diagnosticar engarrafamentos de E/S.

sar -n DEV 1 3
5. Estatísticas de rede
sar -n DEV 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:12:47        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
19:12:48           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19:12:48       enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19:12:48       wlp3s0     10.00      3.00      1.83      0.37      0.00      0.00      0.00      0.00
19:12:48    br-5129d04f972f      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
.
.
.

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
...output truncated...

Para visualizar estatísticas de rede, como o número de pacotes recebidos (transmitidos) pela interface de rede:

# -n DEV diz ao sar para relatar interfaces de dispositivos de rede

Isso exibe estatísticas de rede a cada segundo por três segundos, ajudando a monitorar o tráfego de rede.

  1. 6. Dados históricos
  2. # são “true” e “false”. Por favor, não coloque outros valores, eles
  3. Configurar o intervalo de coleta de dados: Edite a configuração da tarefa cron para definir o intervalo de coleta de dados.
sar -u -f /var/log/sysstat/sa04
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

15:20:49     LINUX RESTART    (12 CPU)

16:13:30     LINUX RESTART    (12 CPU)

18:16:00        CPU     %user     %nice   %system   %iowait    %steal     %idle
18:16:01        all      0.25      0.00      0.67      0.08      0.00     99.00
Average:        all      0.25      0.00      0.67      0.08      0.00     99.00
Substitua <DD> com o dia do mês que você deseja ver os dados.

No comando abaixo, /var/log/sysstat/sa04 fornece estatísticas para o 4º dia do mês atual.

sar -I SUM 1 3

7. Interrupções de CPU em Tempo Real
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:14:22         INTR    intr/s
19:14:23          sum   5784.00
19:14:24          sum   5694.00
19:14:25          sum   5795.00
Average:          sum   5757.67

Para observar interrupções por segundo atendidas pelo CPU em tempo real, use este comando:

# Saída

Este comando ajuda na monitoração de quão frequentemente a CPU está lidando com interrupções, o que pode ser crucial para a otimização de desempenho em tempo real.

Estes exemplos ilustram como você pode usar o sar para monitorar vários aspectos do desempenho do sistema. O uso regular do sar pode ajudar a identificar gargalos do sistema e garantir que as aplicações continuem funcionando de forma eficiente.

8.9. Estratégia Geral de Resolução de Problemas para Servidores

Por que precisamos entender o monitoramento?

Monitoramento do sistema é um aspecto importante da administração do sistema. Aplicações críticas exigem um alto nível de proatividade para evitar falhas e reduzir o impacto de interrupções.

O Linux oferece ferramentas muito poderosas para medir a saúde do sistema. Nesta seção, você aprenderá sobre as várias métodos disponíveis para verificar a saúde do seu sistema e identificar os gargalos.

[user@host ~]$ uptime 19:15:00 up 1:04, 0 users, load average: 2.92, 4.48, 5.20

Encontrar a média de carga e o tempo de atividade do sistema

Reinicializações do sistema podem ocorrer o que às vezes pode bagunçar algumas configurações. Para verificar quanto tempo a máquina está funcionando, use o comando: uptime. Além do tempo de atividade, o comando também exibe a média de carga.

A média de carga é a carga do sistema nas últimas 1, 5 e 15 minutos. Uma olhada rápida indica se a carga do sistema parece estar aumentando ou diminuindo ao longo do tempo.

Nota: A fila ideal da CPU é 0. Isso só é possível quando não há filas de espera para a CPU.

lscpu
A carga por CPU pode ser calculada dividindo a média de carga pelo número total de CPUs disponíveis.
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
.
.
.
output omitted

Para encontrar o número de CPUs, use o comando lscpu.

# saída

Se a média de carga parecer aumentar e não descer, as CPUs estão sobrecarregadas. Há algum processo que está preso ou existe uma perda de memória.

free -mh
Calculando a memória livre
               total        used        free      shared  buff/cache   available
Mem:            14Gi       3.5Gi       7.7Gi       109Mi       3.2Gi        10Gi
Swap:          8.0Gi          0B       8.0Gi

Às vezes, o alto uso de memória pode estar causando problemas. Para verificar a memória disponível e a memória em uso, use o comando free.

# saída

Calculando o espaço em disco

df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.5G  2.4M  1.5G   1% /run
/dev/nvme0n1p2  103G   34G   65G  35% /
tmpfs           7.3G   42M  7.2G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
efivarfs        246K   93K  149K  39% /sys/firmware/efi/efivars
/dev/nvme0n1p3  130G   47G   77G  39% /home
/dev/nvme0n1p1  511M  6.1M  505M   2% /boot/efi
tmpfs           1.5G  140K  1.5G   1% /run/user/1000

Para garantir que o sistema está saudável, não esqueça do espaço em disco. Para listar todos os pontos de montagem disponíveis e sua respectiva porcentagem usada, use o comando abaixo. Idealmente, o espaço em disco usado não deve exceder 80%.

O comando df fornece detalhes do espaço em disco.

Determinando os estados dos processos

[user@host ~]$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 runner         1  0.1  0.0 1535464 15576 ?       S  19:18   0:00 /inject/init
 runner        14  0.0  0.0  21484  3836 pts/0    S   19:21   0:00 bash --norc
 runner        22  0.0  0.0  37380  3176 pts/0    R+   19:23   0:00 ps aux

Os estados dos processos podem ser monitorados para verificar se há algum processo preso com alto uso de memória ou CPU.

Vimos anteriormente que o comando ps fornece informações úteis sobre um processo. Dê uma olhada nas colunas CPU e MEM.

Monitoramento de sistema em tempo real

O monitoramento em tempo real fornece uma janela para o estado real de tempo do sistema.

Uma ferramenta que você pode usar para fazer isso é o comando top.

O comando top exibe uma visão dinâmica dos processos do sistema, mostrando um cabeçalho de resumo seguido por uma lista de processos ou threads. Em comparação com seu contrapartida estática ps, o top atualiza continuamente as estatísticas do sistema.

Com o top, você pode ver detalhes bem organizados em uma janela compacta. Há uma série de bandeiras, atalhos e métodos de destacamento que vêm com o top.

Você também pode matar processos usando o top. Para isso, pressione k e depois insira o ID do processo.

Interpretação de logs

logs do sistema e aplicativos carregam toneladas de informações sobre o que o sistema está passando. Eles contêm informações úteis e códigos de erro que apontam para erros. Se você procurar por códigos de erro em logs, a identificação de issue e o tempo de correção podem ser grandemente reduzidos.

Análise de portas de rede

O aspecto de rede não deve ser ignorado, pois os problemas de rede são comuns e podem impactar o sistema e o fluxo de tráfego. Os problemas de rede comuns incluem esgotamento de portas, enchendo de portas, recursos não liberados e muito mais.

Para identificar esses problemas, precisamos entender os estados das portas. Alguns dos estados das portas são explicados brevemente aqui:
Estado Descrição
LISTEN Representa portas que estão esperando por uma solicitação de conexão de qualquer porta remota TCP.
ESTABLISHED Representa conexões que estão abertas e os dados recebidos podem ser entregues ao destino.
TIME WAIT Representa o tempo de espera para garantir o reconhecimento da sua solicitação de encerramento da conexão.

FIN WAIT2

Representa o aguardo de uma solicitação de encerramento de conexão do TCP remoto.

[user@host ~]$ /sbin/sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 15000    65000

Vamos explorar como podemos analisar informações relacionadas a portas no Linux.

Intervalos de porta: Intervalos de porta são definidos no sistema e o intervalo pode ser aumentado/diminuído conforme necessário. No exemplo abaixo, o intervalo é de 15000 até 65000, o que resulta em 50000 (65000 – 15000) portas disponíveis. Se o número de portas utilizadas estiver chegando ou ultrapassando esse limite, há um problema.

O erro relatado nas logs em tais casos pode ser Falha ao bindar na porta ou Muitas conexões.

Identificação de perda de pacotes

Na monitoração do sistema, precisamos garantir que a comunicação de saída e de entrada estejam intactas.
[user@host ~]$ ping 10.13.6.113
 PING 10.13.6.141 (10.13.6.141) 56(84) bytes of data.
 64 bytes from 10.13.6.113: icmp_seq=1 ttl=128 time=0.652 ms
 64 bytes from 10.13.6.113: icmp_seq=2 ttl=128 time=0.593 ms
 64 bytes from 10.13.6.113: icmp_seq=3 ttl=128 time=0.478 ms
 64 bytes from 10.13.6.113: icmp_seq=4 ttl=128 time=0.384 ms
 64 bytes from 10.13.6.113: icmp_seq=5 ttl=128 time=0.432 ms
 64 bytes from 10.13.6.113: icmp_seq=6 ttl=128 time=0.747 ms
 64 bytes from 10.13.6.113: icmp_seq=7 ttl=128 time=0.379 ms
 ^C
 --- 10.13.6.113 ping statistics ---
 7 packets transmitted, 7 received,0% packet loss, time 6001ms
 rtt min/avg/max/mdev = 0.379/0.523/0.747/0.134 ms

Um comando útil é o ping. O ping atinge o sistema de destino e traz a resposta de volta. Note as últimas linhas de estatísticas que mostram a porcentagem de perda de pacotes e o tempo.

# ping IP de destino

Pacotes também podem ser capturados em tempo de execução usando o tcpdump. Vamos olhar para isso depois.

Coleta de estatísticas para morte de incidente

  • Sempre é uma boa prática coletar certas estatísticas que serão úteis para identificar a causa raiz depois. Normalmente, após o reinício do sistema ou o reinício dos serviços, perdemos a snapshot inicial do sistema e os logs.

Abaixo estão algumas das maneiras de capturar o snapshot do sistema.

  • Backup de logs

Antes de fazer quaisquer mudanças, copie os arquivos de log para outro local. Isso é crucial para compreender em qual condição o sistema estava durante o momento do problema. As vezes, os arquivos de log são a única janela para olhar para os estados anteriores do sistema, pois outras estatísticas de tempo de execução são perdidas.

sudo tcpdump -i any -w

 TCP Dump
O tcpdump é um utilitário de linha de comando que permite capturar e analisar o tráfego de rede de entrada e saída. Ele é usado principalmente para ajudar a solucionar problemas de rede. Se você sentir que o tráfego do sistema está sendo afetado, execute o tcpdump da seguinte forma:
# Onde,

# -i any captura o tráfego de todas as interfaces
# -w especifica o nome do arquivo de saída

# Pare o comando após alguns minutos, pois o tamanho do arquivo pode aumentar

# use a extensão de arquivo como .pcap

Uma vez capturado o tcpdump, você pode usar ferramentas como o Wireshark para analisar visualmente o tráfego.

Conclusão

Obrigado por ler o livro até o final. Se você achou útil, considere compartilhá-lo com outros.

Este livro não termina aqui, no entanto. Eu continuarei a melhorá-lo e adicionar novos materiais no futuro. Se você encontrou algum problema ou se você gostaria de sugerir melhorias, sinta-se livre para abrir um PR/ Issue.

  1. Fique Conectado e Continue Sua Jornada de Aprendizado!
  2. LinkedIn: Eu compartilho artigos e posts sobre tecnologia lá. Deixe uma recomendação no LinkedIn e endosse minhas habilidades relevantes.

Acesse conteúdo exclusivo: Para ajuda individual e conteúdo exclusivo, vá aqui.

Acesse conteúdo exclusivo: Para ajuda individual e conteúdo exclusivo, vá aqui.