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 6: Scripting Bash
-
6.3. Visão geral do Shell Bash e Interface de Linha de Comando
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:
-
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.
-
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.
-
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.
-
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.
-
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) erm
(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 eaccess.log
é a entrada. Como resultado, a instruçãocat
exibe o conteúdo do arquivoaccess.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:
f
– Arquivo regular, como arquivos de texto, imagens e arquivos ocultos.
d
– Diretório. Estas são as pastas em consideração.
l
– Ligação simbólica. As ligações simbólicas apontam para ficheiros e são semelhantes a atalhos.
c
– Dispositivos 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.
b
– Dispositivos 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 arquivosyslog.log
. -
9623
representa o número de palavras no arquivosyslog.log
. -
64367
representa o número de caracteres no arquivosyslog.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")
- 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
- 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.
+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
- 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:
- Modo de comando.
- 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 cimaP
: Colar acima do cursor:%s/old/new/g
: Substitui todas as ocorrências deold
pornew
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 ajudaCtrl+J
: Justificar o parágrafo atualCtrl+V
: Rolar para baixo uma páginaCtrl+\
: 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 odate
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ávelthe_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.
- 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
- Em scriptings Bash, o seguinte são as convenções de nomenclatura de variáveis:
- Os nomes das variáveis devem começar com uma letra ou um underscore (
_
). - Os nomes das variáveis podem conter letras, números, e underscores (
_
). - Os nomes das variáveis são sensíveis a maiúsculas e minúsculas.
- Os nomes das variáveis não devem conter espaços ou caracteres especiais.
- 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
- 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
- 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:
- Se falarmos especificamente sobre o Ubuntu,
- O índice é buscado usando
apt update.
(apt
é explicado na próxima seção). - Os arquivos necessários/dependências solicitados de acordo com o índice usando
apt install
- 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
Usandodpkg
para 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.
- Existem três tipos principais de contas de usuário:
- Superusuário: O superusuário tem acesso total ao sistema. O nome do superusuário é
root
. Ele tem umUID
de 0. - 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
:
- O arquivo
/etc/passwd
contém as seguintes informações sobre cada usuário: - Nome de usuário:
root
– O nome de usuário da conta de usuário. - Senha:
x
– A senha do usuário em formato criptografado que é armazenada no arquivo/etc/shadow
por questões de segurança. - ID de usuário (UID):
0
– O identificador numérico único da conta de usuário. - ID do grupo (GID):
0
– O identificador primário do grupo da conta de usuário. - Informações do usuário:
root
– O nome real da conta de usuário. - 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
:
- Aqui é a análise das colunas na entrada dada:
- Nome do grupo:
adm
– O nome do grupo. - 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. - 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.
- Podemos alterar as permissões usando dois modos:
- 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 comor, 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
eescrita
paragrupo
eoutros
:chmod go-rw
. - Removendo permissões de
leitura
paraoutros
: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
egrupo
, 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
:
- Aqui estão alguns exemplos do comando
usermod
em Linux: - Mudar o nome de login de um usuário:
- Alterar o diretório pessoal de um utilizador:
- Adicionar um utilizador a um grupo suplementar:
- Alterar a shell de um utilizador:
- Bloquear a conta de um utilizador:
- Desbloquear a conta de um usuário:
- Definir uma data de expiração para uma conta de usuário:
- Alterar o ID de usuário (UID) de um usuário:
- 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.
- A conexão com um servidor segue estes passos:
- Iniciar Conexão: O cliente envia uma solicitação de conexão ao servidor.
- Excange de Chaves: O servidor envia sua chave pública ao cliente. Ambos concordam em usar os métodos de criptografia.
- 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.
- 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.
- Veja alguns usos comuns do
grep
: - Este comando busca por “search_string” no arquivo chamado
filename
. - Este comando busca por “
search_string"
em todos os arquivos dentro do diretório especificado e seus subdiretórios. - Este comando realiza uma busca insensível a maiúsculas e minúsculas por “search_string” no arquivo chamado
filename
. - Este comando mostra os números de linha juntamente com as linhas correspondentes no arquivo chamado
filename
. - Este comando conta o número de linhas que contêm “search_string” no arquivo chamado
filename
. - Este comando exibe todas as linhas que não contêm “search_string” no arquivo chamado
filename
. - 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.
sed
uso:
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 usocut
para 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:
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
- 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
- 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
- Isso extrai o terceiro campo que contém o nível de log.
Combinandocut
com 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
- 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.
- 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
- 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
- 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
- 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
- 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
- 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:
USUÁRIO
: O usuário que é proprietário do processo.PID
: O ID do processo.%CPU
: O uso da CPU pelo processo.%MEM
: A utilização de memória do processo.VSZ
: O tamanho da memória virtual do processo.RSS
: O tamanho do conjunto residente, ou seja, a memória física não trocada que uma tarefa tem usado.TTY
: O terminal de controle do processo. Um?
indica que não há um terminal de controle.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 primeiroS
indica o estado de espera, e o segundos
indica que é líder de sessão.START
: O tempo ou data de início do processo.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.
- 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
- 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 &
- 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:
- 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
- # 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 combg %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
- Aqui estão alguns exemplos do comando
kill
no Linux: - Este comando envia o sinal padrão
SIGTERM
para o processo com PID 1234, solicitando que ele seja encerrado. - Este comando envia o sinal padrão
SIGTERM
para todos os processos com o nome especificado. - Este comando envia a sinal
SIGKILL
para o processo com PID 1234, terminando-o forçosamente. - 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
- 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:
- O descritor de arquivo para
stdin
é0
. - 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 forstdout
is1
.
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
- 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:
- Aqui estão alguns exemplos de uso do comando
netstat
na linha de comando: - Exibir todas as conexões de soquete ouvindo e não ouvindo:
- Mostrar apenas as portas ouvindo:
- Exibir estatísticas de rede:
- Mostrar tabela de roteamento:
- Exibir conexões TCP:
- Exibir conexões UDP:
- Mostrar interfaces de rede:
- Exibir PID e nomes de programas para conexões:
- 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}
- Por exemplo, você pode usar
http://www.official-joke-api.appspot.com/
para experimentar com o comandocurl
.
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.
- 6. Dados históricos
- # são “true” e “false”. Por favor, não coloque outros valores, eles
- 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.
- Fique Conectado e Continue Sua Jornada de Aprendizado!
-
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.
Source:
https://www.freecodecamp.org/news/learn-linux-for-beginners-book-basic-to-advanced/