Apostila 4linux
Apostila 4linux
com
Fabio Gonçalves De Melo Santana / [email protected]
Olá aluno(a),
Para que você se prepare da melhor maneira para as suas cert ificações LPI-101 e
LPI-102, o nosso curso foi criado a part ir dos mat eriais oficiais de est udos para
prova da LPI, disponibilizados pela LPI.org no endereço:
ht t ps:/ / learning.lpi.org/ pt / learning-mat erials/ learning-mat erials/
Ut ilizamos est e mat erial como base, adicionando quizzes, novos exemplos
aprofundados, muit as aulas em vídeo abordando t odos os t ópicos das provas, e
um super simulado.
Fabio Gonçalves De Melo Santana / [email protected]
Sumário
1 101.1 Determinar e definir configurações de hardware 19
1.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2 Ativação do dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3 Inspeção de dispositivos no Linux . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4 Comandos para inspeção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5 Arquivos de informação e de dispositivo . . . . . . . . . . . . . . . . . . . . . 26
1.6 Dispositivos de armazenamento . . . . . . . . . . . . . . . . . . . . . . . . . 27
2 Resumo 29
2.1 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3 Inicialização do Sistema 31
3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 BIOS ou UEFI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 O bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4 Inicialização do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 Inspeção da inicialização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.7 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3
4 Sumário
Fabio Gonçalves De Melo Santana / [email protected]
5.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2 Pontos de montagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3 Mantendo as coisas separadas . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4 A partição de inicialização (/boot) . . . . . . . . . . . . . . . . . . . . . . . 52
5.5 A partição do sistema EFI (ESP) . . . . . . . . . . . . . . . . . . . . . . . . 53
5.6 A partição /home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.7 Dados variáveis (/var) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.8 Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.9 LVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.10 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.11 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7 GRUB 2 61
7.1 Instalando o GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.2 Configurando o GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.3 Administrando as entradas de menu . . . . . . . . . . . . . . . . . . . . . . . 63
7.4 Interagindo com o GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.5 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
10 Resumo 106
6 Sumário
Fabio Gonçalves De Melo Santana / [email protected]
13 Introdução 115
13.1 Obtendo informações sobre o sistema . . . . . . . . . . . . . . . . . . . . . . 115
13.2 Obtendo informações sobre comandos . . . . . . . . . . . . . . . . . . . . . . 116
13.3 Usando o histórico de comandos . . . . . . . . . . . . . . . . . . . . . . . . . 118
13.4 Encontrando suas variáveis de ambiente . . . . . . . . . . . . . . . . . . . . . 119
13.5 Criando novas variáveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . 120
13.6 Removendo as variáveis de ambiente . . . . . . . . . . . . . . . . . . . . . . 121
13.7 Usando aspas para escapar dos caracteres especiais . . . . . . . . . . . . . . . 122
14 Resumo 124
19 Resumo 177
19.1 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
24 Introdução 255
24.1 Montando e desmontando sistemas de arquivos . . . . . . . . . . . . . . . . . 255
24.2 Listando sistemas de arquivos montados . . . . . . . . . . . . . . . . . . . . 256
24.3 Parâmetros adicionais da linha de comando . . . . . . . . . . . . . . . . . . . 257
24.4 Como lidar com arquivos abertos . . . . . . . . . . . . . . . . . . . . . . . . 257
24.5 Onde montar? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
24.6 Montagem de sistemas de arquivos na inicialização . . . . . . . . . . . . . . . 258
24.7 Usando UUIDs e rótulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
24.8 Montando discos com Systemd . . . . . . . . . . . . . . . . . . . . . . . . . 261
24.9 Montagem automática de uma unidade de montagem . . . . . . . . . . . . . 263
24.10Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
31 106.1_Instalar_e_configurar_o_X11/ 344
13 Sumário
Fabio Gonçalves De Melo Santana / [email protected]
32 106.2_Areas_de_trabalho_graficas/ 354
32.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
32.2 X Window System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
32.3 Ambiente de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
32.4 Aplicativos relacionados ao sistema . . . . . . . . . . . . . . . . . . . . . . . 356
32.5 Ambientes de trabalho populares . . . . . . . . . . . . . . . . . . . . . . . . 356
32.6 Interoperabilidade da área de trabalho . . . . . . . . . . . . . . . . . . . . . . 358
32.7 Acesso não-local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
40 Introdução 447
40.1 IP (Internet Protocol) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
40.2 Classes de endereço . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
40.3 IPs públicos e privados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
40.4 Convertendo o formato decimal em binário . . . . . . . . . . . . . . . . . . . 448
40.5 Convertendo o formato binário em decimal . . . . . . . . . . . . . . . . . . . 450
40.6 Netmask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
40.7 Identificando os endereços de rede e de transmissão . . . . . . . . . . . . . . 453
40.8 Rota padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
40.9 Portas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
40.10Transmission Control Protocol (TCP) . . . . . . . . . . . . . . . . . . . . . . 456
40.11User Datagram Protocol (UDP) . . . . . . . . . . . . . . . . . . . . . . . . . 456
40.12Internet Control Message Protocol (ICMP) . . . . . . . . . . . . . . . . . . . 456
40.13IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
16 Sumário
Fabio Gonçalves De Melo Santana / [email protected]
40.14Abreviações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
40.15Tipos de endereço IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
40.16Diferenças entre IPv4 e IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
40.17Talves isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
42 Introdução 462
42.1 A Interface de Rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
42.2 Nomes de interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
42.3 Gerenciamento da interface . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
42.4 Nomes locais e remotos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
44 Introdução 472
44.1 Sobre o comando ip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
44.2 Máscara de rede e revisão de roteamento . . . . . . . . . . . . . . . . . . . . 473
44.3 Configurando uma interface . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
44.4 Configurando opções de baixo nível . . . . . . . . . . . . . . . . . . . . . . . 476
44.5 A tabela de roteamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
44.5.1 Exemplo de IPv4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
44.5.2 Exemplo de IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
44.6 Gerenciando as rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
44.7 Testando conexões com ping . . . . . . . . . . . . . . . . . . . . . . . . . . 479
44.8 Traçando Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
44.9 Encontrando MTUs com tracepath . . . . . . . . . . . . . . . . . . . . . . . 482
44.10Criando Conexões Arbitrárias . . . . . . . . . . . . . . . . . . . . . . . . . . 483
44.11Visualizando conexões atuais e listeners . . . . . . . . . . . . . . . . . . . . . 484
44.12Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
46 Introdução 488
46.1 O processo de resolução de nome . . . . . . . . . . . . . . . . . . . . . . . . 488
46.2 Classes DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
46.3 Entendendo /etc/nsswitch.conf . . . . . . . . . . . . . . . . . . . . . . . . . 489
46.4 O arquivo /etc/resolv.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
46.5 O arquivo /etc/hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
46.6 systemd-resolved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
46.7 Ferramentas de resolução de nomes . . . . . . . . . . . . . . . . . . . . . . . 492
46.8 O comando getent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
17 Sumário
Fabio Gonçalves De Melo Santana / [email protected]
47 Introdução 499
47.1 Verificando Arquivos com SUID e SGID . . . . . . . . . . . . . . . . . . . . . 499
47.2 Gerenciamento e validade das senhas . . . . . . . . . . . . . . . . . . . . . . 502
47.3 Descobrindo portas abertas . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
47.4 Limites em logins de usuário, processos e uso de memória . . . . . . . . . . . 510
47.5 Lidando com usuários conectados . . . . . . . . . . . . . . . . . . . . . . . . 513
47.6 Configuração e uso básicos do sudo . . . . . . . . . . . . . . . . . . . . . . . 515
47.7 O arquivo /etc/sudoers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
47.8 Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
50 Introdução 532
50.1 Visão geral do SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
50.2 Como funciona o SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
50.3 Como o SSH autentica usuários . . . . . . . . . . . . . . . . . . . . . . . . . 533
50.4 Gerando um par de chaves SSH . . . . . . . . . . . . . . . . . . . . . . . . . 534
50.5 Gerando um par de chaves SSH com um número maior de bits . . . . . . . . . 535
50.6 Removendo ou Alterando a Senha em uma Chave Privada . . . . . . . . . . . 535
50.7 Exibindo a impressão digital da chave SSH . . . . . . . . . . . . . . . . . . . 536
50.8 Copiando sua chave SSH pública para um servidor com SSH-Copy-ID . . . . . 537
50.9 Copiando sua chave SSH pública para um servidor sem SSH-Copy-ID . . . . . 538
50.10Copiando sua chave SSH pública para um servidor manualmente . . . . . . . . 538
50.11Instruções básicas de conexão . . . . . . . . . . . . . . . . . . . . . . . . . . 539
50.12Conectando-se a um servidor remoto . . . . . . . . . . . . . . . . . . . . . . 539
50.13Executando um único comando em um servidor remoto . . . . . . . . . . . . 540
50.14Login em um servidor com uma porta diferente . . . . . . . . . . . . . . . . . 540
50.15Adicionando suas chaves SSH a um agente SSH para evitar digitar a frase secreta541
50.16Encaminhando suas credenciais SSH para uso em um servidor . . . . . . . . . 542
50.17Opções de configuração do lado do servidor . . . . . . . . . . . . . . . . . . . 542
18 Sumário
Fabio Gonçalves De Melo Santana / [email protected]
1
101.1 Determinar e definir
configurações de hardware
Introdução
Desde os primórdios da computação, os fabricantes de computadores vêm integrando uma série
de peças de hardware em suas máquinas. Essas peças, por sua vez, devem ser suportadas pelo
sistema operacional. Por isso, é preciso que existam padrões estabelecidos para os conjuntos de
instruções e a comunicação dos dispositivos. Esses padrões facilitam a criação e a manutenção
de um sistema operacional não vinculado a um modelo de hardware específico. Porém, a
complexidade do hardware, às vezes, requer ajustes na maneira como os recursos devem ser
expostos ao sistema operacional, para que ele possa ser instalado e funcionar corretamente.
É possível realizar alguns desses ajustes mesmo sem um sistema operacional instalado. A
maioria das máquinas oferece um utilitário de configuração que pode ser executado quando a
máquina é ligada. Até meados dos anos 2000, o utilitário de configuração era implementado
na BIOS (Basic Input/Output System), o padrão de firmware contendo as rotinas básicas
de configuração para as placas-mãe x86. A partir do final da primeira década dos anos
2000, as máquinas baseadas na arquitetura x86 começaram a substituir a BIOS por uma
nova implementação chamada UEFI (Unified Extensible Firmware Interface), que tem recursos
mais sofisticados para identificação, teste, configuração e atualização de firmware. Apesar da
mudança, não é incomum que se chame o utilitário de configuração de BIOS, já que ambas
as implementações cumprem o mesmo objetivo básico.
19
20 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]
Ativação do dispositivo
O utilitário de configuração do sistema aparece quando pressionamos uma tecla específica ao
ligar o computador. Essa tecla varia de fabricante para fabricante, mas geralmente é Del
ou uma das teclas de função, como F2 ou F12. A combinação de teclas a ser usada é
frequentemente exibida na tela inicial.
A saída dos comandos lspci e lsusb consiste em uma lista de todos os dispositivos PCI e USB
identificados pelo sistema operacional. No entanto, o dispositivo pode não estar totalmente
operacional ainda, porque cada peça de hardware requer um componente de software para
controlar o dispositivo correspondente. Esse componente de software é chamado de módulo
do kernel e pode fazer parte do kernel oficial do Linux ou ser adicionado separadamente. Os
módulos do kernel do Linux relacionados a dispositivos de hardware também são chamados
de drivers, como em outros sistemas operacionais. Os drivers para Linux, no entanto, nem
sempre são fornecidos pelo fabricante do dispositivo. Enquanto alguns fabricantes fornecem
seus próprios drivers binários para serem instalados separadamente, muitos drivers são criados
por desenvolvedores independentes. Historicamente, dispositivos que funcionam no Windows,
por exemplo, podem não ter um módulo de kernel equivalente para Linux. Atualmente, os
sistemas operacionais baseados em Linux têm um forte suporte de hardware e a maioria dos
dispositivos funciona sem dar trabalho.
root@debian10:/home/debian# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: VMware SVGA II Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev
01)
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [
AHCI mode] (rev 02)
A saída desses comandos pode ter dezenas de linhas, de forma que o exemplo anterior e o
seguinte incluem apenas as partes que nos interessam. Os números hexadecimais no início
de cada linha são o endereço exclusivo do dispositivo PCI correspondente. O comando lspci
mostra mais detalhes sobre um dispositivo específico se seu endereço for fornecido com a
22 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]
A saída agora mostra muito mais detalhes sobre o dispositivo no endereço 00:06.0.
Outra maneira de verificar qual módulo do kernel está sendo usado para o dispositivo especi-
ficado seria usar a opção -k, disponível nas versões mais recentes do lspci:
root@debian10:/home/debian# lsusb
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
O comando lsusb mostra os canais USB disponíveis e os dispositivos conectados a eles. Como
no caso do lspci, a opção -v exibe uma saída mais detalhada. Um dispositivo específico pode
ser selecionado para inspeção, bastando fornecer seu ID com a opção -d:
bcdUSB 1.10
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x80ee VirtualBox
idProduct 0x0021 USB Tablet
bcdDevice 1.00
iManufacturer 1 VirtualBox
iProduct 3 USB Tablet
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0022
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 85
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
can't get debug descriptor: Resource temporarily unavailable
Device Status: 0x0000
(Bus Powered)
Com a opção -t, o comando lsusb mostra os mapeamentos do dispositivo USB atual na forma
de árvore hierárquica:
24 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/12p, 12M
|__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
root@debian10:/home/debian# lsmod
Module Size Used by
binfmt_misc 20480 1
fuse 122880 3
vboxvideo 49152 0
rfkill 28672 3
crct10dif_pclmul 16384 0
crc32_pclmul 16384 0
ghash_clmulni_intel 16384 0
intel_rapl_perf 16384 0
snd_intel8x0 45056 3
snd_ac97_codec 147456 1 snd_intel8x0
joydev 24576 0
ac97_bus 16384 1 snd_ac97_codec
snd_pcm 114688 2 snd_intel8x0,snd_ac97_codec
pcspkr 16384 0
serio_raw 16384 0
snd_timer 36864 1 snd_pcm
vboxguest 352256 6
snd 94208 10 snd_intel8x0,snd_timer,snd_ac97_codec,snd_pcm
sg 36864 0
soundcore 16384 1 snd
battery 20480 0
25 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]
ac 16384 0
evdev 28672 10
ip_tables 28672 0
x_tables 45056 1 ip_tables
autofs4 49152 2
ext4 745472 5
crc16 16384 1 ext4
mbcache 16384 1 ext4
jbd2 122880 1 ext4
Alguns módulos exigem que outros módulos funcionem corretamente, como é o caso dos
módulos para dispositivos de áudio:
A terceira coluna, Used by, mostra os módulos que exigem que o módulo na primeira coluna
funcione corretamente. Muitos módulos da arquitetura de som do Linux, prefixados por snd,
são interdependentes. Ao procurar por problemas durante um diagnóstico do sistema, pode
ser útil descarregar módulos específicos atualmente carregados. O comando modprobe pode
ser usado para carregar e descarregar módulos do kernel: para descarregar um módulo e seus
módulos relacionados, desde que não estejam sendo usados por um processo em execução, use
o comando modprobe -r. Por exemplo, para descarregar o módulo snd_intel8x0 (o módulo
para um dispositivo de áudio HDA Intel) e outros módulos relacionados ao sistema de som:
Usando o nome do módulo como único argumento, o comando modinfo mostra uma descrição,
o arquivo, o autor, a licença, a identificação, as dependências e os parâmetros disponíveis para
o módulo fornecido. Para que os parâmetros personalizados de um módulo se tornem persis-
tentes, inclua-os no arquivo /etc/modprobe.conf ou em arquivos individuais com a extensão
26 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]
.conf no diretório /etc/modprobe.d/. A opção -p fará com que o comando modinfo exiba
todos os parâmetros disponíveis e ignore as outras informações:
com informações sobre processos em execução e recursos de hardware. Alguns dos arquivos
importantes em /proc para a inspeção de hardware são:
• /proc/cpuinfo: Lista informações detalhadas sobre a(s) CPU(s) encontradas pelo sis-
tema operacional;
• /proc/interrupts: Uma lista de números de interrupções por dispositivo de entrada e
saída em cada CPU;
• /proc/ioports: Lista as regiões de portas de Entrada/Saída registradas atualmente e
em uso;
• /proc/dma: Lista os canais registrados de DMA (acesso direto à memória) em uso.
Os dispositivos removíveis são manipulados pelo subsistema udev, que cria os dispositivos
correspondentes em /dev. O kernel do Linux captura o evento de detecção de hardware e o
passa para o processo udev, que por sua vez identifica o dispositivo e cria dinamicamente os
arquivos correspondentes em /dev, usando regras predefinidas.
Nas distribuições Linux atuais, o udev é responsável pela identificação e configuração dos
dispositivos já presentes durante a inicialização da máquina (detecção coldplug) e dos dispos-
itivos identificados enquanto o sistema está em execução (detecção hotplug). O Udev utiliza
o SysFS, o pseudosistema de arquivos montado em /sys para informações relacionadas ao
hardware.
À medida que novos dispositivos são detectados, o udev pesquisa uma regra correspondente nas
regras predefinidas armazenadas no diretório /etc/udev/rules.d/. As regras mais importantes
são fornecidas pela distribuição, mas é possível adicionar novas para casos específicos.
Dispositivos de armazenamento
No Linux, os dispositivos de armazenamento são genericamente chamados de dispositivos de
bloco, porque os dados que contêm são lidos em blocos de dados armazenados em buffer com
28 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]
A partir da versão 2.4 do kernel Linux em diante, a maioria dos dispositivos de armazenamento
passou a ser identificada como dispositivos SCSI, independentemente do tipo de hardware. Os
dispositivos de bloco IDE, SSD e USB são prefixados com sd. Para os discos IDE, o prefixo
sd é usado, mas a terceira letra é escolhida dependendo da unidade ser mestre ou escrava (no
primeiro canal IDE, o mestre será sda e o escravo será sdb). As partições são listadas em
ordem numérica. Os caminhos /dev/sda1, /dev/sda2, etc. são usados para a primeira e
a segunda partições do dispositivo de bloco identificado primeiro e /dev/sdb1, /dev/sdb2,
etc. identificam a primeira e a segunda partições do dispositivo de bloco identificado a seguir.
A exceção a esse padrão ocorre com cartões de memória (cartões SD) e dispositivos NVMe
(SSD conectados ao barramento PCI Express). Para os cartões SD, os caminhos /dev/mm-
cblk0p1, /dev/mmcblk0p2 etc. são usados para a primeira e a segunda partições do dis-
positivo identificado primeiro e /dev/mmcblk1p1, /dev/mmcblk1p2, etc. identificam a
primeira e a segunda partições do dispositivo identificado em segundo lugar. Os dispositivos
NVMe recebem o prefixo nvme, como em /dev/nvme0n1p1 e /dev/nvme0n1p2.
Fabio Gonçalves De Melo Santana / [email protected]
2
Resumo
Esta lição aborda os conceitos gerais de como o kernel do Linux lida com recursos de hardware,
principalmente na arquitetura x86. A lição inclui os seguintes tópicos:
29
30 2. Resumo
Fabio Gonçalves De Melo Santana / [email protected]
• Fonte: - https://devops-notes.readthedocs.io/en/latest/File-Systems.html
Fabio Gonçalves De Melo Santana / [email protected]
3
Inicialização do Sistema
Introdução
Sabemos que o Kernel e o componente principal do sistema operacional para controlar a
máquina, e sabemos também que o mesmo deve ser carregado por um programa chamado
bootloader (carregador de inicialização), que por sua vez é carregado por um firmware pré-
instalado, como a BIOS ou a UEFI. O carregador de inicialização pode ser personalizado para
passar parâmetros para o kernel, como a partição que contém o sistema de arquivos raiz ou
em qual modo o sistema operacional deve ser executado. Então, uma vez carregado, o kernel
dá seguimento ao processo de inicialização, identificando e configurando o hardware. Por fim,
o kernel chama o utilitário responsável por iniciar e gerenciar os serviços do sistema.
BIOS ou UEFI
A BIOS, abreviação de Basic Input/Output System, é um programa armazenado em um chip
de memória não volátil conectado à placa-mãe, executado sempre que o computador é ligado.
Esse tipo de programa é chamado firmware, e seu local de armazenamento é separado dos
outros dispositivos de armazenamento do sistema. A BIOS pressupõe que os primeiros 440
bytes no primeiro dispositivo de armazenamentosão o primeiro estágio do bootloader (também
chamado de bootstrap). Os primeiros 512 bytes de um dispositivo de armazenamento são o
que se chama de MBR (Master Boot Record) dos dispositivos de armazenamento que usam o
esquema de partição DOS padrão e, além do primeiro estágio do gerenciador de inicialização,
eles contêm a tabela de partições. Se o MBR não contiver os dados corretos, o sistema não
31
32 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]
De um modo geral, as etapas pré-operacionais para inicializar um sistema equipado com BIOS
são:
A UEFI, abreviação de Unified Extensible Firmware Interface, difere da BIOS em alguns pontos-
chave. Como a BIOS, a UEFI também é um firmware, mas pode identificar partições e ler
muitos sistemas de arquivos nelas. A UEFI não depende do MBR, levando em consideração
apenas as configurações armazenadas na memória não-volátil (NVRAM) conectada à placa-
mãe. Essas definições indicam a localização dos programas compatíveis com a UEFI, chamados
aplicativos EFI, que serão executados automaticamente ou chamados a partir de um menu de
inicialização. Os aplicativos EFI podem ser carregadores de inicialização, seletores de sistema
operacional, ferramentas para diagnóstico e reparo do sistema etc. Eles devem estar em uma
partição de um dispositivo de armazenamento convencional e em um sistema de arquivos
compatível. Os sistemas de arquivos compatíveis padrão são FAT12, FAT16 e FAT32 para
dispositivos de bloco e ISO-9660 para mídia ótica. Essa abordagem permite a implementação
de ferramentas muito mais sofisticadas do que as que seriam possíveis com a BIOS.
A partição que contém os aplicativos EFI é chamada de Partição de Sistema EFI ou apenas
ESP. Essa partição não deve ser compartilhada com outros sistemas de arquivos do sistema,
como o sistema de arquivos raiz ou os sistemas de arquivos de dados do usuário. O diretório
EFI na partição ESP contém os aplicativos apontados pelas entradas salvas na NVRAM.
4. Se o aplicativo EFI predefinido for um bootloader, ele carrega o kernel para iniciar o
sistema operacional.
O padrão UEFI também suporta um recurso chamado Inicialização Segura, que permite apenas
a execução de aplicativos EFI assinados, ou seja, aplicativos EFI autorizados pelo fabricante
do hardware. Esse recurso aumenta a proteção contra software malicioso, mas pode dificultar
a instalação de sistemas operacionais não cobertos pela garantia do fabricante.
O bootloader
O carregador de inicialização mais popular para Linux na arquitetura x86 é o GRUB (Grand
Unified Bootloader). Assim que é chamado pela BIOS ou pela UEFI, o GRUB exibe uma
lista de sistemas operacionais disponíveis para inicialização. Às vezes, a lista não aparece
automaticamente, mas ela pode ser invocada pressionando Shift enquanto o GRUB está sendo
chamado pela BIOS. Nos sistemas UEFI, a tecla a ser usada é Esc.
No menu do GRUB, é possível escolher qual dos kernels instalados deve ser carregado e passar
novos parâmetros para ele. A maioria dos parâmetros do kernel segue o padrão opção=valor.
Alguns dos parâmetros mais úteis do kernel são:
exemplo, root=/dev/sda3;
• rootflags: Opções de montagem para o arquivo de sistemas raiz;
• ro: Torna somente para leitura a montagem inicial do arquivo de sistemas raiz;
• rw: Permite escrever no arquivo de sistemas raiz durante a montagem inicial.
Geralmente não é necessário alterar os parâmetros do kernel, mas isso pode ser útil para
detectar e resolver problemas relacionados ao sistema operacional. Os parâmetros do kernel
devem ser adicionados ao arquivo /etc/default/grub na linha GRUB_CMDLINE_LINUX
para que persistam após a inicialização. É necessário gerar um novo arquivo de configuração
para o carregador de inicialização a cada vez que /etc/default/grub é alterado, o que é feito
com o comando grub-mkconfig -o /boot/grub/grub.cfg. Quando o sistema operacional
estiver rodando, os parâmetros do kernel usados para carregar a sessão ficam disponíveis para
leitura no arquivo /proc/cmdline.
Inicialização do sistema
Além do kernel, o sistema operacional depende de outros componentes que fornecem os recur-
sos esperados. Muitos desses componentes são carregados durante o processo de inicialização
do sistema e vão de simples scripts de shell a programas de serviços mais complexos. Os scripts
geralmente são usados para executar tarefas de curta duração que serão finalizadas durante
o processo de inicialização. Os serviços, também conhecidos como daemons, podem ficar
ativos o tempo todo, pois muitas vezes são responsáveis por aspectos específicos do sistema
operacional.
O kernel abre então o initramfs (initial RAM filesystem). O initramfs é um arquivo que contém
um sistema de arquivos raiz temporário usado durante o processo de inicialização. O principal
objetivo de um arquivo initramfs é fornecer os módulos necessários para que o kernel possa
acessar o sistema de arquivos raiz “de verdade” do sistema operacional.
Logo que o sistema de arquivos raiz fica disponível, o kernel monta todos os sistemas de
arquivos configurados em /etc/fstab e, em seguida, executa o primeiro programa, um utilitário
chamado init. O programa init é responsável por executar todos os scripts de inicialização
e daemons do sistema. Existem implementações distintas desses iniciadores de sistema além
do tradicional init, como o systemd e o Upstart. Depois que o programa init é carregado, o
initramfs é removido da RAM.
Inspeção da inicialização
Às vezes ocorrem erros durante o processo de inicialização, mas nem sempre eles são críticos a
ponto de interromper completamente o sistema operacional. Não obstante, esses erros podem
comprometer o comportamento esperado do sistema. Todos os erros resultam em mensagens
que podem ser usadas para investigações futuras, pois elas contêm informações valiosas sobre
quando e como o erro ocorreu. Mesmo quando nenhuma mensagem de erro é gerada, as
informações coletadas durante o processo de inicialização podem ser úteis para fins de ajuste
e configuração.
36 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# dmesg
[ 5.223753] ACPI: AC Adapter [AC] (on-line)
[ 5.242275] battery: ACPI: Battery Slot [BAT0] (battery present)
[ 5.295824] sr 1:0:0:0: Attached scsi generic sg0 type 5
[ 5.298089] sd 2:0:0:0: Attached scsi generic sg1 type 0
[ 5.309545] vboxguest: loading out-of-tree module taints kernel.
[ 5.315225] vboxguest: module verification failed: signature and/or required key missing
- tainting kernel
[ 5.331754] vgdrvHeartbeatInit: Setting up heartbeat to trigger every 2000 milliseconds
[ 5.331970] input: Unspecified device as /devices/pci0000:00/0000:00:04.0/input/input7
[ 5.332534] vboxguest: Successfully loaded version 6.1.16
[ 5.332561] vboxguest: misc device minor 58, IRQ 20, I/O port d040, MMIO at 00000000
f0400000 (size 0x400000)
[ 5.332562] vboxguest: Successfully loaded version 6.1.16 (interface 0x00010004)
[ 5.354518] input: PC Speaker as /devices/platform/pcspkr/input/input8
[ 5.426200] RAPL PMU: API unit is 2^-32 Joules, 4 fixed counters, 10737418240 ms ovfl
timer
[ 5.426202] RAPL PMU: hw unit of domain pp0-core 2^-0 Joules
[ 5.426203] RAPL PMU: hw unit of domain package 2^-0 Joules
[ 5.426205] RAPL PMU: hw unit of domain dram 2^-0 Joules
[ 5.426206] RAPL PMU: hw unit of domain pp1-gpu 2^-0 Joules
[ 6.105038] Adding 999420k swap on /dev/mapper/debian10--vg-swap_1. Priority:-2 extents
:1 across:999420k FS
[ 8.535214] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000
[ 8.785886] EXT4-fs (dm-3): mounted filesystem with ordered data mode. Opts: (null)
[ 8.842016] EXT4-fs (dm-2): mounted filesystem with ordered data mode. Opts: (null)
[ 8.891303] systemd-journald[255]: Received request to flush runtime journal from PID 1
[ 8.916576] EXT4-fs (dm-4): mounted filesystem with ordered data mode. Opts: (null)
[ 9.153022] EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem
[ 9.158538] EXT4-fs (sda1): mounted filesystem without journal. Opts: (null)
A saída do dmesg pode ter centenas de linhas, portanto a listagem anterior contém apenas o
trecho que mostra o kernel chamando o gerenciador de serviços systemd. Os valores no início
das linhas são a quantidade de segundos desde o início do carregamento do kernel.
Os logs de inicialização anteriores também são preservados nos sistemas baseados no systemd,
sendo assim possível inspecionar as mensagens de sessões anteriores do sistema operacional.
root@debian10:/home/debian# journalctl -b 0
-- Logs begin at Wed 2021-06-30 12:01:51 CDT, end at Wed 2021-06-30 19:04:28 CDT. --
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: Linux version 4.19.0-13-amd64 (debian-
[email protected]) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.160-2
(2020-11-28)
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: Command line: BOOT_IMAGE=/vmlinuz
-4.19.0-13-amd64 root=/dev/mapper/debian10--vg-root ro quiet
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: Supporting XSAVE feature 0
x001: 'x87 floating point registers'
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: Supporting XSAVE feature 0
x002: 'SSE registers'
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: Supporting XSAVE feature 0
x004: 'AVX registers'
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: xstate_offset[2]: 576,
xstate_sizes[2]: 256
As mensagens sobre a inicialização, e outras emitidas pelo sistema operacional, são ar-
mazenadas em arquivos dentro do diretório /var/log/. Se ocorrer um erro crítico e o sistema
operacional for incapaz de continuar o processo de inicialização depois de carregar o kernel
e o initramfs, uma mídia de inicialização alternativa pode ser usada para iniciar o sistema e
acessar o arquivo de sistemas correspondente. Depois disso, os arquivos em /var/log/ po-
dem ser consultados em busca das razões causaram a interrupção do processo de inicialização.
As opções -D ou –directory do comando journalctl servem para ler mensagens de log em
diretórios diferentes de /var/log/journal/, que é a localização padrão para as mensagens de
log do systemd. Como as mensagens de log do sistema não são armazenadas em texto puro,
o comando journalctl é necessário para que fiquem legíveis.
Resumo
Esta aula aborda a sequência de inicialização em um sistema Linux padrão. O conhecimento
adequado de como funciona o processo de inicialização de um sistema Linux ajuda a evitar
erros que podem tornar o sistema inacessível. A lição tratou dos seguintes tópicos:
• Fonte: - https://vulnerablelife.wordpress.com/2016/01/31/uefi-vs-bios/
Fabio Gonçalves De Melo Santana / [email protected]
4
Alterar níveis de execução e
destinos de inicialização e desligar
ou reiniciar o sistema
Introdução
Uma característica comum entre os sistemas operacionais que seguem os princípios de design
do Unix é o emprego de processos separados para controlar funções distintas do sistema.
Esses processos, chamados daemons ou serviços, também são responsáveis pelos recursos do
sistema operacional, como serviços de aplicativos de rede (servidor HTTP, compartilhamento
de arquivos, email. . . ), bancos de dados, configuração sob demanda etc. Embora o Linux
utilize um kernel monolítico, muitos aspectos de baixo nível do sistema operacional são afetados
por daemons, como o balanceamento de carga e a configuração do firewall.
Os serviços podem ser controlados por scripts do shell ou por um programa e seus arquivos
de configuração. O primeiro método é implementado pelo padrão SysVinit, também con-
hecido como System V ou apenas SysV. O segundo método é implementado por systemd e
40
41 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]
SysVinit
Um gerenciador de serviços baseado no padrão SysVinit fornece conjuntos predefinidos de
estados do sistema, chamados níveis de execução, além dos arquivos correspondentes de script
dos serviços a serem executados. Os níveis de execução são numerados de 0 a 6, geralmente
atribuídos às seguintes finalidades:
id:runlevels:action:process
O primeiro termo id é um nome genérico de até quatro caracteres, usado para identificar a
entrada. O item runlevels é uma lista de números dos níveis de execução nos quais uma
ação especificada deve ser executada. O termo action define como init executará o processo
indicado pelo termo process. As ações disponíveis são:
42 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]
# Default runlevel
id:3:initdefault:
Temos também o comando telinit q, que deve ser executado a cada vez que o arquivo
43 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]
/etc/inittab é modificado. O argumento q (ou Q) pede que o init recarregue sua configu-
ração. Essa etapa é importante para evitar uma parada do sistema devido a uma configuração
incorreta em /etc/inittab.
Os scripts usados pelo init para configurar cada nível de execução ficam armazenados no di-
retório /etc/init.d/. Cada nível de execução tem um diretório associado em /etc/, chamado
/etc/rc0.d/, /etc/rc1.d/, /etc/rc2.d/, etc., com os scripts que devem ser executados
quando cada nível de execução é iniciado. Como o mesmo script pode ser usado por diferentes
níveis de execução, os arquivos nesses diretórios são apenas links simbólicos para os scripts
reais em /etc/init.d/.
Além disso, a primeira letra do nome do arquivo do link no diretório do nível de execução
indica se o serviço deve ser iniciado ou encerrado no nível de execução correspondente. Um
nome de arquivo iniciado com a letra K determina que o serviço será encerrado ao entrar no
nível de execução (kill). Se começar com a letra S, o serviço será iniciado ao ingressar no nível
de execução (start). O diretório /etc/rc1.d/, por exemplo, terá muitos links para scripts de
rede iniciados com a letra K, considerando que o nível de execução 1 é o nível do usuário
único, sem conectividade de rede.
O comando runlevel mostra o atual nível de execução do sistema. Esse comando exibe dois
valores: o primeiro é o nível de execução anterior, o segundo o atual:
root@debian10:/home/debian# runlevel
N 5
A letra N na saída mostra que o nível de execução não mudou desde a última inicialização.
No exemplo, runlevel 5 é o nível de execução atual do sistema.
O mesmo programa init pode ser usado para alternar entre níveis de execução em um sistema
em execução sem a necessidade de reiniciar. O comando telinit também permite alternar
entre níveis de execução. Por exemplo, os comandos telinit 1, telinit s ou telinit S mudarão
o sistema para o nível de execução 1.
systemd
Atualmente, o systemd é o conjunto de ferramentas mais usado para gerenciar recursos e
serviços do sistema, chamados de unidades (units) pelo systemd. Uma unidade consiste em um
nome, um tipo e um arquivo de configuração correspondente. Por exemplo, a unidade para um
processo de servidor httpd (como o servidor web Apache) será httpd.service nas distribuições
baseadas no Red Hat e seu arquivo de configuração também será chamado httpd.service (nas
44 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]
• service: O tipo de unidade mais comum, para recursos ativos do sistema que podem
ser iniciados, interrompidos e recarregados;
• socket: O tipo de unidade socket pode ser um socket de sistema de arquivos ou um
socket de rede. Todas as unidades socket possuem uma unidade de serviço correspon-
dente, carregada quando o socket recebe uma solicitação;
• device: Uma unidade de dispositivo está associada a um dispositivo de hardware iden-
tificado pelo kernel. Um dispositivo só será considerado como uma unidade systemd
se existir uma regra udev para isso. Uma unidade de dispositivo pode ser usada para
resolver dependências de configuração quando determinado hardware é detectado, uma
vez que as propriedades da regra udev podem ser usadas como parâmetros para a unidade
de dispositivo;
• mount: Uma unidade de montagem é uma definição de ponto de montagem no sistema
de arquivos, semelhante a uma entrada em /etc/fstab;
• automount: Uma unidade de montagem automática também é uma definição de ponto
de montagem no sistema de arquivos, mas nesse caso montada automaticamente. Cada
unidade de montagem automática possui uma unidade de montagem correspondente,
que é iniciada quando o ponto de montagem automática é acessado;
• target: Uma unidade de destino é um agrupamento de outras unidades, gerenciadas
como uma única unidade;
• snapshot: Uma unidade snapshot é um estado salvo do gerenciador do systemd (não
disponível em todas as distribuições Linux).
resposta é armazenada na variável $?. O valor 0 indica que unit inicia com o sistema e
o valor 1 indica que não.
O comando systemctl isolate alterna entre diferentes destinos. Assim, para alternar manual-
mente para o destino multi-user:
Existem destinos correspondentes aos níveis de execução do SysV, desde runlevel0.target até
runlevel6.target. Todavia, o systemd não usa o arquivo /etc/inittab. Para alterar o destino
padrão do sistema, a opção systemd.unit pode ser adicionada à lista de parâmetros do kernel.
Por exemplo, para usar multi-user.target como destino padrão, o parâmetro do kernel deve
ser systemd.unit=multi-user.target. Todos os parâmetros do kernel podem ser tornados
persistentes alterando-se a configuração do gerenciador de inicialização.
Como nos sistemas que adotam o SysV, o destino padrão nunca deve apontar para shut-
down.target, pois ele corresponde ao nível de execução 0 (encerramento).
Upstart
Os scripts de inicialização usados pelo Upstart estão localizados no diretório /etc/init/. Os
serviços do sistema podem ser listados com o comando initctl list, que também mostra o
estado atual dos serviços e, se disponível, seu número PID.
avahi-cups-reload stop/waiting
avahi-daemon start/running, process 1123
mountall-net stop/waiting
mountnfs-bootclean.sh start/running
nmbd start/running, process 3085
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 1095
tty4 start/running, process 1761
udev start/running, process 1073
upstart-udev-bridge start/running, process 1066
console-setup stop/waiting
irqbalance start/running, process 1842
plymouth-log stop/waiting
smbd start/running, process 1457
tty5 start/running, process 1764
failsafe stop/waiting
Cada uma das ações do Upstart tem seu próprio comando independente. Por exemplo, o
comando start pode ser usado para iniciar um sexto terminal virtual:
O Upstart não usa o arquivo /etc/inittab para definir os níveis de execução, mas os comandos
antigos runlevel e telinit ainda podem ser usados para verificar e alternar entre níveis de
execução.
O Upstart foi desenvolvido para a distribuição Ubuntu Linux para facilitar a inicial-
ização paralela dos processos. O Ubuntu parou de usar o Upstart em 2015, quando
migrou do Upstart para o systemd.
47 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]
Desligar e reiniciar
Um comando muito tradicional usado para desligar ou reiniciar o sistema é o shutdown. O
comando shutdown adiciona funções extras ao processo de desligamento: ele notifica auto-
maticamente todos os usuários conectados com uma mensagem em suas sessões do shell e
impede novos logins.
Após o shutdown ser executado, todos os processos recebem o sinal SIGTERM, seguido pelo
sinal SIGKILL, e o sistema é encerrado ou muda seu nível de execução. Por padrão, quando
as opções -h ou -r não são usadas, o sistema alterna para o nível de execução 1, ou seja,
o modo de usuário único. Para alterar as opções padrão de shutdown, o comando deve ser
executado com a seguinte sintaxe:
Somente o parâmetro time é obrigatório. Esse parâmetro define quando a ação solicitada será
executada, aceitando os seguintes formatos:
O parâmetro message é o texto de aviso enviado a todas as sessões de terminal dos usuários
logados.
A implementação do SysV permite limitar os usuários que poderão reiniciar a máquina pres-
sionando Ctrl+Alt+Del. Para isso, incluímos a opção -a no comando shutdown presente
na linha referente a ctrlaltdel no arquivo /etc/inittab. Ao fazer isso, somente usuários cujos
nomes de usuário constem do arquivo /etc/shutdown.allow poderão reiniciar o sistema com
o atalho de teclado Ctrl+Alt+Del.
O comando systemctl também pode ser usado para desligar ou reiniciar a máquina em
sistemas que empregam o systemd. Para reiniciar o sistema, usamos o comando systemctl
reboot. Para desligar o sistema, o comando é systemctl poweroff. Ambos os comandos
requerem privilégios de root para serem executados, pois usuários comuns não podem realizar
esses procedimentos.
Nem todas as atividades de manutenção exigem que o sistema seja desligado ou reiniciado.
No entanto, quando é necessário alterar o estado do sistema para o modo de usuário único, é
importante avisar os usuários conectados para que não sejam prejudicados pelo encerramento
abrupto de suas atividades.
48 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]
Como no caso do comando shutdown ao desligar ou reiniciar o sistema, o comando wall pode
enviar uma mensagem para as sessões de terminal de todos os usuários logados. Para isso, o
administrador do sistema só precisa fornecer um arquivo ou escrever diretamente a mensagem
como um parâmetro para o comando wall.
Resumo
Esta aula aborda os principais utilitários usados como gerenciadores de serviços pelas dis-
tribuições Linux. Os utilitários SysVinit, systemd e Upstart têm sua abordagem própria
para controlar serviços e estados do sistema. A lição inclui os seguintes tópicos:
• Fonte: https://linoxide.com/systemd-vs-sysvinit-cheatsheet/
Fabio Gonçalves De Melo Santana / [email protected]
5
102.1: Definir o esquema de
partições do disco rígido
Introdução
Um disco é um recipiente físico para seus dados.
Antes de poder ser usado por um computador, ele precisa ser particionado. Uma partição é um
subconjunto lógico do disco físico. O particionamento é uma maneira de “compartimentar” as
informações armazenadas no disco, separando, por exemplo, os dados do sistema operacional
dos dados do usuário.
Todo disco precisa de pelo menos uma partição, mas é possível definir várias partições se
necessário, e as informações a respeito delas são armazenadas em uma tabela de partições.
Essa tabela inclui informações sobre o primeiro e o último setores da partição e seu tipo, além
de detalhes adicionais sobre cada partição.
As partições não podem abranger vários discos. Porém, usando o Gerenciador de Volumes
Lógicos (Logic Volume Manager ou LVM), podemos combinar várias partições, mesmo entre
50
51 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]
Os volumes lógicos abstraem as limitações dos dispositivos físicos e permitem trabalhar com
“pools” de espaço em disco que podem ser combinados ou distribuídos de maneira muito
mais flexível do que as partições tradicionais permitiriam. O LVM é útil em situações em
que é necessário adicionar mais espaço a uma partição sem precisar migrar os dados para um
dispositivo maior.
Pontos de montagem
Antes que um sistema de arquivos possa ser acessado no Linux, ele precisa ser montado.
Isso significa vincular o sistema de arquivos a um ponto específico na árvore de diretórios do
sistema, chamado ponto de montagem.
O ponto de montagem deve existir antes de o sistema de arquivos ser montado. Não é possível
montar uma partição em /mnt/dadosdousuario se esse diretório não existir. No entanto, se
o diretório existir e contiver arquivos, esses arquivos ficarão indisponíveis até você desmontar
o sistema de arquivos. Ao listar o conteúdo do diretório, veremos os arquivos armazenados no
sistema de arquivos montado, não o conteúdo original do diretório.
Os sistemas de arquivos podem ser montados em qualquer lugar que você desejar. No entanto,
certas práticas são recomendadas para facilitar a administração do sistema.
Tradicionalmente, todos os dispositivos externos eram montados no diretório /mnt. Ali existia
uma série de pontos de ancoragem pré-configurados para os dispositivos mais comuns, como
drives de CD-ROM (/mnt/cdrom) e de disquete (/mnt/floppy).
Ele foi substituído por /media, que agora é o ponto de montagem padrão para qualquer mídia
removível (como discos externos, drives flash USB, leitores de cartão de memória, discos óticos
etc.) conectada ao sistema.
ambiente de desktop.
Dito isto, sempre que for preciso montar manualmente um sistema de arquivos, é recomendável
montá-lo em /mnt. Os comandos específicos para controlar a montagem e desmontagem de
sistemas de arquivos no Linux serão discutidos em outra lição.
Também é mais fácil reinstalar o sistema sem o risco de afetar os dados dos usuários se
os diretórios pessoais (em /home) estiverem em uma partição separada. Da mesma forma,
manter os dados relacionados a um servidor web ou banco de dados (normalmente em /var)
em uma partição separada (ou mesmo um disco à parte) facilita a administração do sistema
caso seja necessário adicionar mais espaço em disco para esses casos de uso.
Tecnicamente, uma partição de inicialização não é necessária, pois na maioria dos casos o
GRUB pode montar a partição raiz (/) e carregar os arquivos a partir de um diretório /boot
separado.
No entanto, uma partição de inicialização separada pode ser interessante, seja por segurança
(garantindo que o sistema seja inicializado mesmo em caso de falha no sistema de arquivos
raiz), ou se você desejar usar um sistema de arquivos que o carregador de inicialização não
pode entender na partição raiz, ou se usar um método não suportado de criptografia ou
compactação.
IBM PC BIOS original endereçava os discos usando cilindros, cabeças e setores (CHS), com
um máximo de 1024 cilindros, 256 cabeças e 63 setores, resultando em um tamanho máximo
de disco de 528 MB (504 MB no MS-DOS). Isso significa que qualquer coisa além dessa marca
não estaria acessível em sistemas legados, a menos que um esquema de endereçamento de
disco diferente (como o Endereçamento de bloco lógico, LBA) fosse usado.
Em máquinas com Microsoft Windows, essa partição geralmente é a primeira no disco, embora
isso não seja obrigatório. O ESP é criado (ou preenchido) pelo sistema operacional após a
instalação e, em um sistema Linux, é montado em /boot/efi.
A partição /home
Cada usuário do sistema possui um diretório inicial para armazenar arquivos pessoais e prefer-
ências. A maioria deles está localizada em /home. O diretório inicial costuma ter o mesmo
nome que o usuário, assim, o usuário joatham teria seu diretório em /home/joatham.
Porém há exceções, por exemplo, o diretório inicial do usuário root é /root e alguns serviços
do sistema podem ter usuários associados com diretórios pessoais em outros lugares.
54 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]
Swap
A partição de troca (ou swap) é usada para passar as páginas de memória da RAM para o
disco conforme necessário. Esta partição precisa ser de um tipo específico e configurada com
um utilitário apropriado chamado mkswap antes de poder ser usada.
A partição de troca não pode ser montada como as outras, o que significa que não é possível
acessá-la como um diretório normal e visualizar seu conteúdo.
Um sistema pode ter diversas partições de troca (embora isso seja incomum), e o Linux
também suporta o uso de arquivos de troca em vez de partições, o que pode ser útil para
aumentar rapidamente o espaço de troca quando necessário.
O tamanho da partição de troca é um tema controverso. A regra antiga dos primeiros dias
do Linux (“duas vezes a quantidade de RAM”) nem sempre se aplica, dependendo de como o
sistema está sendo usado e da quantidade de RAM física instalada.
executando um serviço crítico, como um banco de dados, servidor Web ou SAP, é aconselhável
verificar o valor recomendado na documentação desses serviços.
LVM
Já discutimos como os discos são organizados em uma ou mais partições, com cada partição
contendo um sistema de arquivos que descreve como os arquivos e os metadados associados são
armazenados. Uma das desvantagens do particionamento é que o administrador do sistema
deve decidir antecipadamente como o espaço em disco disponível em um dispositivo será
distribuído. Isso pode ser problemático mais tarde, se uma partição exigir mais espaço do que
o originalmente planejado. Claro que as partições podem ser redimensionadas, mas isso nem
sempre é possível (se, por exemplo, não houver mais espaço livre no disco).
Os PVs são agrupados em Grupos de Volumes (VG), que abstraem os dispositivos subjacentes
e são vistos como um único dispositivo lógico, com a capacidade de armazenamento combinada
dos PVs do componente.
Os Grupos de Volumes podem ser subdivididos em Volumes Lógicos (LVs), com funcionalidade
semelhante à das partições, mas com mais flexibilidade.
Após sua criação, um Volume Lógico é visto pelo sistema operacional como um dispositivo
de bloco normal. Um dispositivo será criado em /dev, com o nome /dev/VGNAME/LV-
NAME, em que VGNAME é o nome do Grupo de Volumes e LVNAME o nome do Volume
56 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]
Lógico.
Esses dispositivos podem ser formatados com o sistema de arquivos desejado usando utilitários
padrão (como o mkfs.ext4, por exemplo) e montados com os métodos usuais, seja manual-
mente, com o comando mount, ou automaticamente, adicionando-os ao arquivo /etc/fstab.
Resumo
Nesta aula, falamos sobre particionamento e explicamos quais diretórios geralmente são man-
tidos em partições separadas e por quê. Além disso, demos uma visão geral do LVM (Geren-
ciamento Lógico de Volumes) e como ele pode oferecer uma maneira mais flexível de alocar
os dados e o espaço em disco em comparação com o particionamento tradicional.
• Fonte: - https://brunopontes.com.br/ensino/semestres/2018.1/soredes_info4v/aulas/roteiro_aula_1
Fabio Gonçalves De Melo Santana / [email protected]
6
Instalar um gerenciador de
inicialização
Introdução
Quando um computador é ligado, o primeiro software a ser executado é o gerenciador de
inicialização. O único objetivo desse código é carregar o kernel de um sistema operacional e
entregar o controle a ele. O kernel então carrega os drivers necessários, inicializa o hardware
e, em seguida, carrega o restante do sistema operacional.
O GRUB é o gerenciador de inicialização usado na maioria das distribuições Linux. Ele pode
carregar o kernel do Linux ou outros sistemas operacionais, como o Windows, além de lidar
com diversas imagens e parâmetros do kernel como entradas de menu separadas. A seleção do
kernel na inicialização é feita por meio de uma interface acionada por teclado. Existe também
uma interface de linha de comando para editar as opções e parâmetros de inicialização.
A maioria das distribuições Linux instala e configura o GRUB (na verdade, o GRUB 2) au-
tomaticamente, para que um usuário comum não precise pensar nisso. No entanto, como
administrador do sistema, é essencial saber controlar o processo de inicialização para ser pos-
sível recuperar o sistema no caso de uma falha na inicialização—por exemplo, se houver um
erro na atualização do kernel.
58
59 6. Instalar um gerenciador de inicialização
Fabio Gonçalves De Melo Santana / [email protected]
O GRUB 2 é uma remodelagem completa do GRUB com o objetivo de deixá-lo mais limpo,
seguro, robusto e poderoso. Dentre as muitas vantagens em relação ao GRUB Legacy estão
um arquivo de configuração muito mais flexível.
Também há suporte para temas e menus gráficos de inicialização com telas de abertura, a
possibilidade de inicializar ISOs LiveCD diretamente a partir do disco rígido, melhor suporte
para arquiteturas não-x86, suporte universal para UUIDs (facilitando a identificação de discos
e partições) e muito mais.
O GRUB Legacy não está mais em desenvolvimento ativo (a última versão foi a 0.97, em 2005),
e hoje a maioria das principais distribuições Linux vem com o GRUB 2 como gerenciador de
inicialização padrão. No entanto, ainda podemos encontrar sistemas usando o GRUB Legacy;
portanto, é importante saber como usá-lo e em que ele difere do GRUB 2.
A partição /boot
No Linux, os arquivos necessários para o processo de inicialização geralmente são armazena-
dos em uma partição de inicialização montada no sistema de arquivos raiz e coloquialmente
chamada de /boot.
Uma partição de inicialização não é imprescindível nos sistemas atuais, já que os carregadores
de inicialização como o GRUB geralmente são capazes de montar o sistema de arquivos raiz e
procurar os arquivos necessários dentro de um diretório /boot. Porém, seu uso é aconselhável,
pois ela separa os arquivos necessários ao processo de inicialização do restante do sistema de
arquivos.
Portanto, para garantir uma compatibilidade máxima, a partição /boot geralmente está local-
izada no início do disco e termina antes do cilindro 1024 (528 MB), garantindo que a máquina
sempre possa carregar o kernel. O tamanho recomendado para essa partição em uma máquina
atual é de 300 MB.
Outras razões para uma partição /boot separada são a criptografia e a compactação, já que
alguns métodos ainda não são suportados pelo GRUB 2, ou ainda se a partição raiz do sistema
(/) precisar ser formatada usando um sistema de arquivos não suportado.
60 6. Instalar um gerenciador de inicialização
Fabio Gonçalves De Melo Santana / [email protected]
7
GRUB 2
Instalando o GRUB 2
O GRUB 2 pode ser instalado usando o utilitário grub-install. Se seu sistema se recusa a
inicializar, você precisará inicializá-lo usando um Live CD ou um disco de recuperação, descobrir
qual é a partição de inicialização do seu sistema, montá-la e executar o utilitário.
61
62 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]
Caso esteja instalando em um sistema que não possui uma partição de inicialização, mas
apenas um diretório /boot no sistema de arquivos raiz, aponte-o em grub-install. Nesse caso,
o comando é:
Configurando o GRUB 2
O arquivo de configuração padrão do GRUB 2 é /boot/grub/grub.cfg. Esse arquivo é gerado
automaticamente e não se recomenda editá-lo à mão. Para fazer alterações na configuração do
GRUB, é preciso editar o arquivo /etc/default/grub e depois executar o utilitário update-
grub para gerar um arquivo compatível.
Esses arquivos devem ser executáveis e são processados em ordem numérica pelo update-grub.
Portanto, 05_debian_theme é processado antes de 10_linux e assim por diante. As entradas
de menu personalizadas são geralmente adicionadas ao arquivo 40_custom.
A primeira linha sempre começa com menuentry e termina com {. O texto entre aspas será
mostrado como o rótulo da entrada no menu de inicialização do GRUB 2.
O parâmetro set root define o disco e a partição em que o sistema de arquivos raiz do sistema
operacional está localizado. Note que no GRUB 2 os discos são numerados a partir de zero,
então hd0 é o primeiro disco (sda no Linux), hd1 o segundo e assim por diante. As partições,
por sua vez, são numeradas a partir de um. No exemplo acima, o sistema de arquivos raiz
está localizado no primeiro disco (hd0), primeira partição (,1) ou sda1.
root@debian10:/home/debian# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jun 30 12:01 39bdcf39-9858-4d47-8f0f-dadfad509571 -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jun 30 12:01 46ca5297-6ca0-45a0-b30a-c00dce00fe8e -> ../../dm-4
lrwxrwxrwx 1 root root 10 Jun 30 12:01 475d0289-b393-4af6-9ad1-63749b29e0b3 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jun 30 12:01 aeae66be-f0c2-470d-8481-884427924c77 -> ../../dm-2
lrwxrwxrwx 1 root root 10 Jun 30 12:01 b1199388-b7a3-44ed-bd41-b814cd8989c1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jun 30 12:01 dd1abd55-aad0-46ad-8047-8177d00da412 -> ../../dm-3
Ao usar o comando search, é comum adicionar o parâmetro –no-floppy para que o GRUB não
perca tempo buscando em disquetes.
A linha linux indica onde está localizado o kernel do sistema operacional (neste caso, o arquivo
vmlinuz na raiz do sistema de arquivos). Depois disso, podemos passar parâmetros na linha
de comando para o kernel.
A linha initrd indica onde está localizado o disco de RAM inicial. No exemplo acima, o arquivo
65 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]
A maioria das distribuições Linux não coloca de fato o kernel e o initrd no diretório
raiz do sistema de arquivos raiz. Em vez disso, esses são links para os arquivos reais
dentro do diretório ou partição /boot.
Se você vir apenas uma contagem regressiva, mas não um menu, pressione Shift para
exibir o menu.
Para editar uma opção, selecione-a com as setas e pressione E. Será exibida uma janela de
editor com o conteúdo da menuentry associada àquela opção, confirme definido em /boot/-
grub/grub.cfg.
Depois de editar uma opção, digite Ctrl+X ou F10 para inicializar, ou ainda Esc para retornar
ao menu.
Para entrar no shell do GRUB 2, pressione C na tela do menu (ou Ctrl+C) na janela de edição.
Aparecerá um prompt de comando como este: grub >
Digite help para ver uma lista de todos os comandos disponíveis ou pressione Esc para sair do
shell e retornar à tela do menu.
Lembre-se de que esse menu não aparecerá se GRUB_TIMEOUT estiver definido com
0 em /etc/default/grub.
66 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]
• Fonte: - https://borosan.gitbook.io/lpic1-exam-guide/1011-determine-and-configure-
hardware-settings
Fabio Gonçalves De Melo Santana / [email protected]
8
102.3: Gerenciar Bibliotecas
Compartilhadas
Introdução
Conceito de Bibliotecas Compartilhadas
Bibliotecas são coleções de código que se destinam a ser usadas por muitos programas difer-
entes; assim como as bibliotecas físicas mantêm livros e outros recursos para serem usados
por muitas pessoas diferentes.
Bibliotecas estáticas
Uma biblioteca estática é mesclada com o programa no momento do link. Uma cópia do
código da biblioteca é incorporada ao programa e se torna parte dele. Assim, o programa
não tem dependências da biblioteca em tempo de execução porque o programa já contém o
código da biblioteca. Não ter dependências pode ser visto como uma vantagem, pois você
não precisa se preocupar em ter certeza de que as bibliotecas usadas estão sempre disponíveis.
67
68 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]
Por outro lado, os nomes das bibliotecas estáticas terminam em .a, por exemplo, libpthread.a.
root@debian10:/home/debian# ls -l /lib/x86_64-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 May 1 2019 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.28.so
69 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]
Este padrão de referenciar arquivos de biblioteca compartilhada nomeados por uma versão
específica por nomes de arquivo mais gerais é uma prática comum.
Outros exemplos de bibliotecas compartilhadas incluem libreadline (que permite aos usuários
editar linhas de comando à medida que são digitadas e inclui suporte para os modos de edição
Emacs e vi), libcrypt (que contém funções relacionadas à criptografia, hashing e codificação)
ou libcurl ( que é uma biblioteca de transferência de arquivos multiprotocolo).
• /lib
• /lib32
• /lib64
• /usr/lib
• /usr/local/lib
root@debian10:/home/debian# ls /etc/ld.so.conf.d/
fakeroot-x86_64-linux-gnu.conf libc.conf x86_64-linux-gnu.conf
70 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]
Esses arquivos * .conf devem incluir os caminhos absolutos para os diretórios da biblioteca
compartilhada:
root@debian10:/home/debian# ldconfig -v
/usr/lib/x86_64-linux-gnu/libfakeroot:
libfakeroot-0.so -> libfakeroot-tcp.so
/usr/local/lib:
/lib/x86_64-linux-gnu:
libgcc_s.so.1 -> libgcc_s.so.1
libdevmapper.so.1.02.1 -> libdevmapper.so.1.02.1
libpcprofile.so -> libpcprofile.so
libmariadb.so.3 -> libmariadb.so.3
libicutu.so.63 -> libicutu.so.63.1
libgstmpegts-1.0.so.0 -> libgstmpegts-1.0.so.0.1404.0
libcrypto.so.1.1 -> libcrypto.so.1.1
root@debian10:/home/debian# ls -l /lib/x86_64-linux-gnu/libicutu.so.63
lrwxrwxrwx 1 root root 16 Mar 13 2020 /lib/x86_64-linux-gnu/libicutu.so.63 -> libicutu.so
.63.1
root@debian10:/home/debian# LD_LIBRARY_PATH=/usr/local/mylib
Com a opção -u (ou –unused), ldd imprime as dependências diretas não utilizadas (se exis-
tirem):
/lib/x86_64-linux-gnu/librt.so.1
O motivo de ter essas dependências não utilizadas está relacionado às opções usadas pelo
vinculador ao construir o binário. Embora o programa não precise de uma biblioteca não
utilizada, ele ainda estava vinculado e rotulado como NECESSÁRIO nas informações sobre o
arquivo-objeto. Você pode investigar isso usando comandos como readelf ou objdump, que
você usará em breve no exercício exploratório.
Resumo
Nesta aula você aprendeu:
• Fonte: - https://medium.com/@valentina.rua123/static-and-dynamic-library-in-c-fc4f168ae71d
Fabio Gonçalves De Melo Santana / [email protected]
9
Gerenciamento de pacotes em
distribuições Debian
Introdução
Era uma vez. . . quando o Linux ainda era uma criança, a maneira mais comum de distribuir
software era um arquivo compactado (geralmente um arquivo .tar.gz) com código-fonte, que
você mesmo descompactava e compilava.
Com isso, os esforços para padronizar uma maneira de distribuir esses “pacotes” de software
aumentaram e os primeiros gerenciadores de pacotes nasceram. Essas ferramentas tornaram
muito mais fácil instalar, configurar ou remover programas de um sistema.
Um deles era o formato de pacote Debian (.deb) e sua ferramenta de pacote (dpkg). Hoje,
eles são amplamente usados não apenas no próprio Debian, mas também em seus derivados,
como o Ubuntu e aqueles derivados dele.
75
76 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
O dpkg verificará se essas dependências estão instaladas em seu sistema e não conseguirá
instalar o pacote se não estiverem. Neste caso, o dpkg irá listar quais pacotes estão faltando.
No entanto, ele não pode resolver dependências por si só. Cabe ao usuário encontrar os
pacotes .deb com as dependências correspondentes e instalá-los.
No exemplo abaixo, o usuário tenta instalar o pacote do editor de vídeo OpenShot, mas faltam
algumas dependências:
Removendo Pacotes
Para remover um pacote, passe o parâmetro -r para dpkg, seguido pelo nome do pacote. Por
exemplo, o seguinte comando removerá o pacote unrar do sistema:
Você pode passar vários nomes de pacotes para dpkg -r, então todos eles serão removidos de
uma vez.
Recommends: libu2f-udev
Provides: www-browser
Section: web
Priority: optional
Description: The web browser from Google
Google Chrome is a browser that combines a minimal design with sophisticated technology
to make the web faster, safer, and easier.
Este programa fará backup dos arquivos de configuração antigos, descompactará os novos
nos diretórios corretos e executará o script de pós-instalação fornecido pelo pacote, como se
o pacote tivesse sido instalado pela primeira vez. Tente reconfigurar o pacote tzdata com o
seguinte exemplo:
O APT trabalha em conjunto com os repositórios de software que contêm os pacotes disponíveis
para instalação. Esses repositórios podem ser um servidor local ou remoto ou (menos comum)
até mesmo um disco de CD-ROM.
Debian e Ubuntu, mantêm seus próprios repositórios, e outros repositórios podem ser mantidos
por desenvolvedores ou grupos de usuários para fornecer software não disponível nos principais
repositórios de distribuição.
81 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
apt e apt-get podem exigir uma conexão de rede, porque os pacotes e índices de
pacotes podem precisar ser baixados de um servidor remoto.
Da mesma forma, para remover um pacote, use apt-get remove seguido pelo nome do
pacote:
Esteja ciente de que ao instalar ou remover pacotes, o APT fará a resolução automática das
dependências. Isso significa que quaisquer pacotes adicionais necessários ao pacote que você
está instalando também serão instalados e que os pacotes que dependem do pacote que você
está removendo também serão removidos. O APT sempre mostrará o que será instalado ou
removido antes de perguntar se você deseja continuar:
ou
Para resolver isso, use o comando apt-get install -f. Isso tentará arrumar os pacotes quebra-
dos instalando as dependências ausentes, garantindo que todos os pacotes sejam consistentes
novamente.
Atualizando Pacotes
O APT pode ser usado para atualizar automaticamente quaisquer pacotes instalados para
as versões mais recentes disponíveis nos repositórios. Isso é feito com o comando apt-get
upgrade. Antes de executá-lo, primeiro atualize o índice do pacote com apt-get update:
84 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
O Cache Local
Quando você instala ou atualiza um pacote, o arquivo .deb correspondente é baixado para um
diretório de cache local antes de o pacote ser instalado. Por padrão, este diretório é /var/-
cache/apt/archives. Arquivos parcialmente baixados são copiados para /var/cache/ap-
t/archives/partial/.
Conforme você instala e atualiza pacotes, o diretório de cache pode ficar bem grande. Para
recuperar espaço, você pode esvaziar o cache usando o comando apt-get clean. Isso removerá
o conteúdo dos diretórios /var/cache/apt/archives e /var/cache/apt/archives/partial/.
Para realizar uma pesquisa, use apt-cache search seguido por um padrão de pesquisa. A
saída será uma lista de cada pacote que contém o padrão, seja no nome do pacote, na descrição
ou nos arquivos fornecidos.
85 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
No exemplo acima, a entrada liblzma5 - XZ-format compression library não parece corresponder
ao padrão. No entanto, se mostrarmos as informações completas, incluindo a descrição, para
o pacote usando o parâmetro show, encontraremos o padrão lá:
Você pode usar expressões regulares com o padrão de pesquisa, permitindo pesquisas muito
complexas (e precisas). No entanto, este tópico está fora do escopo desta lição.
86 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
Você também pode usar apt search em vez de apt-cache search e apt show em vez
de apt-cache show.
A Lista de Fontes
O APT usa uma lista de fontes para saber de onde obter os pacotes. Esta lista é armazenada no
arquivo sources.list, localizado dentro do diretório /etc/apt. Este arquivo pode ser editado
diretamente com um editor de texto, como vi, pico ou nano, ou com utilitários gráficos como
aptitude ou synaptic.
• Tipo de arquivo: Um repositório pode conter pacotes com software pronto para execu-
tar (pacotes binários, tipo deb) ou com o código-fonte para este software (pacotes-fonte,
tipo deb-src). O exemplo acima fornece pacotes binários;
• URL: A URL do repositório;
• Distribuição: O nome (ou codinome) da distribuição para a qual os pacotes são forneci-
dos. Um repositório pode hospedar pacotes para várias distribuições. No exemplo acima,
disco é o codinome do Ubuntu 19.04 Disco Dingo;
• Componentes: Cada componente representa um conjunto de pacotes. Esses compo-
nentes podem ser diferentes em diferentes distribuições do Linux.
• main: Consiste em pacotes compatíveis com o Debian Free Software Guidelines (DFSG),
que não depende de software fora desta área para operar. Os pacotes incluídos aqui são
87 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
Para adicionar um novo repositório para obter pacotes, você pode simplesmente adicionar
a linha correspondente (geralmente fornecida pelo mantenedor do repositório) ao final de
sources.list, salvar o arquivo e recarregar o índice do pacote com apt-get update. Depois
disso, os pacotes no novo repositório estarão disponíveis para instalação usando apt-get
install.
Lembre-se de que as linhas que começam com o caractere # são consideradas comentários e
são ignoradas.
O diretório /etc/apt/sources.list.d
Dentro do diretório /etc/apt/sources.list.d você pode adicionar arquivos com repositórios
adicionais para serem usados pelo APT, sem a necessidade de modificar o arquivo /etc/ap-
t/sources.list principal. Esses são arquivos de texto simples, com a mesma sintaxe descrita
acima e a extensão de arquivo .list.
Após a instalação, você precisará atualizar o cache do pacote usado para o arquivo apt:
Isso geralmente leva apenas alguns segundos. Depois disso, você está pronto para usar o
arquivo apt.
Para listar o conteúdo de um pacote, use o parâmetro list seguido do nome do pacote:
Você pode pesquisar um arquivo em todos os pacotes usando o parâmetro de pesquisa, seguido
pelo nome do arquivo. Por exemplo, se você deseja saber qual pacote fornece um arquivo
chamado libSDL2.so, você pode usar:
A diferença entre apt-file search e dpkg-query é que apt-file search também pesquisará
pacotes desinstalados, enquanto dpkg-query só pode mostrar arquivos que pertencem a um
pacote instalado.
89 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
Resumo
Nesta aula, você aprendeu:
• dpkg -i: Instala um único pacote ou uma lista de pacotes separados por espaço;
• dpkg -r: Remove um pacote ou uma lista de pacotes separados por espaço;
• dpkg -I: Inspeciona um pacote, fornecendo detalhes sobre o software que ele instala e
quaisquer dependências necessárias;
• dpkg –get-selections: Lista todos os pacotes que o dpkg instalou no sistema;
• dpkg -L: Imprime uma lista de todos os arquivos que um determinado pacote instala;
• dpkg-query: Com um nome de arquivo especificado, este comando imprimirá o pacote
que instalou o arquivo;
• dpkg-reconfigure: Este comando executará novamente um script de pós-instalação de
pacotes para que um administrador possa fazer ajustes de configuração para a instalação
do pacote;
• apt-get update: Este comando atualizará o índice do pacote local para corresponder
ao que está disponível nos repositórios configurados no diretório / etc / apt /;
• apt-get install: Este comando irá baixar um pacote de um repositório remoto e instalá-
lo junto com suas dependências, também pode ser usado para instalar um pacote Debian
que já foi baixado;
• apt-get remove: Este comando desinstalará o (s) pacote (s) especificado (s) do sis-
tema;
• apt-cache show: Assim como o comando dpkg -I, este comando pode ser usado para
mostrar detalhes sobre um pacote específico;
• apt-cache search: Este comando pesquisará seu banco de dados local em cache do
APT por um pacote específico;
• apt-file update: Este comando atualizará o cache do pacote para que o comando
apt-file possa consultar seu conteúdo;
• apt-file search: Este comando pesquisará em qual pacote um arquivo está incluído.
Uma lista de todos os pacotes contendo o padrão é retornada;
• apt-file list: Este comando é usado para listar o conteúdo de um pacote, assim como
90 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
• Fonte: https://ellawala.wordpress.com/2008/09/22/linux-package-management-cheatsheet/
# Gerenciamento de pacotes com YUM, DNF e Zypper
Introdução
Dando continuidade aos gerenciadores de pacotes, vamos aprender sobre mais alguns.
O RPM Package Manager e sua ferramenta de pacote (rpm) foi desenvolvida pela Red Hat, e
hoje é amplamente utilizado, não somente no próprio Red Hat Enterprise Linux (RHEL), mas
também em seus descendentes, como o Fedora, CentOS e Oracle Linux, outras distribuições
como o openSUSE, e até mesmo outros sistemas operacionais, como o AIX da IBM.
Se existir uma versão anterior de um pacote no sistema, será possível atualizar para uma
versão mais recente usando o parâmetro -U:
Se não houver uma versão anterior do NOMEDOPACOTE, uma nova cópia será instalada.
Para evitar isso e apenas atualizar um pacote que esteja instalado, use a opção -F.
Se um pacote instalado depender do pacote que está sendo removido, aparecerá uma men-
sagem de erro:
92 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
Para concluir a operação, primeiro é necessário remover os pacotes que dependem daquele que
se deseja remover (no exemplo acima, file-roller). Podemos passar vários nomes de pacotes
para o rpm -e para remover vários pacotes de uma só vez.
tzdata-2021a-1.el8.noarch
xkeyboard-config-2.28-1.el8.noarch
kernel-modules-4.18.0-305.3.1.el8.x86_64
libssh-config-0.9.4-2.el8.noarch
python3-dateutil-2.6.1-6.el8.noarch
kbd-legacy-2.0.4-10.el8.noarch
Para obter informações sobre um pacote instalado, como o número de versão, arquitetura,
data de instalação, empacotador, resumo etc., use rpm com os parâmetros -qi (o nome vem
de “query info”), seguido pelo nome do pacote. Por exemplo:
Para ver uma lista dos arquivos que estão dentro de um pacote instalado, use os parâmetros
-ql (ou seja, “query list”) seguido pelo nome do pacote:
Se quiser informações ou uma lista de arquivos de um pacote que ainda não foi instalado,
basta adicionar o parâmetro -p aos comandos acima, seguido pelo nome do arquivo RPM
(FILENAME). Assim, rpm -qi NOMEDOPACOTE se torna rpm -qip FILENAME, e rpm
-ql NOMEDOPACOTE se torna rpm -qlp FILENAME, como mostrado abaixo.
Name : unzip
Version : 5.51
Release : 10.el5
Architecture: i386
Install Date: (not installed)
Group : Applications/Archiving
Size : 1161365
License : BSD
Signature : (none)
Source RPM : (none)
Build Date : Mon 04 Aug 2008 03:07:05 PM EDT
Build Host : ca-build15.us.oracle.com
Relocations : (not relocatable)
Buscando pacotes
Para instalar um pacote, temos de saber o nome dele. Por exemplo, se você precisar de um
utilitário para lidar com arquivos compactados 7Zip (com a extensão .7z), poderia usar:
Installing:
unzip x86_64 6.0-45.el8_4
baseos 195 k
Transaction Summary
============================================================================================================
Install 1 Package
Para atualizar um pacote instalado, use yum update NOMEDOPACOTE. Por exemplo:
Se você omitir o nome de um pacote, poderá atualizar todos os pacotes no sistema para os
quais exista uma atualização disponível.
Para verificar se há uma atualização disponível para um pacote específico, use yum check-
update NOMEDOPACOTE. Como antes, se você omitir o nome do pacote, o yum procurará
atualizações para todos os pacotes instalados no sistema.
Por exemplo, uma das dependências ausentes era libgimpui-2.0.so.0. Para ver qual pacote o
fornece, usamos yum whatprovides, seguido pelo nome do arquivo que estamos procurando:
Isso também funciona para arquivos já existentes no seu sistema. Por exemplo, para saber de
onde o arquivo /etc/hosts veio, você pode usar:
A resposta é setup-2.8.71-10.el7.noarch.
Para obter informações sobre um pacote, como versão, arquitetura, descrição, tamanho e mais,
use yum info NOMEDOPACOTE.
Repositórios adicionais podem ser incluídos pelo usuário acrescentando um arquivo .repo
98 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
Para adicionar um repositório, use o parâmetro –add-repo, seguido da URL para um arquivo
.repo.
Para obter uma lista de todos os repositórios disponíveis, use yum repolist all. A saída obtida
será semelhante a esta:
status
appstream CentOS Linux 8 - AppStream
enabled
appstream-source CentOS Linux 8 - AppStream - Source
disabled
baseos CentOS Linux 8 - BaseOS
enabled
baseos-source CentOS Linux 8 - BaseOS - Source
disabled
cr CentOS Linux 8 - ContinuousRelease
disabled
debuginfo CentOS Linux 8 - Debuginfo
disabled
Na saída acima, a identidade do repositório é mostrada na primeira coluna (repo id) de cada
linha.
DNF
O dnf, a ferramenta de gerenciamento de pacotes usada no Fedora, é um fork do yum. Como
tal, muitos dos comandos e parâmetros são semelhantes. Esta seção oferece apenas uma visão
geral rápida do dnf:
• Busca de pacotes: dnf search PATTERN, onde PATTERN é aquilo que você está
buscando. Por exemplo, dnf search unzip mostra todos os pacotes que contêm a palavra
unzip no nome ou descrição:
• Obter informações sobre um pacote: dnf info NOMEDOPACOTE;
• Instalar pacotes: dnf install NOMEDOPACOTE. Para encontrar o nome, faça uma
busca;
• Remover pacotes: dnf remove NOMEDOPACOTE;
• Atualizar pacotes: dnf upgrade NOMEDOPACOTE para atualizar um só pacote.
Omita o nome do pacote para atualizar todos os pacotes do sistema;
• Descobrir qual pacote fornece um arquivo específico: dnf provides FILENAME;
• Obter uma lista de todos os pacotes instalados no sistema: dnf list –installed;
• Listar o conteúdo de um pacote: dnf repoquery -l NOMEDOPACOTE.
O dnf tem um sistema de ajuda embutido que mostra mais informações (como
parâmetros extras) para cada comando. Para usá-lo, digite dnf help seguido pelo
comando, como dnf help install.
100 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]
Para obter uma lista de todos os repositórios disponíveis, use dnf repolist. Para listar apenas
os repositórios ativados, adicione a opção –enabled e, para listar apenas os repositórios
desativados, adicione a opção –disabled.
Para adicionar um repositório, use dnf config-manager –add_repo URL, onde URL é a URL
completa do repositório. Para habilitar um repositório, use dnf config-manager –set-enabled
REPO_ID.
Da mesma forma, para desativar um repositório, use dnf config-manager –set-disabled REPO_ID.
Nos dois casos, REPO_ID é o ID exclusivo do repositório, que pode ser obtido com dnf re-
polist. Os repositórios adicionados são ativados por padrão. Os repositórios são armazenados
em arquivos .repo no diretório /etc/yum.repos.d/, com exatamente a mesma sintaxe usada
para o yum.
Zypper
O zypper é a ferramenta de gerenciamento de pacotes usada no SUSE Linux e OpenSUSE.
Em termos de recursos, é semelhante ao apt e ao yum, sendo capaz de instalar, atualizar e
remover pacotes de um sistema, com resolução automática de dependências.
O zypper possui um recurso de atualização automática que pode ser ativado caso a caso, ou
seja, alguns repositórios poderão ser atualizados automaticamente antes de uma consulta ou
da instalação de um pacote, e outros poderão precisar ser atualizados manualmente. Vamos
ensinar a controlar esse recurso em breve.
Buscando pacotes
Para procurar um pacote, use o operador search (ou se), seguido pelo nome do pacote:
O operador de pesquisa também serve para obter uma lista de todos os pacotes instalados no
sistema. Para isso, use o parâmetro -i sem o nome do pacote, como em zypper se -i.
Para ver se um pacote específico está instalado, adicione o nome do pacote ao comando acima.
Por exemplo, o seguinte comando buscará dentre os pacotes instalados por um que contenha
“firefox” no nome:
Para pesquisar apenas nos pacotes não-instalados, adicione o parâmetro -u ao operador se.
Para atualizar os pacotes instalados no sistema, use zypper update. Como no caso do processo
de instalação, aparece uma lista de pacotes a serem instalados/atualizados, e o gerenciador
pergunta se você deseja continuar.
Se quiser listar apenas as atualizações disponíveis, sem instalar nada, use zypper list-updates.
Para remover um pacote, use o operador remove (ou rm), seguido pelo nome do pacote:
Lembre-se de que a remoção de um pacote também remove outros pacotes que dependem
dele. Por exemplo:
Na coluna Enabled vemos que alguns repositórios estão ativados e outros não. Para mudar
isso, use o operador modifyrepo, seguido pelo parâmetro -e (enable) ou -d (disable) e pelo
alias do repositório (a segunda coluna na saída acima).
Para adicionar um novo repositório de software para o zypper, use o operador addrepo seguido
da URL e do nome do repositório, como abaixo:
URI : http://packman.inode.at/suse/openSUSE_Leap_15.1/
Enabled : Yes
GPG Check : Yes
Autorefresh : No
Priority : 99 (default priority)
Repository priorities are without effect. All enabled repositories share the same priority.
10
Resumo
Nesta aula, você aprendeu:
• rpm
• yum
• dnf
• zypper
106
107 10. Resumo
Fabio Gonçalves De Melo Santana / [email protected]
• Fonte: https://access.redhat.com/articles/rhsm-cheat-sheet
Fabio Gonçalves De Melo Santana / [email protected]
11
102.6: Linux como um convidado
de virtualizacao
Introdução
Sem dúvida, versatilidade é um dos pontos fortes do Linux. Um aspecto dessa versatilidade é
a capacidade de usar o Linux como hospedeiro de outros sistemas operacionais, ou aplicativos
individuais, em um ambiente completamente isolado e seguro.
109
110 11. 102.6: Linux como um convidado de virtualizacao
Fabio Gonçalves De Melo Santana / [email protected]
• Xen :O Xen é um hipervisor Tipo 1 de software livre, o que significa que não depende
de um sistema operacional subjacente para funcionar;
• KVM: A máquina virtual do kernel ou KVM, é um módulo do kernel Linux para virtu-
alização. O KVM é um hipervisor tanto do Tipo 1 quanto do Tipo 2 porque, embora
precise de um sistema operacional Linux genérico para funcionar, ele é capaz de fun-
cionar perfeitamente bem como um hipervisor, integrando-se a uma instalação do Linux
em execução. As máquinas virtuais implantadas com KVM usam o daemon libvirt e
utilitários de software associados para serem criados e gerenciados;
• VirtualBox: Um aplicativo de desktop popular que facilita a criação e o gerenciamento
de máquinas virtuais. O Oracle VM VirtualBox é multiplataforma e funcionará em
Linux, macOS e Microsoft Windows. Como o VirtualBox requer um sistema operacional
subjacente para ser executado, ele é um hipervisor Tipo 2.
Totalmente Virtualizado
Toda a instrução que se espera que um sistema operacional convidado execute, deve poder
ser executada em uma instalação de sistema operacional totalmente virtualizado. A razão
para isso é que nenhum driver de software adicional é instalado no convidado para traduzir as
instruções para hardware simulado ou real.
Paravirtualizado
Híbrido
A paravirtualização e a virtualização completa podem ser combinadas para permitir que sis-
temas operacionais não modificados recebam desempenho de E/S quase nativo, usando drivers
paravirtualizados em sistemas operacionais totalmente virtualizados.
111 11. 102.6: Linux como um convidado de virtualizacao
Fabio Gonçalves De Melo Santana / [email protected]
Esse modelo de máquina virtual pode ser copiado posteriormente para um novo sistema con-
vidado. Nesse caso, o novo convidado receberia um novo nome e um novo endereço MAC
para sua interface de rede, além de outras modificações dependendo do uso pretendido.
O D-Bus Machine ID
Muitas instalações do Linux utilizam um número de identificação de máquina gerado no mo-
mento da instalação, chamado de D-Bus machine ID. No entanto, se uma máquina virtual
for clonada para ser usada como modelo para outras instalações de máquina virtual, um novo
D-Bus machine ID precisará ser criado para garantir que os recursos do sistema do hipervisor
sejam direcionados ao sistema convidado correto.
O comando a seguir serve para validar se existe um D-Bus machine ID para o sistema em
execução:
Se nenhuma mensagem de erro for exibida, é porque já existe um ID para o sistema. Para
visualizar o D-Bus machine ID atual, execute o seguinte:
Se por acaso /var/lib/dbus/machine-id não for um link simbólico que remete a /etc/machine-
id, /var/lib/dbus/machine-id terá de ser removido.
A sintaxe do arquivo YAML usado com cloud-init se chama cloud-config. Eis um exemplo
de arquivo cloud-config:
#cloud-config
timezone: Africa/Dar_es_Salaam
hostname: test-system
packages:
- nginx
Observe que na linha superior não há espaço entre o símbolo hash (#) e o termo cloud-config.
Contêineres
A tecnologia de contêiner lembra uma máquina virtual em certos aspectos: eles proporcionam
um ambiente isolado para implementar facilmente um aplicativo. Ao passo que, com uma
máquina virtual, um computador inteiro é emulado, um contêiner usa apenas o software
suficiente para executar um aplicativo. Dessa forma, há muito menos sobrecarga.
12
Talvez isso possa te ajudar. . .
• Fonte: https://zhihuicao.wordpress.com/2015/06/13/para-virtualization-full-virtualization-
differences/ # 103.1: Trabalho na linha de comando
114
Fabio Gonçalves De Melo Santana / [email protected]
13
Introdução
root@debian10:/home/debian# pwd
/home/debian
Agora imagine que o usuário debian esteja atualmente logado no sistema e em seu diretório
pessoal: /home/debian/. Se debian criar um arquivo vazio usando o comando touch sem
115
116 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
especificar qualquer outro local no sistema de arquivos, o arquivo será criado em /home/de-
bian/. Se usarmos ls para listar o conteúdo do diretório, veremos esse novo arquivo:
root@debian10:/home/debian# ls novoarquivo
novoarquivo
Além de sua localização no sistema de arquivos, você também pode precisar de informações
sobre o sistema Linux que está executando, como por exemplo o número exato da versão de
sua distribuição ou a versão do kernel do Linux atualmente carregada. A ferramenta uname é
a resposta. E, em particular, uname mais a opção -a (“all”).
root@debian10:/home/debian# uname -a
Linux debian10.linuxvmimages.local 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28)
x86_64 GNU/Linux
Como regra, os desenvolvedores Linux escrevem arquivos man e os distribuem junto com os
utilitários que criam. Os arquivos man são documentos altamente estruturados cujo conteúdo
é dividido intuitivamente em cabeçalhos padronizados. Basta digitar man seguido do nome
de um comando para exibir informações como o nome do comando, uma breve sinopse de seu
uso, uma descrição mais detalhada e alguns dados importantes sobre o histórico e as licenças
de uso. Se liga:
User Commands
UNAME(1)
NAME
uname - print system information
117 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
SYNOPSIS
uname [OPTION]...
DESCRIPTION
Print certain system information. With no OPTION, same as -s.
-a, --all
print all information, in the following order, except omit -p and -i if
unknown:
-s, --kernel-name
print the kernel name
-n, --nodename
print the network node hostname
-r, --kernel-release
print the kernel release
-v, --kernel-version
print the kernel version
-m, --machine
print the machine hardware name
-p, --processor
print the processor type (non-portable)
-i, --hardware-platform
print the hardware platform (non-portable)
-o, --operating-system
print the operating system
Caso não precise da documentação completa de um comando, pode obter seus dados básicos
118 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
rapidamente usando type. Neste exemplo, usamos type para consultar quatro comandos
separados ao mesmo tempo. Os resultados mostram que cp é um programa que vive em
/bin/cp, e que kill é um comando interno do shell (shell builtin), o que significa que é parte
do próprio shell Bash:
Código 13.5: Verificando se um comando é nativo do shell ou se é um binário externo com type
Note que, além de ser um comando binário regular como cp, uname também aparece como
“hashed”. A razão para isso é que Debian recentemente usou uname e, para aumentar a
eficiência do sistema, o comando foi adicionado a uma tabela de hash para ficar mais acessível
na próxima vez que for executado. Se Debian rodasse type uname após a inicialização do
sistema, ele constataria que type voltaria a descrever uname como um binário regular.
Uma maneira mais rápida de limpar a tabela de hash é executar o comando hash -d.
Às vezes precisamos de uma fonte mais simples de informações sobre um comando. O co-
mando which, que o comando type do exemplo anterior rastreou para nós, retorna somente
a localização absoluta de um comando. Este exemplo localiza os comandos uname e which.
Se quiser exibir informações sobre comandos internos do shell (“builtin”), use o co-
mando help.
algumas semanas depois, quando você precisa executar o mesmo comando com as mesmas
opções e argumentos, mas não consegue se lembrar dos detalhes? Ao invés de recomeçar a
pesquisa do zero, vale a pena tentar recuperar o comando original usando history.
Digite history para exibir os comandos mais recentes em ordem de execução. É fácil pesquisar
nesses comandos usando um pipe para canalizar uma string específica para o comando grep.
O exemplo abaixo procura por qualquer comando que inclua o texto bash_history:
Aqui, um único comando é retornado junto com seu número na sequência, 34.
E por falar em bash_history, esse é na verdade o nome de um arquivo oculto que costuma
estar no diretório inicial do usuário. Por se tratar de um arquivo oculto (indicado pelo ponto
que precede seu nome de arquivo), ele só será visível ao se listar o conteúdo do diretório,
usando ls com o argumento -a:
root@debian10:/home/debian# ls /home/debian/
4linux.txt Desktop Downloads meutexto novoarquivo Public
qualteupapo.txt.zip sha256.txt Templates
4linux.txt.backup Documents meunovotexto Music Pictures qualteupapo.txt.jpg
qualteupapo.zip.jpg softlink Videos
root@debian10:/home/debian# ls -a /home/debian/
. 4linux.txt.backup .bashrc Desktop .gnupg meunovotexto novoarquivo
Public qualteupapo.zip.jpg .ssh .vboxclient-
display-svga-x11.pid Videos
.. .bash_history .cache Documents .ICEauthority meutexto Pictures
qualteupapo.txt.jpg sha256.txt Templates .vboxclient-
draganddrop.pid
4linux.txt .bash_logout .config Downloads .local Music .profile
qualteupapo.txt.zip softlink .vboxclient-clipboard.pid .vboxclient-
seamless.pid
root@debian10:/home/debian# env
SHELL=/bin/bash
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/su
SUDO_USER=debian
PWD=/home/debian
LOGNAME=root
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Aparecerão muitos resultados, mas por enquanto, observe a entrada PATH, que contém
os diretórios nos quais seu shell (e outros aplicativos) procura por outros programas, sem
a necessidade de especificar um caminho completo. Neste caso, seria possível executar um
programa binário que reside, digamos, em /usr/local/bin de dentro do seu diretório pessoal,
e ele seria executado como se o arquivo fosse local.
Agora se liga. . . O comando echo exibe na tela o que você mandar. Acredite ou não, haverá
diversas ocasiões em que será muito útil fazer echo, literalmente repetir algo.
Mas echo tem outras cartas na manga. Quando você o alimenta com o nome de uma variável
de ambiente, e informa que se trata de uma variável, com o prefixo $, ao invés de apenas
exibir o nome da variável, o shell irá expandi-lo, informando o valor. Não tem certeza se o seu
diretório favorito está atualmente em PATH? Você pode verificar rapidamente com o echo:
root@debian10:/home/debian# minhavariavel=oi
root@debian10:/home/debian# echo $minhavariavel
oi
Note que não há espaços em torno do sinal de igual durante a atribuição de variáveis.
Mas será que funcionou mesmo? Digite bash no terminal para abrir um novo shell. Ele terá
exatamente a mesma aparência daquele que acabamos de usar, mas na verdade é um filho do
original (que chamamos de pai). Agora, dentro desse novo shell filho, tente fazer com que o
echo opere sua mágica, da mesma maneira de antes. Nada. O que aconteceu?
root@debian10:/home/debian# bash
root@debian10:/home/debian# echo $minhavariavel
Código 13.14: Exportando variáveis para serem visíveis aos processos filhos com export
root@debian10:/home/debian# exit
exit
root@debian10:/home/debian# export minhavariavel
root@debian10:/home/debian# bash
root@debian10:/home/debian# echo $minhavariavel
oi
Se um comando unset existe, pode apostar que também há um comando set complementar.
122 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
A execução de set por si só exibirá um monte de saídas, mas nada muito diferente de env.
Observe a primeira linha da saída obtida ao filtrarmos por PATH:
Qual a diferença entre set e env? Para nossos propósitos, a principal delas é que set exibe
todas as variáveis e funções. Para ilustrar isso, vamos criar uma nova variável chamada
joatham e em seguida confirmar se ela está lá:
root@debian10:/home/debian# joatham=4linux
root@debian10:/home/debian# echo $joatham
4linux
Se rodarmos env usando grep para filtrar pela string joatham, nenhuma saída será exibida.
Mas se rodarmos set da mesma maneira, veremos nossa variável local.
Para ilustrar esse fato, digitaremos touch e em seguida o título: my big file. O problema é
que existem dois espaços entre as palavras que o Bash interpretará. Embora, tecnicamente,
espaços não sejam “caracteres”, é assim que eles se comportam, já que o Bash não os lerá
literalmente. Se você listar o conteúdo do diretório atual, em vez de um arquivo chamado
my big file, verá três arquivos chamados, respectivamente, my, big, e file. Isso porque o Bash
123 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
pensou que você queria criar vários arquivos cujos nomes estavam sendo dados em uma lista:
Os espaços serão interpretados da mesma forma se você excluir (rm) os três arquivos com um
só comando:
Agora, vamos fazer do jeito certo. Digite touch e as três partes do seu nome de arquivo, mas
desta vez coloque o nome entre aspas. Desta vez, funciona. Ao listar o conteúdo do diretório,
veremos um único arquivo com o nome correto.
Existem outras maneiras de obter o mesmo efeito. As aspas simples, por exemplo, funcionam
da mesma forma que as aspas duplas (note que as aspas simples preservam o valor literal de
todos os caracteres, ao passo que as aspas duplas preservam todos os caracteres exceto $, ‘,
e, em certos casos, !.)
Podemos incluir uma barra invertida antes de cada caractere especial para “escapar” dessa
característica e fazer com que o Bash o leia literalmente.
14
Resumo
Nesta aula, você aprendeu:
124
125 14. Resumo
Fabio Gonçalves De Melo Santana / [email protected]
15
Talvez isso possa te ajudar. . .
• Fonte: - https://wizardzines.com/comics/man-pages/
Fabio Gonçalves De Melo Santana / [email protected]
16
103.2: Processar fluxos de texto
usando filtros
Introdução
Lidar com textos é uma parte importante do trabalho de todo administrador de sistemas. Por-
tanto, um administrador deve estar pronto para lidar com muitas ferramentas de manipulação
de texto dentro de uma distribuição Linux.
Uma das principais formas de fazer os programas trabalharem juntos é usar piping (canalização)
e redirecionamentos. Praticamente todos os programas de manipulação de texto obtêm texto
de uma entrada padrão (stdin), produzem uma saída padrão (stdout) e enviam eventuais
erros para uma saída de erro padrão (stderr). A menos que especifiquemos o contrário, a
entrada padrão será o que digitamos no teclado (o programa lê esse texto quando pressionamos
Enter). Da mesma forma, a saída padrão e os erros serão exibidos na tela do terminal. Vamos
ver como isso funciona:
129
130 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# cat
Isto eh um texto
Isto eh um texto
E ai..Qualteupapo..
E ai..Qualteupapo..
@joatham.silva
@joatham.silva
@qualteupapo
@qualteupapo
^C
Para saber mais sobre o comando cat (o termo vem de “concatenar”), consulte as páginas de
manual.
Conforme demonstrado acima, se você não especificar de onde cat deve ler, ele lerá a entrada
padrão (o que você digitar) e produzirá o que for lido na janela do terminal (a saída padrão).
O sinal de > (maior que) diz ao cat para enviar a saída ao arquivo meutexto, não para a
saída padrão. Agora tente o seguinte:
O efeito desse comando é copiar meutexto para meunovotexto. Na verdade, podemos verificar
se esses dois arquivos têm o mesmo conteúdo executando um diff:
131 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
Como não há saída, os arquivos são idênticos. Agora, tente o operador de redirecionamento
de acréscimo (»):
root@debian10:/home/debian# echo "Se voce esta aqui.. me da um salve no instagram rsrs" >>
meunovotexto
root@debian10:/home/debian# diff meutexto meunovotexto
3a4
> Se voce esta aqui.. me da um salve no instagram rsrs
Até agora, usamos redirecionamentos para criar e manipular arquivos. Também podemos usar
pipes (representados pelo símbolo |) para redirecionar a saída de um programa para outro
programa. Vamos encontrar as linhas onde a palavra joatham aparece:
Nós canalizamos a saída de cat para outro comando: grep. Observe que, quando ignoramos o
uso de maiúsculas e minúsculas (usando a opção -i), obtemos uma linha extra como resultado.
Vamos criar um arquivo chamado 4linux.txt contendo uma lista dos seguintes comandos:
bzcat
cat
cut
head
132 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat
A seguir, vamos usar o comando grep para imprimir todas as linhas que contêm a string cat:
Outra forma de obter essas informações é apenas usar o comando grep para filtrar o texto
diretamente, sem a necessidade de usar outro aplicativo para enviar o fluxo de texto para
stdout:
Existem outros comandos que lidam com arquivos compactados (bzcat para arquivos com-
pactados bzip, xzcat para arquivos xz e zcat para arquivos gzip). Eles são usados para visualizar
o conteúdo de um arquivo compactado com base no algoritmo de compactação empregado.
133 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# ls 4linux.*
4linux.txt
root@debian10:/home/debian# gzip 4linux.txt
root@debian10:/home/debian# ls 4linux*
4linux.txt.gz
Em seguida, use o comando zcat para visualizar o conteúdo do arquivo compactado com o
gzip:
Nesse ponto veremos mensagens rolando muito rápido na janela do terminal. É possível
canalizar a saída para o programa less para que os resultados sejam paginados. Com o less,
podemos usar as setinhas do teclado para navegar pela saída. Comandos do tipo vi também
ajudam a navegar e pesquisar em todo o texto.
Código 16.13: Habilitar rolagem para arquivos muito grandes com o comando less
Para ajudar a ilustrar o número de linhas exibidas, podemos canalizar a saída do comando head
para o comando nl, que exibirá o número de linhas de texto transmitidas para o comando:
Código 16.15: Inspecionando as linhas do comando head com redirecionamento para o comando nl
Da mesma forma, podemos canalizar a saída do comando tail para o comando wc, que por
padrão conta o número de palavras em um documento, e usando a opção -l para imprimir na
tela o número de linhas de texto lidas pelo comando:
Muito do que podemos fazer com grep, também podemos fazer com sed. Primeiro, vamos
recuperar nosso arquivo 4linux.txt descompactando o pacote gzip do arquivo:
Em seguida, podemos usar sed para listar apenas as linhas que contêm a string cat:
Usamos o sinal de menor que < para direcionar o conteúdo do arquivo 4linux.txt into para
o comando sed. A palavra entre barras (isto é, /cat/) é o termo que estamos procurando.
A opção -n instrui o sed a não produzir nenhuma saída (a não ser as saídas solicitadas pelo
comando p). Tente executar este mesmo comando sem a opção -n para ver o que acontece.
Depois, tente o seguinte:
Sem a opção -n, sed imprime na tela tudo o que está no arquivo, exceto o que /d instrui sed
138 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
a remover da saída.
Um uso comum de sed é localizar e substituir texto em um arquivo. Suponha que você queira
alterar todas as ocorrências de cat para dog. Para isso, use o sed, instruindo a opção s a
trocar cada instância do primeiro termo, cat, pelo segundo, dog:
Em vez de usar um operador de redirecionamento (<) para passar o arquivo 4linux.txt para o
comando sed, podemos fazer o comando sed operar diretamente no arquivo. Tentaremos isso
a seguir, enquanto criamos simultaneamente um backup do arquivo original:
Código 16.23: Criando um arquivo de backup com as alterações realizadas pelo comando sed
A opção -i executa uma operação sed local no arquivo original. Se você não usar .backup após
o parâmetro -i, vai reescrever o arquivo original. Qualquer texto inserido após o parâmetro -i
será o nome com o qual o arquivo original será salvo antes das modificações que você pediu
ao sed para realizar.
139 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# od 4linux.txt
0000000 075142 067544 005147 067544 005147 072543 005164 062550
0000020 062141 066012 071545 005163 062155 071465 066565 067012
0000040 005154 062157 070012 071541 062564 071412 062145 071412
0000060 060550 032462 071466 066565 071412 060550 030465 071462
0000100 066565 071412 071157 005164 070163 064554 005164 060564
0000120 066151 072012 005162 067165 070551 073412 005143 075170
0000140 067544 005147 062172 063557 067412 005151
0000154
A primeira coluna é o deslocamento de bytes para cada linha da saída. Como por padrão od
imprime informações no formato octal, cada linha começa com um deslocamento de bytes de
oito bits, seguido por oito colunas, cada uma contendo o valor octal dos dados dentro dessa
coluna.
root@debian10:/home/debian# od -x 4linux.txt
0000000 7a62 6f64 0a67 6f64 0a67 7563 0a74 6568
0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a
0000040 0a6c 646f 700a 7361 6574 730a 6465 730a
0000060 6168 3532 7336 6d75 730a 6168 3135 7332
0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174
0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78
0000140 6f64 0a67 647a 676f 6f0a 0a69
0000154
Nesse caso, cada uma das oito colunas após o deslocamento de bytes é representada por seus
equivalentes hexadecimais.
Um uso útil do comando od é depurar scripts. Por exemplo, o comando od pode nos mostrar
caracteres que não são normalmente visíveis e que existem em um arquivo, como indicadores
140 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]
de nova linha. Usamos para isso a opção -c, de modo que, em vez de exibir a notação numérica
para cada byte, as colunas serão mostradas como seus equivalentes em caracteres:
root@debian10:/home/debian# od -c 4linux.txt
0000000 b z d o g \n d o g \n c u t \n h e
0000020 a d \n l e s s \n m d 5 s u m \n n
0000040 l \n o d \n p a s t e \n s e d \n s
0000060 h a 2 5 6 s u m \n s h a 5 1 2 s
0000100 u m \n s o r t \n s p l i t \n t a
0000120 i l \n t r \n u n i q \n w c \n x z
0000140 d o g \n z d o g \n o i \n
0000154
Todas as ocorrências de nova linha no arquivo são representadas pelos caracteres ocultos \n.
Se você deseja apenas visualizar todos os caracteres em um arquivo e não precisa ver as
informações de deslocamento de bytes, pode remover essa coluna da saída da seguinte forma:
Resumo
Lidar com fluxos de texto é de grande importância ao administrar qualquer sistema Linux.
Os fluxos de texto podem ser processados usando scripts para automatizar tarefas diárias ou
localizar informações de depuração relevantes em arquivos de log. Eis um breve resumo dos
comandos abordados nesta lição:
• Fonte: - https://www.scribd.com/document/365334038/Bash-Cheatsheet
Fabio Gonçalves De Melo Santana / [email protected]
17
103.3: Gerencia-
mento_básico_de_arquivos
Introdução
Se você não sabia, agora sabe que, no Linux tudo são arquivos, então é importantíssimo
saber como manipulá-los. Em geral, um usuário Linux precisa saber navegar pelo sistema de
arquivos, copiar arquivos de um local para outro e excluir arquivos.
Bom, mas o que é um arquivo? Um arquivo é uma entidade que armazena dados e programas.
Consiste em conteúdo e metadados (tamanho do arquivo, proprietário, data de criação, per-
missões). Os arquivos são organizados em diretórios. Um diretório é um arquivo que armazena
outros arquivos.
143
144 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Manipulação de arquivos
Usando ls para listar arquivos
O comando ls é uma das ferramentas de linha de comando mais importantes que precisamos
aprender para navegar no sistema de arquivos.
root@debian10:/home/debian# ls
4linux 4linux.txt 4linux.txt.backup Desktop Documents Downloads meunovotexto
meutexto Music novoarquivo Pictures Public qualteupapo.txt.jpg qualteupapo.txt.
zip qualteupapo.zip.jpg sha256.txt softlink Templates Videos
Quando usado com -l, conhecido como formato de “listagem longa”, ele mostra as permissões
de arquivo ou diretório, proprietário, tamanho, data de modificação, hora e nome:
root@debian10:/home/debian# ls -l
total 56
drwxr-xr-x 2 root root 4096 Jul 1 12:30 4linux
-rw-r--r-- 1 root root 108 Jul 1 09:35 4linux.txt
-rw-r--r-- 1 root root 105 Jul 1 09:11 4linux.txt.backup
drwxr-xr-x 2 debian debian 4096 Feb 6 03:21 Desktop
drwxr-xr-x 3 debian debian 4096 Jun 30 15:06 Documents
drwxr-xr-x 2 debian debian 4096 Feb 6 03:21 Downloads
-rw-r--r-- 1 root root 158 Jul 1 09:06 meunovotexto
-rw-r--r-- 1 root root 105 Jul 1 09:03 meutexto
drwxr-xr-x 2 debian debian 4096 Feb 6 03:21 Music
Para mostrar o tamanho dos arquivos em um formato legível por humanos, adicione a opção
-h:
root@debian10:/home/debian# ls -lh
145 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
total 56K
drwxr-xr-x 2 root root 4.0K Jul 1 12:30 4linux
-rw-r--r-- 1 root root 108 Jul 1 09:35 4linux.txt
-rw-r--r-- 1 root root 105 Jul 1 09:11 4linux.txt.backup
drwxr-xr-x 2 debian debian 4.0K Feb 6 03:21 Desktop
drwxr-xr-x 3 debian debian 4.0K Jun 30 15:06 Documents
Para listar todos os arquivos, incluindo arquivos ocultos (aqueles que começam com .), use a
opção -a:
root@debian10:/home/debian# ls -a
. 4linux.txt .bash_logout .config Downloads .local Music
.profile qualteupapo.txt.zip softlink .vboxclient-clipboard.pid
.vboxclient-seamless.pid
.. 4linux.txt.backup .bashrc Desktop .gnupg meunovotexto
novoarquivo Public qualteupapo.zip.jpg .ssh .vboxclient-display-
svga-x11.pid Videos
4linux .bash_history .cache Documents .ICEauthority meutexto Pictures
qualteupapo.txt.jpg sha256.txt Templates .vboxclient-draganddrop.pid
Os arquivos de configuração como .bash_history, que por padrão ficam ocultos, agora estão
visíveis.
ls OPTIONS FILE
Onde OPTIONS é qualquer uma das opções mostradas anteriormente (para ver todas as
opções possíveis execute man ls), e FILE é o nome do arquivo ou detalhes do diretório que
você deseja listar.
O comando touch é a maneira mais fácil de criar arquivos novos e vazios. Também pode ser
usado para alterar os carimbos de data/hora (ou seja, hora de modificação) dos arquivos e
diretórios existentes. A sintaxe para usar touch é:
Sem nenhuma opção, touch cria novos arquivos com os nomes de arquivo fornecidos como
argumentos, desde que ainda não existam arquivos com o mesmo nome. O comando touch
pode criar qualquer número de arquivos simultaneamente:
Com esse comando, seriam criados três arquivos novos vazios, chamados file1, file2 e file3.
Diversas opções de touch foram especificamente pensadas para permitir ao usuário alterar os
carimbos de data/hora dos arquivos. Por exemplo, a opção -a altera apenas a hora de acesso,
enquanto a opção -m altera apenas a hora de modificação. O uso de ambas as opções em
conjunto altera ambas as horas de acesso e de modificação para o horário atual:
Como usuários Linux, geralmente copiamos arquivos de um local para outro. Podemos usar o
cp para todas as tarefas de cópia, seja para mover um arquivo de música ou um arquivo de
sistema de um diretório para outro:
Este comando pode ser interpretado literalmente como copiar file1 para o diretório dir2. O
resultado é a presença de file1 dentro de dir2. Para que este comando seja executado com
sucesso, file1 deve existir no diretório atual do usuário. Caso contrário, o sistema exibe a
mensagem de erro No such file or directory:
Neste caso, observe que o caminho para file1 é mais explícito. O caminho de origem pode
ser expresso como um caminho relativo ou um caminho absoluto. Os caminhos relativos são
dados em referência a um diretório específico, ao passo que os caminhos absolutos não são
fornecidos com uma referência. Esclareceremos melhor essa noção mais adiante.
Por enquanto, apenas observe que este comando copia file1 para o diretório dir2. O caminho
para file1 é fornecido com mais detalhes, pois o usuário atualmente não está localizado em
dir1:
A sintaxe geral de cp é:
SOURCE é o arquivo a ser copiado e DESTINATION o diretório para o qual o arquivo será
copiado. SOURCE e DESTINATION podem ser especificados como caminhos absolutos ou
148 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
relativos.
Assim como o cp para copiar, o Linux fornece um comando para mover e renomear arquivos.
Ele se chama mv.
A operação de mover é análoga à de recortar e colar que costumamos executar por meio de
uma interface gráfica de usuário (GUI).
mv FILENAME DESTINATION_DIRECTORY
Por padrão, o mv não pede confirmação se você quiser sobrescrever (renomear) um arquivo
existente. No entanto, podemos fazer com que o sistema exiba uma mensagem, usando a
opção -i:
Este comando solicita a permissão do usuário antes de sobrescrever 4linuxagain com teste.
Inversamente, se usarmos -f, o arquivo será sobrescrito à força, sem pedir premissão:
rm é usado para excluir arquivos. Pense nele como uma forma abreviada da palavra “remover”.
Note que a ação de remover um arquivo geralmente é irreversível e, portanto, este comando
deve ser usado com cautela:
debian@debian10:~/Documents$ rm 4linuxdenovo
debian@debian10:~/Documents$ rm -i 4linuxdenovo
rm: remove write-protected regular empty file '4linuxdenovo'?
Este comando solicitaria uma confirmação ao usuário antes de excluir 4linuxdenovo. Lembre-
se, vimos a opção -i ao usarmos mv, acima:
debian@debian10:~/Documents$ rm -f 4linuxdenovo
rm OPTIONS FILE
A criação de diretórios é essencial para organizar seus arquivos e pastas. Os arquivos podem
ser agrupados de maneira lógica dentro de um diretório. Para criar um diretório, use mkdir:
onde DIRECTORY_NAME é o nome do diretório a ser criado. Podemos criar qualquer número
de diretórios simultaneamente:
O comando anterior criaria três diretórios, dir1, dir2 e dir3, ao mesmo tempo.
Para criar um diretório junto com seus subdiretórios, use a opção -p (“parents”):
151 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Isso removeria a estrutura de diretórios joatham/pedro. Note que, se algum dos diretórios não
estiver vazio, ele não será excluído.
152 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home# ls -R debian/
debian/:
4linux 4linux.txt 4linux.txt.backup Desktop Documents Downloads meunovotexto
meutexto Music novoarquivo Pictures Public qualteupapo.txt.jpg qualteupapo.txt.
zip qualteupapo.zip.jpg sha256.txt softlink Templates Videos
debian/4linux:
dir2 file2 file3
debian/4linux/dir2:
file1
debian/Desktop:
ls -R DIRECTORY_NAME
ls -R teste
é similar a
ls -R teste/
153 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
1 directory, 3 files
2 directories, 3 files
root@debian10:/home/debian# rm novacopia/
rm: cannot remove 'novacopia/': Is a directory
root@debian10:/home/debian# rm -r novacopia/
É necessário adicionar -r, como no segundo comando, para que a exclusão tenha efeito.
Você deve estar se perguntando por que não usamos rmdir neste caso. Existe uma
diferença sutil entre os dois comandos. rmdir terá sucesso na exclusão apenas se o
154 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Adicione a opção -i para pedir a confirmação antes que o arquivo seja excluído:
Os curingas são, essencialmente, símbolos que podem ser usados para substituir um ou mais
caracteres. Eles permitem, por exemplo, mostrar todos os arquivos que começam com a letra
A ou todos os que terminam com as letras .conf.
Os caracteres curinga são utilíssimos, pois podem ser usados com comandos como cp, ls ou
rm.
O asterisco
Um asterisco (*) corresponde a zero, uma ou mais ocorrências de qualquer caractere.
Por exemplo:
Esse comando localizaria todos os arquivos que terminam com .png, como foto.png, cat.png,
jota.png. O comando find será explorado posteriormente em uma lição seguinte.
Da mesma maneira:
root@debian10:/home/debian# ls lpic-*.txt
listaria todos os arquivos de texto que começam com os caracteres lpic- seguidos por qualquer
número de caracteres e que terminam com .txt, como lpic-1.txt e lpic-2.txt.
O caractere curinga asterisco pode ser usado para manipular (copiar, excluir ou mover) todo
o conteúdo de um diretório:
O ponto de interrogação
O ponto de interrogação (?) corresponde a uma única ocorrência de um caractere.
Considere a listagem:
root@debian10:/home/debian/4linux# ls
last.txt lest.txt list.txt past.txt third.txt
156 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Para retornar apenas os arquivos que começam com l seguido por qualquer caractere único e
os caracteres st.txt, usamos o caractere curinga ponto de interrogação (?):
root@debian10:/home/debian/4linux# ls l?st.txt
last.txt lest.txt list.txt
Apenas os arquivos last.txt, lest.txt e list.txt são exibidos, pois correspondem aos critérios
dados.
Da mesma maneira,
root@debian10:/home/debian/4linux# ls ??st.txt
last.txt lest.txt list.txt past.txt
exibe os arquivos cujos nomes iniciam com quaisquer dois caracteres seguidos pelo texto st.txt.
root@debian10:/home/debian/4linux# ls l[aef]st.txt
last.txt lest.txt
Este comando listaria todos os arquivos começando com l seguido por qualquer um dos car-
acteres do conjunto aef e terminando com st.txt.
root@debian10:/home/debian/4linux# ls l[a-z]st.txt
last.txt lest.txt list.txt
157 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Esse comando exibe todos os arquivos com nomes começando com l seguido por qualquer
letra minúscula no intervalo de a à z e terminando com st.txt.
root@debian10:/home/debian/4linux# ls
4linux-1A.txt 4linux-2A.txt 4linux-3.txt last.txt lest.txt list.txt past.txt third.
txt
root@debian10:/home/debian/4linux# ls 4linux-[0-9][A-Z].txt
4linux-1A.txt 4linux-2A.txt
A lista mostra um diretório escolar com uma lista de alunos registrados. Listando apenas os
alunos cujos números de registro atendam aos seguintes critérios:
root@debian10:/home/debian/4linux# ls
4linux-1A.txt 4linux-2A.txt 4linux-3.txt last.txt lest.txt list.txt past.txt third.
txt
root@debian10:/home/debian/4linux# ls [plf]?st*
last.txt lest.txt list.txt past.txt
Existem outros caracteres curinga, como o sinal de mais (+), usado para representar carac-
tere(s) que aparecem uma ou mais vezes:
Código 17.46: Casar caracteres que iniciam com a letra f e terminal com algum número
root@debian10:/home/debian/4linux# ls
file1.txt file23.txt file.txt fisher.txt fom23.txt
158 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian/4linux# ls f*[0-9].txt
file1.txt file23.txt fom23.txt
O caminho inicial, neste caso, é o diretório atual. A opção -name especifica que a pesquisa
é baseada no nome do arquivo. myfile.txt é o nome do arquivo a ser pesquisado. Ao usar
globbing de arquivo, inclua sempre a expressão entre aspas:
Este comando busca por todos os arquivos que terminam com .png, começando no diretório
/home/frank/ e abaixo dele. Se você não entendeu o uso do asterisco (*), ele foi abordado
na lição anterior.
159 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Este comando procura por todos os diretórios, no diretório atual e abaixo dele, que tenham o
nome example.
Dentre os outros critérios que podem ser usados com find, temos:
Este comando procura por todos os arquivos em todo o sistema de arquivos (o caminho inicial
é o diretório raiz, ou seja, /) que terminam com os caracteres .conf e que foram modificados
nos últimos sete dias. Este comando exige privilégios elevados para acessar diretórios na base
160 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
da estrutura de diretórios do sistema, daí o uso de sudo neste caso. O argumento passado
para mtime representa o número de dias desde a última modificação do arquivo.
A opção -size exibe arquivos de tamanhos correspondentes ao argumento passado. Eis alguns
exemplos de argumentos:
Para encontrar arquivos vazios, podemos usar: find . -size 0b ou find . -empty.
Esse comando filtra todos os objetos no diretório atual (.) e abaixo dele para nomes de
arquivo terminando com .conf, e em seguida executa o comando chmod 644 para modificar
as permissões de arquivo nos resultados.
Por enquanto, não se preocupe com o significado de ‘{}’ ;, pois isso será discutido mais
adiante.
161 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Considere uma situação na qual precisamos encontrar arquivos com base no conteúdo:
Esse comando busca, na hierarquia de diretórios atual (.), por objetos que são arquivos (-type
f) e em seguida executa o comando grep “lpi” para cada arquivo que satisfaça as condições.
Os arquivos que atendem a essas condições são impressos na tela (-print). As chaves ({})
servem para reservar o espaço para os resultados encontrados por find. As {} são postas entre
aspas simples (’) para evitar passar arquivos com nomes contendo caracteres especiais para o
grep. O comando -exec é concluído com um ponto e vírgula (;), que deve ser escapado (;)
para não ser interpretado pelo shell.
A opção -delete, se colocada no final de uma expressão, excluiria todos os arquivos correspon-
dentes à descrição. Esta opção deve ser usada quando você tiver certeza de que os resultados
correspondem apenas aos arquivos que deseja excluir.
No exemplo abaixo, find localiza todos os arquivos na hierarquia começando no diretório atual
e, em seguida, exclui todos os arquivos que terminam com os caracteres .bak:
Empacotamento de arquivos
O comando tar (Arquivamento e compactação)
O comando tar, abreviação de “tape archive(r)”, é usado para criar arquivos tar, convertendo
um grupo de arquivos em um pacote. Os arquivos de pacote são úteis para mover ou fazer
backup de um grupo de arquivos facilmente. Pense no tar como uma ferramenta que cria uma
cola, na qual os arquivos podem ser grudados, agrupados e facilmente movidos.
162 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
O tar também tem a capacidade de extrair arquivos tar, exibir uma lista dos arquivos incluídos
no pacote e adicionar mais arquivos a um pacote existente.
O tar funciona de maneira recursiva. Ele realiza a ação solicitada em todos os diretórios
subsequentes dentro do diretório especificado.
Para empacotar diversos diretórios de uma vez só, listamos todos eles delimitando-os por um
espaço na seção /PATH/TO/DIRECTORY-OR-FILE:
Extraindo um pacote
Podemos extrair um arquivo de pacote usando o tar:
Este comando é igual ao comando de criação de pacotes usado acima, exceto porque a opção
-x substitui a opção -c.
ls /tmp
stuff
Embora a compressão gzip seja mais frequentemente usada para criar arquivos .tar.gz ou .tgz,
o tar também suporta a compressão bzip2. Isso permite a criação de arquivos compactados
bzip2, geralmente chamados de arquivos .tar.bz2, .tar.bz ou .tbz.
O gzip é mais rápido, mas geralmente compacta um pouco menos, de modo que o arquivo
obtido é um pouco maior. O bzip2 é mais lento, mas comprime um pouco mais, então o
arquivo fica um pouco menor. Em geral, porém, gzip e bzip2 são praticamente a mesma coisa;
ambos funcionam de forma semelhante.
165 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Outra alternativa seria, aplicar a compressão gzip ou bzip2 usando o comando gzip para as
compressões gzip e bzip para as compressões bzip. Por exemplo, para aplicar a compactação
gzip, use:
gzip FILE-TO-COMPRESS
• gzip: Cria o arquivo compactado com o mesmo nome, mas com a terminação .gz;
• gzip: Remove os arquivos originais após criar o arquivo compactado.
O comando cpio
A expressão cpio significa “copy in, copy out”. É usado para processar arquivo de pacote como
os arquivos .cpio ou .tar.
A opção -o instrui o cpio a criar uma saída. Neste caso, o arquivo de saída criado é archive.cpio.
O comando ls lista o conteúdo do diretório atual que será empacotado.
A opção -i é usada para realizar a extração. A opção -d cria a pasta de destino. O caractere
< representa a entrada padrão. O arquivo de entrada a ser extraído é archive.cpio.
O comando dd
O dd copia dados de um local para outro. A sintaxe de linha de comando de dd difere de
muitos outros programas Unix, pois ele usa a sintaxe option = value para as opções de linha
de comando ao invés dos formatos padrão GNU -option value ou –option=value:
dd if=oldfile of=newfile
Este comando copia o conteúdo de oldfile para newfile, onde if= é o arquivo de entrada e of=
refere-se ao arquivo de saída.
O comando dd normalmente não exibe nada na tela até que o comando seja concluído. Ao
fornecer a opção status=progress, o console exibe o andamento do trabalho realizado pelo
comando. Por exemplo: dd status=progress if=oldfile of=newfile.
O dd também é usado para alterar dados para maiúsculas/minúsculas ou para escrever dire-
tamente em dispositivos de bloco como /dev/sdb:
Esse comando copiaria todo o conteúdo de oldfile para newfile e colocaria todo o texto em
maiúsculas.
O comando a seguir faria backup do disco rígido inteiro localizado em /dev/sda para um
arquivo de nome backup.dd:
Resumo
Nesta lição, exploramos como visualizar o que está dentro de um diretório com o comando
ls, como copiar (cp) arquivos e pastas e como movê-los (mv). Também vimos como novos
diretórios podem ser criados com o comando mkdir. Os comandos para remover arquivos (rm)
e pastas (rmdir) também foram abordados.
Nesta lição, você também aprendeu sobre o globbing de arquivos e caracteres curinga. O glob-
bing de arquivo é usado para representar vários nomes de arquivo usando caracteres especiais
chamados curingas. Estes são os caracteres curinga básicos e seus significados:
• Fonte: - https://wall-skills.com/2015/the-find-command-in-examples/
Fabio Gonçalves De Melo Santana / [email protected]
18
103.4 Usando fluxos, pipes e
redirecionamentos
Introdução
Todos os programas de computador seguem o mesmo princípio geral: os dados recebidos de
alguma fonte são transformados para gerar um resultado inteligível. No contexto do shell do
Linux, a fonte de dados pode ser um arquivo local, um arquivo remoto, um dispositivo (como
um teclado), etc. A saída do programa geralmente é exibida em uma tela, mas também
é comum armazenar os dados de saída em um sistema de arquivos local, enviar para um
dispositivo remoto, reproduzi-lo em alto-falantes de áudio etc.
Os processos padrão do Linux têm três canais de comunicação abertos por padrão: o canal
de entrada padrão (na maioria das vezes simplesmente chamado de stdin), o canal de saída
padrão (stdout) e o canal de erro padrão (stderr). Os descritores numéricos de arquivo
atribuídos a esses canais são 0 para stdin, 1 para stdout e 2 para stderr. Os canais de
comunicação também são acessíveis por meio dos dispositivos especiais /dev/stdin, /de-
v/stdout e /dev/stderr.
Esses três canais de comunicação permitem que os programadores escrevam códigos que leem
e gravam dados sem se preocupar com o tipo de mídia de onde vêm ou para o qual vão. Por
exemplo, se um programa precisa de um conjunto de dados como entrada, pode simplesmente
solicitar os dados da entrada padrão; será fornecido aquilo que estiver sendo usado como
entrada padrão. Da mesma forma, o método mais simples que um programa pode usar para
169
170 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]
exibir sua saída é escrevê-la na saída padrão. Em uma sessão comum do shell, o teclado é
definido como stdin e a tela do monitor como stdout e stderr.
Redirecionamentos
Um redirecionamento é definido por um caractere especial na linha de comando. Por exemplo,
para redirecionar a saída padrão de um processo para um arquivo, o símbolo de maior que >
é posicionado no final do comando e seguido pelo caminho até o arquivo que receberá a saída
redirecionada:
Por padrão, apenas o conteúdo que chega a stdout é redirecionado. Isso ocorre porque o valor
numérico do descritor de arquivo deve ser especificado logo antes do símbolo de maior que, e
quando não especificado, o Bash redireciona a saída padrão. Portanto, usar > é equivalente
a usar 1> (o valor do descritor de arquivo de stdout é 1).
Para capturar o conteúdo de stderr, o redirecionamento 2> deve ser usado. A maioria dos
programas de linha de comando enviam informações de depuração e mensagens de erro para o
canal de erro padrão. É possível, por exemplo, capturar a mensagem de erro gerada por uma
tentativa de leitura de um arquivo inexistente:
Tanto stdout quanto stderr são redirecionados para o mesmo destino com &> ou >&.
É importante não colocar nenhum espaço ao lado do “e” comercial, caso contrário o Bash
o interpretará como uma instrução para executar o processo em segundo plano e não para
executar o redirecionamento.
O destino deve ser um caminho para um arquivo gravável, como /tmp/cpu.txt, ou um descritor
de arquivo gravável. O destino de um descritor de arquivo é representado por um “e” comercial
seguido pelo valor numérico do descritor de arquivo. Por exemplo, 1>&2 redireciona stdout
para stderr. Para fazer o oposto, stderr para stdout, devemos usar 2>&1.
171 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]
Embora não seja muito útil, visto que existe uma maneira mais curta de executar a mesma
tarefa, é possível redirecionar stderr para stdout e, em seguida, redirecioná-lo para um arquivo.
Por exemplo, um redirecionamento para gravar stderr e stdout em um arquivo chamado
log.txt pode ser escrito como >log.txt 2>&1. No entanto, o principal motivo para redire-
cionar stderr para stdout é permitir a análise de mensagens de depuração e erro. É possível
redirecionar a saída padrão de um programa para a entrada padrão de outro programa, mas não
é possível redirecionar diretamente o erro padrão para a entrada padrão de outro programa.
Assim, as mensagens do programa enviadas para stderr primeiro precisam ser redirecionadas
para stdout a fim de serem lidas pelo stdin de outro programa.
Para simplesmente descartar a saída de um comando, seu conteúdo pode ser redirecionado
para o arquivo especial /dev/null. Por exemplo, >log.txt 2>/dev/null salva o conteúdo de
stdout no arquivo log.txt e descarta o stderr. O arquivo /dev/null pode ser escrito por
qualquer usuário, mas nenhum dado pode ser recuperado dele, pois não é armazenado em
lugar nenhum.
Uma mensagem de erro é apresentada se o destino especificado não for gravável (se o caminho
apontar para um diretório ou um arquivo somente leitura) e nenhuma modificação for feita no
destino. No entanto, um redirecionamento de saída sobrescreve um destino gravável existente
sem pedir nenhuma confirmação. Os arquivos são substituídos pelos redirecionamentos de
saída, a menos que a opção noclobber esteja habilitada no Bash, o que pode ser feito para
a sessão atual com o comando set -o noclobber ou set -C:
Para remover a opção noclobber da sessão atual, execute set +o noclobber ou set +C. Para
tornar a opção noclobber persistente, ela deve ser incluída no perfil Bash do usuário ou no
perfil de todo o sistema.
Mesmo com a opção noclobber habilitada, é possível anexar dados redirecionados ao conteúdo
existente. Usamos para isso um redirecionamento escrito com dois símbolos de maior que, »:
No exemplo anterior, a nova mensagem de erro foi anexada à existente no arquivo /tmp/er-
172 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]
ror.txt. Se o arquivo ainda não existir, ele será criado com os novos dados.
A fonte de dados da entrada padrão de um processo também pode ser reatribuída. O símbolo
de menor que < é usado para redirecionar o conteúdo de um arquivo para o stdin de um
processo. Nesse caso, os dados fluem da direita para a esquerda: o descritor reatribuído é
considerado como sendo 0 à esquerda do símbolo de menor que, e a fonte de dados (um
caminho para um arquivo) deve estar à direita do símbolo de menor que. O comando uniq,
como a maioria dos utilitários de linha de comando para processamento de texto, aceita os
dados enviados para stdin por padrão:
A opção -c faz com que o uniq exiba quantas vezes uma linha repetida aparece no texto.
Como o valor numérico do descritor de arquivo redirecionado foi suprimido, o comando de
exemplo é equivalente a uniq -c 0 < /tmp/error.txt.
root@debian10:/home/debian# wc -c <<EOF
> Sao quantos caracteres
> dentro deste documento
> EOF
46
À direita dos dois símbolos de menor que « está o termo de fim EOF. O modo de inserção
termina assim que for inserida uma linha contendo apenas o termo de fim. Qualquer outro
termo pode ser usado como termo de fim, mas é importante não colocar caracteres em branco
entre o símbolo de menor que e o termo de fim. No exemplo acima, as duas linhas de texto
foram enviadas para o stdin do comando wc -c, que exibe a contagem de caracteres. Assim
como acontece com os redirecionamentos de entrada para arquivos, o stdin (descritor de
arquivo 0) é pressuposto se o descritor de arquivo redirecionado for suprimido.
O método de Here string é muito parecido com o método de Here document, mas para
uma linha apenas:
173 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]
Pipes
Ao contrário dos redirecionamentos, com os pipes os dados fluem da esquerda para a direita
na linha de comando e o destino é outro processo, não um caminho do sistema de arquivos,
descritor de arquivo ou Here document. O caractere de barra vertical | manda o shell
iniciar todos os comandos distintos ao mesmo tempo e conectar a saída do comando anterior
à entrada do comando seguinte, da esquerda para a direita. Por exemplo, em vez de usar
redirecionamentos, o conteúdo do arquivo /proc/cpuinfo enviado para a saída padrão por
cat pode ser canalizado para o stdin de wc com o seguinte comando:
O conteúdo do arquivo /proc/cpuinfo produzido por cat /proc/cpuinfo foi canalizado para o
comando grep ‘model name’, que em seguida seleciona apenas as linhas contendo o termo
model name. A máquina que executa o exemplo tem muitas CPUs, portanto existem lin-
has repetidas com model name. O último pipe conecta grep ‘model name’ ao uniq, que é
responsável por pular qualquer linha idêntica à anterior.
O redirecionamento de entrada para grep não é estritamente necessário, pois grep aceita um
174 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]
caminho de arquivo como argumento, mas o exemplo demonstra como construir comandos
combinados.
Pipes e redirecionamentos são exclusivos, ou seja, uma origem pode ser mapeada para apenas
um destino. Ainda assim, é possível redirecionar uma saída para um arquivo e ainda vê-la na
tela com o programa tee. Para isso, o primeiro programa envia sua saída para o stdin de tee
e um nome de arquivo é fornecido a este último para armazenar os dados:
A saída do último programa na cadeia, gerada por uniq, é exibida e armazenada no arquivo
cpu_model.txt. Para não sobrescrever o conteúdo do arquivo fornecido, e sim anexar dados a
ele, a opção -a deve ser fornecida para tee.
Apenas a saída padrão de um processo é capturada por um pipe. Digamos que você precise
passar por um longo processo de compilação na tela e, ao mesmo tempo, salvar tanto a
saída padrão quanto o erro padrão em um arquivo para inspeção posterior. Supondo que seu
diretório atual não tenha um Makefile, o seguinte comando gerará um erro:
Embora exibida na tela, a mensagem de erro gerada por make não foi capturada por tee e o
arquivo log.txt foi criado vazio. É preciso fazer um redirecionamento antes que um pipe possa
capturar o stderr:
Neste exemplo, o stderr de make foi redirecionado para o stdout, de forma que o tee foi
capaz de capturá-lo com um pipe, exibi-lo na tela e salvá-lo no arquivo log.txt. Em casos
como esse, pode ser útil salvar as mensagens de erro para inspeção posterior.
175 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]
Substituição de comando
Outro método para capturar a saída de um comando é a substituição de comando. Ao colocar
um comando entre crases, o Bash o substitui por sua saída padrão. O exemplo a seguir mostra
como usar o stdout de um programa como argumento para outro programa:
A saída do programa date, a data atual formatada como ano-mês-dia, foi usada como um
argumento para criar um diretório com o mkdir. Um resultado idêntico é obtido usando $()
em vez de crases:
O mesmo método pode ser usado para armazenar a saída de um comando como uma variável:
O comando uname -o retorna o nome genérico do sistema operacional atual, que foi ar-
mazenado na variável de sessão OS. Atribuir a saída de um comando a uma variável é muito
útil em scripts, possibilitando armazenar e avaliar os dados de várias maneiras distintas.
A opção -0 diz ao xargs que o caractere nulo deve ser usado como separador. Dessa forma, os
caminhos de arquivo fornecidos pelo find são analisados corretamente, mesmo se contiverem
espaços em branco ou outros caracteres especiais. O exemplo anterior mostra como usar o
comando du para descobrir o uso de espaço em disco por cada arquivo encontrado, e em
seguida classificar os resultados por tamanho. A saída foi suprimida para fins de concisão.
Observe que para cada critério de pesquisa é necessário incluir a opção -print0 para find.
Por padrão, o xargs coloca por último os argumentos do comando executado. Para mudar
esse comportamento, usamos a opção -I:
No último exemplo, todo arquivo encontrado por find é movido para o diretório atual. Como
o(s) caminho(s) de origem devem ser informados para o mv antes do caminho de destino,
um termo de substituição é dado à opção -I do xargs, que é então apropriadamente colocado
junto a mv. Ao usar o caractere nulo como separador, não é necessário colocar o termo de
substituição entre aspas.
Fabio Gonçalves De Melo Santana / [email protected]
19
Resumo
Esta lição cobre métodos para executar um programa redirecionando seus canais de comuni-
cação padrão. Os processos do Linux usam esses canais padrão como descritores de arquivo
genéricos para ler e gravar dados, tornando possível transferi-los arbitrariamente para arquivos
ou dispositivos. A lição demonstra as seguintes etapas:
177
178 19. Resumo
Fabio Gonçalves De Melo Santana / [email protected]
-
Fonte: - https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr
- Fonte: - https://linuxhint.com/redirect-stderr-stdout-bash/
179 19. Resumo
Fabio Gonçalves De Melo Santana / [email protected]
- Fonte: - https://kb.no-
vaordis.com/index.php/Linux_General_Concepts
- Fonte: - https://neilkakkar.com/unix.html
19. Resumo
- Fonte: - https://neilkakkar.com/unix.html
180
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]
20
103.5: Criar, monitorar e eliminar
processos
Introdução
Sempre que rodamos um comando, um ou mais processos são startados. Um SysAdmin
experiente não só precisa criar processos, mas também ser capaz de controlá-los e enviar
diferentes tipos de sinais a eles, se e quando necessário.
Controle de jobs
Jobs são processos iniciados de forma interativa através de um terminal, enviados para o
segundo plano e ainda não finalizados. Para descobrir mais sobre os jobs ativos (e seus status)
em seu sistema Linux, execute o comando jobs:
root@debian10:/home/debian/4linux# jobs
O comando jobs acima não produziu nenhuma saída, o que significa que não há jobs ativos
no momento. Vamos criar nosso primeiro job executando um comando que leva algum tempo
para terminar de ser executado (o comando sleep com um parâmetro de 60) e pressionamos
Ctrl+Z:
181
182 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian/4linux# sleep 60
^Z
[1]+ Stopped sleep 60
root@debian10:/home/debian/4linux# jobs
[1]+ Stopped sleep 60
• [1]: Este número é o identificador do trabalho e pode ser usado –precedido por um
símbolo de porcentagem (%)—para alterar o status do job com os utilitários fg, bg e
kill (como ensinaremos mais tarde);
• +: O sinal de mais indica o job atual por padrão (ou seja, o último a ser suspenso ou
mandado ao segundo plano). O job anterior é sinalizado com um sinal de menos (-).
Quaisquer outros jobs anteriores não são sinalizados;
• Stopped: Descrição do status do job;
• sleep 60: O comando ou job em si.
Com a opção -l, o comando jobs exibe adicionalmente o identificador do processo (PID) logo
antes do status:
root@debian10:/home/debian/4linux# jobs -l
[1]+ 1428 Stopped sleep 60
• -n: Lista apenas os processos que mudaram de status desde a última notificação. Os
possíveis status incluem Running, Stopped, Terminated ou Done;
• -p: Lista os IDs do processo;
• -r: Lista apenas os jobs em execução;
• -s: Lista apenas os jobs interrompidos (ou suspensos).
Especificação do trabalho
O comando jobs, a exemplo de outros utilitários como fg, bg e kill (que você verá na próxima
seção), precisa de uma especificação de trabalho (ou jobspec) para agir sobre um job particular.
Como acabamos de ver, este pode ser—e normalmente é—o ID do trabalho precedido por %.
No entanto, outras especificações de trabalho também são possíveis. Vamos dar uma olhada
nelas:
root@debian10:/home/debian/4linux# jobs %1
[1]+ Stopped sleep 60
• %+ ou %%: Job atual (o que foi iniciado por último em segundo plano ou suspenso
do primeiro plano):
root@debian10:/home/debian/4linux# jobs %+
[1]+ Stopped sleep 60
• %-: Job anterior (aquele que era %+ antes do padrão, que é o atual):
root@debian10:/home/debian/4linux# jobs %-
[1]+ Stopped sleep 60
root@debian10:/home/debian/4linux# fg %1
sleep 60
fg move o job especificado para o primeiro plano e o torna o job atual. A seguir podemos
esperar que ele seja concluído, interrompê-lo novamente com Ctrl+Z ou encerrá-lo com
Ctrl+C.
root@debian10:/home/debian/4linux# bg %1
[1]+ sleep 60 &
Uma vez no segundo plano, o trabalho pode ser trazido de volta ao primeiro plano com fg ou
eliminado (veja abaixo). Observe o e comercial (&) indicando que o trabalho foi enviado para
o segundo plano. Na verdade, também podemos usar o e comercial para iniciar um processo
diretamente em segundo plano:
Junto com o ID do novo trabalho ([2]), também obtemos o ID do processo (1487). Agora,
ambos os trabalhos estão rodando em segundo plano:
root@debian10:/home/debian/4linux# jobs
[1]- Running sleep 60 &
[2]+ Running sleep 100 &
root@debian10:/home/debian/4linux# jobs
[1]- Done sleep 60
[2]+ Running sleep 100 &
root@debian10:/home/debian/4linux# kill %2
Para ter certeza de que o job foi encerrado, rode jobs novamente:
root@debian10:/home/debian/4linux# jobs
[2]+ Terminated sleep 100
Se nenhum trabalho for especificado, fg e bg agirão sobre o job padrão atual. kill, no
entanto, sempre precisa de uma especificação de trabalho.
Lembre-se, o & envia o processo para o segundo plano e libera o terminal em que estamos
trabalhando.
A saída mostra o ID do trabalho ([1]) e o PID (1491), seguido por uma mensagem nos
informando sobre o arquivo nohup.out. Este é o arquivo padrão no qual stdout e stderr serão
salvos. Agora podemos pressionar Ctrl+C para liberar o prompt de comando, fechar a sessão,
iniciar outra como root e usar tail -f para verificar se o comando está rodando e a saída está
sendo escrita no arquivo padrão:
root@debian10:/home/debian/4linux# exit
root@debian10:/home/debian/4linux# tail -f /home/debian/4linux/nohup.out64 bytes from
localhost (::1): icmp_seq=167 ttl=64 time=0.083 ms
64 bytes from localhost (::1): icmp_seq=168 ttl=64 time=0.035 ms
64 bytes from localhost (::1): icmp_seq=169 ttl=64 time=0.084 ms
64 bytes from localhost (::1): icmp_seq=170 ttl=64 time=0.078 ms
64 bytes from localhost (::1): icmp_seq=171 ttl=64 time=0.080 ms
64 bytes from localhost (::1): icmp_seq=172 ttl=64 time=0.079 ms
64 bytes from localhost (::1): icmp_seq=173 ttl=64 time=0.078 ms
64 bytes from localhost (::1): icmp_seq=174 ttl=64 time=0.078 ms
64 bytes from localhost (::1): icmp_seq=175 ttl=64 time=0.082 ms
64 bytes from localhost (::1): icmp_seq=176 ttl=64 time=0.081 ms
Monitoramento de processos
O comando watch executa um programa periodicamente (por padrão, a cada 2 segundos)
e nos permite observar a mudança da saída do programa ao longo do tempo. Por exemplo,
podemos monitorar como a média de trabalho muda conforme mais processos são executados
digitando watch uptime:
Da mesma forma, você pode verificar o uso de memória à medida que novos processos são
criados com watch free:
Como no caso do pgrep, o comando pkill elimina um processo com base em seu nome:
Para eliminar várias instâncias do mesmo processo, o comando killall pode ser usado:
188 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
Tanto pkill quanto killall funcionam da mesma maneira que kill, ou seja, enviam um sinal de
encerramento para o(s) processo(s) especificado(s). Se nenhum sinal for fornecido, o padrão
SIGTERM é enviado. No entanto, kill só aceita um ID de trabalho ou de processo como
argumento.
• Nome:
• Numero:
kill -1 1247
Para fazer com que kill funcione de forma semelhante a pkill ou killall (evitando os comandos
para descobrir os PIDs correspondentes), podemos usar a substituição de comandos:
Como você já deve saber, uma sintaxe alternativa é kill -1 pgrep sleep.
Para uma lista exaustiva de todos os sinais de kill e seus códigos, digite kill -l no
terminal. Use -KILL (-9 ou -s KILL) para eliminar processos rebeldes quando todos
os outros sinais falharem.
189 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
top e ps
Quando se trata de monitoramento de processos, duas ferramentas inestimáveis são top e
ps. Enquanto o primeiro produz resultados de maneira dinâmica, o último o faz de maneira
estática. Em todos os casos, ambos são excelentes utilitários para se ter uma visão abrangente
de todos os processos do sistema.
O top permite uma certa interação do usuário. Por padrão, a saída é classificada pela porcent-
agem de tempo da CPU usada por cada processo em ordem decrescente. Esse comportamento
pode ser modificado pressionando as seguintes teclas de dentro do top:
190 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
• ? ou h: Ajuda;
• k: Elimina um processo. O top pedirá o PID do processo a encerrar, assim como o sinal
a ser enviado (por padrão, SIGTERM ou 15);
• r: Altera a prioridade de um processo (renice). top pede o valor de nice. Os valores
possíveis variam de -20 a 19, mas apenas o superusuário (root) pode definir um valor
negativo ou inferior ao atual;
• u: Lista os processos de um determinado usuário (por padrão, são mostrados os pro-
cessos de todos os usuários);
• c: Mostra os caminhos absolutos dos programas e diferencia os processos do espaço do
usuário dos processos do espaço do kernel (entre colchetes);
• V: Visão de floresta/hierárquica dos processos;
• t e m: Mudam a aparência das leituras da CPU e da memória, respectivamente, em um
ciclo de quatro estágios: os dois primeiros pressionamentos mostram barras de progresso,
o terceiro oculta a barra e o quarto a traz de volta;
• W: Salva as definições de configuração em ~/.toprc.
Uma versão mais sofisticada e amigável de top é htop. Outra alternativa, talvez
mais exaustiva, é atop. Se ainda não estiverem instalados em seu sistema, use seu
gerenciador de pacotes para instalá-los e experimentá-los.
• A área de resumo é composta pelas cinco linhas superiores e nos fornece as seguintes
informações:
– top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14;
– hora atual (em formato de 24 horas): 11:20:29;
191 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
Abaixo da área de resumo fica a área de tarefas, que inclui uma série de campos e colunas que
informam sobre os processos em execução:
Como dito acima, o ps exibe um instantâneo dos processos. Para ver todos os processos com
um terminal (tty), digite ps a:
root@debian10:/home/debian/4linux# ps a
PID TTY STAT TIME COMMAND
731 tty1 Ssl+ 0:00 /usr/lib/gdm3/gdm-wayland-session gnome-session --autostart /usr
/share/gdm/greeter/autostart
735 tty1 Sl+ 0:00 /usr/lib/gnome-session/gnome-session-binary --autostart /usr/
share/gdm/greeter/autostart
743 tty1 Sl+ 0:43 /usr/bin/gnome-shell
Com relação às opções, o ps aceita três estilos diferentes: BSD, UNIX e GNU. Vamos ver
como cada um desses estilos se comportaria ao relatar informações sobre a ID de um processo
específico:
ps p 811
PID TTY STAT TIME COMMAND
811 pts/0 S 0:00 -su
ps -p 811
PID TTY TIME CMD
811 pts/0 00:00:00 bash
ps --pid 811
PID TTY TIME CMD
811 pts/0 00:00:00 bash
Nos três casos, o ps relata informações sobre o processo cujo PID é 811—neste caso, o bash.
Da mesma forma, podemos usar o ps para pesquisar os processos iniciados por um usuário
determinado:
• ps U debian (BSD);
• ps -u debian (UNIX);
• ps –user debian (GNU).
root@debian10:/home/debian/4linux# ps U debian
PID TTY STAT TIME COMMAND
845 ? Ss 0:00 /lib/systemd/systemd --user
852 ? S 0:00 (sd-pam)
914 ? R 0:01 sshd: debian@pts/0
918 pts/0 Ss 0:00 -bash
Podemos obter o melhor do ps combinando algumas de suas opções. Um comando muito útil
(produzindo uma saída semelhante à de top) é ps aux (estilo BSD). Nesse caso, os processos
de todos os shells (não apenas o atual) são mostrados. O significado das opções é o seguinte:
194 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian/4linux# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.0 169752 5332 ? Ss 12:15 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S 12:15 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 12:15 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 12:15 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 12:15 0:00 [kworker/0:0H-kblockd]
root 8 0.0 0.0 0 0 ? I< 12:15 0:00 [mm_percpu_wq]
• Qualquer invocação bem-sucedida resultará em pelo menos uma sessão que—por sua
vez—incluirá ao menos uma janela. As janelas contêm programas;
• As janelas podem ser divididas em regiões ou painéis—o que ajuda na produtividade ao
195 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]
Resumo
Nesta lição, você aprendeu sobre jobs (trabalhos) e controle de jobs. Os fatos e conceitos
principais a ser lembrados são:
• Fonte: https://codeahoy.com/2017/01/20/hhtop-explained-visually/
Fabio Gonçalves De Melo Santana / [email protected]
21
103.6 Modificar as prioridades de
execução do processo
Introdução
Os sistemas operacionais capazes de executar mais de um processo ao mesmo tempo são
chamados de sistemas multitarefa ou multiprocessamento. Embora a verdadeira simultanei-
dade só aconteça quando mais de uma unidade de processamento estiver disponível, mesmo
os sistemas de processador único podem imitar a simultaneidade alternando entre os processos
muito rapidamente.
Na verdade, apenas um processo por vez pode controlar a CPU. No entanto, a maioria das
atividades de processo são chamadas de sistema, ou seja, o processo em execução transfere o
controle da CPU para o processo de um sistema operacional para que ele execute a operação
solicitada. As chamadas do sistema são responsáveis por todas as comunicações entre dis-
positivos, como alocações de memória, leitura e gravação em sistemas de arquivos, impressão
de texto na tela, interação do usuário, transferências de rede etc. Transferir o controle da
CPU durante uma chamada do sistema permite que o sistema operacional decida se para
retornar o controle da CPU para o processo anterior ou para transferi-lo para outro processo.
Como as CPUs modernas podem executar instruções muito mais rápido do que a maioria dos
hardwares externos podem se comunicar entre si, um novo processo de controle pode fazer
muito trabalho da CPU enquanto as respostas de hardware solicitadas anteriormente ainda
estão indisponíveis. Para garantir o aproveitamento máximo da CPU,os sistemas operacionais
198
199 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
O Linux Scheduler
O Linux, como um sistema operacional de multiprocessamento preventivo, implementa um
agendador que organiza a fila de processos. Mais precisamente, o escalonador também decide
qual thread enfileirada será executado - um processo pode ramificar muitos threads indepen-
dentes - mas processo e thread são termos intercambiáveis neste contexto. Todo processo
possui dois predicados que intervêm em seu escalonamento: a política de escalonamento e a
prioridade de escalonamento.
Existem dois tipos principais de políticas de escalonamento: políticas em tempo real e políticas
normais. Os processos em uma política em tempo real são programados diretamente por seus
valores de prioridade. Se um processo mais importante ficar pronto para ser executado, um
processo menos importante será interrompido e o processo de prioridade mais alta assumirá o
controle da CPU. Um processo de prioridade mais baixa obterá controle da CPU apenas se os
processos de prioridade mais alta estiverem ociosos ou aguardando a resposta do hardware.
Qualquer processo em tempo real tem prioridade mais alta do que um processo normal. Como
um sistema operacional de uso geral, o Linux executa apenas alguns processos em tempo
real. A maioria dos processos, incluindo o sistema e os programas do usuário, são executados
sob as políticas de agendamento normais. Os processos normais geralmente têm o mesmo
valor de prioridade, mas as políticas normais podem definir regras de prioridade de execução
usando outro predicado de processo: o valor agradável. Para evitar confusão com as prioridades
dinâmicas derivadas de valores legais, as prioridades de agendamento são geralmente chamadas
de prioridades de agendamento estáticas.
O agendador do Linux pode ser configurado de muitas maneiras diferentes e existem maneiras
ainda mais intrincadas de estabelecer prioridades, mas esses conceitos gerais sempre se aplicam.
Ao inspecionar e ajustar a programação do processo, é importante ter em mente que apenas
os processos sob a política de programação normal serão afetados.
200 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Prioridades de leitura
O Linux reserva prioridades estáticas de 0 a 99 para processos em tempo real e processos
normais são atribuídos a prioridades estáticas de 100 a 139, o que significa que existem 39
níveis de prioridade diferentes para processos normais. Valores mais baixos significam prioridade
mais alta. A prioridade estática de um processo ativo pode ser encontrada no arquivo sched,
localizado em seu respectivo diretório dentro do sistema de arquivos /proc:
Conforme mostrado no exemplo, a linha que começa com prio fornece o valor de prioridade do
processo (o processo PID 1 é o init ou o processo systemd, o primeiro processo que o kernel
inicia durante a inicialização do sistema). A prioridade padrão para processos normais é 120,
de modo que pode ser diminuída para 100 ou aumentada para 139. As prioridades de todos
os processos em execução podem ser verificadas com o comando ps -Al ou ps -el:
root@debian10:/home/debian# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 1 80 0 - 42432 do_epo ? 00:00:03 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp
1 I 0 4 2 0 60 -20 - 0 - ? 00:00:00 rcu_par_gp
1 I 0 5 2 0 80 0 - 0 - ? 00:00:00 kworker/0:0-events
1 I 0 6 2 0 60 -20 - 0 - ? 00:00:00 kworker/0:0H-kblockd
1 I 0 7 2 0 80 0 - 0 - ? 00:00:00 kworker/u4:0-flush-254:2
1 I 0 8 2 0 60 -20 - 0 - ? 00:00:00 mm_percpu_wq
A coluna PRI indica a prioridade estática atribuída pelo kernel. Observe, entretanto, que o
valor de prioridade exibido por ps difere daquele obtido no exemplo anterior. Devido a razões
históricas, as prioridades exibidas por ps variam de -40 a 99 por padrão, então a prioridade
real é obtida adicionando 40 a ela (em particular, 80 + 40 = 120).
Para obter mais detalhes do pscomando, opções adicionais podem ser usadas. Com-
pare a saída deste comando com a de nosso exemplo anterior:
ps -e -o usuário, uid, comm, tty, pid, ppid, pri, pmem, pcpu –sort = -pcpu | head
Niceness do processo
Todo processo normal começa com um valor legal padrão de 0 (prioridade 120). O nome nice
“legal” vem da ideia de que processos “mais legais” permitem que outros processos sejam
executados antes deles em uma fila de execução específica. Números agradáveis variam de -20
(menos legais, prioridade alta) a 19 (mais legais, prioridade baixa). O Linux também permite
a capacidade de atribuir diferentes valores agradáveis a threads dentro do mesmo processo. A
coluna NI na saída do comando ps indica o número nice “legal”.
Apenas o usuário root pode diminuir a gentileza de um processo abaixo de zero. É possível
iniciar um processo com uma prioridade não padrão com o comando nice. Por padrão, o
comando nice altera o niceness para 10, mas pode ser especificado com a opção -n:
Neste exemplo, o comando tar é executado com uma prioridade de 15. O comando renice
pode ser usado para alterar a prioridade de um processo em execução. A opção -p indica o
número PID do processo de destino. Por exemplo:
Além do comando renice, a prioridade dos processos pode ser modificada com outros progra-
mas, como o programa top.
202 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Resumo
Esta lição cobre como o Linux compartilha o tempo de CPU entre seus processos gerenciados.
Para garantir o melhor desempenho, os processos mais críticos devem ultrapassar os processos
menos críticos. A lição passa pelas seguintes etapas:
Introdução
As expressões regulares consistem em sequências de caracteres, constituindo um padrão genérico
usado para localizar e, às vezes, modificar uma sequência correspondente em uma sequência
maior de caracteres. As expressões regulares expandem muito a capacidade de:
A expressão regular mais simples contém pelo menos um átomo. Um átomo, assim chamado
por ser o elemento básico de uma expressão regular, é apenas um caractere que pode ou não
ter um significado especial. A maioria dos caracteres comuns não são ambíguos e retêm seu
significado literal, enquanto outros têm um significado especial:
Por exemplo, a expressão regular bc, composta pelos átomos literais b e c, pode ser encontrada
na string abcd, mas não na string a1cd. Por outro lado, a expressão regular .c pode ser
encontrada nas strings abcd e a1cd, pois o ponto . corresponde a qualquer caractere.
Expressão de colchetes
Embora não sejam um único caractere, os colchetes [] (incluindo o conteúdo) são considerados
um único átomo. Uma expressão de colchetes geralmente é apenas uma lista de caracteres
literais delimitados por [], fazendo com que o átomo corresponda a qualquer caractere único
da lista. Por exemplo, a expressão [1b] pode ser encontrada nas strings abcd e a1cd. Para
especificar caracteres aos quais o átomo não deve corresponder, a lista deve começar com
ˆ, como em [ˆ1b]. Também é possível especificar intervalos de caracteres em expressões de
colchetes. Por exemplo, [09] corresponde aos dígitos de 0 a 9 e [az] corresponde a qualquer
letra minúscula. Os intervalos devem ser usados com cuidado, pois podem não ser consistentes
em diferentes idiomas.
As listas de expressão de colchetes também aceitam classes em vez de apenas caracteres únicos
e intervalos. As classes de caracteres tradicionais são:
As classes de caracteres podem ser combinadas com caracteres únicos e intervalos, mas não
podem ser usadas como ponto final de um intervalo. Além disso, as classes de caracteres
podem ser usadas apenas em expressões de colchetes, não como um átomo independente fora
dos colchetes.
Chaves
As chaves são quantificadores que permitem ao usuário especificar limites precisos de quanti-
dade para um átomo. Em expressões regulares estendidas, as chaves podem aparecer de três
maneiras:
• {i}: O átomo deve aparecer exatamente i vezes (sendo i um número inteiro). Por
exemplo, [[:blank:]]{2} corresponde a exatamente dois caracteres em branco;
• {i,}: O átomo deve aparecer pelo menos i vezes (sendo i um número inteiro). Por
exemplo, [[:blank:]]{2,} corresponde a qualquer sequência de dois ou mais caracteres
em branco;
• {i,j}: O átomo deve aparecer pelo menos i vezes e no máximo j vezes (i e j números
inteiros, j maior que i). Por exemplo, xyz {2,4} corresponde à string xy seguida por dois
a quatro do caractere z.
De toda forma, se uma substring corresponder a uma expressão regular e uma substring
mais longa começando no mesmo ponto também corresponder, a substring mais longa será
considerada.
As expressões regulares básicas também suportam chaves, mas elas devem ser precedidas por:
{ e }. Sozinhas, { e } são interpretadas como caracteres literais. Uma { seguida por um
caractere diferente de um dígito é um caractere literal, não uma abertura de chave.
205 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
busca por arquivos maiores que 100 megabytes (100 unidades de 1048576 bytes), mas apenas
em caminhos dentro do diretório inicial do usuário que contenham uma correspondência com
./.., ou seja, um /. rodeado por qualquer outro número de caracteres. Em outras palavras,
apenas os arquivos ocultos ou arquivos dentro de diretórios ocultos serão listados, indepen-
dentemente da posição de /. no caminho correspondente. Para expressões regulares que não
diferenciam maiúsculas de minúsculas, a opção -iregex deve ser usada em seu lugar:
Neste exemplo, a expressão regular contém alternâncias (escritas no estilo estendido) para listar
apenas arquivos de fonte específicos na hierarquia de diretório /usr/share/fonts. Expressões
regulares estendidas não são suportadas por padrão, mas find permite que sejam habilitadas
com -regextype posix-extended or -regextype egrep. A ER padrão para find é findutils-default,
que é essencialmente um clone da expressão regular básica.
Um dos usos mais comuns do grep é facilitar a inspeção de arquivos longos, usando a expressão
206 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
regular como filtro aplicado a cada linha. Pode ser usado para mostrar apenas as linhas que
começam com um determinado termo. Por exemplo, o grep pode ser usado para investigar
um arquivo de configuração para módulos do kernel, listando apenas as linhas de opções:
O caractere pipe | pode ser empregado para redirecionar a saída de um comando diretamente
para a entrada de grep. O exemplo a seguir usa uma expressão entre colchetes para selecionar
linhas da saída de fdisk -l, começando com Disk /dev/sda ou Disk /dev/sdb:
A mera seleção de linhas com correspondências pode não ser apropriada para uma tarefa em
particular, exigindo ajustes no comportamento de grep através de suas opções. Por exemplo,
a opção -c ou –count diz ao grep para exibir quantas linhas têm correspondências:
A opção pode ser colocada antes ou depois da expressão regular. Outras opções importantes
do grep são:
Embora ativada por padrão quando vários caminhos de arquivo são fornecidos como entrada,
a opção -H não é ativada para arquivos individuais. Isso pode ser importante em situações
especiais, como quando grep é chamado diretamente por find, por exemplo:
Neste exemplo, find lista todos os arquivos em /usr/share/doc e passa cada um deles para
o grep, que por sua vez realiza uma busca sem distinção entre maiúsculas e minúsculas por
iptables dentro do arquivo. O pipe para cut existe apenas para limitar o comprimento da saída
a 100 colunas. Observe, entretanto, que não há como saber de qual arquivo as linhas vieram.
Esse problema é resolvido adicionando -H ao grep:
Agora é possível identificar os arquivos nos quais cada correspondência foi encontrada. Para
tornar a listagem ainda mais informativa, linhas iniciais e finais podem ser adicionadas às linhas
com correspondências:
A opção -1 instrui o grep a incluir uma linha antes e uma linha depois quando encontrar uma
linha com uma correspondência. Essas linhas extras são chamadas de linhas de contexto e são
208 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
identificadas na saída por um sinal de menos após o nome do arquivo. O mesmo resultado
pode ser obtido com -C 1 ou –context=1; outras quantidades de linhas de contexto podem
ser indicadas.
Existem dois programas complementares a grep: egrep e fgrep. O programa egrep é equivalente
ao comando grep -E, que incorpora recursos extras além das expressões regulares básicas. Por
exemplo, com o egrep é possível usar recursos de expressões regulares estendidas, como as
alternâncias:
Neste exemplo, a expressão buscada corresponderá a iptables ou firewall, sem distinção entre
maiúsculas e minúsculas. Para exibir apenas as partes de um fluxo de texto que correspondem
à expressão usada por egrep, use a opção -o.
O programa fgrep é equivalente a grep -F, ou seja, não analisa expressões regulares. Ele é
útil em pesquisas simples, nas quais o objetivo é encontrar uma expressão literal. Portanto,
caracteres especiais como o cifrão e o ponto serão interpretados literalmente e não como seus
significados em uma expressão regular.
O sed é adequado para texto transmitido por meio de encadeamentos (pipelines). Sua sintaxe
básica é sed -f SCRIPT, quando as instruções de edição são armazenadas no arquivo SCRIPT,
ou sed -e COMANDOS para executar COMANDOS diretamente da linha de comando. Se
nem -f nem -e estiverem presentes, o sed usa o primeiro parâmetro que não seja uma opção
como arquivo de script. Também é possível usar um arquivo como entrada apenas fornecendo
seu caminho como um argumento para o sed.
209 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
As instruções do sed são compostas por um único caractere, possivelmente precedido por um
endereço ou seguido por uma ou mais opções, e são aplicadas a uma linha de cada vez. Os
endereços podem ser um único número de linha, uma expressão regular ou um intervalo de
linhas. Por exemplo, a primeira linha de um fluxo de texto pode ser excluída com 1d, onde 1
especifica a linha à qual o comando de exclusão d será aplicado. Para esclarecer o uso de sed,
vejamos a saída do comando factor seq 12, que retorna os fatores primos para os números de
1 a 12:
Mais de uma instrução pode ser usada na mesma execução, separadas por ponto e vírgula.
Nesse caso, no entanto, é importante colocá-las entre parênteses para que o ponto e vírgula
não seja interpretado pelo shell:
Neste exemplo, duas instruções de exclusão foram executadas, primeiro nas linhas que vão de
1 a 7 e depois na linha 11. Um endereço também pode ser uma expressão regular, portanto,
apenas as linhas correspondentes serão afetadas pela instrução:
A instrução de exclusão d é apenas uma das muitas instruções de edição fornecidas pelo sed.
Em vez de excluir uma linha, o sed pode substitui-la por um texto determinado:
A instrução c REMOVED simplesmente substitui uma linha pelo texto REMOVED. No caso
do exemplo, cada linha com uma substring correspondente à expressão regular :.2. é afetada
pela instrução c REMOVED. A instrução a TEXT copia o texto indicado por TEXT para uma
nova linha após a linha com uma correspondência. A instrução r FILE faz o mesmo, mas copia
o conteúdo do arquivo indicado por FILE. A instrução w faz o oposto de r, ou seja, a linha
será anexada ao arquivo indicado.
De longe, a instrução mais usada do sed é s/FIND/REPLACE/, que é usada para substituir uma
correspondência da expressão regular FIND pelo texto indicado por REPLACE. Por exemplo, a
instrução s/hda/sda/ substitui uma substring que corresponde à ER literal hda por sda. Apenas
a primeira correspondência encontrada na linha será substituída, a menos que o sinalizador g
seja colocado após a instrução, como em s/hda/sda/g.
A opção -d traduz o número IP para o nome de host correspondente. O nome do host pode
fornecer pistas sobre o provedor de internet ou o serviço de hospedagem usado para realizar
essas tentativas de login incorretas. A opção -a põe o nome do host na última coluna, o
que facilita a filtragem a ser aplicada. A opção –time-format notime suprime a hora em que
ocorreu a tentativa de login. O comando lastb pode levar algum tempo para ser concluído caso
tenha havido muitas tentativas de login incorretas, por isso limitamos a saída a dez entradas
com a opção -n 10. Nem todos os IPs remotos têm um nome de host associado, portanto o
DNS reverso não se aplica e eles podem ser dispensados. Embora seja possível escrever uma
expressão regular que corresponda ao formato esperado para um nome de host no final da
linha, provavelmente é mais simples escrever uma que corresponda a uma letra do alfabeto ou
a um único dígito no final linha. O exemplo a seguir mostra como o comando grep pega a
212 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
A opção -v do comando grep exibe apenas as linhas que não correspondem à expressão
regular fornecida. Uma expressão regular que corresponda a qualquer linha terminada por
um número (isto é, [0-9])capturaapenasasentradassemumnomedehost.P ortanto, grep −
v ′ [0 − 9]’ mostra somente as linhas que terminam com um nome de host. A filtragem da saída
pode ser ainda mais refinada, mantendo-se apenas o nome de domínio e removendo as outras
partes de cada linha. Para isso, usamos o comando sed com um comando de substituição para
trocar a linha inteira por um agrupamento referente ao nome de domínio contido nela:
O parêntese escapado em .* (.*)$ diz ao sed para lembrar aquela parte da linha, ou seja, a parte
entre o último caractere de espaço e o final da linha. No exemplo, esta parte é referenciada
com \1 e usada para substituir a linha inteira. Parece claro que a maioria dos hosts remotos
tenta fazer o login mais de uma vez, assim, o mesmo nome de domínio se repete. Para suprimir
as entradas repetidas, elas precisam primeiro ser classificadas (com o comando sort) e depois
passadas para o comando uniq:
Este exemplo mostra como diferentes comandos podem ser combinados para produzir o resul-
tado desejado. A lista de nomes de host pode então ser usada para escrever regras de firewall
de bloqueio ou tomar outras medidas para garantir a segurança do servidor.
213 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Resumo
Esta lição cobre o suporte geral do Linux para expressões regulares, um padrão amplamente
usado cujos recursos de correspondência de padrões são suportados pela maioria dos programas
que trabalham com texto. A lição atravessa as seguintes etapas:
Introdução
Na maioria das distribuições Linux, vi - abreviação de “visual” - é pré-instalado e é o editor
padrão no ambiente shell. Vi é um editor de texto interativo, que mostra o conteúdo do
arquivo na tela à medida que vai sendo editado. Como tal, permite ao usuário navegar e fazer
modificações em qualquer parte do documento. No entanto, ao contrário dos editores visuais
da área de trabalho gráfica, o editor vi é um aplicativo shell com atalhos de teclado para todas
as tarefas de edição.
Uma alternativa ao vi, chamada vim (vi melhorado), às vezes é usada como um substituto
moderno para o vi. Entre outras melhorias, o vim oferece suporte para destaque de sintaxe,
desfazer/refazer e edição de múltiplos documentos. Embora mais engenhoso, o vim é total-
mente compatível com versões anteriores do vi, tornando ambos indistinguíveis para a maioria
das tarefas.
A maneira padrão de iniciar o vi é fornecer a ele um caminho para um arquivo como parâmetro.
Para pular diretamente para uma linha específica, seu número deve ser informado com um sinal
de mais, como em vi +9 /etc/fstab para abrir /etc/fstab/ e posicionar o cursor na 9ł linha.
Sem um número, o sinal de mais por si só coloca o cursor na última linha.
Modo de inserção
O modo de inserção é simples: o texto aparece na tela à medida que é digitado no teclado.
É o tipo de interação que a maioria dos usuários espera de um editor de texto, mas não é
como o vi primeiro apresenta um documento. Para entrar no modo de inserção, o usuário deve
executar um comando de inserção no modo normal. A tecla Esc termina o modo de inserção
e retorna ao modo normal, o modo vi padrão.
Se você estiver interessado em saber mais sobre os outros modos de execução, abra
o vi e digite:
215 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
: help vim-modes-intro
Modo normal
O modo normal, também conhecido como modo de comando, é como o vi inicia por padrão.
Neste modo, as teclas do teclado são associadas a comandos para navegação e tarefas de
manipulação de texto. A maioria dos comandos neste modo são chaves exclusivas. Algumas
das teclas e suas funções no modo normal são:
Se precedido por um número, o comando será executado o mesmo número de vezes. Por
exemplo, pressione 3yy para copiar a linha atual mais as duas seguintes, pressione d5w para
excluir a palavra atual e as 4 palavras seguintes e assim por diante.
A maioria das tarefas de edição são combinações de vários comandos. Por exemplo, a sequência
de teclas vey é usada para copiar uma seleção começando na posição atual até o final da palavra
216 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
atual. A repetição de comandos também pode ser usada em combinações, então v3ey copiaria
uma seleção começando na posição atual até o final da terceira palavra a partir daí.
Qualquer sequência de teclas pode ser gravada como uma macro para execução futura. Uma
macro pode ser gravada, por exemplo, para colocar um texto selecionado entre aspas duplas.
Primeiro, uma string de texto é selecionada e a tecla q é pressionada, seguida por uma tecla de
registro para associar a macro, como d. A linha recording @d aparecerá na linha de rodapé,
indicando que a gravação está ativada. Presume-se que algum texto já esteja selecionado,
então o primeiro comando é x para remover (e copiar automaticamente) o texto selecionado.
A tecla i é pressionada para inserir duas aspas duplas na posição atual e, em seguida, Esc
retorna ao modo normal. O último comando é P, para inserir novamente a seleção excluída
imediatamente antes da última aspa dupla. Pressionar q novamente encerrará a gravação.
Agora, uma macro que consiste na sequência de teclas x, i, "", Esc e P será executada
toda vez que as teclas @d forem pressionadas no modo normal, onde d é a tecla de registro
associada à macro.
No entanto, a macro estará disponível apenas durante a sessão atual. Para tornar as macros
persistentes, elas devem ser armazenadas no arquivo de configuração. Como a maioria das
distribuições modernas usa o vim como editor compatível com o vi, o arquivo de configuração
do usuário é /.vimrc. Dentro de /.vimrc, a linha let @d = ‘xi"" P’ definirá o registro d para
a sequência de teclas entre aspas simples. O mesmo registro atribuído anteriormente a uma
macro pode ser usado para colar sua sequência de teclas.
Enter pressionada sem nenhum comando. Alguns dos comandos de dois pontos mais comuns
são indicados aqui (a inicial não faz parte do comando):
O programa vi padrão é capaz de fazer a maioria das tarefas de edição de texto, mas qualquer
outro editor não gráfico pode ser usado para editar arquivos de texto no ambiente shell.
As distribuições que adotam o vim também possuem o comando vimtutor, que usa
o próprio vim para abrir um guia passo a passo das principais atividades.
O arquivo é uma cópia editável que pode ser usada para praticar os comandos e
progressivamente se acostumar com eles.
Editores Alternativos
Os usuários não familiarizados com o vi podem ter dificuldade em se adaptar a ele, pois seu
funcionamento não é intuitivo. Uma alternativa mais simples é o GNU nano, um pequeno
editor de texto que oferece todos os recursos básicos de edição de texto, como desfazer/re-
fazer, coloração de sintaxe, busca e substituição interativa, recuo automático, números de
linha, completamento de palavras, bloqueio de arquivo, arquivos de backup e apoio à interna-
cionalização. Ao contrário do vi, todos os pressionamentos de tecla são apenas inseridos no
documento que está sendo editado. Os comandos no nano são dados usando a tecla Ctrl ou
a tecla Meta (dependendo do sistema, Meta é Alt ou ).
• Ctrl-6 ou Meta-A.: Inicie uma nova seleção. Também é possível criar uma seleção
pressionando Shift e movendo o cursor;
218 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Emacs é outro editor de texto muito popular para o ambiente de shell. Enquanto o texto
é inserido apenas digitando-o, como no nano, a navegação pelo documento é auxiliada por
comandos do teclado, como no vi. O Emacs inclui muitos recursos que o tornam mais do
que apenas um editor de texto. É também um IDE (ambiente de desenvolvimento integrado)
capaz de compilar, executar e testar programas. O Emacs pode ser configurado como um
cliente de email, notícias ou RSS, tornando-o um pacote de produtividade autêntico.
O próprio shell executará um editor de texto padrão, geralmente o vi, sempre que necessário.
Este é o caso, por exemplo, quando crontab -e é executado para editar cronjobs. O Bash usa
as variáveis de sessão VISUAL ou EDITOR para descobrir o editor de texto padrão para o
ambiente do shell. Por exemplo, o comando export EDITOR=nano define o nano como o
editor de texto padrão na sessão shell atual. Para tornar essa mudança persistente nas sessões,
o comando deve ser incluído em ~/.bash_profile.
219 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Introdução
Não adianta. . . para se ter um sistema operacional, um disco precisa com certeza ser par-
ticionado antes de poder ser usado. Uma partição é um subconjunto lógico do disco físico;
as informações sobre as partições são armazenadas em uma tabela de partições. Essa tabela
inclui informações sobre o primeiro e o último setores da partição e seu tipo, além de mais
detalhes sobre cada partição.
Normalmente, cada partição é vista por um sistema operacional como um “disco” separado,
mesmo que todas residam na mesma mídia física. Nos sistemas Windows, elas recebem letras
220 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
como C: (historicamente o disco principal), D: e assim por diante. No Linux, cada partição
recebe um diretório em /dev, como /dev/sda1 ou /dev/sda2.
Durante as tarefas de administração do sistema, é bastante possível que você encontre ambos
os esquemas em uso, por isso é importante saber como usar as ferramentas associadas a cada
um para criar, excluir ou modificar partições.
serve para editar a tabela de partição do primeiro dispositivo conectado por SATA (sda) no
sistema. Lembre-se de que é preciso especificar o dispositivo correspondente ao disco físico,
não uma de suas partições (como /dev/sda1).
221 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Todas as operações de disco desta lição devem ser realizadas com o usuário root (o
administrador do sistema), ou com privilégios de root usando sudo.
Quando invocado, fdisk mostra uma saudação seguida de um aviso e espera pelos seus co-
mandos.
O aviso é importante. Você pode criar, editar ou remover partições à vontade, mas nada será
gravado no disco a menos que você use o comando write (w). Assim, você pode “praticar”
sem o risco de perder dados, desde que mantenha distância da tecla w. Para sair do fdisk sem
salvar as alterações, use o comando q.
Dito isso, jamais pratique em um disco importante, pois sempre haverá riscos. Use
um disco externo sobressalente ou um pendrive.
O comando p é usado para imprimir a tabela de partição atual. A saída é mais ou menos
assim:
Em um disco MBR, podemos ter 2 tipos principais de partições, primária e estendida. Como já
dissemos, só é possível ter 4 partições primárias no disco e, para que o disco seja “inicializável”,
a primeira partição deve ser primária.
Uma maneira de contornar essa limitação é criar uma partição estendida que atue como um
contêiner para partições lógicas. Seria possível ter, por exemplo, uma partição primária, uma
partição estendida ocupando o restante do espaço em disco e cinco partições lógicas dentro
dela.
Para um sistema operacional como o Linux, as partições primárias e estendidas são tratadas
exatamente da mesma maneira, então não há “vantagens” em se usar uma ou outra.
Para criar uma partição, use o comando n. Por padrão, as partições serão criadas no início
do espaço não alocado no disco. Você será questionado sobre o tipo de partição (primária ou
estendida), primeiro setor e último setor.
Para o primeiro setor, geralmente podemos aceitar o valor padrão sugerido pelo fdisk, a menos
que você precise que uma partição inicie em um setor específico. Em vez de especificar o último
setor, dá para especificar um tamanho seguido das letras K, M, G, T ou P (Kilo, Mega, Giga,
Tera ou Peta). Assim, se você quiser criar uma partição de 1 GB, pode especificar +1G como
Last sector e o fdisk redimensiona a partição de acordo. Veja este exemplo para a criação de
uma partição primária:
Se você não souber quanto espaço livre resta no disco, pode usar o comando F para mostrar
o espaço não alocado, desta maneira:
Removendo partições
Para remover uma partição, use o comando d. O fdisk irá pedir o número da partição a
remover, a menos que haja apenas uma partição no disco. Neste caso, essa partição será
selecionada e excluída imediatamente.
Esteja ciente de que se você excluir uma partição estendida, todas as partições lógicas dentro
dela também serão excluídas.
Lacunas
Tenha em mente que, ao criar uma nova partição com fdisk, o tamanho máximo será limitado
pela quantidade máxima de espaço contíguo não alocado no disco. Digamos, por exemplo,
que você tenha o seguinte mapa de partições:
Somando o tamanho do espaço não alocado, em teoria teríamos 881 MB disponíveis. Mas
veja o que acontece quando tentamos criar uma partição de 700 MB:
Isso acontece porque o maior espaço contíguo não alocado no disco é o bloco de 512 MB que
pertencia à partição 2. Sua nova partição não pode “pular por cima” da partição 3 para usar
parte do espaço não alocado existente depois dela.
Ocasionalmente, pode ser necessário alterar o tipo da partição, especialmente ao lidar com
discos que serão usados em outros sistemas operacionais e plataformas. Isso é feito com o
comando t, seguido pelo número da partição que se deseja alterar.
O tipo de partição deve ser especificado por seu código hexadecimal correspondente. Para ver
uma lista de todos os códigos válidos, use o comando l.
Não confunda o tipo de partição com o sistema de arquivos usado nela. Embora no início
houvesse uma relação entre eles, hoje não é possível presumir que isso seja verdade. Uma
partição Linux, por exemplo, pode conter qualquer sistema de arquivos nativo do Linux, como
ext4 ou ReiserFS.
O comando p é usado para imprimir a tabela de partição atual. A saída é mais ou menos
assim:
O comando para criar uma partição é n, assim como em fdisk. A principal diferença é que,
além do número da partição e do primeiro e último setores (ou o tamanho), também podemos
226 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
especificar o tipo de partição durante a criação. As partições GPT suportam muitos mais tipos
do que as MBR. Para ver uma lista de todos os tipos suportados, use o comando L.
Para excluir uma partição, digite d e o número da partição. Ao contrário do fdisk, a primeira
partição não será selecionada automaticamente se for a única no disco.
Em discos GPT, as partições podem ser facilmente reordenadas ou “classificadas” para evitar
lacunas na sequência de numeração. Para isso, basta usar o comando s. Por exemplo, imagine
um disco com a seguinte tabela de partição:
Ao contrário dos discos MBR, ao criar uma partição em discos GPT, o tamanho não é limitado
pela quantidade máxima de espaço contíguo não alocado. Você pode usar até o último
pedacinho de um setor livre, não importa onde ele esteja localizado no disco.
227 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Opções de recuperação
Para reconstruir um cabeçalho GPT principal corrompido ou uma tabela de partição, usamos
b e c, respectivamente, ou usamos o cabeçalho principal e a tabela para reconstruir um backup
com d e e. Também dá para converter um MBR em GPT com f e fazer o oposto com g,
entre outras operações. Digite ? no menu de recuperação para obter uma lista de todos os
comandos de recuperação disponíveis e descrições sobre o que eles fazem.
A ferramenta padrão usada para criar um sistema de arquivos no Linux é o mkfs, que vem em
muitos “sabores” de acordo com o sistema de arquivos com o qual ele precisa trabalhar.
Os utilitários mkfs.ext2, mkfs.ext3 e mkfs.ext4 são usados para criar sistemas de arquivos ext2,
ext3 e ext4. De fato, todos esses “utilitários” existem apenas como links simbólicos para outro
utilitário chamado mke2fs. O mke2fs altera seus padrões de acordo com o nome pelo qual é
chamado. Dessa forma, todos eles têm o mesmo comportamento e parâmetros na linha de
comando.
Onde TARGET é o nome da partição na qual o sistema de arquivos deve ser criado. Por
exemplo, para criar um sistema de arquivos ext3 em /dev/sdb1, o comando seria:
Em vez de usar o comando correspondente ao sistema de arquivos que deseja criar, você pode
passar o parâmetro -t para mke2fs seguido do nome do sistema de arquivos. Por exemplo, os
comandos a seguir são equivalentes e irão criar um sistema de arquivos ext4 em /dev/sdb1.
Parâmetros de linha de comando O mke2fs suporta uma ampla gama de parâmetros e opções
de linha de comando. Eis alguns dos mais significativos. Todos eles também se aplicam a
mkfs.ext2, mkfs.ext3 e mkfs.ext4:
• -b SIZE: Define o tamanho dos blocos de dados no dispositivo para SIZE, que pode ser
de 1024, 2048 ou 4096 bytes por bloco;
• -c: Verifica se existem blocos defeituosos no dispositivo de destino antes de criar o
sistema de arquivos. Para fazer uma verificação mais detalhada, porém muito mais
lenta, aplique esse parâmetro duas vezes, como em mkfs.ext4 -c -c TARGET;
• -d DIRECTORY: Copia o conteúdo do diretório especificado para a raiz do novo
sistema de arquivos. Útil quando se precisa “pré-preencher” o disco com um conjunto
de arquivos predefinido;
• -F: Perigo, Will Robinson! Esta opção força o mke2fs a criar um sistema de arquivos,
mesmo se as outras opções passadas para ele ou para o alvo forem perigosas ou não
fizerem nenhum sentido. Se especificado duas vezes (como em -F -F), pode inclusive
ser usado para criar um sistema de arquivos em um dispositivo montado ou em uso, o
que é uma coisa muito, mas muito ruim de se fazer;
• -L VOLUME_LABEL: Define o rótulo do volume conforme especificado em VOL-
UME_LABEL. Esse rótulo deve ter ao menos 16 caracteres;
• -n: Esta é uma opção utilíssima que simula a criação do sistema de arquivos e mostra
o que seria feito se executado sem a opção n. Pense nele como um modo de “teste”. É
bom verificar as coisas antes de realmente efetuar quaisquer alterações no disco;
• -q: Modo silencioso. O mke2fs será executado normalmente, mas não produzirá nen-
huma saída para o terminal. Útil ao executar mke2fs a partir de um script;
• -U ID: Este parâmetro define o UUID (Universally Unique Identifier, ou Identificador
único universal) de uma partição para o valor especificado como ID. Os UUIDs são
números de 128 bits em notação hexadecimal que servem para identificar uma partição
229 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
para o sistema operacional. Esse número é especificado como uma string de 32 dígitos
no formato 8-4-4-4-12, ou seja, 8 dígitos, hífen, 4 dígitos, hífen, 4 dígitos, hífen, 4
dígitos, hífen, 12 dígitos, como D249E380-7719-45A1-813C-35186883987E. Em vez de
um ID, você também pode especificar parâmetros como clear para remover o UUID do
sistema de arquivos, random para usar um UUID gerado aleatoriamente, ou time para
criar um UUID baseado em tempo;
• -V: Modo detalhado (ou verboso), exibe muito mais informações durante a operação
do que normalmente. Útil para fins de depuração.
As ferramentas para gerenciar os sistemas de arquivos XFS são parte do pacote xfsprogs.
Pode ser preciso instalar esse pacote manualmente, pois ele não vem incluído por padrão em
algumas distribuições Linux. Outras, como o Red Hat Enterprise Linux 7, usam o XFS como
sistema de arquivos padrão.
Os sistemas de arquivos XFS são divididos em pelo menos 2 partes, uma seção de log, onde
é mantido um log de todas as operações do sistema de arquivos (comumente chamadas de
Journal, ou diário), e a seção de dados. A seção de log pode estar localizada dentro da seção
de dados (que é o comportamento padrão), ou mesmo em um disco separado, para melhor
desempenho e confiabilidade.
O comando mais básico para criar um sistema de arquivos XFS é mkfs.xfs TARGET, onde
TARGET é a partição na qual você deseja que o sistema de arquivos seja criado. Por exemplo:
mkfs.xfs /dev/sda1.
Como no caso do mke2fs, o mkfs.xfs suporta uma série de opções de linha de comando. Eis
algumas das mais comuns:
O VFAT é uma extensão do formato FAT16 com suporte para nomes de arquivo longos (até 255
caracteres). Ambos os sistemas de arquivos são controlados pelo mesmo utilitário, mkfs.fat.
mkfs.vfat é um nome alternativo para ele.
O sistema de arquivos FAT tem desvantagens importantes que restringem seu uso em discos
grandes. O FAT16, por exemplo, suporta volumes de no máximo 4 GB e um tamanho máximo
de arquivo de 2 GB. O FAT32 aumenta o tamanho do volume para até 2 PB e o tamanho
máximo do arquivo para 4 GB. Por causa disso, os sistemas de arquivos FAT são hoje mais
comumente usados em pequenos drives USB ou cartões de memória (de até 2 GB), ou dispos-
itivos e sistemas operacionais legados que não oferecem suporte a sistemas de arquivos mais
avançados.
O comando mais básico para a criação de um sistema de arquivos FAT é mkfs.fat TARGET,
onde TARGET é a partição em que você deseja que o sistema de arquivos seja criado. Por
exemplo: mkfs.fat /dev/sdc1.
Como outros utilitários, o mkfs.fat suporta uma série de opções de linha de comando. Uma
231 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
lista completa com a descrição de cada opção pode ser lida no manual do utilitário, com o
comando man mkfs.fat. Abaixo estão as mais importantes:
O mkfs.fat não pode criar um sistema de arquivos “iniciável”. De acordo com a página
de manual, “isso não é tão fácil quanto você pensa” e não será implementado.
Como é bem suportado pelos três principais sistemas operacionais (Windows, Linux e macOS),
trata-se de uma boa escolha nos casos em que a interoperabilidade é necessária, como em
drives flash de grande capacidade, cartões de memória e discos externos. Na verdade, esse
é o sistema de arquivos padrão, conforme definido pela SD Association, para os cartões de
memória SDXC com mais de 32 GB.
O utilitário padrão para criar sistemas de arquivos exFAT é mkfs.exfat, que é um link para
mkexfatfs. O comando mais básico é mkfs.exfat TARGET, onde TARGET é a partição em
que você deseja que o sistema de arquivos seja criado. Por exemplo: mkfs.exfat /dev/sdb2.
232 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
Ao contrário dos outros utilitários discutidos nesta lição, o mkfs.exfat tem pouquíssimas opções
de linha de comando. Elas são:
Existem muitos recursos que tornam o Btrfs atraente nos sistemas modernos em que é comum
haver grandes quantidades de armazenamento. Dentre esses recursos estão o suporte a múltip-
los dispositivos (incluindo striping, mirroring e striping + mirroring, como em uma configuração
RAID), compressão transparente, otimizações SSD, backups incrementais, instantâneos, des-
fragmentação online, verificações offline, suporte para subvolumes (com cotas), deduplicação
e muito mais.
Por ser um sistema de arquivos cópia em gravação (copy-on-write), ele é muito resistente a
travamentos. Além disso, o Btrfs é simples de usar e bem suportado por muitas distribuições
Linux. Algumas delas, como o SUSE, o usam como sistema de arquivos padrão.
O utilitário mkfs.btrfs é usado para criar um sistema de arquivos Btrfs. Se o comando for usado
sem nenhuma opção, ele cria um sistema de arquivos Btrfs em um determinado dispositivo,
assim:
Caso não tenha o utilitário mkfs.btrfs em seu sistema, procure por btrfs-progs no
gerenciador de pacotes de sua distribuição.
Você pode usar -L para definir um rótulo (ou nome) para o seu sistema de arquivos. Os rótulos
Btrfs podem ter até 256 caracteres, exceto por quebras de linha:
O Btrfs tem uma coisa peculiar: é possível incluir múltiplos dispositivos no comando mkfs.btrfs.
Quando passamos mais de um dispositivo, o sistema de arquivos se estenderá por todos os
dispositivos, numa configuração semelhante à de um RAID ou LVM. Para especificar como os
metadados serão distribuídos na matriz de disco, use o parâmetro -m. Os parâmetros válidos
são raid0, raid1, raid5, raid6, raid10, single e dup.
Por exemplo, para criar um sistema de arquivos abrangendo /dev/sdb1 e /dev/sdc1, concate-
nando as duas partições em uma maior, use:
Existem muitos front-ends gráficos que tornam o trabalho com o parted muito mais fácil,
como o GParted para ambientes de desktop baseados no GNOME e o KDE Partition Manager
para desktops KDE. No entanto, você deve aprender a usar o parted na linha de comando, já
que em uma configuração de servidor nunca podemos contar com a presença de um ambiente
gráfico.
A maneira mais simples de começar a usar o parted é digitando parted DEVICE, onde DEVICE
é o dispositivo que se deseja gerenciar (parted /dev/sdb). O programa inicia uma interface de
linha de comando interativa, como fdisk e gdisk, com um prompt (parted) para você inserir
os comandos.
(parted)
Selecionando discos
Para mudar para um disco diferente do especificado na linha de comando, usamos o comando
select, seguido pelo nome do dispositivo:
Obtendo informações
O comando print pode ser usado para obter mais informações sobre uma partição específica
ou até mesmo todos os dispositivos de bloco (discos) conectados ao seu sistema.
Para obter informações sobre a partição atualmente selecionada, basta digitar print:
(parted) print
Model: ATA CT120BX500SSD1 (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Use print devices para obter uma lista de todos os dispositivos de bloco conectados ao seu
sistema:
Para obter informações sobre todos os dispositivos conectados de uma vez, usamos print all.
Se quiser saber quanto espaço livre existe em cada um deles, o comando é print free:
Existem muitos tipos suportados de tabelas de partição, mas os principais que você deve
conhecer são msdos, usado aqui para se referir a uma tabela de partição MBR, e gpt para se
referir a uma tabela de partição GPT. Para criar uma tabela de partição MBR, digite:
• PARTTYPE: É o tipo de partição, que pode ser primary, logical ou extended no caso
de uma tabela de partição MBR;
• FSTYPE: Especifica qual sistema de arquivos será usado nesta partição. Note que
parted não cria o sistema de arquivos. Ele apenas define um sinalizador na partição que
informa ao sistema operacional que tipo de dados esperar dela;
• START: Especifica o ponto exato no dispositivo onde a partição começa. Você pode
usar unidades diferentes para especificar esse ponto. 2s pode ser usado para se referir
ao segundo setor do disco, ao passo que 1m se refere ao início do primeiro megabyte do
disco. Outras unidades comuns são B (bytes) e % (porcentagem do disco);
• END: Especifica o fim da partição. Observe que este não é o tamanho da partição,
este é o ponto no disco onde ele termina. Por exemplo, se você especificar 100m, a
partição terminará 100 MB após o início do disco. Podemos usar as mesmas unidades
do parâmetro START.
Assim, o comando:
Cria uma partição primária do tipo ext4, começando no primeiro megabyte do disco e termi-
nando após o 100ž megabyte.
Recuperando partições
O parted é capaz de recuperar uma partição excluída. Considere que temos a seguinte estrutura
de partição:
Por acidente, você removeu a partição 2 usando rm 2. Para recuperá-la, pode-se usar o
comando rescue, com a sintaxe rescue START END, onde START é o local aproximado onde
a partição começava e END o local aproximado onde terminava.
O parted irá analisar o disco em busca de partições e se oferecer para restaurar as que forem
encontradas. No exemplo acima, a partição 2 começava em 99,6 MB e terminava em 200
MB. Portanto, você pode usar o seguinte comando para recuperar a partição:
Yes/No/Cancel? y
A partição e seu conteúdo serão recuperados dessa forma. Note que o rescue só pode recuperar
partições em que haja um sistema de arquivos instalado. Partições vazias não são detectadas.
Para criar a partição swap usando fdisk ou gdisk, proceda como se estivesse criando uma
partição normal, conforme explicado anteriormente. A única diferença é que você precisará
alterar o tipo de partição para Linux swap.
• No fdisk, use o comando t. Selecione a partição que deseja usar e mude seu tipo para
82. Grave as alterações no disco e saia com w;
• No gdisk, o comando para alterar o tipo de partição também é t, mas o código é 8200.
Grave as alterações no disco e saia com w.
Se estiver usando o parted, a partição deve ser identificada como uma partição de troca
durante a criação, apenas use linux-swap como tipo de sistema de arquivos. Por exemplo, o
comando para criar uma partição de troca de 500 MB, começando com 300 MB no disco é:
Assim que a partição for criada e devidamente identificada, basta usar mkswap seguido do
dispositivo que representa a partição que deseja usar, como:
Para habilitar a troca nesta partição, use swapon seguido do nome do dispositivo:
Da mesma forma, swapoff, seguido pelo nome do dispositivo, desabilita a troca naquele dis-
positivo.
O Linux também suporta o uso de arquivos de troca em vez de partições. Basta criar um
arquivo vazio do tamanho que desejar usando dd e então usar mkswap e swapon tendo esse
arquivo como destino.
if = é o arquivo de entrada, a fonte dos dados que serão gravados no arquivo. Neste caso, é o
dispositivo /dev/zero, que fornece tantos caracteres NULL quanto solicitados. of = é o arquivo
de saída, o arquivo que será criado. bs = é o tamanho dos blocos de dados, especificados aqui
em Megabytes, e count = é a quantidade de blocos a serem gravados na saída. 1.024 blocos
de 1 MB cada equivalem a 1 GB.
Usando os comandos acima, este arquivo de troca será usado apenas durante a sessão atual
do sistema. Se a máquina for reinicializada, o arquivo ainda estará disponível, mas não será
carregado automaticamente. Você pode automatizar esse processo adicionando o novo arquivo
de troca a /etc/fstab, que discutiremos em uma lição posterior.
Tanto o mkswap quanto o swapon vão reclamar se seu arquivo de troca tiver per-
missões inseguras. O sinalizador de permissão de arquivo recomendado é 0600. O
proprietário e o grupo devem ser root.
Resumo
Nesta lição, você aprendeu:
• Como criar uma tabela de partição MBR em um disco com fdisk e como usá-la para
criar e deletar partições;
• Como criar uma tabela de partição MBR em um disco com gdisk e como usá-la para
criar e deletar partições;
• Como criar partições ext2, ext3, ext4, XFS, VFAT e exFAT;
• Como usar o parted para criar, excluir e recuperar partições em discos MBR e GPT;
• Como usar e redimensionar partições ext2, ext3, ext4 e Brts;
240 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]
• fdisk
• gdisk
• mkfs.ext2, mkfs.ext3, mkfs.ext4, mkfs.xfs, mkfs.vfat e mkfs.exfat
• parted
• btrfs
• mkswap
• swapon e swapoff
• Fonte: https://devconnected.com/how-to-format-disk-partitions-on-linux/
Fabio Gonçalves De Melo Santana / [email protected]
22
104.2: Manutenção da
integridade dos sistemas de
arquivos
Introdução
Você sabia que o Linux tem suporte a journaling? Isso significa que cada operação é registrada
em um log interno antes de ser executada. Se a operação for interrompida devido a um erro
do sistema (como kernel panic, falha de energia etc.), ela pode ser reconstituída verificando-se
o diário, evitando assim a corrupção do sistema de arquivos e perda de dados.
Isso reduz muito a necessidade de verificações manuais do sistema de arquivos, mas elas
ainda podem ser necessárias. Conhecer as ferramentas utilizadas para isso (e os parâmetros
correspondentes) pode representar a diferença entre jantar em casa com a família ou passar a
noite na sala do servidor no trabalho.
241
242 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
O du é recursivo por natureza. Em sua forma mais básica, o comando simplesmente mostra
quantos blocos de 1 Kilobyte estão sendo usados pelo diretório atual e todos os seus subdi-
retórios:
root@debian10:/home/debian# du
12944 .
Isso não é muito útil, então podemos solicitar uma saída maior e “legível por humanos”
adicionando o parâmetro -h:
root@debian10:/home/debian# du -h
13M .
root@debian10:/home/debian# du -ah
4.0K ./.gnupg/pubring.kbx
16K ./.gnupg
4.0K ./.profile
0 ./softlink
4.0K ./Videos
4.0K ./.vboxclient-seamless.pid
13M .
root@debian10:/home/debian# du -h
16K ./.gnupg
4.0K ./Videos
13M .
No exemplo acima, podemos ver que o subdiretório Temp ocupa 4,8 MB e o diretório atual,
incluindo Temp, ocupa 6,0 MB. Mas quanto espaço os arquivos no diretório atual ocupam,
excluindo os subdiretórios? Para isso temos o parâmetro -S:
root@debian10:/home/debian# du -sh
243 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
13M .
Se quiser manter essa distinção entre o espaço usado pelos arquivos no diretório atual e o
espaço usado pelos subdiretórios, mas também quiser um total geral no final, você pode
adicionar o parâmetro -c:
root@debian10:/home/debian# du -Shc
4.0K ./.local/share/tracker
4.0K ./.local/share/gnome-shell
8.0K ./.local/share
4.0K ./.local
4.0K ./.gnupg/private-keys-v1.d
12K ./.gnupg
4.0K ./Videos
40K .
13M total
root@debian10:/home/debian/Documents# du -h
4.0K ./joatham/pedro
8.0K ./joatham
12K .
root@debian10:/home/debian/Documents# du -h -d1
8.0K ./joatham
12K .
Observe que, mesmo que pedro não esteja sendo mostrado, seu tamanho ainda está sendo
levado em consideração.
244 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Você pode querer excluir alguns tipos de arquivos da contagem, o que é feito com –exclude=“PATTERN”,
onde PATTERN é o padrão que deve ser correspondido. Considere este diretório:
root@debian10:/home/debian/Documents/joatham# du -ah
4.0K ./pedro
136K ./qualteupapo.bin
144K .
Agora, usamos –exclude para filtrar todos os arquivos com a extensão .bin:
Observe que o total não reflete mais o tamanho dos arquivos excluídos.
O comando df fornece uma lista de todos os sistemas de arquivos disponíveis (já montados)
em seu sistema, incluindo o tamanho total, quanto espaço foi usado, quanto espaço está
disponível, a porcentagem de uso e onde estão montados:
root@debian10:/home/debian/Documents/joatham# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 222304 0 222304 0% /dev
tmpfs 48660 2992 45668 7% /run
/dev/mapper/debian10--vg-root 23897936 3949320 18711624 18% /
tmpfs 243292 0 243292 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 243292 0 243292 0% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp 1886280 5816 1766596 1% /tmp
/dev/mapper/debian10--vg-var 9545920 791056 8250240 9% /var
/dev/mapper/debian10--vg-home 490307536 86904 465244660 1% /home
/dev/sda1 482922 59785 398203 14% /boot
tmpfs 48656 4648 44008 10% /run/user/1000
root@debian10:/home/debian/Documents/joatham# df -h
Filesystem Size Used Avail Use% Mounted on
udev 218M 0 218M 0% /dev
tmpfs 48M 3.0M 45M 7% /run
/dev/mapper/debian10--vg-root 23G 3.8G 18G 18% /
tmpfs 238M 0 238M 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 238M 0 238M 0% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp 1.8G 5.7M 1.7G 1% /tmp
/dev/mapper/debian10--vg-var 9.2G 773M 7.9G 9% /var
/dev/mapper/debian10--vg-home 468G 85M 444G 1% /home
/dev/sda1 472M 59M 389M 14% /boot
tmpfs 48M 4.6M 43M 10% /run/user/1000
Também podemos usar o parâmetro -i para mostrar os inodes usados/disponíveis, em vez dos
blocos:
root@debian10:/home/debian/Documents/joatham# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 55576 408 55168 1% /dev
tmpfs 60823 711 60112 2% /run
/dev/mapper/debian10--vg-root 1525920 175187 1350733 12% /
tmpfs 60823 1 60822 1% /dev/shm
tmpfs 60823 5 60818 1% /run/lock
tmpfs 60823 17 60806 1% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp 121920 32 121888 1% /tmp
/dev/mapper/debian10--vg-var 610800 10873 599927 2% /var
/dev/mapper/debian10--vg-home 31203328 162 31203166 1% /home
/dev/sda1 124928 339 124589 1% /boot
tmpfs 60823 40 60783 1% /run/user/1000
Um parâmetro útil é -T, que também imprime o tipo de cada sistema de arquivos:
root@debian10:/home/debian/Documents/joatham# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 218M 0 218M 0% /dev
tmpfs tmpfs 48M 3.0M 45M 7% /run
/dev/mapper/debian10--vg-root ext4 23G 3.8G 18G 18% /
tmpfs tmpfs 238M 0 238M 0% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs tmpfs 238M 0 238M 0% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp ext4 1.8G 5.7M 1.7G 1% /tmp
/dev/mapper/debian10--vg-var ext4 9.2G 773M 7.9G 9% /var
/dev/mapper/debian10--vg-home ext4 468G 85M 444G 1% /home
/dev/sda1 ext2 472M 59M 389M 14% /boot
tmpfs tmpfs 48M 4.6M 43M 10% /run/user/1000
Conhecendo o tipo do sistema de arquivos, podemos filtrar a saída. A ideia é mostrar apenas
sistemas de arquivos de um determinado tipo com -t TYPE ou excluir sistemas de arquivos
246 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Também podemos personalizar a saída de df, selecionando o que deve ser exibido e em que
ordem, usando o parâmetro –output= seguido por uma lista separada por vírgulas dos campos
que desejamos exibir. Alguns dos campos disponíveis são:
Se quiser uma saída mostrando o destino, a fonte, o tipo e o uso, você pode usar:
root@debian10:/home/debian/Documents/joatham# df -h --output=target,source,fstype,pcent
Mounted on Filesystem Type Use%
/dev udev devtmpfs 0%
/run tmpfs tmpfs 7%
/ /dev/mapper/debian10--vg-root ext4 18%
/dev/shm tmpfs tmpfs 0%
/run/lock tmpfs tmpfs 1%
/sys/fs/cgroup tmpfs tmpfs 0%
/tmp /dev/mapper/debian10--vg-tmp ext4 1%
247 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
O df também pode ser usado para verificar as informações do inode, passando os seguintes
campos para –output=:
Por exemplo:
root@debian10:/home/debian/Documents/joatham# df -h --output=source,fstype,itotal,iused,
ipcent
Filesystem Type Inodes IUsed IUse%
udev devtmpfs 55K 408 1%
tmpfs tmpfs 60K 711 2%
/dev/mapper/debian10--vg-root ext4 1.5M 172K 12%
tmpfs tmpfs 60K 1 1%
tmpfs tmpfs 60K 5 1%
tmpfs tmpfs 60K 17 1%
/dev/mapper/debian10--vg-tmp ext4 120K 32 1%
/dev/mapper/debian10--vg-var ext4 597K 11K 2%
/dev/mapper/debian10--vg-home ext4 30M 162 1%
/dev/sda1 ext2 122K 339 1%
tmpfs tmpfs 60K 40 1%
O fsck em si não verifica o sistema de arquivos, mas apenas chama para isso o utilitário
apropriado para o tipo de sistema de arquivos em questão. No exemplo acima, como um
tipo de sistema de arquivos não foi especificado, o fsck pressupôs se tratar de um sistema de
arquivos ext2/3/4 por padrão, e chamou e2fsck.
Para especificar um sistema de arquivos, use a opção -t, seguida pelo nome do sistema de
arquivos, como em fsck -t vfat /dev/sdc. Alternativamente, podemos chamar diretamente um
utilitário específico ao sistema de arquivos, como o fsck.msdos para sistemas de arquivos FAT.
Digite fsck seguido por Tab duas vezes para ver uma lista de todos os comandos
relacionados em seu sistema.
O fsck aceita alguns argumentos de linha de comando. Estes são alguns dos mais comuns:
O utilitário específico para sistemas de arquivos ext2, ext3 e ext4 é o e2fsck, também chamado
fsck.ext2, fsck.ext3 e fsck.ext4 (esses três são apenas links para e2fsck). Por padrão, ele é
executado no modo interativo: quando um erro é encontrado no sistema de arquivos, ele para
e pergunta ao usuário o que fazer. O usuário deve digitar y para corrigir o problema, n para
deixá-lo sem solução ou a para corrigir o problema atual e todos os subsequentes.
É claro que se sentar em frente a um terminal esperando o e2fsck perguntar o que fazer não é
um uso produtivo do seu tempo, especialmente se você estiver lidando com um grande sistema
de arquivos. Dessa forma, existem opções que fazem com que o e2fsck seja executado em
modo não interativo:
• -p: Essa opção tenta corrigir automaticamente quaisquer erros encontrados. Se for
encontrado um erro que requeira intervenção do administrador do sistema, o e2fsck
fornecerá uma descrição do problema e sairá;
• -y: Responde y (sim) a todas as questões;
• -n: O oposto de -y. Além de responder n (não) a todas as questões, faz com que
o sistema de arquivos seja montado somente para leitura e, portanto, não possa ser
modificado;
249 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
• -f: Força o e2fsck a verificar um sistema de arquivos mesmo se ele estiver marcado
como “limpo”, ou seja, que foi corretamente desmontado.
Para ver os parâmetros atuais de qualquer sistema de arquivos, use o parâmetro -l seguido
pelo dispositivo que representa a partição. O exemplo abaixo mostra a saída desse comando
na primeira partição do primeiro disco (/dev/sda1) de uma máquina:
A contagem máxima de montagens pode ser definida com o parâmetro -c N, onde N é o número
de vezes que o sistema de arquivos pode ser montado sem ser verificado. O parâmetro -C
N define o número de vezes que o sistema foi montado com o valor de N. Observe que os
parâmetros da linha de comando diferenciam maiúsculas de minúsculas, então -c é diferente
de -C.
Também é possível definir um intervalo de tempo entre as verificações com o parâmetro -i,
seguido por um número e as letras d para dias, m para meses e y para anos. Por exemplo, -i
10d verificaria o sistema de arquivos na reinicialização seguinte a cada 10 dias. Use zero como
valor para desabilitar este recurso.
-L pode ser usado para definir um rótulo para o sistema de arquivos. Esse rótulo pode ter até
16 caracteres. O parâmetro -U define o UUID do sistema de arquivos, que é um número hex-
adecimal de 128 bits. No exemplo acima, o UUID é 6e2c12e3-472d-4bac-a257-c49ac07f3761.
Tanto o rótulo quanto o UUID podem ser usados no lugar do nome do dispositivo (como
/dev/sda1) para montar o sistema de arquivos.
O comportamento padrão é continue. remount-ro pode ser útil em aplicativos com dados
sensíveis, pois irá interromper imediatamente as gravações no disco, evitando mais erros po-
tenciais.
Os sistemas de arquivos ext3 são basicamente sistemas de arquivos ext2 com um diário.
Usando o tune2fs, podemos adicionar um diário a um sistema de arquivos ext2, convertendo-o
assim em ext3. O procedimento é simples: basta passar o parâmetro -j para tune2fs, seguido
do dispositivo que contém o sistema de arquivos:
Ao lidar com sistemas de arquivos com journaling, o parâmetro -J permite usar parâmetros
extras para definir algumas opções de diário, como -J size= para definir o tamanho do diário
(em megabytes), -J location= para especificar onde o diário deve ser armazenado (seja um
bloco específico ou uma posição específica no disco com sufixos como M ou G) e até mesmo
colocar o diário em um dispositivo externo com -J device=.
Para especificar diversos parâmetros ao mesmo tempo, eles devem ser separados por vírgula.
Por exemplo: -J size=10,location=100M,device=/dev/sdb1 criam um diário (Journal) de 10
MB na posição 100 MB do dispositivo /dev/sdb1.
O tune2fs tem uma opção de “força bruta”, -f, que o força a completar uma operação
mesmo que sejam encontrados erros. Nem é preciso dizer que esse recurso deve ser
usado com extrema cautela.
Isso pode ser feito passando o parâmetro -n para xfs_repair, seguido pelo dispositivo que
contém o sistema de arquivos. O parâmetro -n significa “no modify”, o sistema de arquivos
será verificado e os erros relatados, mas nenhum reparo será feito:
Se forem encontrados erros, você pode prosseguir com os reparos sem o parâmetro -n, da
seguinte forma: xfs_repair /dev/sdb1.
física do sistema;
• -d: O modo “dangerous” (perigoso) permite reparar sistemas de arquivos montados
como apenas leitura;
• -v: Você deve ter adivinhado: modo verboso. Cada vez que este parâmetro é usado,
a “verbosidade” é aumentada (por exemplo, -v -v imprime mais informações do que
apenas -v).
Observe que xfs_repair não é capaz de reparar sistemas de arquivos com um log “sujo”. É
possível “zerar” um log corrompido com o parâmetro -L, mas tenha em mente que este é um
último recurso, pois pode resultar em corrupção do sistema de arquivos e perda de dados.
Para depurar um sistema de arquivos XFS, o utilitário xfs_db pode ser usado, como em
xfs_db /dev/sdb1. Ele serve principalmente para inspecionar diversos elementos e parâmetros
do sistema de arquivos.
Este utilitário tem um prompt interativo, como o parted, com muitos comandos internos. Um
sistema de ajuda também está disponível: digite help para ver uma lista de todos os comandos,
e help seguido do nome do comando para ver mais informações sobre o comando.
Outro utilitário útil é o xfs_fsr, que pode ser usado para reorganizar (“desfragmentar”) um
sistema de arquivos XFS. Quando executado sem nenhum argumento extra, ele roda por duas
horas e tenta desfragmentar todos os sistemas de arquivos XFS graváveis e montados listados
no arquivo /etc/mtab/. Pode ser necessário instalar esse utilitário usando o gerenciador de
pacotes de sua distribuição Linux, pois ele nem sempre faz parte de uma instalação padrão.
Para obter mais informações, consulte a página do manual correspondente.
Resumo
Nesta lição, você aprendeu:
(ext2/3/4);
• tune2fs: Modifica parâmetros do sistema de arquivos em um sistema de arquivos es-
tendido (ext2/3/4);
• xfs_repair: Equivalente a fsck para sistemas de arquivos XFS;
• xfs_db: Utilitário usado para visualizar diversos parâmetros de um sistema de arquivos
XFS.
- Fonte: https://twitter.com/b0rk/s-
tatus/1000953701090103302
Fabio Gonçalves De Melo Santana / [email protected]
23
104.3: Controlar a montagem e
desmontagem dos sistema de
arquivos
254
Fabio Gonçalves De Melo Santana / [email protected]
24
Introdução
Montar significa anexar o sistema de arquivos em um ponto específico da árvore de diretórios
do sistema, chamado ponto de montagem. Os sistemas de arquivos podem ser montados
manual ou automaticamente e há muitas maneiras de fazê-lo.
Onde:
• TYPE - O tipo de sistema de arquivos sendo montado (p. ex. ext4, btrfs, exfat, etc.);
• DEVICE - O nome da partição que contém o sistema de arquivos (p. ex. /dev/sdb1);
• MOUNTPOINT - Onde o sistema de arquivos será montado. O diretório de mon-
tagem não precisa estar vazio, embora precise existir. Porém, quaisquer arquivos que ele
contiver estarão inacessíveis por nome enquanto o sistema de arquivos estiver montado.
Por exemplo, para montar uma unidade flash USB contendo um sistema de arquivos exFAT
localizado em /dev/sdb1 em um diretório chamado flash em seu diretório inicial, você usaria:
255
256 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Podemos especificar vários sistemas de arquivos de uma vez, separando-os com uma vírgula:
Onde SOURCE é a partição que contém o sistema de arquivos, TARGET é o diretório onde
ele está montado, TYPE é o tipo do sistema de arquivos e OPTIONS são as opções passadas
para o comando mount no momento da montagem.
257 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Para desmontar um sistema de arquivos, use o comando umount, seguido pelo nome do
dispositivo ou ponto de montagem. Considerando o exemplo acima, os comandos abaixo são
intercambiáveis:
Nesses casos, podemos usar o comando lsof seguido do nome do dispositivo que contém o
sistema de arquivos para ver uma lista de processos que o acessam e quais arquivos estão
abertos. Por exemplo:
Onde montar?
Você pode montar um sistema de arquivos em qualquer lugar que desejar. No entanto, existem
algumas práticas recomendadas para facilitar a administração do sistema.
Tradicionalmente, /mnt era o diretório sob o qual todos os dispositivos externos eram mon-
tados e, dentro dele, existia uma série de “pontos de ancoragem” pré-configurados para dis-
positivos comuns, como drives de CD-ROM (/mnt/cdrom) e disquetes (/mnt/floppy).
Ele foi substituído por /media, que agora é o ponto de montagem padrão para qualquer mídia
removível pelo usuário (por exemplo, discos externos, pendrives, leitores de cartão de memória
etc.) conectada ao sistema.
Onde:
259 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Por exemplo, a primeira partição do primeiro disco de uma máquina pode ser descrita como:
As opções de montagem em OPTIONS são uma lista de parâmetros separados por vírgulas,
que podem ser genéricos ou específicos ao sistema de arquivos. Entre os genéricos temos:
• atime e noatime - Por padrão, cada vez que um arquivo é lido, a informação de data
e hora de acesso é atualizada. Se essa opção for desativada (com noatime), a E/S
do disco fica mais veloz. Não confundir com a hora de modificação, que é atualizada
sempre que um arquivo é gravado;
• auto e noauto - Se o sistema de arquivos pode (ou não) ser montado automaticamente
com mount -a;
• defaults - Passa as opções rw, suid, dev, exec, auto, nouser e async para mount;
• dev e nodev - Indica se os dispositivos de caractere ou de bloco no sistema de arquivos
montado devem ser interpretados;
• exec e noexec - Permite ou nega a permissão para executar binários no sistema de
arquivos;
• user e nouser - Permite (ou não) a um usuário comum montar o sistema de arquivos;
• group - Permite a um usuário montar o sistema de arquivos se o usuário pertencer ao
mesmo grupo que possui o dispositivo que o contém;
• owner - Permite a um usuário montar um sistema de arquivos se ele for proprietário do
dispositivo que o contém;
• suid e nosuid - Permite ou não que os bits SETUID e SETGID tenham efeito;
• ro e rw - Montam um sistema de arquivos como somente leitura ou gravável;
• remount - Tenta remontar um sistema de arquivos já montado. Não é usado em
/etc/fstab, mas como um parâmetro para mount -o. Por exemplo, para remontar a
partição já montada /dev/sdb1 como somente leitura, você pode usar o comando mount
260 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Uma maneira de evitar isso é especificar o rótulo ou UUID (Universally Unique Identifier) do
volume. Ambos são especificados quando o sistema de arquivos é criado e não serão alterados,
a menos que o sistema de arquivos seja destruído ou atribuído manualmente a um novo rótulo
ou UUID.
O comando lsblk serve para consultar informações sobre um sistema de arquivos e descobrir
o rótulo e o UUID associados a ele. Para isso, use o parâmetro -f, seguido pelo nome do
dispositivo:
Em /etc/fstab, um dispositivo pode ser especificado por seu UUID com a opção UUID=
seguida pelo UUID, ou com LABEL=, seguida pelo rótulo. Assim, em vez de:
261 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Usaríamos:
A mesma sintaxe pode ser usada com o comando mount. Em vez do nome do dispositivo,
passe o UUID ou rótulo. Por exemplo, para montar um disco NTFS externo com o UUID
56C11DCC5D2E1334 em /mnt/external, o comando seria:
Para usar este recurso do systemd, você precisa criar um arquivo de configuração chamado
unidade de montagem. Cada volume a ser montado tem sua própria unidade de montagem e
elas devem ser postas em /etc/systemd/system/.
As unidades de montagem são arquivos de texto simples com a extensão .mount. O formato
básico é mostrado abaixo:
[Unit]
Description=
[Mount]
What=
Where=
262 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Type=
Options=
[Install]
WantedBy=
[Unit]
Description=External data disk
[Mount]
What=/dev/disk/by-uuid/56C11DCC5D2E1334
Where=/mnt/external
Type=ntfs
Options=defaults
[Install]
WantedBy=multi-user.target
Mas ainda não acabamos. Para funcionar corretamente, a unidade de montagem deve ter o
mesmo nome do ponto de montagem. Neste caso, o ponto de montagem é /mnt/external,
de forma que o nome do arquivo precisa ser mnt-external.mount.
Depois disso, precisamos reiniciar o daemon do systemd com o comando systemctl e iniciar a
unidade:
Agora o conteúdo do disco externo deve estar disponível em /mnt/external. Para verificar o
status da montagem, use o comando systemctl status mnt-external.mount, como mostrado
abaixo:
[Unit]
Description=
[Automount]
Where=
[Install]
WantedBy=multi-user.target
[Unit]
Description=Automount for the external data disk
264 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
[Automount]
Where=/mnt/external
[Install]
WantedBy=multi-user.target
Salve o arquivo com o mesmo nome do ponto de montagem (neste caso, mnt-external.automount),
recarregue o systemd e inicie a unidade:
Agora, sempre que o diretório /mnt/external for acessado, o disco será montado. Como
anteriormente, para habilitar a montagem automática em cada inicialização usaríamos:
- Fonte: - https://aodba.com/describing-Linux-fstab-filesystem-table-file/
Fabio Gonçalves De Melo Santana / [email protected]
25
104.5: Gerenciar permissões e
propriedade de arquivos
Introdução
Por ser um sistema multiusuário, o Linux precisa de alguma forma de rastrear quem é o
proprietário de cada arquivo, e se um usuário tem ou não permissão para executar ações
em um arquivo. Isso serve para garantir a privacidade dos usuários que desejam manter o
conteúdo de seus arquivos em sigilo, bem como para permitir colaboração, tornando certos
arquivos acessíveis a diversos usuários.
Isso é feito por meio de um sistema de permissões em três níveis. Cada arquivo em disco
pertence a um usuário e a um grupo de usuários, e tem três conjuntos de permissões: um
para seu proprietário, um para o grupo que possui o arquivo e um para todos os outros. Nesta
lição, você aprenderá a consultar as permissões de um arquivo, o significado dessas permissões
e como manipulá-las.
ls
265
266 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Mas há muito mais informações disponíveis para cada arquivo, incluindo seu tipo, tamanho,
propriedade e muito mais. Para ver essas informações, você deve pedir ao ls uma lista de
“formato longo”, usando o parâmetro -l:
root@debian10:/home/debian# ls -l
total 536
drwxrwxr-x 2 debian debian 4096 Jun 10 15:57 diretorio_qualquer
-rw------- 1 debian debian 539663 Jun 10 10:43 foto.jpg
-rw-rw-r-- 1 debian debian 1881 Jun 10 15:57 texto.txt
Cada coluna da saída acima tem um significado. Vamos dar uma olhada nas colunas relevantes
para esta lição.
A segunda coluna indica o número de links físicos que apontam para aquele arquivo. A quinta
coluna mostra o tamanho do arquivo. A sexta coluna mostra a data e hora em que o arquivo
foi modificado pela última vez. Mas essas colunas não são relevantes para o tópico atual.
Se você solicitar informações sobre um diretório usando ls -l, ele mostra uma lista do conteúdo
do diretório:
267 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# ls -l diretorio_qualquer/
total 0
-rw-r--r-- 1 debian debian 0 Jun 10 17:59 outro_arquivo.txt
Para evitar isso e consultar informações sobre o próprio diretório, adicione o parâmetro -d a
ls:
root@debian10:/home/debian# ls -l -d diretorio_qualquer/
drwxrwxr-x 2 debian debian 4096 Jun 10 17:59 diretorio_qualquer/
root@debian10:/home/debian# ls -l
total 544
drwxrwxr-x 2 debian debian 4096 Jun 10 17:59 diretorio_qualquer
-rw------- 1 debian debian 539663 Jun 10 10:43 foto.jpg
-rw-rw-r-- 1 debian debian 1881 Jun 10 15:57 texto.txt
Existem três outros arquivos nesse diretório, mas eles estão ocultos. No Linux, os arquivos
cujo nome começa com um ponto (.) são ocultados automaticamente. Para vê-los, precisamos
adicionar o parâmetro -a ao ls:
root@debian10:/home/debian# ls -l -a
total 544
drwxrwxr-x 3 debian debian 4096 Jun 10 16:01 .
drwxrwxr-x 4 debian debian 4096 Jun 10 15:56 ..
drwxrwxr-x 2 debian debian 4096 Jun 10 17:59 diretorio_qualquer
-rw------- 1 debian debian 539663 Jun 10 10:43 foto.jpg
-rw-rw-r-- 1 debian debian 1881 Jun 10 15:57 texto.txt
-rw-r--r-- 1 debian debian 0 Jun 10 16:01 .oculto
O arquivo .oculto está oculto simplesmente porque o nome começa com . (ponto).
• - (arquivo normal): Um arquivo pode conter dados de qualquer tipo e ajuda a gerenciar
esses dados. Os arquivos podem ser modificados, movidos, copiados e excluídos;
• d (diretório): Um diretório contém outros arquivos ou diretórios e ajuda a organizar o
sistema de arquivos. Tecnicamente, os diretórios são um tipo especial de arquivo;
• l (link simbólico): Este “arquivo” é um ponteiro para outro arquivo ou diretório em
outro local no sistema de arquivos.
Além desses, existem três outros tipos de arquivo que você precisa pelo menos conhecer, mas
estão fora do escopo desta lição:
Entendendo as permissões
Na saída de ls -l, as permissões de arquivo são mostradas logo após o tipo de arquivo, como
três grupos de três caracteres cada, na ordem r, w e x. Eis o que significam. Lembre-se de
que um traço - representa a falta de permissão.
269 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Permissões de arquivos
• r: Significa read (leitura) e tem um valor octal de 4 (não se preocupe, falaremos de
octais em breve). Indica permissão para abrir um arquivo e ler seu conteúdo;
• w: Significa write (escrita) e tem um valor octal de 2. Indica permissão para editar ou
excluir um arquivo;
• x: Significa execute (execução) e tem um valor octal de 1. Indica que o arquivo pode
ser executado como um executável ou script.
Assim, por exemplo, um arquivo com permissões rw- pode ser lido e escrito, mas não pode
ser executado.
Permissões em diretórios
• r: Significa read (leitura) e tem um valor octal de 4. Indica permissão para ler o
conteúdo do diretório, como nomes de arquivos. Mas não implica em permissão para
ler os arquivos em si;
• w: Significa write (escrita) e tem um valor octal de 2. Indica permissão para editar ou
excluir arquivos em um diretório, ou alterar seus nomes, permissões e proprietários. Se
um usuário tiver a permissão w em um diretório, ele poderá alterar as permissões de
qualquer arquivo dentro do diretório (o conteúdo do diretório), mesmo que o usuário
não tenha permissões no arquivo ou se o arquivo pertencer a outro utilizador.
Lembre-se de que ter permissões de gravação em um diretório ou arquivo não significa que
você tem permissão para remover ou renomear o diretório ou arquivo em si.
• x: Significa execute (execução) e tem um valor octal de 1. Indica permissão para entrar
em um diretório, mas não para listar seus arquivos (para isso, r é necessário).
A última parte sobre diretórios pode parecer um pouco confusa. Vamos imaginar, por exemplo,
que você tem um diretório chamado diretorio_qualquer, com as seguintes permissões:
Imagine também que dentro deste diretório há um script de shell chamado oi.sh:
Se você for a usuário debian e tentar listar o conteúdo de diretorio_qualquer, receberá uma
mensagem de erro, pois seu usuário não tem permissão de leitura para esse diretório:
root@debian10:/home/debian# ls -l diretorio_qualquer/
ls: cannot open directory 'diretorio_qualquer/': Permission denied
No entanto, o usuário debian tem permissões de execução, o que significa que ele pode entrar
no diretório. Portanto, o usuário debian pode acessar arquivos dentro do diretório, desde
que tenha as permissões corretas para o respectivo arquivo. Vamos supor que o usuário tem
permissões totais (rwx) para o script oi.sh. Nesse caso, se souber o nome do arquivo completo,
ele pode executar o script, embora não possa ler o conteúdo do diretório que o contém:
root@debian10:/home/debian# sh diretorio_qualquer/oi.sh
Salve Galeraa!!!
Como dissemos antes, as permissões são especificadas em sequência: primeiro para o propri-
etário do arquivo, depois para o grupo proprietário e, em seguida, para outros usuários. Sempre
que alguém tenta realizar uma ação no arquivo, as permissões são verificadas na mesma ordem.
Primeiro, o sistema verifica se o usuário atual possui o arquivo e, se for o caso, ele aplica apenas
o primeiro conjunto de permissões. Caso contrário, ele verifica se o usuário atual pertence ao
grupo que possui o arquivo. Nesse caso, ele aplica o segundo conjunto de permissões apenas.
Em qualquer outro caso, o sistema aplicará o terceiro conjunto de permissões.
Isso significa que, se o usuário atual for o proprietário do arquivo, apenas as permissões do
proprietário serão efetivas, mesmo se as permissões do grupo ou outras forem mais permissivas
do que as do proprietário.
modo octal, é mais fácil de lembrar e mais rápido de usar quando desejamos definir todos os
valores de permissão de uma vez.
Ambos os modos levam ao mesmo resultado final. Assim, por exemplo, os comandos:
Modo simbólico
Ao descrever quais permissões alterar no modo simbólico, o(s) primeiro(s) caractere(s) in-
dica(m) as permissões que serão alteradas: de usuário (u), grupo (g), outros (o) e/ou todos
(a).
Então você precisa dizer ao comando o que fazer: você pode conceder uma permissão (+),
revogar uma permissão (-) ou defini-la com um valor específico (=).
Por último, você especifica em qual permissão deseja agir: leitura (r), escrita (w) ou execução
(x).
Por exemplo, imagine que temos um arquivo chamado texto.txt com o seguinte conjunto de
permissões:
root@debian10:/home/debian# ls -l texto.txt
-rw-r--r-- 1 debian debian 765 Jun 20 21:25 texto.txt
Se você deseja conceder permissões de gravação aos membros do grupo proprietário do arquivo,
272 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
deve usar o parâmetro g+w. É mais fácil pensar desta forma: “Para o grupo (g), conceda
(+) permissões de escrita (w)”. Então, o comando seria:
root@debian10:/home/debian# ls -l texto.txt
-rw-rw-r-- 1 debian debian 765 Jun 20 21:25 texto.txt
Deseja remover as permissões de leitura para o proprietário do mesmo arquivo? Pense assim:
“Para o usuário (u), revogue (-) as permissões de leitura (r)”. Portanto, o parâmetro é u-r,
desta maneira:
E se quisermos definir as permissões exatamente como rw- para todos? Nesse caso, pensamos
assim: “Para todos (a), defina exatamente (=) leitura (r), escrita (w), e não execução (-)”.
Assim:
Claro, é possível modificar diversas permissões ao mesmo tempo. Neste caso, separe-os com
uma vírgula (,):
O exemplo acima pode ser lido como: “Para o usuário (u), conceda (+) permissões de leitura,
escrita e execução (rwx), para o grupo (g), revogue (-) permissões de execução (x)”.
273 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Este comando pode ser lido como: “Recursivamente (-R), para o usuário (u), conceda (+)
permissões de leitura, escrita e execução (rwx)”.
Tenha cuidado e pense duas vezes antes de usar a opção -R, pois é fácil alterar sem
querer as permissões de arquivos e diretórios, especialmente em diretórios com um
grande número de arquivos e subdiretórios.
Modo octal
No modo octal, as permissões são especificadas de maneira diferente: como um valor de três
dígitos na notação octal, um sistema numérico de base 8.
Cada permissão tem um valor correspondente e elas são especificadas na seguinte ordem:
primeiro vem leitura (r), que é 4, depois escrita (w), que é 2, e por fim execução (x), repre-
sentada por 1. Se não houver permissão, usamos o valor zero (0). Portanto, uma permissão
rwx seria 7 (4 + 2 + 1) e rx seria 5 (4 + 0 + 1).
O primeiro dos três dígitos no conjunto de permissões representa as permissões do usuário (u),
o segundo as do grupo (g) e o terceiro as do outros (o). Se quisermos definir as permissões
de um arquivo como rw-rw—-, o valor octal seria 660:
Além disso, a sintaxe no modo octal é a mesma que no modo simbólico: o primeiro parâmetro
representa as permissões que você deseja alterar e o segundo aponta para o arquivo ou diretório
onde a alteração será feita.
274 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Qual sintaxe você deve usar? O modo octal é recomendado quando se deseja alterar as
permissões para um valor específico, por exemplo 640 (rw- r– —).
O modo simbólico é mais útil se você deseja inverter apenas um valor específico, independen-
temente das permissões atuais do arquivo. Por exemplo, você pode adicionar permissões de
execução para o usuário usando apenas chmod u+x script.sh sem levar em conta, ou mesmo
tocar, as permissões atuais de grupo e outros.
root@debian10:/home/debian# ls -l texto.txt
-rw-rw---- 1 debian debian 1881 Jun 10 15:57 texto.txt
O usuário que possui o arquivo é debian, e o grupo também é debian. Agora, vamos mudar
o grupo proprietário do arquivo para um outro grupo, como students:
Lembre-se de que o usuário que possui um arquivo não precisa pertencer ao grupo que possui
o arquivo. No exemplo acima, o usuário debian não precisa ser um membro do grupo students.
O conjunto de permissões de usuário ou grupo pode ser omitido se você não quiser alterá-
lo. Portanto, para alterar apenas o grupo que possui um arquivo, o comando seria chown:
students texto.txt. Para alterar apenas o usuário, o comando seria chown debian: texto.txt ou
apenas chown debian texto.txt. Alternativamente, você pode usar o comando chgrp students
texto.txt.
275 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
A menos que você seja o administrador do sistema (root), não é possível mudar a propriedade
de um arquivo para outro usuário ou grupo ao qual você não pertence. Se tentar fazer isso,
aparecerá a mensagem de erro Operation not allowed.
Consultando os grupos
Antes de alterar a propriedade de um arquivo, pode ser útil saber quais grupos existem no
sistema, quais usuários são membros de um grupo e a quais grupos um usuário pertence.
Para ver quais grupos existem em seu sistema, digite getent group. A saída será semelhante
a esta (a saída foi abreviada):
Se quiser saber a quais grupos um usuário pertence, adicione o nome de usuário como um
parâmetro a groups:
Para fazer o inverso (ver quais usuários pertencem a um grupo), use groupmems. O
parâmetro -g especifica o grupo, e -l lista todos os seus membros:
Permissões padrão
Vamos fazer uma experiência. Abra uma janela de terminal e crie um arquivo vazio com o
seguinte comando:
Agora, vamos dar uma olhada nas permissões deste arquivo. Eles podem ser diferentes em
seu sistema, mas vamos supor que sejam mais ou menos assim:
As permissões são rw-r—r–: leitura e escrita para o usuário, e leitura para o grupo e outros,
ou 644 no modo octal. Agora, tente criar um diretório:
Agora as permissões são rwxr-xr-x: leitura, escrita e execução para o usuário, leitura e
execução para o grupo e outros, ou 755 no modo simbólico.
Não importa onde você esteja no sistema de arquivos, cada arquivo ou diretório que criar terá
as mesmas permissões. Você já se perguntou de onde eles vêm?
Elas vêm da máscara de usuário ou umask, que define as permissões padrão para cada arquivo
criado. Você pode verificar os valores atuais com o comando umask:
root@debian10:/home/debian# umask
0022
Mas isso não se parece com rw-r—r–, ou mesmo 644. Talvez devêssemos tentar com o
parâmetro -S, para obter uma saída em modo simbólico:
root@debian10:/home/debian# umask -S
u=rwx,g=rx,o=rx
277 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
Essas são as mesmas permissões que nosso diretório de teste obteve em um dos exemplos
acima. Mas por que quando criamos um arquivo as permissões eram diferentes?
Bem, não faz sentido definir permissões globais de execução para todos em qualquer arquivo
por padrão, certo? Os diretórios precisam de permissões de execução (caso contrário, não é
possível entrar neles), mas os arquivos não, então eles não as recebem. Daí o rw-r—r–.
Além de exibir as permissões padrão, o umask também pode ser usado para alterá-las para
sua sessão do shell atual. Por exemplo, se usarmos o comando:
Cada novo diretório irá herdar as permissões rwxrwx—, e cada arquivo rw-rw—- (já que
eles não recebem permissões de execução). Se você repetir os exemplos acima para criar um
testfile e testdir e verificar as permissões, o resultado será:
root@debian10:/home/debian# umask
0007
O resultado não parece familiar porque os valores usados são diferentes. Eis uma tabela com
todos os valores e seus respectivos significados:
Como vemos, 007 corresponde a rwxrwx—, exatamente como solicitamos. O zero inicial
pode ser ignorado.
Permissões especiais
Além das permissões de leitura, gravação e execução para usuário, grupo e outros, cada
arquivo pode ter três outras permissões especiais capazes de alterar a maneira como um
diretório funciona ou como um programa é executado. Elas podem ser especificadas no modo
simbólico ou octal e são as seguintes:
Sticky Bit
O sticky bit, também chamado de sinalizador de exclusão restrito, tem o valor octal 1 e no
modo simbólico é representado por um t dentro das permissões de outros. Ele se aplica apenas
a diretórios e não tem efeito em arquivos normais. No Linux, ele evita que os usuários removam
ou renomeiem um arquivo em um diretório, a menos que sejam proprietários desse arquivo ou
diretório.
No modo octal, as permissões especiais são especificadas usando uma notação de 4 dígitos,
sendo que o primeiro dígito representa a permissão especial sobre a qual agir. Por exemplo,
para definir o sticky bit (valor 1) para o diretório diretorio_qualquer no modo octal, com
permissões 755, o comando seria:
Set GID
O Set GID, também conhecido como SGID ou Set Group ID bit, tem o valor octal 2 e no
modo simbólico é representado por um s nas permissões de grupo. Ele pode ser aplicado a
arquivos executáveis ou diretórios. Nos arquivos, fará com que o processo seja executado com
os privilégios do grupo que possui o arquivo. Quando aplicado a diretórios, fará com que cada
arquivo ou diretório criado herde o grupo do diretório pai.
Arquivos e diretórios com o bit SGID mostram um s no lugar do x nas permissões de grupo
na saída de ls -l:
root@debian10:/home/debian# ls -l test.sh
-rwxr-sr-x 1 debian debian 33 Jun 11 10:36 test.sh
Agora, vamos mudar para esse diretório e, usando o comando touch, criar um arquivo vazio
dentro dele. O resultado seria:
root@debian10:/home/debian# cd Diretorio_exemplo/
root@debian10:/home/debian# touch novoarquivo
root@debian10:/home/debian# ls -lh novoarquivo
-rw-r--r-- 1 debian debian 0 Jan 18 17:11 novoarquivo
Como podemos ver, o arquivo é propriedade do usuário debian e do grupo debian. Mas, se
o diretório tivesse a permissão SGID definida, o resultado seria diferente. Primeiro, vamos
adicionar o bit SGID ao Diretorio_exemplo e verificar os resultados:
280 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]
O s nas permissões do grupo indica que o bit SGID está definido. Agora, vamos mudar para
este diretório e, novamente, criar um arquivo vazio com o comando touch:
root@debian10:/home/debian# cd Diretorio_exemplo/
root@debian10:/home/debian# touch arquivovazio
root@debian10:/home/debian# ls -lh arquivovazio
-rw-r--r-- 1 debian users 0 Jan 18 17:20 arquivovazio
O grupo que possui o arquivo é users. Isso ocorre porque o bit SGID fez o arquivo herdar o
proprietário do grupo de seu diretório pai, que é users.
Set UID
SUID, também conhecido como Set User ID, tem valor octal 4 e é representado por um s nas
permissões de usuário no modo simbólico. Aplica-se apenas aos arquivos e não tem efeito em
diretórios. Seu comportamento é semelhante ao do bit SGID, mas o processo será executado
com os privilégios do usuário proprietário do arquivo. Os arquivos com o bit SUID mostram
um s no lugar do x nas permissões do usuário, na saída de ls -l:
E o resultado seria:
Se o seu terminal exibe cores, como é o caso da maioria atualmente, é fácil ver se
essas permissões especiais estão definidas olhando a saída de ls -l. Para o sticky bit, o
nome do diretório pode ser mostrado em uma fonte preta com fundo azul. O mesmo
se aplica aos arquivos com os bits SGID (fundo amarelo) e SUID (fundo vermelho). As
cores podem ser diferentes dependendo da distribuição do Linux e das configurações
do terminal que você usa.
Resumo
Nesta aula, você aprendeu como usar o ls para obter informações sobre permissões de arquivo,
como controlar ou alterar quem pode criar, excluir ou modificar um arquivo com chmod, tanto
nos modos octal e simbólico como para alterar a propriedade de arquivos com chown e chgrp,
e como consultar e alterar a máscara de permissões padrão para arquivos e diretórios com
umask.
• Fonte: https://twitter.com/0xax/status/605640674935848960
Fabio Gonçalves De Melo Santana / [email protected]
26
104.6: Criar e alterar links
simbólicos e hardlinks
Introdução
Como já disse antes, no Linux tudo é tratado como arquivo. Mas, alguns arquivos recebem
um tratamento especial, seja devido ao local em que estão armazenados, como os arquivos
temporários, ou à maneira como interagem com o sistema de arquivos, como os links. Nesta
lição, aprenderemos onde esses arquivos estão localizados, como funcionam e como gerenciá-
los.
Arquivos temporários
Os arquivos temporários são arquivos usados pelos programas para armazenar dados que serão
necessários apenas por um curto espaço de tempo, por exemplo, dados de processos em
execução, logs de falhas, arquivos de rascunho de um salvamento automático, arquivos inter-
mediários usados durante uma conversão, arquivos de cache e assim por diante.
283
284 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]
• /tmp: De acordo com o FHS, não se deve pressupor que os arquivos escritos aqui serão
preservados entre as invocações de um programa. A recomendação é que esse diretório
seja limpo (todos os arquivos apagados) durante a inicialização do sistema, embora isso
não seja obrigatório;
• /var/tmp: Outro local para arquivos temporários, mas este não deve ser limpo durante
a inicialização do sistema, ou seja, os arquivos armazenados aqui geralmente persistem
entre as reinicializações;
• /run: Este diretório contém arquivos variáveis de tempo de execução usados pelos
processos ativos, como os arquivos identificadores de processo (.pid). Os programas que
precisam de mais de um arquivo de tempo de execução podem criar subdiretórios aqui.
Este local deve ser limpo durante a inicialização do sistema. Antigamente essa finalidade
pertencia a /var/run e, em alguns sistemas, /var/run pode ser um link simbólico para
/run.
Observe que nada impede o programa de criar arquivos temporários em outro local do sistema,
mas é recomendável respeitar as convenções definidas pelo FHS.
A solução é uma permissão especial chamada sticky bit, que se aplica a diretórios e arquivos.
Porém, por razões de segurança, o kernel do Linux ignora o sticky bit quando ele é apli-
cado a arquivos. Quando esse bit especial é definido para um diretório, ele impede que os
usuários removam ou renomeiem um arquivo nesse diretório, a menos que sejam proprietários
do arquivo.
Os diretórios com o sticky bit definido mostram um t no lugar do x nas permissões de outros
na saída de ls -l. Por exemplo, vamos verificar as permissões dos diretórios /tmp e /var/tmp:
Como você pode ver pelo t no lugar do x na permissão para outros, os dois diretórios estão
285 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]
Para definir o sticky bit em um diretório usando chmod no modo numérico, use a notação de
quatro dígitos, sendo 1 o primeiro dígito. Por exemplo:
Isso define o sticky bit para o diretório chamado temp e suas permissões como rwxr-xr-t.
Ao usar o modo simbólico, empregue o parâmetro t. Assim, +t para definir o sticky bit e -t
para desativá-lo. Desta maneira:
Compreendendo os links
Como já mencionamos anteriormente, no Linux tudo é tratado como um arquivo, mas existe
um tipo especial de arquivo chamado link. Há dois tipos de links em um sistema Linux:
Links simbólicos
Também chamados de soft links, eles apontam para o caminho de outro arquivo. Se excluirmos
o arquivo para o qual o link aponta (chamado destino), o link ainda existirá, mas “para de
funcionar”, pois passará a apontar para “nada”.
Links físicos
Um link físico é como como um segundo nome para o arquivo original. Eles não são duplicatas,
mas sim uma entrada adicional no sistema de arquivos que aponta para o mesmo local (inode)
no disco.
$ ln TARGET LINK_NAME
O TARGET já deve existir (trata-se do arquivo para o qual o link apontará) e, se o destino não
estiver no diretório atual ou se você deseja criar o link em outro lugar, é obrigatório especificar
o caminho completo para ele. Por exemplo, o comando
$ ln target.txt /home/debian/Documents/hardlink
Se deixarmos de fora o último parâmetro (LINK_NAME), será criado um link com o mesmo
nome do destino no diretório atual.
Os links físicos são entradas no sistema de arquivos que têm nomes diferentes, mas que
apontam para os mesmos dados no disco. Todos esses nomes são equivalentes e podem
ser usados para se referir a um arquivo. Se você alterar o conteúdo de um dos nomes, o
conteúdo de todos os outros nomes que apontam para aquele arquivo será alterado, já que
todos apontam para os mesmos dados. Se você excluir um dos nomes, os outros nomes
continuarão a funcionar.
Isso acontece porque quando você “exclui” um arquivo, os dados não são realmente apagados
do disco. O sistema simplesmente exclui a entrada na tabela do sistema de arquivos apon-
tando para o inode correspondente aos dados no disco. Mas se houver uma segunda entrada
apontando para o mesmo inode, ainda será possível acessar os dados. É como se fossem duas
estradas convergindo no mesmo ponto. Mesmo se bloquearmos ou redirecionarmos uma das
estradas, ainda será possível chegar ao destino usando a outra.
root@debian10:/home/debian/Documents# ls -li
total 0
5636238 -rw-r--r-- 2 root root 0 Jun 30 12:17 hardlink
5636238 -rw-r--r-- 2 root root 0 Jun 30 12:17 target.txt
O número anterior às permissões é o número inode. Percebeu que tanto o arquivo hardlink
quanto o arquivo target.txt têm o mesmo número (5636238)? Isso ocorre porque um é o link
físico do outro.
Mas qual é o original e qual é o link? Não dá pra dizer, já que, na prática, eles são a mesma
coisa.
Observe que todo link físico que aponta para um arquivo aumenta a contagem de links do
arquivo. Este é o número logo após as permissões na saída de ls -l. Por padrão, todo arquivo
tem uma contagem de links de 1 (os diretórios têm uma contagem de 2), e cada link físico
apontando para ele aumenta a contagem em um. Por isso a contagem de links é 2 nos arquivos
da lista acima.
Ao contrário dos links simbólicos, só é possível criar links físicos para arquivos, e tanto o link
quanto o destino devem residir no mesmo sistema de arquivos.
Como os links físicos são tratados como arquivos regulares, eles podem ser excluídos com rm,
e renomeados ou movidos no sistema de arquivos com mv. E como um link rígido aponta para
o mesmo inode do destino, ele pode ser movido livremente, sem medo de “quebrar” o link.
Links simbólicos
Criando links simbólicos
O comando usado para criar um link simbólico também é ln, mas com o parâmetro -s adi-
cionado. Assim:
Como no caso dos links físicos, é possível omitir o nome do link, para criar um link com o
288 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]
Os links simbólicos apontam para outro caminho no sistema de arquivos. Podemos criar links
simbólicos para arquivos e diretórios, mesmo em diferentes partições. É muito fácil identificar
um link simbólico na saída de ls:
root@debian10:/home/debian/Documents# ls -lh
total 0
-rw-r--r-- 2 root root 0 Jun 30 12:17 hardlink
lrwxrwxrwx 1 root root 10 Jun 30 12:21 softlink -> target.txt
-rw-r--r-- 2 root root 0 Jun 30 12:17 target.txt
No exemplo acima, o primeiro caractere nas permissões para o arquivo softlink é l, indicando
um link simbólico. Além disso, logo após o nome do arquivo, vemos o nome do destino para
o qual o link aponta, o arquivo target.txt.
Note que nas listagens de arquivos e diretórios os links simbólicos sempre mostram as permis-
sões rwx para o usuário, o grupo e outros, mas, na prática, as permissões de acesso para eles
são as mesmas do destino.
Como no caso dos links físicos, os links simbólicos podem ser removidos usando rm e movidos
ou renomeados com mv. No entanto, deve-se tomar cuidado especial ao criá-los, para evitar
“quebrar” o link se ele for movido de seu local original.
Ao criar links simbólicos, é preciso estar ciente de que, a menos que um caminho seja total-
mente especificado, o local do destino será interpretado como sendo relativo ao local do link.
Isso pode criar problemas caso o link ou o arquivo para o qual ele aponta seja movido.
É mais fácil entender isso com um exemplo. Digamos que temos um arquivo chamado orig-
inal.txt no diretório atual e desejamos criar um link simbólico para ele chamado softlink.
Poderíamos usar:
root@debian10:/home/debian/Documents# ls -lh
total 0
-rw-r--r-- 1 root root 0 Jun 30 12:25 original.txt
lrwxrwxrwx 1 root root 12 Jun 30 12:25 softlink -> original.txt
Observe como o link é elaborado: softlink aponta para () original.txt. Entretanto, vamos ver
o que acontece se movermos o link para o diretório anterior e tentarmos exibir seu conteúdo
com o comando less:
Como o caminho para original.txt não foi especificado, o sistema pressupõe que ele está no
mesmo diretório que o link. Quando isso deixa de ser verdade, o link para de funcionar.
Para evitar isso, devemos sempre especificar o caminho completo para o destino ao criar o
link:
Dessa forma, o link continuará a funcionar mesmo se for movido, porque aponta para a
localização absoluta do destino. Verifique com ls:
root@debian10:/home/debian/Documents# ls -lh
total 0
-rw-r--r-- 1 root root 0 Jun 30 12:25 original.txt
lrwxrwxrwx 1 root root 35 Jun 30 12:27 softlink -> /home/debian/Documents/original.txt
Resumo
Nesta lição, você aprendeu:
• ln: O comando “link”. Sozinho, este comando cria um link físico. Com a opção -
s, podemos criar um link simbólico ou soft link. Lembre-se de que os links físicos
só podem residir na mesma partição e sistema de arquivos, e que os links simbólicos
podem atravessar partições e sistemas de arquivos (inclusive armazenamento conectado
em rede);
• O parâmetro -i do ls, que permite visualizar o número inode de um arquivo.
• Fonte: https://linuxhandbook.com/ln-command/
Fabio Gonçalves De Melo Santana / [email protected]
27
104.7: Encontrar arquivos de
sistema e conhecer sua
localização correta
Introdução
As distribuições Linux, na minha opinião, são como carros, onde cada pessoa se identifica com
um tipo específico. . . Tem pessoas que gostam de Sedã (assim como eu), outras preferem
caminhonete, e por aí vai. Mas uma coisa que quase todas as distribuições têm em comum,
é o fato de seguirem o Filesystem Hierarchy Standard (FHS), que define um “layout padrão”
para o sistema de arquivos. Isso simplifica muito a interoperação e administração do sistema.
291
Fabio Gonçalves De Melo Santana / [email protected]
28
O Filesystem Hierarchy Standard
292
293 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]
Tenha em mente que alguns desses diretórios, como /etc, /usr e /var, contêm toda uma
hierarquia de subdiretórios.
Busca de arquivos
Para pesquisar por arquivos em um sistema Linux, podemos usar o comando find. Esta é
uma ferramenta muito poderosa, rica em parâmetros configuráveis para modificar a saída
exatamente de acordo com suas necessidades.
Para começar, o find precisa de dois argumentos: um ponto de partida e o que procurar. Por
exemplo, para pesquisar todos os arquivos no diretório atual (e seus subdiretórios) cujo nome
termina em .txt, usaríamos:
Essa busca corresponde a qualquer arquivo cujos últimos quatro caracteres do nome sejam
294 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]
.txt, não importa o que venha antes, já que * é um curinga para “qualquer coisa”. No entanto,
veja o que acontece se outro * for adicionado no final do padrão:
O arquivo qualteupapo.txt.zip (destacado acima) não foi incluído na lista anterior, porque
embora contenha .txt em seu nome, não corresponde ao padrão, já que há caracteres extras
depois dele. O novo padrão significa “qualquer coisa .txt qualquer coisa”, então ele passa a
corresponder.
A expressão * .txt deve ser posta entre aspas simples, para evitar que o shell interprete o
padrão como um comando. Experimente sem as aspas e veja o que acontece.
Por padrão, o find começa no ponto de partida e vai descendo pelos subdiretórios (e sub-
diretórios desses subdiretórios) encontrados. Para restringir esse comportamento, use os
parâmetros -maxdepth N, onde N é o número máximo de níveis.
Para pesquisar apenas no diretório atual, usaríamos -maxdepth 1. Suponha que você tem a
seguinte estrutura de diretório:
Para pesquisar dentro de somedir, você precisará usar -maxdepth 2 (o diretório atual +1
nível abaixo). Para pesquisar dentro de anotherdir, -maxdepth 3 seria necessário (o diretório
atual +2 níveis abaixo). O parâmetro -mindepth N faz o contrário, pesquisando apenas em
diretórios no mínimo N níveis abaixo.
O parâmetro -mount pode ser usado para evitar que o find mergulhe em sistemas de arquivos
montados. Também é possível restringir a pesquisa a tipos específicos de sistemas de arquivos
usando o parâmetro -fstype. Assim, find /mnt -fstype exfat -iname “report” buscaria
somente dentro de sistemas de arquivos exFAT montados sob /mnt.
295 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]
Adicione um - antes de NNNN para procurar por arquivos que tenham pelo menos a permissão
especificada. Por exemplo, -perm -644 encontraria arquivos que tenham permissões de ao
menos 644 (rw-r—r–). Isso inclui arquivos com 664 (rw-rw-r–) ou mesmo 775 (rwxrwx-r-x).
Aqui também, podemos usar os prefixos + ou - (que aqui significam maior que e menor
que) para buscar por tamanhos relativos. Por exemplo, -size -10M corresponderia a qualquer
arquivo menor de 10 MiB.
Assim, para pesquisar arquivos em seu diretório inicial que contenham o padrão report (sem
distinção entre maiúsculas e minúsculas) em qualquer parte do nome, tenham permissões
0644, foram acessados há 10 dias e cujo tamanho é de pelo menos 1 Mib, usaríamos
Para -cmin N e -ctime N, qualquer alteração de atributo é levada em conta, incluindo mudanças
nas permissões, leitura ou gravação no arquivo. Isso torna esses parâmetros especialmente
poderosos, uma vez que praticamente qualquer operação envolvendo o arquivo fará com que
ele corresponda aos parâmetros da busca.
O exemplo a seguir corresponderia a qualquer arquivo no diretório atual que foi modificado
há menos de 24 horas e é maior que 100 MiB:
A maneira mais simples de usar locate é simplesmente fornecer a ele um padrão a pesquisar.
Por exemplo, para encontrar todas as imagens JPEG em seu sistema, você usaria locate jpg.
A lista de resultados pode ser bastante longa, mas teria a seguinte aparência:
Com locate, estamos procurando por padrões, e não por extensões de arquivo.
Em princípio, o padrão diferencia maiúsculas de minúsculas. Isso significa que arquivos con-
tendo .JPG não seriam mostrados, pois o padrão está em letras minúsculas. Para evitar isso,
passe o parâmetro -i para locate. Repetindo nosso exemplo anterior:
Para passar vários padrões para locate, basta separá-los com espaços. O exemplo abaixo
faria uma busca sem distinção entre maiúsculas e minúsculas por quaisquer arquivos que
correspondam aos padrões zip e jpg:
Ao usar múltiplos padrões, você pode solicitar ao locate que exiba apenas os arquivos que
correspondam a todos eles. Isso é feito com a opção -A. O exemplo a seguir mostraria
qualquer arquivo que corresponda aos padrões .jpg e .zip:
Um problema com o locate é que ele mostra apenas as entradas presentes no banco de dados
gerado pelo updatedb (localizado em /var/lib/mlocate.db). Se o banco de dados estiver
298 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]
desatualizado, a saída poderá mostrar arquivos que foram excluídos desde a última vez em
que foi atualizado. Uma maneira de evitar isso é adicionar o parâmetro -e, que fará com que
ele verifique se o arquivo ainda existe antes de mostrá-lo na saída.
Obviamente, isso não fará com que os arquivos criados após a última atualização do banco
de dados apareçam. Para isso será necessário atualizar o banco de dados com o comando
updatedb. O tempo para a execução dessa operação dependerá da quantidade de arquivos em
seu disco.
Se a opção -a for adicionada, o comando mostrará todos os nomes de caminho que correspon-
dem ao executável. Observe a diferença:
299 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]
Para descobrir quais diretórios estão no PATH, use o comando echo P AT H.Eleexibe(echo)ocontedoda
no terminal.
type é um comando semelhante que mostra informações sobre um binário, incluindo sua
localização e tipo. Basta usar type seguido do nome do comando:
E o parâmetro -t mostra o tipo de arquivo do comando que pode ser alias, keyword, function,
builtin ou file. Por exemplo:
O comando whereis é mais versátil e, além dos binários, também pode ser usado para mostrar
a localização das páginas do manual ou mesmo o código-fonte de um programa (se disponível
em seu sistema). Basta digitar whereis seguido do nome binário:
Podemos filtrar rapidamente os resultados usando opções de linha de comando como -b, para
limitá-los apenas aos binários, -m, para limitá-los apenas a páginas de manual, ou -s, para
limitá-los apenas ao código-fonte. Repetindo o exemplo acima, os resultados seriam:
Resumo
Nesta lição, você aprendeu sobre a organização básica do sistema de arquivos em uma máquina
Linux, de acordo com o FHS, e como encontrar binários e arquivos, seja por nome ou por
atributos. Os seguintes comandos foram discutidos nesta lição:
• find: Um comando versátil usado para encontrar arquivos e pastas segundo uma var-
iedade de critérios de pesquisa;
• locate: Um utilitário que usa um banco de dados local contendo a localização dos
arquivos armazenados localmente;
• updatedb: Atualiza o banco de dados local usado pelo comando locate;
• which: Exibe o caminho completo até um executável;
• whereis: Exibe a localização das páginas de manual, binários e código-fonte no sistema;
• type: Exibe a localização de um binário e de que tipo de aplicativo se trata (um
programa instalado, um programa interno do Bash e assim por diante).
301 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]
• Fonte: https://twitter.com/Alra3ees/status/1181028153944358913/photo/1
Fabio Gonçalves De Melo Santana / [email protected]
29
105.1 Personalizar e usar o
ambiente do shell
Introdução
Acredito que não preciso dizer, mas já dizendo, o nosso querido shell é a ferramenta mais foda
do Linux. Ele pode ser definido como uma interface entre o usuário e o kernel do sistema
operacional. Além de interpretar os comandos inseridos pelo usuário. Dessa forma, todos os
administradores de sistema devem saber usar o shell. Como você já deve ter entendido, o
Bourne Again Shell (Bash) é o shell de fato na grande maioria das distribuições Linux.
A primeira coisa que o Bash ou qualquer outro shell faz é executar uma série de scripts de
inicialização. Esses scripts personalizam o ambiente da sessão. Existem scripts que afetam
todo o sistema e outros específicos do usuário. Podemos colocar as preferências ou configu-
rações pessoais que melhor atendam às necessidades dos usuários nesses scripts na forma de
variáveis, aliases e funções.
302
303 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Os shells interativos e não interativos podem ser de login ou sem login; qualquer combinação
possível desses tipos tem seus usos específicos.
Os shells de login interativos são executados quando os usuários fazem login no sistema, e são
usados para personalizar as configurações de usuário de acordo com suas necessidades. Um
bom exemplo do uso desse tipo de shell seria um grupo de usuários pertencentes ao mesmo
departamento de uma empresa que precisam de uma determinada variável definida em suas
sessões.
Shells sem login interativos são quaisquer outros shells abertos pelo usuário após o login
no sistema. Os usuários empregam esses shells durante as sessões para realizar tarefas de
manutenção e administrativas, como definir variáveis, data e hora, copiar arquivos, criar scripts
etc.
Por outro lado, os shells não-interativos não requerem nenhum tipo de interação humana.
Dessa forma, esses shells não pedem entrada de dados pelo usuário e sua saída—quando
existe—é, na maioria dos casos, gravada em um log.
Os shells de login não-interativos são bastante raros e pouco práticos. Eles praticamente
não têm utilidade e nós só estamos falando deles para você conhecer outros aspectos do
comportamento do shell. Alguns exemplos incomuns incluem forçar um script a ser executado
a partir de um shell de login com /bin/bash –login ou canalizando a saída padrão (stdout) de
um comando para a entrada padrão (stdin) de uma conexão ssh:
No caso do shell não-interativo e sem login, não há interação nem login em nome do usuário;
portanto, estamos nos referindo aqui ao uso de scripts automatizados. Esses scripts são
usados principalmente para realizar tarefas administrativas e de manutenção repetitivas, como
as incluídas em cronjobs. Nesses casos, o bash não lê nenhum arquivo de inicialização.
Abrindo um terminal
Quando estamos em um ambiente de desktop, podemos abrir um aplicativo de terminal ou
mudar para um dos consoles do sistema. Portanto, um novo shell pode ser um shell pts, quando
aberto a partir de um emulador de terminal na GUI, ou um shell tty, quando executado em um
304 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
console do sistema. No primeiro caso, não estamos lidando com um terminal, mas com um
emulador de terminal. Por serem parte das sessões gráficas, os emuladores de terminal, como
o gnome-terminal ou o konsole, são muito ricos em recursos e fáceis de usar em comparação
com os terminais de interface de usuário baseados em texto.
Ao iniciar o processo filho bash, podemos especificar diversas opções para definir que tipo de
shell queremos iniciar. Eis algumas opções importantes de invocação no bash:
1. su: Muda o ID de usuário ou o torna superusuário (root). Com este comando, podemos
chamar shells de login e sem login:
• su - debian, su -l debian ou su –login debian: Iniciam um shell de login
interativo como debian;
305 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Assim como o su, o sudo permite invocar shells de login e sem login:
Nível global
• /etc/profile: Arquivo .profile de todo o sistema para o shell Bourne e shells com-
patíveis com Bourne (incluindo o bash). Através de uma série de instruções if, esse
arquivo define uma série de variáveis como PATH e PS1 conforme necessário, além de
buscar e executar—se existirem—o arquivo /etc/bash.bashrc e os que estão no diretório
/etc/profile.d;
• /etc/profile.d/: Este diretório pode conter scripts que são executados por /etc/profile.
Nível local
Assim, através da saída de seus respectivos comandos echo, sabemos quando cada um desses
arquivos é lido e executado. Para demonstrar, vamos ver o que acontece quando debian se
loga via ssh a partir de outra máquina:
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Como mostram as duas últimas linhas, deu tudo certo. Além disso, observe três coisas:
Nível global - /etc/bash.bashrc: Este é o arquivo .bashrc de todo o sistema para shells
bash interativos. Ao longo de sua execução, o bash garante que ele esteja sendo executado de
maneira interativa, verifica o tamanho da janela após cada comando (atualizando os valores
de LINES e COLUMNS se necessário) e define algumas variáveis.
Nível local - ~/.bashrc: Além de realizar tarefas semelhantes às descritas para /etc/bash.bashrc
no nível do usuário (como verificar o tamanho da janela ou se está sendo executado intera-
tivamente), este arquivo específico do Bash geralmente define algumas variáveis de histórico
e busca e executa ~/.bash_aliases, se existir. Além disso, esse arquivo é normalmente usado
para armazenar aliases e funções específicas dos usuários.
Da mesma forma, também é importante notar que ~/.bashrc é lido se o bash detectar que é
uma conexão de rede (como era o caso com a conexão Secure Shell (SSH) no exemplo acima).
debian@debian:~$ bash
Ola... /etc/bash.bashrc
Ola... /home/debian/.bashrc
Lembre-se, devido à ordem em que os arquivos são executados, os arquivos locais têm
precedência sobre os globais.
Para provar, vamos escrever um script simples e torná-lo executável. Não incluiremos nenhum
shebang porque invocaremos o executável do bash (/bin/bash com a opção de login) a partir
da linha de comando.
1. Criamos o script teste.sh contendo a linha echo ‘Ola. . . a script’ para ser possível provar
que o script foi executado com sucesso:
Funcionou! Antes de executar o script, o login foi feito e tanto /etc/profile quanto ~/.profile
foram executados.
Aprenderemos sobre shebangs e todos os outros aspectos dos scripts do shell em lições
futuras.
Vamos agora mandar a saída padrão (stdout) do comando echo para a entrada padrão (stdin)
de uma conexão ssh por meio de um pipe (|):
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ola... /etc/profile
Ola... /home/debian/.profile
-bash: line 1: Ola shell nao interativo: command not found
Novamente, /etc/profile and ~/.profile são executados. Fora isso, a primeira e a última linha
da saída são bastante reveladoras no que diz respeito ao comportamento do shell.
Os scripts não leem nenhum dos arquivos listados acima, mas procuram a variável de ambiente
BASH_ENV, expandem seu valor se necessário e o usam como nome de um arquivo de
inicialização para ler e executar comandos. Aprenderemos mais sobre variáveis de ambiente
na próxima lição.
root@debian:~# su - debian
Ola... /etc/bash.bashrc
Ola... /etc/profile
Ola... /home/debian/.bashrc
Ola... /home/debian/.profile
é claro, os arquivos de configuração dos shells). SKEL e outras variáveis relacionadas são
armazenadas em /etc/adduser.conf, que é o arquivo de configuração para adduser:
SKEL está definido em /etc/skel, assim, os scripts de inicialização que configuram nossos
shells estarão lá:
debian@debian:~$ ls -a /etc/skel/
. .. .bash_logout .bashrc .profile
Lembre-se de que os arquivos que começam com . estão ocultos, portanto é preciso
usar ls -a para vê-los ao listar o conteúdo do diretório.
Vamos agora criar um diretório em /etc/skel para armazenar os scripts pessoais de todos os
novos usuários:
root@debian:~# cd /etc/skel/
root@debian:/etc/skel#
2. Listamos o conteúdo:
root@debian:/etc/skel# ls -a
. .. .bash_logout .bashrc .profile
root@debian:~# su - debian
debian@debian:~$ pwd
/home/debian
debian@debian:~$ ls -a
. .. .bash_history .bash_logout .bashrc meu_script_pessoal .profile
pela qual criamos ou definimos variáveis. Por outro lado, o processo de acesso ao valor contido
no nome é denominado referenciamento de variável.
<nome_da_variável>=<valor_da_variável>
Por exemplo:
$ distro=joatham
A variável distro é igual a joatham, ou seja, há uma parte da memória que contém o valor
joatham—sendo distro o indicador para ele.
Observe, no entanto, que não pode haver nenhum espaço em qualquer lado do sinal de igual
ao se atribuir uma variável:
Para referenciar uma variável (ou seja, para verificar seu valor), usamos o comando echo antes
do nome da variável com um sinal $:
Nomes de variáveis
Ao escolher o nome das variáveis, existem certas regras que devemos levar em consideração.
O nome da variável pode conter letras (a-z, A-Z), números (0-9) e sublinhados (_):
314 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
root@debian:~$ distro=joatham
root@debian:~$ echo $distro
joatham
root@debian:~$ DISTRO=joatham
root@debian:~$ echo $DISTRO
joatham
root@debian:~$ distro_1=joatham
root@debian:~$ echo $distro_1
joatham
root@debian:~$ _distro=joatham
root@debian:~$ echo $_distro
joatham
Ele não deve começar com um número para não confundir o Bash:
root@debian:~$ 1distro=joatham
-bash: 1distro=joatham: command not found
Não deve conter espaços (nem mesmo entre aspas); por convenção, os sublinhados são usados
no lugar dos espaços:
As variáveis podem conter quaisquer caracteres alfanuméricos (a-z, A-Z, 0-9), além da maioria
dos outros caracteres (?, !, *, ., / etc.):
root@debian:~$ distro=4linux12.4?
root@debian:~$ echo $distro
4linux12.4?
Os valores das variáveis devem ser postos entre aspas se contiverem espaços simples:
315 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Os valores das variáveis também devem ser postos entre aspas se contiverem caracteres como
os usados para redirecionamento (<, >) ou o símbolo de barra vertical (|). A única coisa que
o comando a seguir faz é criar um arquivo vazio chamado 4linux:
root@debian:~$ distro=>4linux
root@debian:~$ echo $distro
root@debian:~$ ls 4linux
4linux
root@debian:~$ distro=">4linux"
root@debian:~$ echo $distro
>4linux
No entanto, aspas simples e duplas nem sempre são intercambiáveis. Dependendo do que
estamos fazendo com uma variável (atribuindo ou referenciando), o uso de uma ou de outra
tem implicações e produzirá resultados diferentes. No contexto da atribuição de variáveis, as
aspas simples consideram literalmente todos os caracteres do valor da variável, enquanto as
aspas duplas permitem a substituição de variáveis:
root@debian:~$ qualteupapo=instagram
root@debian:~$ qualquercoisa='Meu $qualteupapo'
root@debian:~$ echo $qualquercoisa
Meu $qualteupapo
root@debian:~$ qualquercoisa="Meu $qualteupapo"
root@debian:~$ echo $qualquercoisa
Meu instagram
Por outro lado, ao referenciar uma variável cujo valor inclui alguns espaços iniciais (ou extras),
às vezes combinados com asteriscos, é obrigatório usar aspas duplas após o comando echo
316 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Se a referência da variável contiver um ponto de exclamação no final, este deve ser o último
caractere da string (caso contrário, o Bash pensará que estamos nos referindo a um evento de
history):
root@debian:~$ distro=4linux.?/!os
-bash: !os: event not found
root@debian:~$ distro=4linux.?/!
root@debian:~$ echo $distro
4linux.?/!
Todas as barras invertidas devem ser escapadas com outra barra invertida. Aliás, se uma
barra invertida for o último caractere na string e não o escaparmos, o Bash interpretará que
queremos uma quebra de linha e criará uma nova linha:
root@debian:~$ distro=joatham\
>
root@debian:~$ distro=joatham\\
root@debian:~$ echo $distro
joatham\
Nas próximas duas seções, resumiremos as principais diferenças entre as variáveis locais e de
ambiente.
Para realizar alguns testes, vamos criar uma variável local. Conforme explicado acima, escol-
hemos um nome de variável apropriado e o igualamos a um valor apropriado. Por exemplo:
root@debian:~$ reptil=jabuti
317 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Vamos agora usar o comando echo para referenciar nossa variável e verificar se tudo correu
conforme o esperado:
Em certos cenários a imutabilidade pode ser um recurso interessante das variáveis. Se quis-
ermos que nossas variáveis sejam imutáveis, podemos criá-las em modo readonly (somente
leitura):
root@debian:~$ reptil=jabuti
root@debian:~$ readonly reptil
root@debian:~$ reptil=qualteupapo
-bash: distro: readonly variable
Para listar todas as variáveis somente leitura da sessão atual, digite readonly ou read-
only -p no terminal.
O set exibe uma saída com todas as variáveis e funções do shell atribuídas atualmente. Como
podem ser muitas linhas (experimente você mesmo!), recomendamos usá-lo em combinação
com um paginador como o less:
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="12" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.12(1)-release'
(...)
Todavia, reptil, por ser uma variável local, não será herdada por nenhum processo filho nascido
do shell atual:
root@debian:~$ bash
root@debian:~$ set | grep reptil
root@debian:~$
unset deve ser seguido somente pelo nome da variável (não precedido pelo símbolo
$).
Podemos passar recursivamente o valor dessas variáveis para outras variáveis e o valor da
última acabará por se expandir para o da primeira:
root@debian:~$ meu_shell=$SHELL
root@debian:~$ echo $meu_shell
/bin/bash
root@debian:~$ seu_shell=$meu_shell
root@debian:~$ echo $seu_shell
/bin/bash
root@debian:~$ our_shell=$seu_shell
root@debian:~$ echo $our_shell
/bin/bash
Para que uma variável local do shell se torne uma variável de ambiente, usamos o comando
export:
Com export reptil, transformamos nossa variável local em uma variável de ambiente para que
os shells filhos possam reconhecê-la e usá-la:
root@debian:~$ bash
root@debian:~$ echo $reptil
jabuti
Da mesma maneira, export pode ser usado para definir e exportar uma variável de uma só vez:
320 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Agora podemos abrir uma nova instância do Bash e referenciar com sucesso a nova variável:
root@debian:~$ bash
root@debian:~$ echo $anfibio
sapo
Com export -n, a variável será novamente transformada em variável local do shell.
O comando export também nos dá uma lista de todas as variáveis de ambiente existentes
quando inserido sozinho (ou com a opção -p):
root@debian:~$ export
declare -x HOME="/home/debian"
declare -x LANG="en_GB.UTF-8"
declare -x LOGNAME="debian"
(...)
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
declare -x PWD="/home/debian"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="192.168.1.10 49330 22"
declare -x SSH_CONNECTION="192.168.1.10 49330 192.168.1.7 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm-256color"
declare -x USER="debian"
declare -x XDG_RUNTIME_DIR="/run/user/1001"
declare -x XDG_SESSION_ID="8"
declare -x reptil="jabuti"
Dois outros comandos que podem ser usados para imprimir na tela uma lista de todas as
variáveis de ambiente são env e printenv:
root@debian:~$ env
SSH_CONNECTION=192.168.1.10 48678 192.168.1.7 22
LANG=en_GB.UTF-8
XDG_SESSION_ID=3
USER=debian
321 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
PWD=/home/debian
HOME=/home/debian
SSH_CLIENT=192.168.1.10 48678 22
SSH_TTY=/dev/pts/0
MAIL=/var/mail/debian
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=debian
XDG_RUNTIME_DIR=/run/user/1001
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
_=/usr/bin/env
Além de ser um sinônimo de env, às vezes podemos usar printenv de forma semelhante à que
usamos o comando echo para verificar o valor de uma variável:
Note, entretanto, que com printenv o nome da variável não é precedido por $.
• O nome do host (localhost se esse dado estiver ausente) no qual o servidor X está
rodando;
• Dois pontos como delimitador;
• Um número (normalmente é 0 e se refere à tela do computador).
Um valor vazio para esta variável indica um servidor sem um X Window System. Um número
extra—como em my.xserver:0:1—faria referência ao número da tela, caso haja mais de uma.
2. HISTCONTROL Esta variável controla quais comandos são salvos em HISTFILE (veja
abaixo). São três valores possíveis:
• ignorespace: Comandos iniciados com um espaço não serão salvos.
• ignoredups: Um comando idêntico ao anterior não será salvo.
• ignoreboth: Comandos que se encaixam em uma das duas categorias anteriores
não serão salvos.
root@debian:~$ echo $HISTCONTROL
ignoreboth
4. HISTFILESIZE
Define o número de comandos a serem salvos em HISTFILE, tanto no início quanto no final
da sessão:
5. HISTFILE
O nome do arquivo que armazena todos os comandos à medida que são digitados. Por padrão,
esse arquivo está localizado em ~/.bash_history:
6. HOME Esta variável armazena o caminho absoluto do diretório home do usuário atual
e é definido quando o usuário faz login.
11. MAIL Esta variável armazena o arquivo no qual o Bash procura por email:
12. MAILCHECK Esta variável armazena um valor numérico que indica, em segundos, a
frequência com que o Bash verifica se há novas mensagens:
13. PATH Esta variável de ambiente armazena a lista de diretórios onde o Bash procura
por arquivos executáveis quando instruído a executar qualquer programa. Em nossa
máquina de exemplo, esta variável é definida através do arquivo de sistema /etc/profile:
fi
export PATH
(...)
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin"
fi
export PATH
Agora podemos ver como o valor da variável muda quando fazemos login como usuário regular:
# su - pedro
root@debian:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin
14. PS1 Essa variável armazena o valor do prompt do Bash. No trecho de código a seguir
(igualmente de /etc/profile), a declaração if testa a identidade do usuário e lhe atribui
um prompt bastante personalizado (# para root ou $ para usuários regulares):
fi
15. PS2 Normalmente definido como > e usado como prompt de continuação para coman-
dos longos de muitas linhas;
16. PS3 Usado como prompt para o comando select;
17. PS4 Normalmente definido como + e usado para depuração;
18. SHELL Esta variável armazena o caminho absoluto do shell atual:
Criando aliases
Um alias é um nome substituto para outro(s) comando(s). Ele pode ser executado como um
comando normal, mas, na verdade, executa outro comando de acordo com a definição do alias.
A sintaxe para declarar aliases é bastante simples. Os aliases são declarados escrevendo-se a
palavra-chave alias seguida pela atribuição do alias. Por sua vez, a atribuição do alias consiste
no nome do alias, um sinal de igual e um ou mais comandos:
alias alias_name=command(s)
Por exemplo:
Este alias bizarro inicia uma instância do shell sh original quando o usuário digitar shellantigo
no terminal:
root@debian:~$ shellantigo
root@debian:~$
O poder dos aliases reside no fato de nos permitirem escrever versões curtas de comandos
longos:
Para saber mais sobre o ls e suas cores, digite man dir_colors no terminal.
Da mesma forma, podemos criar aliases para uma série de comandos concatenados—o ponto
e vírgula (;) é usado como um delimitador. Podemos, por exemplo, ter um alias que nos dá
informações sobre a localização do executável git e sua versão:
root@debian:~$ git_info
/usr/bin/git
git version 2.7.4
root@debian:~$ alias
alias git-info='which git;git --version'
alias ls='ls --color=auto'
alias shellantigo='sh'
O comando unalias remove aliases. Podemos, por exemplo, digitar unalias git-info e ver como
ele desaparece da listagem:
328 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
Como vimos com alias hi=‘echo We salute you.’ em uma lição anterior, precisamos colocar
os comandos entre aspas (simples ou duplas) quando, devido aos argumentos ou parâmetros,
eles contêm espaços:
root@debian:~$ reptil=instagram
root@debian:~$ alias show='echo Hello $reptil!'
root@debian:~$ show
Hello instagram!
O escape de um alias é útil quando um alias tem o mesmo nome de um comando regular.
Nesse caso, o alias tem precedência sobre o comando original, que, no entanto, ainda pode
ser acessado escapando-se o alias.
root@debian:~$ where?
/home/debian
root@debian:~$ alias my_home=where?
root@debian:~$ my_home
/home/debian
Além disso, também é possível colocar uma função dentro de um alias, como será demonstrado
mais adiante.
Como podemos ver nas últimas três linhas, é possível ter nosso próprio arquivo dedicado aos
aliases—~/.bash_aliases—para o .bashrc abrir e executar a cada inicialização do sistema. Ao
escolher essa opção, criamos e preenchemos esse arquivo:
###########
# .bash_aliases:
# a file to be populated by the user's personal aliases (and sourced by ~/.bashrc).
###########
alias git_info='which git;git --version'
alias show='echo Hello world!'
alias ll='ls -al'
alias where?='echo $PWD'
Parâmetros posicionais $0 a $9
Expandem-se para os parâmetros ou argumentos que estão sendo passados para a função (alias
ou script)—$0 se expande para o nome do script ou shell.
Vamos criar uma função para demonstrar os parâmetros posicionais—note PS2 (>) indicando
332 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
root@debian:~$ special_vars() {
> echo $0
> echo $1
> echo $2
> echo $3
}
Agora, vamos invocar a função (special_vars) passando três parâmetros para ela (debian,
ubuntu, 4linux):
Embora seja tecnicamente possível passar parâmetros posicionais para aliases, não é
lá muito prático, já que—com aliases—os parâmetros posicionais são sempre passados
no final:
• $#
Expande-se para o número de argumentos passados para o comando
• $@, $*
Expandem-se para os argumentos passados para o comando
• $_
Expande-se para o último parâmetro ou o nome do script (dentre outras coisas; consulte
man bash para saber mais!):
333 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]
- Fonte:
- https://www.cyberciti.biz/tutorials/openbsd/
Fabio Gonçalves De Melo Santana / [email protected]
30
105.2 Personalizar ou criar scripts
simples
Introdução
Tarefas administrativas são, muitas vezes, longas e repetitivas. Podemos automatizar esses
procedimentos através de scripts. Na verdade, os scripts podem nos auxiliar muito, numa
vasta gama de atividades.
O que é um script? É uma sequência de instruções que são executadas toda vez que o mesmo
é chamado.
Mas, qual a diferença entre um script e um programa, já que ambos são sequências de
instruções?
Sendo uma linguagem de programação, a Shell Script possui uma série de estruturas de
controle como loops e condicionais, mas que são estudadas apenas em cursos mais avançados.
Vejamos o seguinte exemplo de Shell Script:
334
335 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
Este é um script bem simples. As linhas que começam pelo símbolo # (cerquilha) são
comentários, ou seja, tudo que aparece depois do desse carácter é desprezado. Os comentários
são muito importantes nos programas, pois são uma forma de documentá-los. Imagine se você
tiver que fazer uma alteração num programa escrito a um ano antes. Será que você irá se
lembrar de todas as estruturas e variáveis que utilizou? Provavelmente não. Se for outra
pessoa quem tiver que efetuar essa mudança, a situação será pior ainda!
Mas a primeira linha, na qual aparece um comentário, possui uma característica um tanto
estranha. Na verdade, a primeira linha de um script, indica qual será o interpretador daquele
script. Em nosso exemplo será o programa /bin/bash, uma shell. Se estivéssemos criando
um script com a linguagem de programação Perl, a primeira linha seria algo como /us-
r/bin/perl.
Executando o script
Um programa ou script no GNU/Linux deve possuir permissão de execução. Vamos denominar
como shell.sh o nosso script nesse exemplo. Agora para podermos executá-lo, devemos
primeiro executar o comando:
root@debian10:/home/debian# ./shell.sh
Em algumas situações, pode ser necessário fornecer parâmetros para um script. Por exemplo,
336 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
Supondo que esse novo script chama-se script2.sh, uma possível forma de utilização do
script seria:
Para passar parâmetros para esse script, precisamos conhecer a função de algumas variáveis:
$1, $2. Quando passamos algum parâmetro para o nosso script, esse parâmetro fica ar-
mazenado em uma variável específica. Por exemplo:
Para conseguirmos resgatar o valor desses parâmetros, precisamos chamar as variáveis $1, $2
e $3, por exemplo:
Usando os números
Muitas vezes quando fazemos scripts, precisamos de uma função que faça o trabalho das
operações matemáticas básicas como soma, divisão, multiplicação e subtração. Em shell
script podemos usar o comando expr para realizá-las. Já a contagem de linhas é feita pelo
comando wc. E o comando cut serve para cortar a saída no ponto especificado pelo separador.
Vamos ver esse exemplo: um script que deve dizer quantos usuários estão presentes, quantos
grupos estão presentes e no final mostrar quantos objetos meu sistema tem, a soma dos
usuários e dos grupos:
#!/bin/bash
#
echo "Aguarde ....."
337 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
sleep 3
G‘=wc -l /etc/group | cut -d " " -‘f1
U‘=wc -l /etc/passwd | cut -d " " -‘f1
echo "O sistema possui $U usuarios."
echo "O sistema possui $G grupos."
echo "O sistema possui ‘expr $G + $U ‘objetos."
Usando a estrutura se
Até o presente momento, fizemos scripts que não possuem escolhas, ou seja, comandos de
execução em linha de comando em série, utilizando nossa lógica para fazer com que aquele
script seja executado corretamente. Mas se qualquer coisa acontecer no meio do caminho,
não temos a oportunidade de trabalhar com as famosas exceptions.
As exceptions, também conhecidas como exceções, servem para ajudar quando o resultado
de alguma parte do script pode ter vários rumos. Usando a condição se, é possível testar o
resultado de uma condicional.
A variável $?
A variável interrogação é conhecida por testar o valor de retorno de qualquer comando quando
mostrada após sua execução. Com ela podemos verificar se o programa foi executado com
sucesso ou não. Para isso basta saber que essa variável tem dois retornos principais:
root@debian10:/home/debian# pwd
root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 0
root@debian10:/home/debian# pws
root@debian10:/home/debian# echo $?
root@debian10:/home/debian# !=0
Quando o resultado é diferente de 0, quer dizer que existiu algum problema na execução do
comando.
Cada programa tem sua tabela e exceções, mas sempre retornam 0 quando o programa é bem
executado.
338 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
O comando test
O teste de condicionais (strings, matemáticas e em arquivos) em Shell Script é feito através
do comando test. Vamos conferir algumas formas de testar condicionais.
Testando strings
root@debian10:/home/debian# var=valor
root@debian10:/home/debian# test -z $var
root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 1
339 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
Usando a estrutura se
Acima mostramos algumas formas de se testar as condicionais utilizadas dentro da estrutura
se. Lembre-se que podemos usar as condicionais tanto dentro, quanto fora da estrutura se,
depende do caso e do meio.
Existem muitos outros operadores para que possamos dominar o mundo e consequentemente
os sistemas UNIX com shell script. Estes são apenas os essenciais!
Utilizando a estrutura if
Abaixo alguns exemplos realmente práticos de como utilizar a estrutura if:
#!/bin/bash
## Primeiro script - Verificando se um usuário existe
echo " Digite usuário para consulta:"
read USER
REPLY=$( getent passwd | grep $USER )
if [ -z $REPLY ] ; then
echo " Usuário $USER não existe!"
else
echo "Usuário Existe"
fi
Ao invés de verificar se a variável que recebia o resultado do comando estava vazia, poderíamos
ter utilizado o comando test antes da estrutura e checar apenas seu código de erro:
#!/bin/bash
## Primeiro script - Verificando se um usuário existe
#
echo "Digite usuário para consulta:"
read USER
REPLY=$(getent passwd | grep $USER)
test -z $REPLY
if [ $? -eq 0 ] ; then
echo "Usuário $USER não existe!"
else
echo "Pagamento em dia"
fi
#!/bin/bash
clear
echo "Digite o nome do usuário"
read USER
if
then
clear
echo $USER esta logado
else
who | grep $USER > /dev/null
clear
echo $USER nao esta logado
fi
#!/bin/bash
clear
echo "Escreva o nome do arquivo e a palavra a ser pesquisada:"
read file word
if grep $word $file > /dev/null
then
clear
echo "A palavra $word existe no arquivo $file . "
fi
#!/bin/bash
clear
echo "Digite um nome de usuário"
read Usuario
case $Usuario in
aluno )
clear ; ls /etc ; cal ; date
;;
root )
clear ; whoami
;;
*)
clear
echo $Usuario não existe
;;
esac
#!/bin/bash
341 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
clear
echo " Escolha uma opção para informações da maquina ( Digite o numero)"
echo " 1 - Horario do sistema "
echo " 2 - Tempo que o servidor esta ligado "
echo " 3 - Quantidade de usuário logados "
echo " 4 - Sair "
read ESC
case $ESC in
1)
H = $ ( uptime | awk -F " " ’{ print $1 } ’)
echo " Agora são $H "
;;
2)
T = $ ( uptime | awk -F " " ’{ print $3 } ’)
echo " O sistema esta $T ligado "
;;
3)
U = $ ( uptime | awk -F " " ’{ print $4 } ’)
echo " Existem $U atualmete logados "
;;
4)
echo " Bye ... "
;;
*)
echo " Opção invalida "
;;
esac
Quando repetições são necessárias podemos utilizar estruturas de looping como while e for.
while [<expressão>]; do
comandos
done
#!/bin/bash
clear
echo "Digite o endereço de um site"
read SITE
while ping -c1 $SITE > /dev/null 2 >&1
do
echo "O site $SITE está no ar."
done
Exemplo 2: Cria quantos arquivos você indicar com uma determinada extensão:
#!/bin/bash
342 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
clear
echo "Digite o nome do arquivo"
read ARQ
clear
echo "Digite a extensão do arquivo"
read EXT
clear
echo "Digite o numero de arquivos criados"
read NUM
i=1
while [ $i -le $NUM ]
do
touch $ARQ$i.$EXT
i='expr $i + 1'
done
#!/bin/bash
for i in 'ls -1'
do
tar -cvzf $i.tar.gz $i
done
#!/bin/bash
clear
echo "Digite a extensão dos arquivos que você quer apagar"
read ARQ
for i in *.$ARQ ; do
rm $i
done
343 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]
- Fonte: https://slideplayer.com.br/slide/8585130/
Fabio Gonçalves De Melo Santana / [email protected]
31
106.1_Instalar_e_configu-
rar_o_X11/
Introdução
X Window System é uma pilha de software usada para exibir texto e gráficos em uma tela. A
aparência geral e o design de um cliente X não são ditados pelo X Window System, mas sim
gerenciados por cada cliente X individual, um gerenciador de janela (por exemplo, Window
Maker, Tab Window Manager) ou um ambiente de desktop completo como KDE, GNOME ou
Xfce.
A versão principal do protocolo X usado nas distribuições Linux modernas é X.org) versão 11,
comumente escrita como X11. O protocolo X é o mecanismo de comunicação entre o cliente
X e o servidor X. As diferenças entre o cliente X e o servidor X serão discutidas abaixo.
344
345 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
um servidor e, na maioria das instalações em que uma área de trabalho gráfica é necessária,
ambos os componentes estão no mesmo computador. O componente cliente assume a forma
de um aplicativo, como um emulador de terminal, um game ou um navegador web. Cada
aplicativo cliente informa ao servidor X sobre a localização e o tamanho de sua janela na tela
do computador. O cliente também decide o que vai para aquela janela, e o servidor X exibe
o desenho solicitado na tela. O X Window System também lida com os dados enviados por
dispositivos como mouses, teclados e muito mais.
O gerenciador de exibição fornece um login gráfico para um sistema. Esse sistema pode ser um
computador local ou uma máquina em uma rede. O gerenciador de exibição é iniciado após
a inicialização do computador e inicia uma sessão do servidor X para o usuário autenticado.
O gerenciador de exibição também é responsável por manter o servidor X em funcionamento.
Como exemplo de gerenciadores de exibição, podemos citar o GDM e o LightDM.
hostname:displaynumber.screennumber
O nome de exibição também informa a um aplicativo gráfico onde ele deve ser renderizado e
em qual hospedeiro (no caso de uma conexão X remota).
O displaynumber faz referência à coleção de “telas” que estão em uso, seja uma única tela de
laptop ou diversas telas em uma estação de trabalho. Cada sessão do servidor X em execução
recebe um número de exibição começando em 0.
346 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
O screennumber padrão é 0. Esse pode ser o caso se apenas uma tela física ou diversas telas
físicas estiverem configuradas para funcionar como uma só tela. Quando todas as telas de
uma configuração de múltiplos monitores são combinadas em uma única tela lógica, as janelas
do aplicativo podem ser movidas livremente entre as telas. Em situações em que cada tela é
configurada para funcionar independentemente uma da outra, cada tela abrigará as janelas dos
aplicativos que forem abertos dentro delas e as janelas não podem ser movidas de uma tela
para outra. A cada tela independente será atribuído seu próprio número. Se houver apenas
uma tela lógica em uso, o ponto e o número da tela serão omitidos.
1. O servidor X em uso está no sistema local, portanto, não há nada impresso à esquerda
dos dois pontos;
2. A sessão atual do servidor X é a primeira indicada por 0 imediatamente após os dois
pontos;
3. Há apenas uma tela lógica em uso, portanto um número de tela não é visível.
(A) - Um único monitor, com uma única configuração de monitor e apenas uma tela.
(B) - Configurado como um único monitor, com dois monitores físicos configurados como
uma tela. As janelas do aplicativo podem ser movidas livremente entre os dois monitores.
(C) - Uma configuração de tela única (conforme indicado por :0), porém cada monitor é uma
tela independente. Ambas as telas ainda compartilharão os mesmos dispositivos de entrada,
como teclado e mouse; porém, um aplicativo aberto na tela :0.0 não pode ser movido para a
tela :0.1 e vice-versa.
Para iniciar um aplicativo em uma tela específica, atribua o número da tela à variável de
ambiente DISPLAY antes de iniciar o aplicativo: $
Esse comando iniciaria o navegador Firefox na tela à direita do diagrama acima. Alguns kits
de ferramentas também oferecem opções de linha de comando para instruir um aplicativo a
ser executado em uma tela especificada.
Configuração do servidor X
Tradicionalmente, o principal arquivo de configuração usado para configurar um servidor X é
o arquivo /etc/X11/xorg.conf. Nas distribuições Linux modernas, o servidor X configura a si
mesmo em tempo de execução quando é iniciado e, portanto, nenhum arquivo xorg.conf pode
existir.
O arquivo xorg.conf é dividido em estrofes separadas chamadas seções. Cada seção começa
com o termo Section e, após este termo está o nome da seção, que se refere à configuração
de um componente. Cada Section é encerrada por uma EndSection correspondente. Um
arquivo xorg.conf típico contém as seguintes seções:
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
EndSection
A opção de XkbLayout determina a disposição das teclas de um teclado, como Dvorak, canhoto
ou destro, QWERTY e idioma. A opção de XkbModel é usada para definir o tipo de teclado
utilizado. Há uma tabela de modelos, layouts e suas descrições em xkeyboard-config(7). Os
arquivos associados aos layouts de teclado podem ser encontrados em /usr/share/X11/xkb.
Um layout de teclado grego politônico em um computador Chromebook apareceria desta
maneira:
348 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "gr(polytonic)"
Option "XkbModel" "chromebook"
EndSection
Essa configuração só permanecerá ativa enquanto a sessão X estiver em uso. Para que essas al-
terações se tornem permanentes, modifique o arquivo /etc/X11/xorg.conf.d/00-keyboard.conf
de forma a incluir as configurações necessárias.
As distribuições Linux modernas fornecem o comando localectl através do systemd, que tam-
bém pode ser usado para modificar um layout de teclado e cria automaticamente o arquivo de
configuração /etc/X11/xorg.conf.d/00-keyboard.conf. Novamente, eis um exemplo de con-
figuração de um teclado grego politônico em um Chromebook, desta vez com o comando
localectl:
A opção –no-convert é usada aqui para impedir que o localectl modifique o mapa do teclado
no console do hospedeiro.
• Monitor - A seção Monitor descreve o monitor físico utilizado e onde está conectado. Eis
um exemplo de configuração que mostra um monitor de hardware conectado à segunda
porta de vídeo e usado como monitor principal:
Section "Monitor"
Identifier "DP2"
Option "Primary" "true"
EndSection
349 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
• Device - A seção Device descreve a placa de vídeo física utilizada. A seção também
contém o módulo do kernel usado como driver para a placa de vídeo, junto com sua
localização física na placa-mãe:
Section "Device"
Identifier "Device0"
Driver "i915"
BusID "PCI:0:2:0"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "DP2"
EndSection
Section "ServerLayout"
Identifier "Layout-1"
Screen "Screen0" 0 0
InputDevice "mouse1" "CorePointer"
InputDevice "system-keyboard" "CoreKeyboard"
EndSection
O comando xdpyinfo é usado em um computador para exibir informações sobre uma instância
do servidor X em execução. Veja abaixo um exemplo de saída do comando:
root@debian10:/home/debian# xdpyinfo
name of display: :0
version number: 11.0
vendor string: The X.Org Foundation
vendor release number: 12004000
350 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
screen #0:
dimensions: 3840x1080 pixels (1016x286 millimeters)
resolution: 96x96 dots per inch
depths (7): 24, 1, 4, 8, 15, 16, 32
root window id: 0x39e
depth of root window: 24 planes
number of colormaps: minimum 1, maximum 1
default colormap: 0x25
default number of colormap cells: 256
preallocated pixels: black 0, white 16777215
options: backing-store WHEN MAPPED, save-unders NO
largest cursor: 3840x1080
current input event mask: 0xda0033
KeyPressMask KeyReleaseMask EnterWindowMask
LeaveWindowMask StructureNotifyMask SubstructureNotifyMask
SubstructureRedirectMask PropertyChangeMask ColormapChangeMask
number of visuals: 270
351 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
...
As partes mais relevantes da saída estão em negrito, como o nome da tela (que é idêntico ao
conteúdo da variável de ambiente DISPLAY), as informações de versão do servidor X em uso,
o número e a listagem das extensões do Xorg em uso e mais informações sobre a tela em si.
Em algumas distribuições Linux, o comando X pode ser usado no lugar de Xorg, pois X é um
link simbólico para Xorg.
Um arquivo xorg.conf.new será criado em seu diretório de trabalho atual. O conteúdo desse
arquivo deriva-se do que o servidor X descobriu estar disponível em hardware e drivers no
sistema local. Para usar esse arquivo, ele deve ser movido para o diretório /etc/X11/ e
renomeado comoxorg.conf:
Wayland
Wayland é o protocolo de exibição mais recente, criado para substituir o X Window System.
Ele é o servidor de exibição padrão de muitas distribuições Linux modernas. Foi projetado
352 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]
para usar menos recursos do sistema e ocupar um espaço de instalação menor do que o X.
O projeto foi iniciado em 2010 e ainda está em desenvolvimento ativo, com a colaboração de
desenvolvedores e ex-desenvolvedores do X.org.
Ao contrário do X Window System, não existe uma instância de servidor executada entre o
cliente e o kernel. Em vez disso, uma janela do cliente trabalha com seu próprio código ou o
código de um kit de ferramentas (como Gtk + ou Qt) para realizar a renderização. Para que
a renderização seja feita, uma solicitação é enviada ao kernel do Linux por meio do protocolo
Wayland. O kernel encaminha a solicitação através do protocolo Wayland para o compositor
Wayland, que gerencia os dados inseridos pelo dispositivo, o gerenciamento de janelas e a
composição. O compositor é a parte do sistema que combina os elementos renderizados em
uma saída visual na tela.
Assim como o X Window System usa uma variável de ambiente DISPLAY para controlar as
telas em uso, o protocolo Wayland usa uma variável de ambiente WAYLAND_DISPLAY. Veja
abaixo um exemplo de saída de um sistema executando um monitor Wayland:
• Fonte: - https://pt.slideshare.net/gnomekr/gnome-on-waylandataglance/9
Fabio Gonçalves De Melo Santana / [email protected]
32
106.2_Areas_de_trabalho_grafi-
cas/
Introdução
Os sistemas operacionais baseados em Linux são conhecidos por sua avançada interface de linha
de comando, mas ela pode assustar um pouco os usuários sem uma formação mais técnica.
Para tornar o uso do computador mais intuitivo, a combinação de telas de alta resolução com
dispositivos apontadores deu origem a interfaces de usuário baseadas em imagens. Enquanto
a interface de linha de comando exige um conhecimento prévio dos nomes dos programas e
suas opções de configuração, a funcionalidade dos programas com interface gráfica do usuário
(GUI) pode ser acionada simplesmente clicando-se em elementos visuais familiares, o que torna
a curva de aprendizado bem mais suave. Além disso, a interface gráfica é mais adequada para
tarefas de multimídia e outras atividades visualmente orientadas.
354
355 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]
X Window System
No Linux e em outros sistemas operacionais semelhantes ao Unix, o X Window System (tam-
bém conhecido como X11 ou apenas X) fornece os recursos de baixo nível relacionados à
renderização da interface gráfica e à interação do usuário com ela, como:
Embora o X Window System seja responsável por controlar a exibição gráfica (o driver de
vídeo em si é parte do X), ele não se destina a desenhar elementos visuais complexos por
conta própria. Formas, cores, sombras e outros efeitos visuais são gerados pelo aplicativo que
roda em cima do X. Esta abordagem dá mais liberdade aos aplicativos para criar interfaces
personalizadas, mas também pode levar a sobrecargas de desenvolvimento que vão além do
escopo do aplicativo, além de inconsistências na aparência e no comportamento em relação a
outras interfaces de programas.
Ambiente de trabalho
A GUI tradicional consiste em diversas janelas—o termo janela refere-se aqui a qualquer área
autônoma da tela—associadas aos processos em execução. Como o X Window System sozinho
oferece apenas recursos interativos básicos, a experiência completa do usuário depende dos
componentes fornecidos pelo ambiente de área de trabalho.
Além dos componentes básicos da área de trabalho, que podem ser considerados programas
individuais por si sós, os ambientes de área de trabalho seguem a metáfora da escrivaninha,
fornecendo um conjunto mínimo de programas acessórios desenvolvidos a partir das mesmas
diretrizes de design. Todos os principais ambientes de desktop propõem variações dos seguintes
aplicativos:
Os ambientes de desktop podem incluir muitos outros serviços e aplicativos: a tela de login
inicial, o gerenciador de sessão, a comunicação entre processos, o chaveiro etc. Eles também
incorporam recursos fornecidos por serviços de terceiros, como o PulseAudio para som e o
CUPS para impressão. Esses recursos não necessitam do ambiente gráfico para funcionar, mas
o ambiente de trabalho fornece interfaces gráficas que facilitam sua configuração e operação.
O Gnome é um dos ambientes de desktop mais populares, sendo a primeira escolha em dis-
tribuições como Fedora, Debian, Ubuntu, SUSE Linux Enterprise, Red Hat Enterprise Linux,
CentOS, etc. Em sua versão 3, o Gnome recebeu uma grande repaginada em sua aparência e
estrutura, afastando-se da metáfora da escrivaninha e apresentando o Gnome Shell como sua
nova interface.
O iniciador de tela cheia de uso geral Gnome Shell Activities substituiu o iniciador de aplicativos
e a barra de tarefas tradicionais. No entanto, ainda é possível usar o Gnome 3 com a aparência
antiga escolhendo a opção Gnome Classic na tela de login.
O Xfce é um ambiente de desktop que visa ser esteticamente agradável sem consumir muitos
recursos da máquina. Sua estrutura é altamente modularizada, permitindo ao usuário ativar e
desativar componentes de acordo com suas necessidades e preferências.
Existem muitos outros ambientes de desktop para Linux, geralmente fornecidos por versões
alternativas das distribuições. A distribuição Linux Mint, por exemplo, propõe dois ambientes
de trabalho originais: o Cinnamon (um fork do Gnome 3) e o MATE (um fork do Gnome 2).
O LXDE é um ambiente de desktop adaptado para baixo consumo de recursos, sendo assim
uma boa escolha para instalação em equipamentos mais antigos ou computadores de placa
única. Embora não ofereça todas as capabilidades dos ambientes de trabalho mais pesados, o
LXDE inclui todos os recursos básicos esperados de uma interface gráfica de usuário moderna.
358 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]
A facilidade de uso oferecida pelos ambientes de desktop tem uma desvantagem em compara-
ção com as interfaces de texto como o shell: a capacidade de fornecer acesso remoto. Embora
o ambiente shell de linha de comando de uma máquina remota possa ser facilmente acessado
com ferramentas como ssh, o acesso remoto a ambientes gráficos requer métodos diferentes
e o desempenho nem sempre é satisfatório em conexões mais lentas.
Acesso não-local
O X Window System adota um design baseado em displays (telas) autônomos, nos quais o
mesmo X display manager (gerenciador de exibição X) pode controlar mais de uma sessão
de desktop gráfico ao mesmo tempo. Em essência, um display é análogo a um terminal de
359 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]
texto: ambos se referem a uma máquina ou aplicativo de software usado como um ponto
de entrada para estabelecer uma sessão independente do sistema operacional. Embora a
configuração mais comum envolva uma única sessão gráfica em execução na máquina local,
outras configurações menos convencionais também são possíveis:
As sessões de desktop remoto são suportadas nativamente pelo X, que emprega o X Display
Manager Control Protocol (XDMCP) para se comunicar com monitores remotos. Devido ao
alto uso de largura de banda, o XDMCP raramente é usado através da Internet ou em LANs
de baixa velocidade. Também há questões de segurança com o XDMCP: o display local se
comunica com um gerenciador de exibição X remoto privilegiado para executar procedimen-
tos remotos, portanto, uma eventual vulnerabilidade possibilitaria a execução de comandos
privilegiados arbitrários na máquina remota.
O Virtual Network Computing (VNC) é uma ferramenta não vinculada a uma plataforma que
permite visualizar e controlar ambientes de desktop remotos usando o protocolo Remote Frame
Buffer (RFB). Por meio dele, os eventos produzidos pelo teclado e mouse locais são transmi-
tidos para a área de trabalho remota, que por sua vez envia de volta quaisquer atualizações
de tela para serem exibidas localmente. É possível executar muitos servidores VNC na mesma
máquina, mas cada servidor VNC precisa de uma porta TCP exclusiva na interface de rede
que aceite solicitações de sessão de entrada. Por convenção, o primeiro servidor VNC deve
usar a porta TCP 5900, o segundo deve usar 5901 e assim por diante.
O servidor VNC não precisa de privilégios especiais para ser executado. Um usuário comum
pode, por exemplo, fazer login em sua conta remota e iniciar seu próprio servidor VNC a partir
de lá. Assim, na máquina local, qualquer aplicativo cliente VNC pode ser usado para acessar a
área de trabalho remota (supondo que as portas de rede correspondentes sejam alcançáveis).
O arquivo ~/.vnc/xstartup é um script de shell executado pelo servidor VNC quando ele inicia,
e pode ser usado para definir qual ambiente de desktop o servidor VNC disponibilizará para
o cliente VNC. É importante observar que nativamente o VNC não propõe métodos nativos
de criptografia e autenticação modernos, e por isso deve ser usado em conjunto com um
360 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]
aplicativo de terceiros que forneça esses recursos. Com frequência, usam-se métodos que
envolvem túneis VPN e SSH para proteger as conexões VNC.
O Remote Desktop Protocol (RDP) é usado sobretudo para acessar remotamente a área de
trabalho de um sistema operacional Microsoft Windows por meio da porta de rede TCP 3389.
Embora ele empregue o protocolo RDP proprietário da Microsoft, a implementação do cliente
usada nos sistemas Linux consiste em programas de código aberto licenciados sob a GNU
General Public License (GPL) e não tem restrições legais de uso.
33
106.3 Acessibilidade
Introdução
O ambiente de desktop do Linux inclui muitas configurações e ferramentas para adaptar a
interface do usuário a pessoas com deficiência. Os dispositivos de interface humana comuns
podem ser reconfigurados individualmente para compensar deficiências visuais ou uma mobil-
idade reduzida.
É possível, por exemplo, adaptar o esquema de cores da área de trabalho para melhor atender
pessoas daltônicas. Além disso, quem sofre de lesões por esforço repetitivo pode tirar proveito
de métodos alternativos de digitação e clique.
Alguns desses recursos de acessibilidade são fornecidos pelo próprio ambiente de área de
trabalho, como o Gnome ou o KDE, e outros são fornecidos por programas adicionais. Neste
último caso, é importante escolher a ferramenta que melhor se integra ao ambiente de trabalho,
para ter um auxílio de melhor qualidade.
Configurações de acessibilidade
As principais distribuições Linux incluem mais ou menos os mesmos recursos de acessibilidade,
que podem ser personalizados com um módulo especial no gerenciador de configurações que
vem com o ambiente de desktop. O módulo de configurações de acessibilidade é chamado de
Acesso universal na área de trabalho do Gnome, enquanto que no KDE ele está em Configu-
rações do sistema, Personalização, Acessibilidade. Outros ambientes de desktop, como o Xfce,
361
362 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
O Gnome, por exemplo, pode ser configurado para exibir permanentemente o menu de Acesso
Universal no canto superior direito da tela, permitindo ativar rapidamente as opções de aces-
sibilidade. Podemos usá-las, por exemplo, para substituir o alerta sonoro por um alerta visual,
permitindo que usuários com deficiência auditiva percebam os alertas do sistema com mais
facilidade. Embora o KDE não inclua um menu de acesso rápido semelhante, o recurso de
alerta visual também está disponível com o nome de sino visual.
O recurso Teclas de repercussão (Bounce keys) serve para inibir pressionamentos de tecla não
intencionais, adicionando um tempo de latência entre eles, ou seja, um novo pressionamento
de tecla será aceito somente após um período de tempo especificado desde o pressionamento
anterior. Com o recurso de teclas de repercussão, os usuários com tremores nas mãos evitam
os efeitos de pressionar uma tecla várias vezes quando pretendem pressioná-la apenas uma
vez. No Gnome, este recurso diz respeito apenas às repetições da mesma tecla. Já no KDE
são levados em conta os pressionamentos de outras teclas. Ele pode ser encontrado na guia
Filtros do teclado.
O recurso Teclas lentas (Slow keys) também ajuda a evitar toques acidentais nas teclas.
Quando ativadas, as teclas lentas exigem que o usuário mantenha a tecla pressionada por
363 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
um período de tempo especificado antes de ela ser aceita. Dependendo das necessidades do
usuário, também pode ser útil ajustar a repetição automática enquanto uma tecla é mantida
pressionada, disponível nas configurações do teclado.
Os recursos de acessibilidade de teclas de aderência e teclas lentas podem ser ativados e de-
sativados com Gestos de ativação realizados no teclado. No KDE, a opção Usar gestos para
ativar as teclas de aderência e as teclas lentas deve ser marcada para habilitar os Gestos de
Ativação, enquanto no Gnome esse recurso é chamado de Habilitar por Teclado na janela de
configuração do Assistente de Digitação. Assim que os Gestos de Ativação forem habilitados,
o recurso de teclas de aderência será ativado pressionando-se a tecla Shift cinco vezes consec-
utivas. Para ativar o recurso de teclas lentas, a tecla Shift deve ser mantida pressionada por
oito segundos consecutivos.
Os usuários que acham mais confortável usar o teclado em vez do mouse ou touchpad podem
recorrer aos atalhos de teclado para navegar no ambiente de trabalho. Além disso, um recurso
chamado Mouse por teclado permite que o usuário controle o próprio ponteiro do mouse com o
teclado numérico, presente em teclados de desktop de tamanho normal e em laptops maiores.
O teclado numérico é organizado em uma grade quadrada, de modo que cada número cor-
responde a uma direção: 2 move o cursor para baixo, 4 move o cursor para a esquerda, 7
move o cursor para o noroeste etc. Por padrão, o número 5 corresponde ao clique esquerdo
do mouse.
Ao passo que no Gnome há apenas um interruptor para habilitar a opção Mouse por teclado na
janela de configurações de Acesso universal, no KDE as configurações de Mouse por teclado
estão localizadas em Configurações do sistema, Mouse, Navegação por teclado. Certas opções,
como velocidade e aceleração, podem ser personalizadas.
As teclas lentas, teclas de aderência, teclas de repercussão e o mouse por teclado são
recursos de acessibilidade fornecidos pelo AccessX, um recurso existente na extensão
X keyboard do X Window System. As configurações do AccessX também podem ser
modificadas na linha de comando, com o comando xkbset.
O mouse ou o touchpad podem ser usados para gerar entrada de teclado quando o uso do
teclado físico for demasiado desconfortável ou impossível. Se a opção Teclado virtual nas
configurações de acesso universal do Gnome estiver habilitada, um teclado aparecerá na tela
sempre que o cursor estiver em um campo de texto; um novo texto é inserido clicando-se nas
teclas com o mouse ou os dedos em uma tela de toque, semelhante ao teclado virtual dos
smartphones.
O KDE e outros ambientes de área de trabalho nem sempre trazem o teclado virtual por padrão,
364 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
mas o pacote onboard, que pode ser instalado manualmente, oferece um teclado virtual simples
que pode ser usado em qualquer ambiente de área de trabalho. Após a instalação, ele ficará
disponível como um aplicativo normal no inicializador de aplicativos.
Se o usuário não conseguir pressionar um ou mais botões do mouse, os cliques podem ser
simulados usando diferentes técnicas. Na seção Assistência de clique do Acesso Universal do
Gnome, a opção Clique secundário simulado simula um clique com o botão direito se o usuário
pressionar e segurar o botão esquerdo do mouse. Com a opção Clique flutuante habilitada,
um evento de clique será disparado quando o usuário segurar o mouse sem movê-lo. No KDE,
o aplicativo KMouseTool fornece esses mesmos recursos para facilitar as ações com o mouse.
Deficiências visuais
Alguns usuários com visão reduzida ainda podem usar a tela do monitor para interagir com
o computador. Dependendo das necessidades do usuário, muitos ajustes visuais são possíveis
para refinar os detalhes de difícil visualização da área de trabalho gráfica padrão.
A seção Visão das configurações de Acesso universal do Gnome inclui opções que podem
ajudar pessoas com visão reduzida:
• Alto contraste - torna as janelas e botões mais visíveis exibindo-os em cores mais
contrastadas;
• Texto grande - amplia o tamanho padrão da fonte na tela;
• Tamanho do cursor - permite escolher um cursor maior e mais fácil de localizar na
tela.
Alguns desses ajustes não estão estritamente relacionados aos recursos de acessibilidade e,
portanto, podem ser encontrados na seção de aparência do utilitário de configuração fornecido
por outros ambientes de desktop. Um usuário que tenha dificuldade em discernir entre os
elementos visuais pode escolher um tema de alto contraste para facilitar a identificação de
botões, janelas sobrepostas etc.
opções como taxa de ampliação, posição da lupa e ajustes de cor podem ser personalizadas.
No KDE, o programa KMagnifier oferece os mesmos recursos, mas está disponível como um
aplicativo comum através do inicializador de aplicativos. Outros ambientes de desktop podem
fornecer seus próprios ampliadores de tela. O Xfce, por exemplo, permite aumentar e diminuir
o zoom da tela girando a roda de rolagem do mouse enquanto a tecla Alt está pressionada.
Finalmente, os usuários para os quais a interface gráfica não é uma opção podem usar um
leitor de tela para interagir com o computador. Independentemente do ambiente de trabalho
escolhido, o leitor de tela mais popular para os sistemas Linux é o Orca, que normalmente
vem instalado por padrão na maioria das distribuições. O Orca gera uma voz sintetizada que
descreve os eventos na tela e lê o texto sob o cursor do mouse. O Orca também funciona com
visores braille atualizáveis, dispositivos especiais que exibem caracteres em braille erguendo
pequenos pinos que podem ser sentidos com a ponta dos dedos. Nem todos os aplicativos de
desktop são totalmente adaptados para leitores de tela e nem todos os usuários acharão fácil
usá-los, por isso é importante fornecer o máximo possível de estratégias de leitura de tela para
os usuários terem escolha.
Resumo
Esta aula cobre os recursos gerais de acessibilidade disponíveis nos sistemas Linux. Todos os
principais ambientes de desktop, especialmente o Gnome e o KDE, fornecem diversos aplica-
tivos integrados e de terceiros para auxiliar as pessoas com deficiência visual ou mobilidade
reduzida. A lição abrange os seguintes tópicos:
Introdução
A administração de usuários e grupos é uma parte fundamental do trabalho de qualquer
administrador de sistema. As distribuições Linux modernas incluem interfaces gráficas que
permitem gerenciar todas as atividades relacionadas a este aspecto com rapidez e facilidade.
Essas interfaces são visualmente diferentes entre si, mas os recursos são os mesmos. Com
essas ferramentas, torna-se possível visualizar, editar, adicionar e excluir usuários e grupos
locais. No entanto, para tarefas de gerenciamento mais avançadas, é necessário usar a linha
de comando.
Depois de criar o novo usuário, você pode definir a senha dele usando o comando passwd. Para
rever o ID de usuário (UID), ID de grupo (GID) e os grupos aos quais esse usuário pertence,
usamos os comandos id e groups.
Lembre-se de que qualquer usuário pode consultar seu UID, GID e os grupos aos
quais pertence simplesmente usando os comandos id e groups sem argumentos, e que
367 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
qualquer usuário pode alterar sua própria senha com o comando passwd. No entanto,
apenas os usuários com privilégios de root podem alterar a senha de qualquer usuário.
• -c - Cria uma nova conta de usuário com comentários personalizados (por exemplo, o
nome completo do usuário);
• -d - Cria uma nova conta de usuário com um diretório pessoal personalizado;
• -e - Cria uma nova conta de usuário definindo uma data específica na qual ela será
desabilitada;
• -f - Cria uma nova conta de usuário definindo o número de dias após a expiração de
uma senha durante os quais o usuário deve atualizar a senha (caso contrário, a conta
será desabilitada);
• -g - Cria uma nova conta de usuário com um GID específico;
• -G - Cria uma nova conta de usuário adicionando-a a diversos grupos secundários;
• -k - Cria uma nova conta de usuário copiando os arquivos de esqueleto de um diretório
personalizado específico (esta opção só é válida se a opção -m ou –create-home for
especificada);
• -m - Cria uma nova conta de usuário com seu diretório inicial (se ele não existir);
• -M - Cria uma nova conta de usuário sem seu diretório inicial;
• -s - Cria uma nova conta de usuário com um shell de login específico;
• -u - Cria uma nova conta de usuário com um UID específico.
Nos exemplos acima, o shell de login de joatham é alterado primeiro e, em seguida, uma breve
descrição é adicionada a esta conta de usuário. Lembre-se de que podemos modificar diversos
atributos de uma vez, especificando-os em um único comando.
Lembre-se que, ao alterar o nome de login de uma conta de usuário, você provavel-
mente deve renomear o diretório pessoal desse usuário e outros itens relacionados a
ele, como arquivos de spool de email. Lembre-se também que, ao alterar o UID de
uma conta de usuário, provavelmente será preciso corrigir a propriedade dos arquivos
e diretórios que estejam fora do diretório inicial do usuário (o ID do usuário é alterado
automaticamente na caixa de email do usuário e em todos os arquivos pertencentes
ao usuário e localizados no diretório inicial do usuário).
Quanto a useradd e usermod, é necessário ter autoridade de root para excluir contas de usuário.
Lembre-se de que quando você adiciona uma nova conta de usuário, o grupo primário
e os grupos secundários aos quais ela pertence precisam existir antes de iniciar o
comando useradd.
Mais tarde, se você quiser renomear o grupo desenvolvedor para desenvolvedor_web e alterar
seu GID, pode executar o seguinte:
Se você alterar o GID usando a opção -g, será necessário alterar o GID de todos os
arquivos e diretórios que precisam continuar a pertencer ao grupo.
Não é possível excluir um grupo caso se trate do grupo principal de uma conta de usuário.
Portanto, é preciso remover o usuário antes de remover o grupo. Quanto aos usuários, se
você excluir um grupo, os arquivos pertencentes a esse grupo permanecerão em seu sistema
de arquivos e não serão excluídos ou atribuídos a outro grupo.
370 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
O diretório de esqueleto
Quando você adiciona uma nova conta de usuário e cria seu diretório inicial, o diretório inicial
recém-criado é preenchido com arquivos e pastas copiados do diretório de esqueleto (por
padrão /etc/skel). A ideia é simples: um administrador de sistema deseja adicionar novos
usuários que tenham os mesmos arquivos e diretórios em sua pasta pessoal. Portanto, caso
queira personalizar os arquivos e pastas criados automaticamente no diretório inicial das novas
contas de usuário, você deve adicionar esses novos arquivos e pastas ao diretório de esqueleto.
O arquivo /etc/login.defs
No Linux, o arquivo /etc/login.defs especifica os parâmetros de configuração que controlam
a criação de usuários e grupos. Além disso, os comandos mostrados nas seções anteriores
utilizam os valores padrão deste arquivo.
Ao gerenciar usuários e grupos, sempre verifique este arquivo para visualizar e, even-
tualmente, alterar o comportamento padrão do sistema, se necessário.
371 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
O comando passwd
Este comando é usado principalmente para alterar a senha de um usuário. Conforme descrito
anteriormente, qualquer usuário pode alterar sua própria senha, mas apenas o root pode alterar
a senha de qualquer usuário. Isso acontece porque o comando passwd tem o bit SUID definido
(um s no lugar do sinalizador executável para o proprietário), o que significa que ele é executado
com os privilégios do proprietário do arquivo (portanto, root).
root@debian10:/home/debian# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 42096 mag 17 2015 /usr/bin/passwd
Dependendo das opções utilizadas com passwd, é possível controlar aspectos específicos do
envelhecimento da senha:
Os grupos também podem ter uma senha, que pode ser definida usando o comando
gpasswd. Os usuários que não são membros de um grupo, mas conhecem a senha
podem ingressar nele temporariamente usando o comando newgrp. gpasswd também
é usado para adicionar e remover usuários de um grupo, e para definir a lista de
administradores e membros comuns do grupo.
O comando chage
Este comando, que significa “alterar idade” (change age), é usado para alterar as informações
de validade da senha de um usuário. O comando chage é restrito ao root, exceto com a opção
-l, que pode ser executada por usuários comuns para listar informações sobre a expiração de
372 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]
• /etc/passwd - Um arquivo de sete campos delimitados por dois pontos contendo in-
formações básicas sobre os usuários;
• /etc/group - Um arquivo de quatro campos delimitados por dois pontos contendo
informações básicas sobre os grupos;
• /etc/shadow - Um arquivo de nove campos delimitados por dois pontos contendo
senhas de usuário criptografadas;
• /etc/gshadow - Um arquivo de quatro campos delimitados por dois pontos contendo
senhas de grupo criptografadas.
Embora esses quatro arquivos estejam em texto simples, eles não devem jamais ser editados
diretamente, mas sim por meio das ferramentas fornecidas pela distribuição que se está usando.
/etc/passwd
Este é um arquivo legível por todos contendo uma lista de usuários em linhas separadas. Cada
linha consiste em sete campos delimitados por dois pontos:
/etc/group
Este é um arquivo legível por todos contendo uma lista de grupos em linhas separadas. Cada
linha consiste em quatro campos delimitados por dois pontos:
/etc/shadow
Este é um arquivo que pode ser lido apenas pelo root e por usuários com privilégios de root
contendo senhas de usuário criptografadas em linhas separadas. Cada linha consiste em nove
campos delimitados por dois pontos:
/etc/gshadow
Este é um arquivo legível apenas pelo root e por usuários com privilégios de root que contém
senhas criptografadas para grupos em linhas separadas. Cada linha consiste em quatro campos
delimitados por dois pontos:
Outra maneira de acessar esses bancos de dados é usar o comando getent. Em geral, esse
comando exibe entradas de bancos de dados suportados pelas bibliotecas Name Service Switch
(NSS) e requer o nome do banco de dados e uma chave de pesquisa. Se nenhum argumento-
chave for fornecido, todas as entradas do banco de dados especificado serão exibidas (a menos
que o banco de dados não suporte enumeração). Caso contrário, se um ou mais argumentos-
chave forem fornecidos, o banco de dados será filtrado de acordo.
O comando getent não requer autoridade de root; você só precisa ter a permissão para ler o
banco de dados do qual deseja recuperar os registros.
- Fonte: - https://blog.csdn.net/weixin_42499201/article/details/117778817
Fabio Gonçalves De Melo Santana / [email protected]
34
107.2 Automatizar tarefas de
administração do sistema
agendando trabalhos
Introdução
Cara, tenho certeza de que vez ou outra você já precisou ou pensou em agendar uma tarefa
aqui no Linux pra economizar trabalho manual. E essa ideia vem muito bem a calhar, pois
uma das funções mais importantes de um bom administrador de sistema é agendar os jobs
(trabalhos) que precisam ser executados regularmente. Por exemplo, um administrador pode
criar e automatizar jobs para fazer backups, atualizações do sistema e muitas outras atividades
repetitivas. Para isso, usamos o recurso cron, que serve para automatizar o agendamento de
tarefas periódicas.
376
377 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]
Crontabs de usuário
Os crontabs de usuário são arquivos de texto que gerenciam o agendamento de trabalhos cron
definidos pelo usuário. Eles sempre têm o nome da conta de usuário que os criou, mas a
localização desses arquivos depende da distribuição usada (geralmente é um subdiretório de
/var/spool/cron).
Cada linha em um crontab de usuário contém seis campos separados por um espaço:
Para o mês do ano e o dia da semana, podemos usar as três primeiras letras do nome em vez
do número correspondente.
Os primeiros cinco campos indicam quando executar o comando especificado no sexto campo,
e podem conter um ou mais valores. Em particular, é possível especificar vários valores usando:
Muitas distribuições incluem o arquivo /etc/crontab, que pode ser usado como referência para
a disposição dos elementos de um arquivo cron. Eis um exemplo de arquivo /etc/crontab de
uma instalação de Debian:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Crontabs de sistema
Os crontabs de sistema são arquivos de texto que gerenciam a programação de cron jobs
do sistema e só podem ser editados pelo usuário root. /etc/crontab e todos os arquivos no
diretório /etc/cron.d são crontabs de sistema.
A maioria das distribuições inclui também os diretórios /etc/cron.hourly (de hora em hora),
/etc/cron.daily (diariamente), /etc/cron.weekly (semanalmente) e /etc/cron.monthly (men-
salmente), que contêm scripts que devem ser executados com a frequência adequada. Por
exemplo, se você quiser executar um script diariamente, pode colocá-lo em /etc/cron.daily.
A sintaxe dos crontabs de sistema é semelhante à dos crontabs de usuário, porém ela requer
um campo adicional obrigatório que especifica qual usuário executará o cron job. Portanto,
cada linha em um crontab de sistema contém sete campos separados por um espaço:
Quanto aos crontabs do usuário, podemos especificar mais de um valor nos campos de tempo
usando os operadores *, ,, - e /. Também é possível indicar o mês do ano e o dia da semana
com as três primeiras letras do nome em vez do número correspondente.
• @monthly: Roda a tarefa especificada uma vez por mês, à meia-noite do primeiro dia
do mês;
• @yearly (or @annually): Roda a tarefa especificada uma vez por ano, à meia-noite de 1ž
de janeiro.
Variáveis no crontab
Dentro de um arquivo crontab, pode haver atribuições de variáveis definidas antes que as
tarefas agendadas sejam declaradas. As variáveis de ambiente comumente definidas são:
• HOME: O diretório no qual o cron invoca os comandos (por padrão, o diretório inicial
do usuário);
• MAILTO: O nome do usuário ou o endereço para o qual a saída e o erro padrão são
enviados (por padrão, o proprietário do crontab). Diversos valores separados por vírgulas
também são permitidos, e um valor vazio indica que nenhum email deve ser enviado;
• PATH: O caminho no qual os comandos podem ser encontrados;
• SHELL: O shell a ser usado (por padrão /bin/sh).
root@debian10:/home/debian$ crontab -e
no crontab for joatham - using an empty one
Por padrão, o comando crontab abre o editor especificado pelas variáveis de ambiente VISUAL
ou EDITOR, para que você possa começar a editar seu arquivo crontab com o editor de sua
preferência. Algumas distribuições, como mostrado no exemplo acima, permitem escolher o
editor em uma lista quando crontab é executado pela primeira vez.
Se você deseja executar o script teste2.sh, localizado em seu diretório inicial, todos os dias às
10:00, adicione a seguinte linha ao seu arquivo crontab:
380 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]
0 10 * * * /home/joatham/teste2.sh
0,15,30,45 08 * * 2 /home/joatham/teste.sh
30 20 1-15 1,6 1-5 /home/joatham/teste2.sh
Além da opção -e mencionada acima, o comando crontab inclui outras opções úteis:
Por exemplo, para executar o script teste2.sh localizado no diretório /root todos os dias à
01:30, abra /etc/crontab com seu editor preferido e adicione a seguinte linha:
Exceto nos casos em que a saída é redirecionada para um arquivo, como no exemplo
acima (ou se a variável MAILTO estiver definida como um valor em branco), toda a
saída de um trabalho cron será enviada ao usuário via email. Uma prática comum é
redirecionar a saída padrão para /dev/null (ou para um arquivo, para revisão posterior,
se necessário) e não redirecionar o erro padrão. Desta forma, o usuário é notificado
imediatamente por email sobre eventuais erros.
Um temporizador inclui uma seção [Timer] que especifica quando os jobs agendados devem ser
executados. Especificamente, podemos usar a opção OnCalendar= para definir temporizadores
em tempo real, que funcionam da mesma maneira que os cron jobs (baseiam-se na expressão
de eventos de calendário). A opção OnCalendar= requer a seguinte sintaxe:
sendo DayOfWeek opcional. Os operadores *, / e , têm o mesmo significado dos que são
usados para cron jobs. Usamos .. entre dois valores para indicar um intervalo contíguo. Na
especificação DayOfWeek (dia da semana), podemos usar as primeiras três letras do nome ou
o nome completo.
Você também pode definir temporizadores monotônicos, que são ativados após algum
tempo decorrido de um ponto de início específico (por exemplo, quando a máquina
foi inicializada ou quando o próprio temporizador foi ativado).
[Unit]
Description=Run the servico service
[Timer]
OnCalendar=Mon *-*-1..7 05:30:00
Persistent=true
[Install]
WantedBy=timers.target
Depois de criar o novo temporizador, você pode ativá-lo e iniciá-lo executando os seguintes
comandos como root:
Finalmente, se você quiser ver a lista de temporizadores ativos ordenados pelo momento em
que terminam, use o comando systemctl list-timers. A opção –all exibe também as unidades
de temporizador inativas.
Em vez da forma normalizada mais longa mencionada acima, é possível usar algumas expressões
especiais que descrevem frequências específicas para a execução de um job:
• hourly - Roda a tarefa especificada uma vez por hora, no início da hora;
• daily - Roda a tarefa especificada uma vez por dia à meia-noite;
• weekly - Roda a tarefa especificada uma vez por semana, na meia-noite de segunda-
feira;
• monthly - Roda a tarefa especificada uma vez por mês, na meia-noite do primeiro dia
do mês;
• yearly - Roda a tarefa especificada uma vez por ano, na meia-noite de 1ž de janeiro.
O job at no exemplo acima simplesmente executa o comando date após cinco minutos. Como
no caso do cron, a saída padrão e o erro são enviados por email. Observe que o daemon atd
precisará estar rodando no sistema para ser possível usar o agendamento de tarefas at.
No Linux, o comando batch é semelhante a at, porém os jobs batch são executados
apenas quando a carga do sistema está baixa o suficiente para permiti-lo.
root@debian10:/home/debian# at 09:30 AM
warning: commands will be executed using /bin/sh
at> ./teste2.sh
at> Ctrl+D
job 13 at Sat Sep 14 09:30:00 2021
root@debian10:/home/debian# at now +2 hours
warning: commands will be executed using /bin/sh
at> ./teste.sh
at> Ctrl+D
job 14 at Sat Sep 14 11:10:00 2021
Para listar os jobs pendentes, use o comando atq, que mostra as seguintes informações para
cada job: ID do trabalho, data de execução do trabalho, tempo de execução do trabalho, fila
e nome de usuário.
root@debian10:/home/debian# atq
14 Sat Sep 14 11:10:00 2021 a joatham
13 Sat Sep 14 09:30:00 2021 a joatham
12 Sat Sep 14 09:15:00 2021 a joatham
Se você executar atq como root, ele exibirá os trabalhos na fila para todos os usuários.
root@debian10:/home/debian# atrm 14
É possível excluir vários trabalhos com atrm especificando diversos IDs separados por espaços.
Lembre-se de que o comando at -d é um alias de atrm.
O usuário que rodar atrm como root pode excluir os jobs de todos os outros usuários.
Especificações de tempo
Para especificar quando um job at determinado deve ser executado, use o formato HH:MM,
seguido opcionalmente por AM ou PM no caso do formato de 12 horas. Se o momento
especificado já tiver passado, a instrução é aplicada no dia seguinte. Para agendar uma data
em particular para executar o job, é preciso adicionar as informações de data após a hora
usando um dos formatos a seguir: nome-do-mês dia-do-mês, nome-do-mês dia-do-mês ano,
MMDDYY, MM/DD/YY, DD.MM.YY e YYYY-MM-DD).
Uma alternativa ao at
Usando o systemd como gerenciador de sistema e serviços, também é possível agendar tare-
fas únicas com o comando systemd-run. Normalmente ele é usado para criar uma unidade
386 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]
Se quiser executar o script teste2.sh, localizado em seu diretório atual, depois de dois minutos,
use:
CRONTAB
• Fonte: - https://twitter.com/techparida/status/1293072657043173378
Fabio Gonçalves De Melo Santana / [email protected]
35
107.3 Localização e
internacionalização
Introdução
Todas as principais distribuições Linux podem ser configuradas para usar configurações de
localização personalizadas. Essas configurações incluem definições relacionadas à região e
ao idioma, como fuso horário, idioma da interface e codificação de caracteres, e podem ser
modificadas durante a instalação do sistema operacional ou a qualquer momento depois disso.
Para serem capazes de representar qualquer texto escrito, independentemente da língua falada,
os sistemas operacionais modernos precisam de um padrão de codificação de caracteres de
referência, e os sistemas Linux não fogem à regra. Como os computadores só conseguem lidar
com números, um caractere de texto nada mais é do que um número associado a um símbolo
gráfico. Plataformas de computação distintas podem associar valores numéricos distintos ao
mesmo caractere e, portanto, um padrão comum de codificação de caracteres é necessário
para torná-los compatíveis. Um documento de texto criado em um sistema só será legível
387
388 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
A natureza heterogênea das configurações de localização nos sistemas baseados em Linux re-
sulta em diferenças sutis entre as distribuições. Apesar dessas diferenças, todas as distribuições
compartilham as mesmas ferramentas e conceitos básicos para configurar os aspectos de in-
ternacionalização de um sistema.
Fusos horários
Os fusos horários são faixas distintas da superfície da Terra, aproximadamente proporcionais,
abrangendo o equivalente a uma hora, ou seja, regiões do mundo que experimentam a mesma
hora do dia no mesmo momento. Uma vez que não existe uma única longitude que possa
ser considerada como o início do dia para o mundo inteiro, os fusos horários são relativos
ao meridiano primário, onde o ângulo de longitude da Terra foi definido como 0. O tempo
no primeiro meridiano é chamado de Tempo Universal Coordenado, por convenção abreviado
para UTC. Por razões práticas, os fusos horários não seguem a distância longitudinal exata a
partir do ponto de referência (o meridiano principal). Em vez disso, eles são artificialmente
adaptados de forma a seguir as fronteiras dos países ou outras subdivisões significativas.
As subdivisões políticas são tão relevantes que os fusos horários recebem nomes que home-
nageiam algum agente geográfico importante daquela área específica, geralmente com base
no nome de um grande país ou cidade dentro da zona. No entanto, os fusos horários são
divididos de acordo com seu deslocamento de tempo em relação a UTC; esse deslocamento
também pode ser usado para indicar o fuso em questão. O fuso horário GMT-5, por exemplo,
indica uma região na qual o horário UTC está cinco horas à frente, ou seja, essa região está
5 horas atrás do UTC. Da mesma forma, o fuso horário GMT+3 indica uma região na qual o
horário UTC está três horas atrás. O termo GMT—de Greenwich Mean Time—é usado como
sinônimo de UTC nos nomes de fusos horários que indicam a diferença de hora.
Uma máquina conectada pode ser acessada de diferentes partes do mundo, de forma que é
aconselhável definir o relógio do hardware para UTC (o fuso horário GMT+0) e deixar a escolha
do fuso horário para cada caso particular. Os serviços em nuvem, por exemplo, costumam
ser configurados para usar UTC, o que pode ajudar a mitigar eventuais inconsistências entre
o horário local e o horário dos clientes ou de outros servidores. Por outro lado, os usuários
que abrem uma sessão remota no servidor podem querer usar seu fuso horário local. Assim,
caberá ao sistema operacional configurar o fuso horário correto de acordo com cada caso.
Além da data e hora atuais, o comando date também exibe o fuso horário atualmente con-
figurado:
389 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# date
Mon Oct 21 10:45:21 -03 2019
O deslocamento em relação a UTC é dado pelo valor -03, que indica que a hora exibida é três
horas a menos que UTC. Portanto, o horário UTC está três horas à frente, e assim GMT-3
é o fuso horário correspondente para as configurações de tempo especificadas. O comando
timedatectl, disponível em distribuições que usam o systemd, mostra mais detalhes sobre a
data e hora do sistema:
root@debian10:/home/debian# timedatectl
Local time: Sat 2019-10-19 17:53:18 -03
Universal time: Sat 2019-10-19 20:53:18 UTC
RTC time: Sat 2019-10-19 20:53:18
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
Como vemos na entrada Time zone, nomes de fusos horários baseados em localidades—como
America/Sao_Paulo—também são aceitos. O fuso horário padrão para o sistema é mantido no
arquivo /etc/timezone, seja com o nome descritivo ou com a diferença de hora em relação
a UTC. Os nomes genéricos de fusos horários indicados pela diferença em relação a UTC
devem incluir Etc na primeira parte do nome. Assim, para definir o fuso horário padrão como
GMT+3, o nome do fuso horário deve ser Etc/GMT+3:
Embora os nomes de fusos horários com base em localidades não exijam a indicação da
diferença de hora para funcionar, eles não são tão fáceis de escolher. A mesma zona pode ter
mais de um nome, sendo assim mais difícil de lembrar. Para mitigar este problema, o comando
tzselect oferece um método interativo que guia o usuário na definição correta do fuso horário.
O comando tzselect deve estar disponível por padrão em todas as distribuições Linux, já que
é fornecido pelo pacote que contém utilitários necessários relacionados à Biblioteca GNU C.
O comando tzselect será útil, por exemplo, para um usuário que deseja identificar o fuso
horário da “Cidade de São Paulo” no “Brasil”. O tzselect começa perguntando qual a macror-
região do local desejado:
390 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
8) Indian Ocean
9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 2
O território brasileiro abrange quatro fusos horários; portanto, o nome do país por si só não
basta para definir o fuso horário. Na etapa seguinte, o tzselect pede que o usuário especifique
a região local:
5) Tocantins
6) Alagoas, Sergipe
7) Bahia
8) Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
9) Mato Grosso do Sul
10) Mato Grosso
11) Pará (west)
12) Rondônia
13) Roraima
14) Amazonas (east)
15) Amazonas (west)
16) Acre
#? 8
Nem todos os nomes de localidade estão presentes, mas escolher a região mais próxima já
basta. As informações fornecidas serão então usadas pelo tzselect para exibir o fuso horário
correspondente:
Brazil
Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
You can make this change permanent for yourself by appending the line
TZ='America/Sao_Paulo'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
America/Sao_Paulo
O nome do fuso horário resultante, America/Sao_Paulo, também pode ser usado como o
conteúdo de /etc/timezone para informar o fuso horário padrão para o sistema:
o fuso horário das sessões futuras do usuário. A variável TZ também pode ser modificada
temporariamente durante a sessão atual, a fim de exibir a hora em um fuso horário diferente:
No exemplo, o comando env executa o comando fornecido em uma nova sessão de sub-shell
com as mesmas variáveis de ambiente da sessão atual, exceto pela variável TZ, modificada
pelo argumento TZ=‘Africa/Cairo’.
Horário de verão
Muitas regiões adotam o horário de verão, quando os relógios são normalmente adiantados
em uma hora, em parte do ano, o que pode levar um sistema mal configurado a relatar a hora
errada durante aquela estação do ano.
O arquivo /etc/localtime contém os dados usados pelo sistema operacional para ajustar seu
relógio corretamente. Os sistemas Linux padrão têm arquivos para todos os fusos horários
no diretório /usr/share/zoneinfo/, de modo que /etc/localtime é apenas um link simbólico
para o arquivo de dados real dentro desse diretório. Os arquivos em /usr/share/zoneinfo/ são
organizados pelo nome do fuso horário correspondente, então o arquivo de dados para o fuso
horário America/Sao_Paulo será /usr/share/zoneinfo/America/Sao_Paulo.
Como as definições de horário de verão podem mudar, é importante manter em dia os ar-
quivos de /usr/share/zoneinfo/. O comando de atualização da ferramenta de gerenciamento
de pacotes fornecida pela distribuição deve atualizá-los sempre que uma nova versão estiver
disponível.
Conforme visto na saída deste exemplo, a variável LANG também contém a codificação de
caracteres destinada ao sistema. O ASCII, abreviação de American Standard Code for Infor-
mation Interchange, foi o primeiro padrão de codificação de caracteres amplamente usado para
comunicação eletrônica. No entanto, como o ASCII tem uma gama muito limitada de valores
numéricos disponíveis e foi baseado no alfabeto inglês, ele não contém caracteres usados por
outros idiomas ou um conjunto extenso de símbolos não-alfabéticos. A codificação UTF-8 é
um Padrão Unicode para os caracteres ocidentais comuns, além de diversos outros símbolos
não convencionais.
Além da variável LANG, outras variáveis de ambiente afetam aspectos específicos da localidade,
como o símbolo monetário ou o separador de milhar correto para números:
root@debian10:/home/debian# locale
LANG=pt_BR.UTF-8
LC_CTYPE="pt_BR.UTF-8"
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="pt_BR.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="pt_BR.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=
A única variável indefinida é LC_ALL, que pode ser usada para substituir temporariamente
todas as outras configurações locais. O exemplo a seguir mostra como o comando date, sendo
executado em um sistema configurado para a localidade pt_BR.UTF-8, modifica sua saída de
forma a cumprir a nova variável LC_ALL:
root@debian10:/home/debian# date
seg out 21 10:45:21 -03 2019
root@debian10:/home/debian# env LC_ALL=en_US.UTF-8 date
Mon Oct 21 10:45:21 -03 2019
A modificação da variável LC_ALL fez com que ambas as abreviações de dia da semana e
nome do mês fossem mostradas em inglês americano (en_US). Não é obrigatório, entretanto,
definir a mesma localidade para todas as variáveis. É possível, por exemplo, ter a linguagem
definida como pt_BR e o formato numérico (LC_NUMERIC) no padrão americano.
Algumas configurações de localização alteram a forma como os programas lidam com a ordem
alfabética e formatos de numeração. Embora os programas convencionais geralmente sejam
capazes de escolher corretamente uma localidade comum para essas situações, os scripts po-
dem se comportar de forma inesperada ao tentar ordenar corretamente uma lista de itens em
395 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
ordem alfabética, por exemplo. Por este motivo, recomenda-se definir a variável de ambiente
LANG para a localidade comum C, como em LANG=C, para que o script produza resultados
inequívocos, independentemente das definições de localização usadas no sistema onde é exe-
cutado. A localidade C realiza apenas uma comparação simples de bytes e, portanto, também
terá um desempenho melhor do que as outras.
Conversão de codificação
Um texto pode aparecer com caracteres ilegíveis quando exibido em um sistema com uma
configuração de codificação de caracteres diferente do sistema onde o texto foi criado. O
comando iconv ajuda a resolver este problema, convertendo o arquivo de sua codificação
de caracteres original para a desejada. Por exemplo, para converter um arquivo de nome
original.txt da codificação ISO-8859-1 no arquivo converted.txt utilizando a codificação UTF-
8, o seguinte comando pode ser usado:
Introdução
A prática de controlar a hora pode parecer trivial para o usuário final, mas o sistema precisa
ser capaz de lidar com muitas características e casos extremos de forma inteligente. É preciso
levar em conta o fato de que os fusos horários não são estáticos, mas podem ser alterados
por uma decisão administrativa ou política. Nosso país optou por acabar com o horário de
verão. Felizmente para os administradores de sistema, as soluções para o controle de data e
hora no sistema operacional Linux são maduras, robustas e geralmente funcionam sem muita
interferência.
Quando um computador Linux é inicializado, ele começa a marcar o tempo. Nós nos referimos
a isso como o relógio do sistema, uma vez que é atualizado pelo sistema operacional. Além
disso, os computadores modernos também têm um relógio de hardware ou de tempo real.
Esse relógio de hardware é um recurso da placa-mãe que marca o tempo, esteja o computador
funcionando ou não. Durante a inicialização, a hora do sistema é definida a partir do relógio
396 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
de hardware, mas na maioria das vezes esses dois relógios funcionam independentemente um
do outro.
Na maioria dos sistemas Linux modernos, a hora do sistema e a hora do hardware são sin-
cronizadas com a hora da rede, implementada pelo Network Time Protocol (NTP). Na grande
maioria dos casos, a única configuração que um usuário normal precisa fazer é definir seu fuso
horário; o NTP cuida do resto.
O relógio do sistema pode ser definido para a hora UTC ou local, mas é recomendável que
também seja definido para a hora UTC.
Date
date é um utilitário nativo que simplesmente imprime a hora local:
root@debian10:/home/debian# date
Sun Jun 17 12:55:06 EST 2021
root@debian10:/home/debian# date -u
Sun Jun 17 18:02:51 UTC 2021
Outras opções comumente usadas retornam a hora local em um formato RFC aceito:
• -I: Data/hora no formato ISO 8601. Anexar =date limita a saída apenas à data. Outros
formatos são hours, minutes, seconds e ns (para nanossegundos);
• -R: Retorna data e hora no formato RFC 5322;
• –rfc-3339: Retorna data e hora no formato RFC 3339.
397 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
O formato de date pode ser personalizado pelo usuário com as sequências especificadas na
página de manual. Por exemplo, a hora atual pode ser formatada como tempo do Unix da
seguinte maneira:
O tempo do Unix é usado internamente na maioria dos sistemas baseados em Unix. Ele
armazena a hora UTC como o número de segundos desde a Época, que foi definida como 1ž
de janeiro de 1970.
Usando essas sequências, podemos formatar a data e a hora em quase todos os formatos
exigidos por qualquer aplicativo. Claro, na maioria dos casos é preferível seguir um padrão
aceito.
Além disso, date –date pode ser usado para formatar um horário que não seja a hora atual.
Neste caso, um usuário pode especificar a data a ser aplicada ao sistema usando o tempo do
Unix, por exemplo:
A opção –debug é muito útil para garantir que uma data possa ser analisada com sucesso.
Observe o que acontece ao passarmos uma data válida para o comando:
Essa é uma ferramenta útil para a resolução de problemas em um aplicativo que gera uma
398 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
data.
Relógio do hardware
O comando hwclock exibe a hora mantida no relógio de tempo real. Este comando exige
privilégios elevados, portanto, usamos sudo para chamar o comando neste caso:
A opção –verbose retorna mais resultados, que podem ser úteis para solucionar problemas:
Observe o Calculated Hardware Clock drift. Esta saída informa se a hora do sistema e a hora
do hardware estão divergindo uma da outra.
timedatectl
timedatectl é um comando que pode ser usado para verificar o status geral de hora e data,
incluindo se a hora da rede foi ou não sincronizada (na próxima lição, trataremos do Network
Time Protocol).
Por padrão, timedatectl retorna informações semelhantes a date, mas com a adição da hora
RTC (hardware), bem como o status do serviço NTP:
root@debian10:/home/debian# timedatectl
Local time: Thu 2021-12-05 11:08:05 EST
Universal time: Thu 2021-12-05 16:08:05 UTC
RTC time: Thu 2021-12-05 16:08:05
Time zone: America/Toronto (EST, -0500)
System clock synchronized: yes
399 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
A lista de fusos horários possíveis é longa, por isso o uso do comando grep é recomendado
neste caso.
Em seguida, podemos definir o fuso horário usando um dos elementos da lista retornada:
Os arquivos zoneinfo contêm as regras necessárias para calcular a diferença de horário local
em relação a UTC, e também são importantes se a sua região segue o horário de verão. O
conteúdo de /etc/localtime será lido quando o Linux precisar determinar o fuso horário local.
Para definir o fuso horário sem o uso de uma GUI, o usuário deve criar um link simbólico de
/usr/share/zoneinfo para /etc/localtime informando sua localização. Por exemplo:
Isso configurará o relógio do hardware a partir do relógio do sistema (ou seja, o relógio em
401 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]
tempo real será configurado para a mesma hora que date). Note que este comando é executado
com privilégios de root, neste caso, você está logado como root.
Observe que este arquivo não é usado por todas as distribuições Linux.
Fabio Gonçalves De Melo Santana / [email protected]
36
Configurando data e hora sem
timedatectl
A maioria dos sistemas Linux modernos usa o systemd para sua configuração e serviços,
assim, não é recomendado usar date ou hwclock para definir a hora. O systemd
emprega para isso o timedatectl. No entanto, é importante conhecer esses comandos
legados no caso de você precisar administrar um sistema mais antigo.
Usando date
date tem uma opção para definir a hora do sistema. Use –set ou -s para definir a data e hora.
Também há a opção –debug para verificar a análise correta do comando:
Neste caso, é necessário ter privilégios de root para definir a data. Também podemos optar
por alterar a hora ou data independentemente:
Aqui, devemos especificar as sequências para que nossa string seja analisada corretamente. Por
402
403 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]
exemplo, %Y refere-se ao ano e, portanto, os primeiros quatro dígitos 2011 serão interpretados
como o ano de 2011. Da mesma forma, %T é a sequência de hora, como demonstrado aqui
ao definirmos a hora:
Usando hwclock
Em vez de definir o relógio do sistema e atualizar o relógio do hardware, podemos optar por
reverter o processo. Começaremos ajustando o relógio do hardware:
Note que, por padrão, hwclock espera a hora UTC, mas retorna a hora local.
O NTP emprega uma estrutura hierárquica para divulgar o tempo. Os relógios de referência
são conectados a servidores no topo da hierarquia. Esses servidores são máquinas Estrato
1 e, normalmente, não são acessíveis ao público. As máquinas Estrato 1 são, entretanto,
acessíveis a máquinas Estrato 2, por sua vez acessíveis a máquinas Estrato 3 e assim por
diante. Os servidores Estrato 2 são acessíveis ao público, assim como qualquer máquina
inferior na hierarquia. Ao configurar o NTP para uma rede grande, é recomendável conectar
um pequeno número de computadores aos servidores Estrato 2+ e, a partir daí, fazer com que
essas máquinas forneçam o NTP a todas as outras máquinas. Desta forma, minimizam-se as
demandas sobre as máquinas Estrato 2.
Alguns termos são importantes ao se falar em NTP. Alguns desses termos aparecem nos
comandos que usamos para rastrear o status do NTP em nossas máquinas:
Agora vamos discutir algumas das maneiras específicas como o Linux implementa o NTP.
405 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]
timedatectl
Se sua distribuição Linux usa timedatectl, por padrão ela implementa um cliente SNTP ao invés
de uma implementação NTP completa. Esta é uma implementação menos complexa de tempo
de rede e significa que a máquina não servirá NTP para outros computadores conectados.
Neste caso, o SNTP não funcionará a menos que o serviço timesyncd esteja rodando. Como
acontece com todos os serviços systemd, podemos verificar se ele está rodando com:
Jan 11 13:06:18 NeoMex systemd-timesyncd[1032]: Synchronized to time server for the first
time 91.189.91.157:123 (ntp.ubuntu.com).
...
Essa configuração pode ser adequada para a maioria das situações, porém, conforme já obser-
vamos, ela é insuficiente quando se deseja sincronizar diversos clientes em uma rede. Nesse
406 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]
Daemon NTP
A hora do sistema é regularmente comparada à hora da rede. Para que isso funcione, é
necessário ter um daemon rodando em segundo plano. Em muitos sistemas Linux, o nome
desse daemon é ntpd. O ntpd permite que uma máquina não seja apenas um consumidor de
tempo (isto é, capaz de sincronizar seu próprio relógio a partir de uma fonte externa), mas
também forneça tempo para outras máquinas.
Vamos supor que nosso computador seja baseado no systemd e use systemctl para controlar
os daemons. Vamos instalar os pacotes ntp usando o gerenciador de pacotes apropriado e, em
seguida, verificar se o daemon ntpd está rodando:
Em alguns casos, pode ser necessário iniciar e habilitar o ntpd. Na maioria das máquinas
Linux, isso é feito com:
As consultas NTP acontecem na porta TCP 123. Se o NTP falhar, verifique essa porta está
aberta e escutando.
ntpdate
Durante a configuração inicial, a hora do sistema e o NTP podem ser seriamente dessincroniza-
dos. Se o deslocamento entre o sistema e a hora NTP for maior que 17 minutos, o daemon
NTP não fará alterações na hora do sistema. Neste caso, será necessária uma intervenção
manual.
Primeiramente, se ntpd estiver rodando, será necessário interromper o serviço. Use systemctl
stop ntpd para fazer isso.
407 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]
Em seguida, use ntpdate pool.ntp.org para realizar uma sincronização inicial única, onde
pool.ntp.org se refere ao endereço IP ou URL de um servidor NTP. Pode ser necessária mais
de uma sincronização.
ntpq
ntpq é um utilitário para monitorar o status do NTP. Uma vez que o daemon NTP foi iniciado
e configurado, usamos ntpq para verificar seu status:
root@debian10:/home/debian# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
+37.44.185.42 91.189.94.4 3 u 86 128 377 126.509 -20.398 6.838
+ntp2.0x00.lv 193.204.114.233 2 u 82 128 377 143.885 -8.105 8.478
*inspektor-vlan1 121.131.112.137 2 u 17 128 377 112.878 -23.619 7.959
b1-66er.matrix. 18.26.4.105 2 u 484 128 10 34.907 -0.811 16.123
Neste caso, -p significa imprimir, ou seja, exibir um resumo dos pares. Os endereços de host
também podem ser retornados como endereços IP usando -n.
ntpq também inclui um modo interativo, que é acessado quando ele é executado sem opções
ou argumentos. A opção ? retorna uma lista de comandos reconhecidos pelo ntpq.
chrony
chrony é outra forma de implementar o NTP. Ele é instalado por padrão em alguns sistemas
Linux, mas está disponível para download em todas as principais distribuições. chronyd é o
daemon chrony e chronyc é a interface de linha de comando. Pode ser necessário iniciar e
habilitar chronyd antes de interagir com chronyc.
Se a instalação do chrony tiver uma configuração padrão, o uso do comando chronyc tracking
408 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]
Essa saída contém muitas informações, mais do que as que estão disponíveis em outras im-
plementações:
Também podemos ver informações detalhadas sobre a última atualização válida do NTP:
Stratum : 2
Poll interval : 6 (64 seconds)
Precision : -25 (0.000000030 seconds)
Root delay : 0.000381 seconds
Root dispersion : 0.000092 seconds
Reference ID : 61B7CE58 ()
Reference time : Mon Jan 13 21:50:03 2020
Offset : +0.000491960 seconds
Peer delay : 0.004312567 seconds
Peer dispersion : 0.000000068 seconds
Response time : 0.000037078 seconds
Jitter asymmetry: +0.00
NTP tests : 111 111 1111
Interleaved : No
Authenticated : No
TX timestamping : Daemon
RX timestamping : Kernel
Total TX : 15
Total RX : 15
Total valid RX : 15
Finalmente, chronyc sources retorna informações sobre os servidores NTP usados para sin-
cronizar a hora:
No momento, esta máquina não possui fontes configuradas. Podemos adicionar fontes de
pool.ntp.org abrindo o arquivo de configuração do chrony. Geralmente, ele fica em /etc/chrony.conf.
Quando abrimos este arquivo, podemos ver que alguns servidores estão listados por padrão:
Esses servidores também servirão como um guia de sintaxe ao inserir nossos próprios servidores.
No entanto, neste caso, simplesmente removeremos os ! no início de cada linha, fazendo com
que deixem de ser comentários, para usar os servidores padrão do projeto pool.ntp.org.
Além disso, neste arquivo, podemos optar por alterar a configuração padrão em relação ao
skew (diferença entre a frequência real e a ideal) e ao escorregamento, bem como a localização
do driftfile e do keyfile.
Nesta máquina, precisamos fazer uma grande correção inicial do relógio. Optamos por remover
o comentário da seguinte linha:
! makestep 1.0 3
Depois de fazer alterações no arquivo de configuração, reinicie o serviço chronyd e use chronyc
makestep para ajustar manualmente o relógio do sistema:
E então use chronyc tracking como anteriormente para verificar se as alterações foram real-
izadas.
Fabio Gonçalves De Melo Santana / [email protected]
37
108.2 Registro de eventos do
sistema
Introdução
Sabe quem são os melhores amigos de qualquer administrador de sistemas? Os logs. Logs são
arquivos (geralmente de texto) onde todos os eventos do sistema e da rede são registrados,
em ordem cronológica, a partir do momento em que o sistema é inicializado. Desta forma,
a gama de informações que podem ser encontradas nos logs inclui virtualmente todos os
aspectos do sistema: tentativas de autenticação malsucedidas, erros de programas e serviços,
hosts bloqueados pelo firewall etc. Como você pode imaginar, os logs facilitam muito a vida
dos administradores de sistema quando se trata de resolução de problemas, verificação de
recursos, detecção de comportamento anômalo de programas e assim por diante.
Logs do sistema
No exato momento em que o kernel e os diferentes processos em seu sistema começam a rodar
e a se comunicar uns com os outros, muitas informações são geradas na forma de mensagens
que são, em sua maioria, enviadas para os logs.
Sem eles, os administradores de sistema teriam que descascar uma floresta de abacaxis sempre
que precisassem procurar um evento que aconteceu em um servidor. Os logs são determinantes
e reveladores quando se trata de solucionar problemas e manter a segurança, além de serem
411
412 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
Os logs tradicionalmente são tratados por três serviços dedicados principais: syslog, syslog-ng
(syslog nova geração) e rsyslog (“o sistema mais veloz para processamento de log”). O rsyslog
trouxe melhorias importantes (como suporte a RELP) e se tornou a escolha mais popular hoje
em dia. Esses serviços coletam mensagens de outros serviços e programas e as armazenam
em arquivos de log, normalmente em /var/log.
No entanto, alguns serviços cuidam de seus próprios logs (por exemplo, o servidor web Apache
HTTPD ou o sistema de impressão CUPS). Da mesma forma, o kernel do Linux usa um buffer
de anel na memória para armazenar suas mensagens de log.
Tipos de log
Como os logs são dados variáveis, costumam ser encontrados em /var/log. A grosso modo,
podem ser classificados em logs do sistema e logs de serviços ou programas.
O nome e o conteúdo exatos dos arquivos de log podem variar de acordo com as
distribuições Linux. Existem também logs específicos para distribuições específicas
como /var/log/dpkg.log (contendo informações relacionadas aos pacotes dpkg) no
Debian GNU/Linux e seus derivados.
Lendo logs
Para ler os arquivos de log, é preciso ser o usuário root ou ter permissões de leitura para o
arquivo. Podemos usar uma variedade de utilitários, como:
• less ou more - Paginadores que permitem visualizar e rolar uma página por vez:
• zless ou zmore - O mesmo que less e more, mas usados para logs que foram com-
pactados com o gzip (uma função comum de logrotate):
• Carimbo de data/hora;
• Nome do host a partir do qual a mensagem se originou;
• Nome do programa/serviço que gerou a mensagem;
• O PID do programa que gerou a mensagem;
• Descrição da ação que ocorreu.
Existem alguns exemplos em que os registros não são em forma de texto, mas arquivos binários
e você deverá usar comandos especiais para analisá-los:
root@debian:~# who
root pts/0 2020-09-14 13:05 (192.168.1.75)
root pts/1 2020-09-14 13:43 (192.168.1.75)
Também existem ferramentas gráficas para ler arquivos de log, como gnome-logs e
KSystemLog.
#################
#### MODULES ####
#################
• GLOBAL DIRECTIVES - permite configurar uma série de coisas, como logs e per-
missões de diretório de log:
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
#
# Where to place spool and state files
#
418 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
Eis um trecho do rsyslog.conf de nosso sistema Debian GNU/Linux 10 (buster) que inclui
alguns exemplos de regras:
###############
#### RULES ####
###############
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
#
# Some "catch-all" log files.
#
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
auth,authpriv.* /var/log/auth.log
Independentemente de sua prioridade (*), todas as mensagens dos recursos auth ou authpriv
serão enviadas para /var/log/auth.log.
*.*;auth,authpriv.none -/var/log/syslog
Todas as mensagens serão gravadas em /var/log/syslog (o sinal de menos (-) antes do caminho
evita gravações em disco excessivas). Note o ponto e vírgula (;) para dividir o seletor e a vírgula
(,) para concatenar dois recursos na mesma regra (auth,authpriv).
mail.err /var/log/mail.err
As mensagens do recurso mail com um nível de prioridade de error ou superior (critical, alert
ou emergency) serão enviadas para /var/log/mail.err.
* .=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
As mensagens de todos os recursos com a prioridade debug e nenhuma outra (=) serão
gravadas em /var/log/debug—excluindo-se todas as mensagens que venham dos recursos
auth, authpriv, news e mail (note a sintaxe: ;\).
• Evitar que arquivos de log antigos usem mais espaço em disco do que o necessário;
• Manter os registros em um tamanho gerenciável para facilitar a consulta.
O utilitário responsável pela rotação de log é logrotate. Dentre suas responsabilidades estão
ações como mover arquivos de log para um novo nome, arquivá-los e/ou compactá-los, às vezes
enviando-os por email para o administrador do sistema e, eventualmente, excluí-los quando
421 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
ficam obsoletos. Existem diversas convenções para nomear esses arquivos de log rotacionados
(por exemplo, adicionar um sufixo com a data ao nome do arquivo), no entanto, a prática
mais comum é simplesmente adicionar um sufixo com um número inteiro:
root@debian:~# ls /var/log/messages*
/var/log/messages /var/log/messages.1 /var/log/messages.2.gz /var/log/messages.3.gz /
var/log/messages.4.gz
Observe como os três arquivos de log mais antigos são compactados, mas os dois mais recentes
não. Além disso, preservamos os registros das últimas 4-5 semanas. Para ler mensagens com
1 semana de idade, consultamos messages.1 (e assim por diante).
O logrotate é executado diariamente como um processo automatizado ou cron job por meio do
script /etc/cron.daily/logrotate. Ele consulta o arquivo de configuração /etc/logrotate.conf.
Este arquivo inclui algumas opções globais e é bem comentado; cada opção é apresentada por
uma breve explicação de sua finalidade:
(...)
422 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
}
Como vemos, cada diretriz é separada de seu valor por um espaço em branco e/ou um sinal de
igual opcional (=). As linhas entre postrotate e endscript, porém, devem aparecer em linhas
próprias. A explicação é a seguinte:
root@debian:~# journalctl
-- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:19:46 CEST. --
Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 ([email protected])
424 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
(...)
Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=
UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu
(...)
root@debian:~# journalctl -r
-- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:30:30 CEST. --
Oct 12 14:30:30 debian sudo[1356]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 14:30:30 debian sudo[1356]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -r
Oct 12 14:19:53 debian sudo[1348]: pam_unix(sudo:session): session closed for user root
(...)
root@debian:~# journalctl -f
-- Logs begin at Sat 2019-10-12 13:43:06 CEST. --
(...)
Oct 12 14:44:42 debian sudo[1356]: pam_unix(sudo:session): session closed for user root
Oct 12 14:44:44 debian sudo[1375]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -f
Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
(...)
• -e - Salta para o final do diário, deixando as entradas mais recentes visíveis no paginador:
root@debian:~# journalctl -e
(...)
Oct 12 14:44:44 debian sudo[1375]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -f
Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root
Oct 12 14:48:39 debian sudo[1378]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -e
Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
425 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
• -n value, –lines=value - Imprime as linhas mais recentes de value (se não for especi-
ficado um, o padrão é 10):
root@debian:~# journalctl -n 5
(...)
Oct 12 14:44:44 debian sudo[1375]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -f
Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root
Oct 12 14:48:39 debian sudo[1378]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -e
Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
root@debian:~# journalctl -k
-- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:53:20 CEST. --
Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 ([email protected])
(gcc version 6.3.0 20170516 (Debian 6.3.0-18
Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=
UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu
Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point
registers'
Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
(...)
Teclas PageUp, PageDown e as setinhas para nos mover para cima, para baixo, a direita e a
esquerda.
Você pode pesquisar strings para a frente e para trás a partir de sua posição atual:
Para navegar pelas correspondências nas pesquisas, use N para ir para a próxima ocorrência e
Shift+N para ir para a anterior.
426 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
1. Número de inicialização:
• -b, –boot - Mostra todas as mensagens da inicialização atual. Para ver as mensagens
de log das inicializações anteriores, basta adicionar um parâmetro de deslocamento
conforme explicado acima. Por exemplo, para imprimir as mensagens da inicialização
anterior, digitamos journalctl -b -1. Lembre-se, porém, de que para recuperar infor-
mações de logs anteriores, a persistência do diário deve ser habilitada (você aprenderá
como fazer isso na próxima seção):
root@debian:~# journalctl -b -1
Specifying boot ID has no effect, no persistent journal was found
2. Prioridade:
O diário nos informa de que não houve nenhuma mensagem com prioridade de error (ou supe-
rior) da inicialização atual. Nota: -b -0 pode ser omitido quando nos referimos à inicialização
atual.
427 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]
3. Intervalo de tempo:
Da mesma maneira, podemos usar uma especificação de tempo ligeiramente diferente: “inte-
ger time-unit ago”. Assim, para ver mensagens registradas há dois minutos, digitamos sudo
journalctl –since “2 minutes ago”. Também é possível usar + e - para especificar momentos
relativos à hora atual. Assim, –since “-2 minutes” e –since “2 minutes ago” são equivalentes.
Vamos ver todas as mensagens desde a meia-noite passada até hoje às 21:00:
-
Fonte: https://www.linuxjournal.com/article/5476
• Fonte: https://cheatography.com/airlove/cheat-sheets/journalctl/
Fabio Gonçalves De Melo Santana / [email protected]
38
108.3 Noções básicas do Mail
Transfer Agent MTA
Introdução
Nos sistemas operacionais do tipo Unix, como o Linux, cada usuário tem sua própria caixa
de entrada: um local especial no sistema de arquivos, inacessível a outros usuários não-root,
para armazenar as mensagens de email pessoais do usuário. Novas mensagens são adicionadas
à caixa de entrada do usuário pelo Mail Transfer Agent (MTA). O MTA é um programa
executado como um serviço do sistema que coleta mensagens enviadas por outras contas
locais, bem como mensagens recebidas da rede, enviadas por contas de usuários remotos.
O mesmo MTA é responsável pelo envio de mensagens para a rede, caso o endereço de destino
se refira a uma conta remota. Ele faz isso usando um local do sistema de arquivos como uma
caixa de saída de email para todos os usuários do sistema: assim que um usuário coloca uma
nova mensagem na caixa de saída, o MTA identifica o nó da rede de destino a partir do nome
de domínio fornecido pelo endereço de email do destino—a parte após o sinal @—e então tenta
transferir a mensagem para o MTA remoto usando o Simple Mail Transfer Protocol (SMTP).
O SMTP foi projetado pensando em redes não confiáveis, portanto, ele tenta estabelecer rotas
de entrega alternativas caso o nó de destino principal do email esteja inacessível.
429
430 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
Ao contrário das contas locais, uma conta de email remota—também chamada de caixa de
correio remota—requer autenticação do usuário para conceder acesso à caixa de correio do
usuário e ao MTA remoto (neste caso, simplesmente chamado de servidor SMTP). Ao passo
que o usuário que interage com uma caixa de entrada local e o MTA já está identificado pelo
sistema, um sistema remoto precisa verificar a identidade do usuário antes de manipular suas
mensagens por meio de IMAP ou POP3.
Quando um daemon MTA está sendo executado no sistema local, os usuários locais podem
enviar um email para outros usuários locais ou usuários em uma máquina remota, desde que
seu sistema também tenha um serviço MTA que aceite conexões de rede. A porta TCP 25
é a porta padrão para a comunicação SMTP, mas outras portas também podem ser usadas,
dependendo do esquema de autenticação e/ou criptografia empregado (se houver).
Deixando de lado as topologias que envolvem o acesso a caixas de correio remotas, uma rede
de troca de emails entre contas de usuários Linux comuns pode ser implementada, desde que
todos os nós da rede tenham um MTA ativo capaz de realizar as seguintes tarefas:
• Manter a fila de saída das mensagens a serem enviadas. Para cada mensagem na fila, o
MTA local avaliará o MTA de destino a partir do endereço do destinatário;
• Comunicar-se com daemons MTA remotos usando SMTP. O MTA local deve ser capaz
de usar o protocolo SMTP sobre a pilha TCP/IP para receber, enviar e redirecionar
mensagens de/para outros daemons MTA remotos;
• Manter uma caixa de entrada individual para cada conta local. O MTA geralmente
armazena as mensagens no formato mbox: um único arquivo de texto contendo todas
as mensagens de email em sequência.
É preciso pensar na segurança se os hosts MTA forem ficar visíveis para os hosts na internet.
Por exemplo, um usuário desconhecido poderia usar o MTA local para se passar por outro
usuário e enviar emails potencialmente perigosos. Um MTA que retransmite cegamente um
email é conhecido como open relay, quando pode ser usado como intermediário para poten-
cialmente disfarçar o verdadeiro remetente da mensagem. Para evitar esses usos indevidos,
recomenda-se aceitar conexões somente de domínios autorizados e implementar um esquema
de autenticação seguro.
Além disso, existem muitas implementações de MTA diferentes para Linux, cada qual enfo-
cando aspectos específicos como compatibilidade, desempenho, segurança etc. No entanto,
todos os MTAs seguem os mesmos princípios básicos e fornecem recursos semelhantes.
MTAs do Linux
O MTA tradicionalmente disponível para os sistemas Linux é o Sendmail, um MTA de uso
geral bastante flexível adotado por muitos sistemas operacionais do tipo Unix. Outros MTAs
comuns são o Postfix, o qmail e o Exim. O principal motivo para escolher um MTA alternativo
é implementar recursos avançados com mais facilidade, pois, configurar servidores de email
personalizados no Sendmail pode ser uma tarefa complicada. Além disso, cada distribuição
pode ter seu MTA preferido, com ajustes predefinidos apropriados à maioria das configurações
comuns. Todos os MTAs pretendem ser substitutos diretos do Sendmail e, portanto, todos
os aplicativos compatíveis com o Sendmail costumam funcionar, independentemente do MTA
que está sendo usado.
Se o MTA estiver em execução, mas não aceitar conexões de rede, ele só poderá entregar
mensagens de email na máquina local. Para o MTA sendmail, o arquivo /etc/mail/sendmail.mc
deve ser modificado para aceitar conexões não locais. Para isso, a entrada
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
deve ser modificada com o endereço de rede correto e o serviço precisa ser reiniciado. Algumas
distribuições Linux, como o Debian, podem oferecer ferramentas de configuração para ajudar
a guarnecer o servidor de email com um conjunto predefinido de recursos comumente usados.
Uma vez que o MTA está em execução e aceitando conexões da rede, as novas mensagens
de email são passadas para ele com comandos SMTP enviados por meio de uma conexão
TCP. O comando nc—um utilitário de rede que lê e grava dados genéricos na rede—pode ser
usado para enviar comandos SMTP diretamente para o MTA. Se o comando nc não estiver
disponível, ele será instalado com o pacote ncat ou nmap-ncat, dependendo do sistema de
gerenciamento de pacotes em uso. Escrever comandos SMTP diretamente no MTA é útil para
432 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
entender melhor o protocolo e outros conceitos gerais sobre o email, bem como para ajudar a
diagnosticar problemas no processo de entrega de mensagens.
Se, por exemplo, a usuária thallyne no host lab1.4linux.com.br deseja enviar uma mensagem
ao usuário joatham no host lab2.4linux.com.br, ela pode usar o comando nc para conectar-se
diretamente ao MTA lab2.4linux.com.br, supondo que ele esteja escutando na porta TCP 25:
root@debian10:/home/debian# nc lab2.4linux.com.br 25
220 lab2.4linux.com.br ESMTP Sendmail 8.15.2/8.15.2; Sat, 16 Jun 2019 00:16:07 GMT
HELO lab1.4linux.com.br
250 lab2.4linux.com.br Hello lab1.4linux.com.br [10.0.3.134], pleased to meet you
MAIL FROM: [email protected]
250 2.1.0 [email protected]... Sender ok
RCPT TO: [email protected]
250 2.1.5 [email protected]... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: Recipient MTA Test
Assim que a conexão é estabelecida, o MTA remoto se identifica e está pronto para receber
comandos SMTP. O primeiro comando SMTP no exemplo, HELO lab1.4linux.com.br, indica
lab1.4linux.com.br como o iniciador da troca. Os dois comandos seguintes, MAIL FROM:
[email protected] e RCPT TO: [email protected], indicam o remetente
e o destinatário. A mensagem de email em si começa após o comando DATA e termina com
um ponto sozinho em uma linha. Para adicionar um campo subject (assunto) ao email, ele
deve estar na primeira linha após o comando DATA, como mostrado no exemplo. Quando
o campo de assunto é usado, deve haver uma linha em branco separando-o do conteúdo do
email. O comando QUIT termina a conexão com o MTA no host lab2.4linux.com.br.
$ cat /var/spool/mail/joatham
From [email protected] Sat Jun 16 00:19:13 2019
Return-Path: <[email protected]>
Received: from lab1.4linux.com.br (lab1.4linux.com.br [10.0.3.134])
by lab2.4linux.com.br (8.15.2/8.15.2) with SMTP id xAG0G7Y0000595
for [email protected]; Sat, 16 Jun 2019 00:17:06 GMT
Date: Sat, 16 Jun 2019 00:16:07 GMT
433 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
From: [email protected]
Message-Id: <[email protected]>
Subject: Recipient MTA Test
$ nc lab2.4linux.com.br 25
220 lab2.4linux.com.br ESMTP Sendmail 8.15.2/8.15.2; Sat, 16 Jun 2019 00:31:44 GMT
HELO lab1.4linux.com.br
250 lab2.4linux.com.br Hello lab1.4linux.com.br [10.0.3.134], pleased to meet you
MAIL FROM: [email protected]
250 2.1.0 [email protected]... Sender ok
RCPT TO: [email protected]
550 5.7.1 [email protected]... Relaying denied
Os números de resposta do SMTP que começam com 5, como na mensagem Relaying denied
(retransmissão negada), indicam um erro. Existem situações legítimas em que a retransmissão
é desejável, como quando os hosts que enviam e recebem emails não estão conectados o
tempo todo: um MTA intermediário pode ser configurado para aceitar emails destinados a
outros hosts, agindo como um servidor SMTP retransmissor (ou relay) capaz de encaminhar
mensagens entre MTAs.
A possibilidade de rotear o tráfego de email por meio de servidores SMTP intermediários deses-
timula a tentativa de conexão direta ao host indicado pelo endereço de email do destinatário,
como mostrado nos exemplos anteriores. Além disso, os endereços de email geralmente têm
um nome de domínio como local (após o @), de forma que o nome real do host MTA corre-
spondente deve ser recuperado através do DNS. Portanto, é recomendável delegar a tarefa de
identificar o host de destino apropriado ao MTA local ou ao servidor SMTP remoto quando
usamos caixas de correio remotas.
O Sendmail fornece o comando sendmail para realizar uma série de operações relacionadas
a email, incluindo auxiliar na composição de novas mensagens. Ele também requer que o
usuário digite os cabeçalhos do email manualmente, mas de uma forma mais amigável do
que usar comandos SMTP diretamente. Assim, um método mais adequado para o usuário
[email protected] enviar uma mensagem de email para [email protected]
seria:
434 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
Aqui, novamente, o ponto sozinho em uma linha finaliza a mensagem. A mensagem deve
ser enviada imediatamente ao destinatário, a menos que o MTA local não tenha conseguido
contatar o MTA remoto. O comando mailq, se executado pelo root, mostra todas as men-
sagens não entregues. Se, por exemplo, o MTA em lab2.4linux.com.br não respondeu, então
o comando mailq listará a mensagem não entregue e a causa da falha:
root@debian10:/home/debian# mailq
/var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
xAIK3D9S000453 36 Mon Jun 18 20:03 <[email protected]>
(Deferred: Connection refused by lab2.4linux.com.br.)
<[email protected]>
Total requests: 1
O local padrão da fila da caixa de saída é /var/spool/mqueue/, mas diferentes MTAs podem
usar locais diversos no diretório /var/spool/. O Postfix, por exemplo, cria uma árvore de
diretórios sob /var/spool/postfix/ para gerenciar a fila. O comando mailq equivale a send-
mail -bp, e eles devem estar presentes qualquer que seja o MTA instalado no sistema. Para
garantir a compatibilidade reversa, a maioria dos MTAs inclui esses comandos tradicionais de
administração de email.
mensagem mostram que o email atravessou etapas extras antes de chegar ao destino final:
root@debian10:/home/debian#cat /var/spool/mail/joatham
From [email protected] Mon Jun 18 20:07:39 2019
Return-Path: <[email protected]>
Received: from lab1.4linux.com.br (lab1.4linux.com.br [10.0.3.134])
by lab2.4linux.com.br (8.15.2/8.15.2) with ESMTPS id xAIK7clC000432
(version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT)
for <[email protected]>; Mon, 18 Jun 2019 20:07:38 GMT
Received: from lab1.4linux.com.br (localhost [127.0.0.1])
by lab1.4linux.com.br (8.15.2/8.15.2) with ESMTPS id xAIK3D9S000453
(version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT)
for <[email protected]>; Mon, 18 Jun 2019 20:03:13 GMT
Received: (from thallyne@localhost)
by lab1.4linux.com.br (8.15.2/8.15.2/Submit) id xAIK0doL000449
for [email protected]; Mon, 18 Jun 2019 20:00:39 GMT
Date: Mon, 18 Jun 2019 20:00:39 GMT
Message-Id: <[email protected]>
From: [email protected]
To: [email protected]
Subject: Sender MTA Test
De baixo para cima, as linhas que começam com Received: mostram a rota seguida pela men-
sagem. A mensagem foi enviada pela usuária thallyne com o comando sendmail [email protected]
emitido em lab1.4linux.com.br, conforme declarado pelo primeiro cabeçalho Received:. Em
seguida, ainda em lab1.4linux.com.br, o MTA usa ESMTPS—um superconjunto do SMTP, que
adiciona extensões de criptografia—para enviar a mensagem para o MTA em lab2.4linux.com.br,
conforme especificado pelo último (topo) cabeçalho Received:.
O MTA conclui seu trabalho depois que a mensagem é salva na caixa de entrada do usuário. É
comum realizar algum tipo de filtragem de email, como bloqueadores de spam ou a aplicação
de regras de filtragem definidas pelo usuário. Essas tarefas são executadas por aplicativos
de terceiros, trabalhando em conjunto com o MTA. O MTA poderia, por exemplo, chamar o
utilitário SpamAssassin para marcar mensagens suspeitas usando seus recursos de análise de
texto.
Embora possível, não é conveniente ler diretamente o arquivo da caixa de correio. Recomenda-
se usar um programa cliente de email (por exemplo, Thunderbird, Evolution ou KMail), que
analisará o arquivo e gerenciará as mensagens apropriadamente. Esses programas também
oferecem recursos extras, como atalhos para ações comuns, subdiretórios de caixa de entrada
etc.
436 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
Existem muitos tipos distintos de Mail User Agents. Aplicativos de desktop como o Mozilla
Thunderbird e o Evolution, do Gnome, oferecem suporte a contas de email locais e remotas.
Mesmo as interfaces Webmail podem ser vistas como um tipo de MUA, pois intermediam a
interação entre o usuário e o MTA subjacente. No entanto, os clientes de email não estão
restritos às interfaces gráficas; os clientes de email de console são amplamente usados para
acessar caixas de correio não integradas a uma interface gráfica, e para automatizar tarefas
relacionadas a email em scripts do shell.
Hoje em dia, o comando mail mais comumente usado é fornecido pelo pacote mailx, compatível
com todos os recursos de email modernos. Na maioria das distribuições Linux, o comando mail
é apenas um link simbólico para o comando mailx. Outras implementações, como o pacote
GNU Mailutils, basicamente fornecem os mesmos recursos do mailx. Existem, no entanto,
pequenas diferenças entre eles, especialmente com relação às opções de linha de comando.
O modo de envio (send mode) é especialmente útil para enviar mensagens de email automa-
tizadas. Ele pode ser usado, por exemplo, para enviar um email ao administrador do sistema
437 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
Neste exemplo, a opção -s foi adicionada para incluir um campo de assunto na mensagem. O
corpo da mensagem foi fornecido pelo redirecionamento Hereline para a entrada padrão, mas
o conteúdo de um arquivo ou a saída de um comando também pode ser canalizado com um
pipe para o stdin do programa. Se nenhum conteúdo for fornecido por um redirecionamento
para a entrada padrão, o programa aguardará que o usuário entre no corpo da mensagem.
Nesse caso, a combinação de teclas Ctrl+D encerra a mensagem. O comando mail é concluído
imediatamente após a mensagem ser adicionada à fila da caixa de saída.
Entrega personalizada
Por padrão, as contas de email em um sistema Linux são associadas às contas de sis-
tema padrão. Por exemplo, se a usuária thallyne tem o nome de login thallyne no host
lab2.4linux.com.br, seu endereço de email será [email protected]. Esta associação
direta entre contas de sistema e caixas de correio pode ser estendida por métodos padrão
fornecidos pela maioria das distribuições Linux, em particular o mecanismo de roteamento de
email fornecido pelo arquivo /etc/aliases.
Um alias de email é um destinatário de email “virtual” cujas mensagens recebidas são redire-
cionadas para caixas de correio locais existentes, ou para outros tipos de destino de armazena-
mento ou processamento de mensagens. Os aliases são úteis, por exemplo, para colocar as
mensagens enviadas para [email protected] na caixa de correio de thallyne, que
é uma caixa de correio local comum do sistema lab2.4linux.com.br. Para isso, a linha post-
master: thallyne deve ser adicionada ao arquivo /etc/aliases em lab2.4linux.com.br. Após
modificar o arquivo /etc/aliases, o comando newaliases deve ser executado para atualizar os
bancos de dados de aliases do MTA e efetivar as alterações. Os comandos sendmail -bi ou
sendmail -I também servem para atualizar o banco de dados de aliases.
Os aliases são definidos em linhas, no formato <alias>: <destination>. Além das caixas de
correio locais comuns, indicadas pelo nome de usuário correspondente, outros tipos de destino
estão disponíveis:
o comando contiver caracteres especiais (como espaços em brancos), ele deve ser posto
entre aspas duplas. Por exemplo, o alias subscribe: |subscribe.sh em lab2.4linux.com.br
encaminha todas as mensagens enviadas para [email protected] para a en-
trada padrão do comando subscribe.sh. Se sendmail estiver rodando no modo restrito
do shell, os comandos permitidos, ou os links para eles, deverão estar em /etc/smrsh/;
• Um arquivo de inclusão. Um único alias pode ter diversos destinos (separados por vír-
gulas) e, portanto, pode ser mais prático mantê-los em um arquivo externo. A palavra-
chave :include: deve indicar o caminho do arquivo, como em :include:/var/local/desti-
nations;
• Um endereço externo. Os aliases também podem encaminhar mensagens para endereços
de email externos;
• Outro alias.
Um usuário local sem privilégios pode definir aliases para seu próprio email editando o arquivo
.forward em seu diretório inicial. Como os aliases podem afetar apenas sua própria caixa
de correio, somente a parte é necessária. Para encaminhar todos os emails recebidos para
um endereço externo, por exemplo, o usuário joatham em lab2.4linux.com.br poderia criar o
seguinte arquivo ~/.forward:
- Fonte: - https://commons.wikimedia.org/wiki/File:MTA-MDA-MUA_relationship.svg
- Fonte: - https://www.lusoaloja.pt/blog/pop3-imap-e-smtp-qual-a-diferenca/
440 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]
- Fonte: - https://www.bitbaru.com/site/voc-sabe-o-que-smtp-pop-e-imap/
Fabio Gonçalves De Melo Santana / [email protected]
39
108.4 Gerenciamento de
impressoras e impressão
Introdução
Você ainda acha que usar papel e necessário? De qualquer forma é importante para um usuário
saber como imprimir a partir de um sistema, assim como um administrador precisa saber como
manter a capacidade de um computador de trabalhar com impressoras.
No Linux, assim como em muitos outros sistemas operacionais, a pilha de software Common
Unix Printing System (CUPS) permite a impressão e o gerenciamento de impressoras a partir
de um computador. Aqui está um esboço muito simplificado de como um arquivo é impresso
no Linux usando CUPS:
441
442 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]
O serviço CUPS
A maioria das instalações do Linux em máquinas pessoais já vem com os pacotes do CUPS
instalados. Em instalações mínimas do Linux, os pacotes do CUPS podem não estar presentes,
dependendo da distribuição. Uma instalação básica do CUPS pode ser realizada em um sistema
Debian com o seguinte:
Após a conclusão da instalação, você pode verificar se o serviço CUPS está sendo executado
com o uso do comando systemctl:
Como acontece com muitos outros daemons do Linux, o CUPS depende de um conjunto de
arquivos de configuração para suas operações. Na lista abaixo estão os que são de maior
interesse para o administrador do sistema:
• /etc/printcap - Este é o arquivo antigo que foi usado pelo protocolo LPD (Line Printer
Daemon) antes do advento do CUPS. O CUPS continua a criar este arquivo para garantir
a compatibilidade com versões anteriores e muitas vezes ele é um link simbólico para
/run/cups/printcap. Cada linha deste arquivo contém uma impressora à qual o sistema
tem acesso;
• /etc/cups/printers.conf - Este arquivo contém as impressoras configuradas para serem
usadas pelo sistema CUPS. Neste arquivo, cada impressora e sua fila de impressão as-
sociada estão contidas em uma estrofe. Este arquivo fornece as listagens individuais
de impressoras encontradas em /etc/printcap. Nenhuma modificação deve ser feita no
arquivo /etc/cups/printers.conf na linha de comando enquanto o serviço CUPS estiver
em execução;
• /etc/cups/ppd/ - Este não é um arquivo de configuração, mas um diretório que
contém os arquivos PostScript Printer Description (PPD) para as impressoras que os
utilizam. A capacidade operacional de cada impressora será armazenada em um arquivo
PPD (terminando com a extensão .ppd). Esses são arquivos de texto simples e seguem
um formato específico.
O serviço CUPS também utiliza o log da mesma maneira que o serviço Apache 2. Os logs
são armazenados em /var/log/cups/ e contêm um access_log, um page_log e um error_log.
O access_log mantém um registro de acesso à interface web do CUPS, bem como as ações
realizadas dentro dela, como o gerenciamento da impressora. O page_log rastreia os trabalhos
de impressão que foram submetidos às filas de impressão gerenciadas pela instalação do CUPS.
O error_log contém as mensagens sobre trabalhos de impressão que falharam e outros erros
registrados pela interface web.
Se a interface web estiver habilitada, o CUPS pode ser gerenciado a partir de um navegador
na URL padrão http://localhost:631. Por padrão, um usuário do sistema pode visualizar as
impressoras e filas de impressão, mas qualquer modificação da configuração requer que um
usuário com acesso root se autentique no serviço web. A estrofe de configuração no arquivo
/etc/cups/cupsd.conf para restringir o acesso aos recursos administrativos será semelhante a
444 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]
seguinte:
• AuthType Default - usa um prompt de autenticação básico quando uma ação requer
acesso de root;
• Require user @SYSTEM - indica que é necessário um usuário com privilégios ad-
ministrativos para a operação. Pode ser alterado para @groupname, onde membros de
groupname podem administrar o serviço do CUPS, ou ainda, usuários individuais podem
ser listados, como em Require user carol, tim;
• Order deny,allow - funciona de forma semelhante à opção de configuração do Apache
2, onde a ação é negada por padrão a menos que um usuário (ou membro de um grupo)
seja autenticado.
A interface web do CUPS pode ser desabilitada primeiro interrompendo o serviço do CUPS,
alterando a opção WebInterface de Yes para No e, finalmente, reiniciando o serviço do CUPS.
A interface web do CUPS é construída como um site básico, com guias de navegação para as
diversas seções do sistema CUPS. Estas são as guias incluídas na interface:
• Home -A página inicial lista a versão atual do CUPS que está instalada. Ela também
divide o CUPS em seções como:
• CUPS for Users - Fornece uma descrição do CUPS, opções de linha de comando para
trabalhar com impressoras e filas de impressão e um link para o fórum de usuários do
CUPS;
• CUPS for Administrators - Fornece links na interface para instalar e gerenciar impres-
soras e links para informações sobre como trabalhar com impressoras em uma rede;
• CUPS for Developers - Fornece links para o desenvolvimento do próprio CUPS, bem
como para a criação de arquivos PPD para impressoras.
• Administration - A página de administração também é dividida em seções:
• Printers - Aqui, um administrador pode adicionar novas impressoras ao sistema, localizar
as impressoras conectadas ao sistema e gerenciar as impressoras que já estão instaladas;
• Classes - As classes são um mecanismo no qual impressoras podem ser adicionadas a
grupos com políticas específicas. Por exemplo, uma classe pode conter um grupo de
445 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]
a caixa de seleção dessa opção nesta página. Depois de inserir as configurações, clique
no botão Continue;
4. A página seguinte é onde a marca e o modelo da impressora podem ser selecionados.
Essa informação permite que o CUPS pesquise em seu banco de dados local pelos drivers
e arquivos PPD mais adequados para usar com a impressora. Se você tiver um arquivo
PPD fornecido pelo fabricante da impressora, navegue até o local em que ele está e
selecione-o. Depois disso, clique no botão Add Printer;
5. A última página é onde são definidas as opções padrão, como o tamanho da página
usada pela impressora e a resolução dos caracteres impressos. Clique no botão Set
Default Options e a impressora estará instalada no sistema.
• Fonte: https://news.softpedia.com/news/CUPS-Common-UNIX-Printing-System-2-0-
2-Now-Available-for-Download-472671.shtml # 109.1 Fundamentos dos protocolos de
internet
Fabio Gonçalves De Melo Santana / [email protected]
40
Introdução
IP (Internet Protocol)
O IP é o protocolo responsável pelo endereçamento lógico de um host, permitindo que o
pacote seja enviado de um host para outro. Para isso, cada dispositivo da rede recebe um
endereço IP exclusivo. É possível atribuir mais de um endereço ao mesmo dispositivo.
No IPv4, os valores de cada octeto podem variar de 0 a 255, que é o equivalente a 11111111
em formato binário.
447
448 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Classes de endereço
Teoricamente, os endereços IP são separados em classes, definidas pelo intervalo do primeiro
octeto, conforme mostrado na tabela abaixo:
IPs privados são intervalos de endereços IP reservados para uso em redes internas (privadas)
de empresas, instituições, residências etc. Dentro da mesma rede, o uso de um endereço IP
permanece exclusivo. No entanto, o mesmo endereço IP privado pode ser usado em qualquer
rede privada.
Assim, na internet o tráfego de dados emprega endereços IP públicos, que são reconhecíveis
e roteados pela internet, ao passo que nas redes privadas são usados esses intervalos de IP
reservados. O roteador é responsável por converter o tráfego da rede privada para a rede
pública e vice-versa.
Os intervalos de IPs privados, divididos em classes, podem ser vistos na tabela abaixo:
A conversão do formato decimal para binário é feita por meio de divisões consecutivas por 2.
Como exemplo, vamos converter o valor 105 empregando seguintes etapas:
105/2
Quociente = 52
Resto = 1
52/2
Resto = 0
Quociente = 26
26/2
Resto = 0
Quociente = 13
13/2
Resto = 1
Quociente = 6
6/2
Resto = 0
Quociente = 3
3/2
Resto = 1
Quociente = 1
1101001
01101001
1. Cada bit é associado a um valor com uma potência de base dois. As potências se iniciam
em 0 e são incrementadas da direita para a esquerda. Neste exemplo teremos:
1 0 1 1 0 0 0 0
2ˆ7 2ˆ6 2ˆ5 2ˆ4 2ˆ3 2ˆ2 2ˆ1 2ˆ0
1 0 1 1 0 0 0 0
2ˆ7 2ˆ6 2ˆ5 2ˆ4 2ˆ3 2ˆ2 2ˆ1 2ˆ0
128 0 32 16 0 0 0 0
128 + 32 + 16 = 176
Netmask
A máscara de rede (ou netmask) é usada em conjunto com o endereço IP para determinar
qual parte do IP representa a rede e qual representa os hosts. Ela tem o mesmo formato do
endereço IP, ou seja, 32 bits em 4 grupos de 8. Por exemplo:
Usando a máscara 255.255.0.0 como exemplo, podemos ver que, no IP associado a ela, os
primeiros 16 bits (2 primeiros decimais) identificam a rede/sub-rede e os últimos 16 bits são
usados para identificar exclusivamente os hosts dentro da rede.
O CIDR (Classless Inter-Domain Routing) mencionado acima está relacionado a uma notação
de máscara simplificada, que indica o número de bits (1) associados à rede/sub-rede. Essa
notação é comumente usada para substituir o formato decimal, por exemplo /24 em vez de
255.255.255.0.
Vale notar que cada classe de IP possui uma máscara padrão, da seguinte maneira:
No entanto, esse padrão não significa que essa máscara sempre será usada. É possível usar
qualquer máscara com qualquer endereço IP, como veremos a seguir.
192.168.8.12 / 255.255.255.0 / 24
Neste caso, temos os 3 primeiros dígitos (primeiros 24 bits) do endereço IP definindo a rede; o
dígito final identifica os endereços dos hosts, ou seja, o intervalo desta rede vai de 192.168.8.0
a 192.168 .8.255.
Chegamos assim a dois conceitos importantes: cada rede/sub-rede tem 2 endereços reservados.
O primeiro endereço no intervalo é chamado de endereço da rede. Neste caso, 192.168.8.0,
usado para identificar a própria rede/sub-rede. O último endereço no intervalo é chamado de
endereço de transmissão, neste caso 192.168.8.255. Esse endereço de destino é usado para
enviar a mesma mensagem (pacote) para todos os hosts IP dessa rede/sub-rede.
Os endereços de rede e de transmissão não podem ser usados pelas máquinas da rede. Por-
452 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
tanto, a lista de IPs que podem de fato ser configurados varia de 192.168.8.1 a 192.168.8.254.
Vejamos um exemplo com mesmo IP, mas com uma máscara diferente:
192.168.8.12 / 255.255.0.0 / 16
Perceba como a máscara diferente altera o intervalo de IPs que estão na mesma rede/sub-rede.
A divisão das redes por máscaras não se restringe aos valores padrão (8, 16, 24). Podemos
criar subdivisões conforme desejado, adicionando ou removendo bits na identificação da rede,
criando as novas sub-redes.
Por exemplo:
11111111.11111111.11111111.00000000 = 255.255.255.0 = 24
Se quisermos subdividir a rede acima em 2, basta adicionar outro bit à identificação da rede
na máscara, desta maneira:
11111111.11111111.11111111.10000000 = 255.255.255.128 = 25
192.168.8.0 - 192.168.8.127
192.168.8.128 - 192.168.8.255
11111111.11111111.11111111.11000000 = 255.255.255.192 = 26
453 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Teremos:
192.168.8.0 - 192.168.8.63
192.168.8.64 - 192.168.8.127
192.168.8.128 - 192.168.8.191
192.168.8.192 - 192.168.8.255
Observe que em cada sub-rede teremos os endereços de rede reservados (a primeira do in-
tervalo) e de transmissão (o último do intervalo), portanto, quanto mais subdividida a rede,
menos IPs poderão ser usados efetivamente pelos hosts.
O endereço de rede é obtido usando um “E lógico” entre o endereço IP e a máscara em seus for-
matos binários. Vejamos um exemplo usando o IP 192.168.8.12 e a máscara 255.255.255.192.
11000000.10101000.00001000.00001100 (192.168.8.12)
11111111.11111111.11111111.11000000 (255.255.255.192)
11000000.10101000.00001000.00001100 (192.168.8.12)
11111111.11111111.11111111.11000000 (255.255.255.192)
11000000.10101000.00001000.00000000
Agora, para obter o endereço de transmissão, usamos o endereço de rede, forçando todos os
bits relacionados ao host a ser 1s:
11000000.10101000.00001000.00000000 (192.168.8.0)
11111111.11111111.11111111.11000000 (255.255.255.192)
11000000.10101000.00001000.00111111
454 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
192.168.8.12 / 255.255.255.192 / 26
Rota padrão
Como vimos até agora, as máquinas que estão na mesma rede/sub-rede lógica podem se
comunicar diretamente por meio do protocolo IP.
• Rede 1 - 192.168.10.0/24
• Rede 2 - 192.168.200.0/24
Neste caso, a máquina 192.168.10.20 não pode enviar diretamente um pacote para 192.168.200.100,
pois elas estão em redes lógicas diferentes.
Para habilitar essa solução, cada host da rede deve ter configurado o que chamamos de rota
padrão. A rota padrão indica o IP para o qual devem ser enviados todos os pacotes cujo
destino é um IP que não faz parte da rede lógica do host.
A rota padrão também é utilizada para que as máquinas da rede privada (LAN) tenham acesso
à Internet (WAN) por meio de um roteador.
455 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Portas
Para que um host possa acessar um serviço disponível em outro host, além do protocolo de
endereçamento IP na camada de rede, será necessário utilizar um protocolo na camada de
transporte, como os protocolos TCP e UDP.
Esses protocolos realizam essa comunicação por meio de portas de rede. Portanto, além de
definir um IP de origem e destino, usamos portas de origem e destino para acessar um serviço.
As portas usadas por cada tipo de serviço são padronizadas e controladas pela IANA (Internet
Assigned Numbers Authority). Assim, em qualquer sistema, a porta 22 é usada pelo serviço
SSH, a porta 80 pelo serviço HTTP e assim por diante.
Porta Serviço
20 FTP (dados)
21 FTP (controle)
22 SSH (Secure Socket Shell)
23 Telnet (Conexão remota sem criptografia)
25 SMTP (Simple Mail Transfer Protocol), Enviar emails
53 DNS (Domain Name System)
80 HTTP (Hypertext Transfer Protocol)
110 POP3 (Post Office Protocol), Receber emails
123 NTP (Network Time Protocol)
139 Netbios
143 IMAP (Internet Message Access Protocol), Acessar emails
161 SNMP (Simple Network Management Protocol)
162 SNMPTRAP, Notificações SNMP
389 LDAP (Lightweight Directory Access Protocol)
443 HTTPS (HTTP Seguro)
465 SMTPS (SMTP Seguro)
514 RSH (Shell Remoto)
636 LDAPS (LDAP Seguro)
993 IMAPS (IMAP Seguro)
995 POP3S (POP3 Seguro)
456 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Assim, o aplicativo não precisa implementar esse controle de fluxo de dados, pois ele já é
garantido pelo protocolo TCP.
Como há menos controle, o UDP permite um melhor desempenho no fluxo de dados, o que é
importante para alguns tipos de serviços.
É o protocolo utilizado pelo comando ping, que será estudado em outro subtópico.
IPv6
Até agora, estudamos a versão 4 do protocolo IP, ou seja, o IPv4. Esta tem sido a versão
padrão usada em todos os ambientes de rede e internet. Porém, ela apresenta limitações,
principalmente no que diz respeito ao número de endereços disponíveis, e como parece claro
que em um futuro próximo todos os dispositivos estarão de alguma forma conectados à Internet
(ver IoT), é cada vez mais comum utilizar a versão 6 do protocolo IP, abreviada como IPv6.
O IPv6 traz uma série de mudanças, novas implementações e recursos, bem como uma nova
representação do próprio endereço.
Cada endereço IPv6 possui 128 bits, divididos em 8 grupos de 16 bits, representados por
valores hexadecimais.
Por exemplo:
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
Abreviações
O IPv6 define maneiras de encurtar os endereços em algumas situações. Vamos analisar o
seguinte endereço:
2001:0db8:85a3:0000:0000:0000:0000:7344
2001:0db8:85a3:0:0:0:0:7344
Além disso, no caso de grupos de strings com valor 0, elas podem ser omitidas da seguinte
forma:
2001:0db8:85a3::7344
458 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Porém, esta última abreviatura só pode ser feita uma vez no endereço. Veja o exemplo:
2001:0db8:85a3:0000:0000:1319:0000:7344
2001:0db8:85a3:0:0:1319:0:7344
2001:0db8:85a3::1319:0:7344
• Unicast - Identifica uma única interface de rede. Por padrão, os 64 bits à esquerda
identificam a rede e os 64 bits à direita identificam a interface;
• Multicast - Identifica um conjunto de interfaces de rede. Um pacote enviado a um
endereço multicast será enviado a todas as interfaces que pertencem àquele grupo.
Embora semelhante, não deve ser confundido com o broadcast (transmissão), que não
existe no protocolo IPv6;
• Anycast - Também identifica um conjunto de interfaces na rede, mas o pacote encam-
inhado para um endereço anycast será entregue a apenas um endereço nesse conjunto,
não a todos.
• IPv4- 200.216.10.15:443
• IPv6- [2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443
4. O campo TTL (Time to Live) do IPv4 foi substituído pelo “Hop Limit” (limite de saltos)
no cabeçalho do IPv6;
5. Todas as interfaces IPv6 têm um endereço local, denominado endereço de link local,
prefixado com fe80::/10;
6. O IPv6 implementa o Neighbor Discovery Protocol (NDP), semelhante ao ARP usado
pelo IPv4, mas com muito mais funcionalidades.
- Fonte: - https://www.face-
book.com/TeamARIN/photos/10155243976651290
460 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
- Fonte: - https://jared.nyc/cheatsheet.html
109.2 Configuração de rede
461
persistente
41
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]
42
Introdução
Em qualquer rede TCP/IP, cada nó deve configurar seu adaptador de rede para atender aos
requisitos da rede.
As configurações de rede não são dependentes do sistema operacional, mas cada um deles
tem seus próprios métodos para armazenar e aplicar essas configurações. Os sistemas Linux
dependem de configurações armazenadas em arquivos de texto simples no diretório /etc para
ativar a conectividade de rede durante a inicialização.
A Interface de Rede
Interface de rede é o termo pelo qual o sistema operacional se refere ao canal de comunicação
configurado para funcionar com o hardware de rede conectado ao sistema, como um dispositivo
ethernet ou wi-fi. A exceção é a interface loopback, usada quando o sistema operacional precisa
estabelecer uma conexão consigo mesmo, mas o objetivo principal de uma interface de rede é
fornecer uma rota, através da qual os dados locais possam ser enviados, e os dados remotos
recebidos. Se a interface de rede não estiver configurada corretamente, o sistema operacional
não será capaz de se comunicar com outras máquinas na rede.
Na maioria dos casos, as configurações de interface corretas são definidas por padrão ou
personalizadas durante a instalação do sistema operacional. Ainda assim, essas configurações
geralmente precisam ser inspecionadas ou mesmo modificadas, quando a comunicação não está
funcionando corretamente, ou quando o comportamento da interface requer personalização.
462
463 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
O Linux tem muitos comandos para listar as interfaces de rede presentes no sistema, mas nem
todos estão disponíveis em todas as distribuições. O comando ip, no entanto, faz parte do
conjunto básico de ferramentas de rede empacotadas com todas as distribuições Linux e pode
ser usado para listar as interfaces de rede. O comando completo para mostrar as interfaces é
ip link show:
Estes comandos não modificam as configurações do sistema e podem ser executados por um
usuário sem privilégios. Ambos os comandos listam duas interfaces de rede: lo (a interface de
loopback) e enp3s5 (uma interface ethernet).
Os desktops e laptops que executam Linux geralmente têm duas ou três interfaces de rede
predefinidas, uma para a interface virtual de loopback e as outras atribuídas ao hardware de
rede encontrado pelo sistema. Os servidores e dispositivos de rede que executam Linux, por
outro lado, podem ter dezenas de interfaces de rede, mas os mesmos princípios se aplicam a
todas elas. A abstração fornecida pelo sistema operacional permite a configuração de interfaces
de rede usando os mesmos métodos, independentemente do hardware usado.
No entanto, é útil conhecer os detalhes sobre o hardware subjacente de uma interface, para
entender melhor o que está acontecendo quando a comunicação não funciona conforme o
esperado. Em um sistema em que há muitas interfaces de rede disponíveis, nem sempre é
óbvio saber qual delas corresponde ao wi-fi, e qual corresponde à ethernet, por exemplo. Por
esse motivo, o Linux usa uma convenção para a nomenclatura de interfaces, que ajuda a
identificar qual interface de rede corresponde a qual dispositivo e porta.
464 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Nomes de interface
As distribuições Linux mais antigas atribuíam às interfaces de rede ethernet nomes como eth0,
eth1 etc., numeradas de acordo com a ordem em que o kernel identificava os dispositivos.
As interfaces wireless eram nomeadas wlan0, wlan1 etc. Esta convenção de nomenclatura,
no entanto, não esclarece qual porta Ethernet específica corresponde à interface eth0, por
exemplo. Dependendo de como o hardware fosse detectado, era possível inclusive que duas
interfaces de rede trocassem de nome após uma reinicialização.
Para evitar essa ambiguidade, os sistemas Linux mais recentes empregam uma convenção de
nomenclatura previsível para as interfaces de rede, criando uma aproximação maior entre o
nome da interface e a conexão de hardware subjacente.
Nas distribuições Linux que usam o esquema de nomenclatura do systemd, todos os nomes
de interfaces começam com um prefixo de dois caracteres que indica o tipo de interface:
• en - Ethernet;
• ib - InfiniBand;
• sl - Serial line IP (slip);
• wl - Rede de área local sem fio (WLAN);
• ww - Rede de longa distância sem fio (WWAN).
De prioridade mais alta para mais baixa, as seguintes regras são usadas pelo sistema operacional
para nomear e numerar as interfaces de rede:
1. Nomear a interface de acordo com o índice fornecido pela BIOS ou pelo firmware dos
dispositivos incorporados, por exemplo, eno1;
2. Nomear a interface de acordo com o índice do slot PCI Express, conforme fornecido pela
BIOS ou firmware, por exemplo, ens1;
3. Nomear a interface de acordo com seu endereço no barramento correspondente, por
exemplo, enp3s5;
4. Nomear a interface de acordo com o endereço MAC da interface, por exemplo, enx78e7d1ea46da;
5. Nomear a interface usando a convenção legada, por exemplo, eth0.
É correto pressupor, por exemplo, que a interface de rede enp3s5 recebeu esse nome porque
não se encaixava nos dois primeiros métodos de nomenclatura, de forma que seu endereço
no barramento e no slot correspondentes foi usado. O endereço do dispositivo 03:05.0,
encontrado na saída do comando lspci, revela o dispositivo associado:
As interfaces de rede são criadas pelo próprio kernel do Linux, mas existem muitos comandos
que podem ser usados para interagir com elas. Normalmente, a configuração ocorre auto-
maticamente e não há necessidade de se alterar as configurações manualmente. Ainda assim,
com o nome da interface, é possível informar ao kernel como proceder para configurá-la se
necessário.
Gerenciamento da interface
Embora o antigo, e meu preferido, comando ifconfig ainda possa ser usado para fazer consultas
e configurações de interface simples, ele agora está obsoleto devido ao seu suporte limitado a
interfaces não ethernet. O ifconfig foi substituído pelo comando ip, que é capaz de gerenciar
muitos outros aspectos das interfaces TCP/IP, como rotas e túneis.
Para a maioria das tarefas comuns, a riqueza de recursos do comando ip acaba sendo excessiva,
e por isso existem comandos auxiliares que facilitam a ativação e configuração das interfaces
de rede. Os comandos ifup e ifdown servem para configurar interfaces de rede com base nas
definições de interface encontradas no arquivo /etc/network/interfaces. Embora possam ser
invocados manualmente, esses comandos são, em geral, executados automaticamente durante
a inicialização do sistema.
Todas as interfaces de rede gerenciadas por ifup e ifdown devem estar listadas no arquivo
/etc/network/interfaces. O formato usado no arquivo é simples: as linhas que começam
com a palavra auto são usadas para identificar as interfaces físicas a serem acessadas quando
o ifup é executado com a opção -a. O nome da interface deve seguir a palavra auto na mesma
linha. Todas as interfaces marcadas como auto são ativadas no momento da inicialização, na
ordem em que estão listadas.
auto lo
iface lo inet loopback
auto enp3s5
iface enp3s5 inet dhcp
A família de endereços deve ser inet para as redes TCP/IP, mas também há suporte a redes
IPX (ipx) e IPv6 (inet6). As interfaces de loopback usam o método de configuração loopback.
Com o método dhcp, a interface usa as configurações de IP fornecidas pelo servidor DHCP
466 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Listening on LPF/enp3s5/00:16:3e:8d:2b:5b
Sending on LPF/enp3s5/00:16:3e:8d:2b:5b
Sending on Socket/fallback
DHCPDISCOVER on enp3s5 to 255.255.255.255 port 67 interval 4
DHCPOFFER of 10.90.170.158 from 10.90.170.1
DHCPREQUEST for 10.90.170.158 on enp3s5 to 255.255.255.255 port 67
DHCPACK of 10.90.170.158 from 10.90.170.1
bound to 10.90.170.158 -- renewal in 1616 seconds.
Neste exemplo, o método escolhido para a interface enp3s5 foi dhcp, de modo que o comando
ifup chamou um programa cliente DHCP para obter as configurações de IP do servidor DHCP.
Da mesma forma, o comando ifdown enp3s5 pode ser usado para desativar a interface.
Nas redes sem um servidor DHCP, o método static pode ser usado e as configurações de IP
fornecidas manualmente em /etc/network/interfaces. Por exemplo:
As interfaces que usam o método static não precisam de uma instrução auto correspondente,
pois são ativadas sempre que o hardware de rede é detectado.
Se a mesma interface tiver mais de uma entrada iface, todos os endereços e opções configu-
rados serão aplicados ao se abrir essa interface. Isso é útil para configurar endereços IPv4 e
IPv6 na mesma interface, bem como para configurar diversos endereços do mesmo tipo em
uma única interface.
máquina não for destinada a se conectar a uma rede. O nome local geralmente corresponde ao
nome da rede da máquina, mas nem sempre. Se o arquivo /etc/hostname existir, o sistema
operacional usará o conteúdo da primeira linha como nome local, que a partir daí é chamado
simplesmente de nome do host (hostname, em inglês). As linhas que começam com # dentro
de /etc/hostname são ignoradas.
O arquivo /etc/hostname pode ser editado diretamente, mas o nome de host da máquina
também pode ser definido com o comando hostnamectl. Quando fornecido com o subcomando
set-hostname, o comando hostnamectl pega o nome dado como argumento e o escreve em
/etc/hostname:
O comando hostnamectl pode definir dois outros tipos de nomes de host além do nome de
host estático:
• Hostname pretty
Ao contrário do nome de host estático, o nome de host pretty pode incluir todos os tipos de
caracteres especiais. Ele pode ser usado para definir um nome mais descritivo para a máquina,
por exemplo “Armazenamento compartilhado da LAN”:
• Hostname transiente - Usado quando o nome de host estático não está definido
ou quando ele é o nome localhost padrão. O nome de host transiente é normalmente
definido junto com outras configurações automáticas, mas também pode ser modificado
com o comando hostnamectl, por exemplo:
Se nem a opção –pretty nem –transient forem usadas, os três tipos de nomes de host serão
configurados com o nome fornecido. Para definir o nome de host estático, mas não os nomes
pretty e transiente, usa-se a opção –static. Em todos os casos, somente o nome de host
estático é armazenado no arquivo /etc/hostname. O comando hostnamectl também pode ser
usado para exibir diversas informações descritivas e de identidade sobre o sistema em execução:
Esta é a ação padrão do comando hostnamectl, de modo que o subcomando status pode ser
omitido.
Com relação ao nome dos nós remotos da rede, o sistema operacional tem duas maneiras
básicas à sua disposição para combinar nomes e números IP: usar uma fonte local ou usar
um servidor remoto para traduzir nomes em números IP e vice-versa. Os métodos podem ser
complementares entre si, e sua ordem de prioridade é definida no arquivo de configuração Name
Service Switch: /etc/nsswitch.conf. Este arquivo é usado pelo sistema e pelos aplicativos
para determinar não apenas as fontes para as correspondências de nome-IP, mas também as
fontes das quais obter informações de nome-serviço em uma variedade de categorias, chamadas
bancos de dados.
O banco de dados hosts mantém um registro do mapeamento entre nomes e números de host.
A linha dentro de /etc/nsswitch.conf que começa com hosts define os serviços responsáveis
por fornecer as associações para ele:
Neste exemplo, files e dns são os nomes de serviços que especificam como o processo de
pesquisa de nomes de host funciona. Primeiro, o sistema procura por correspondências em
arquivos locais e, em seguida, solicita correspondências ao serviço DNS.
O arquivo local do banco de dados hosts é /etc/hosts, um arquivo de texto simples que associa
endereços IP a nomes de host, com uma linha por endereço IP, por exemplo:
469 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
127.0.0.1 localhost
O número IP 127.0.0.1 é o endereço padrão da interface de loopback, daí sua associação com
o nome localhost.
Também é possível vincular aliases opcionais ao mesmo IP. Os aliases podem fornecer grafias
alternativas, nomes de host mais curtos, e devem ser adicionados no final da linha, por exemplo:
• Os campos da entrada são separados por qualquer número de espaços em branco e/ou
caracteres de tabulação;
• O texto que começa em um caractere # e vai até o final da linha é um comentário e é
ignorado;
• Os nomes de host podem conter apenas caracteres alfanuméricos, sinais de menos e
pontos;
• Os nomes de host devem começar com um caractere alfabético e terminar com um
caractere alfanumérico.
Após a especificação do serviço files, a especificação dns diz ao sistema para solicitar a um
serviço DNS a associação nome/IP desejada. O conjunto de rotinas responsáveis por este
método é chamado de resolver (resolvedor) e seu arquivo de configuração é /etc/resolv.conf.
O exemplo a seguir mostra um /etc/resolv.conf genérico contendo entradas para os servidores
DNS públicos do Google:
nameserver 8.8.4.4
nameserver 8.8.8.8
DNS. Apenas um servidor de nomes é necessário, mas é possível informar até três deles. Os
suplementares serão usados como reserva. Se nenhuma entrada de servidor de nomes estiver
presente, o comportamento padrão é usar o servidor de nomes da máquina local.
O resolver pode ser configurado para adicionar automaticamente o domínio aos nomes antes
de consultá-los no servidor de nomes. Por exemplo:
nameserver 8.8.4.4
nameserver 8.8.8.8
domain 4linux.com.br
search mydomain.net mydomain.com
A entrada domain define 4linux.com.br como o nome de domínio local, assim, as consultas por
nomes dentro deste domínio podem usar nomes curtos relativos ao domínio local. A entrada
search tem uma finalidade semelhante, mas aceita uma lista de domínios a experimentar
quando um nome curto é fornecido. Por padrão, ela contém apenas o nome de domínio local.
109.3 Resolução de problemas
471
básicos de rede
43
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]
44
Introdução
O Linux dispõe de recursos de rede extremamente flexíveis e poderosos. Na verdade, os sis-
temas operacionais baseados em Linux são frequentemente usados nos dispositivos de rede
comuns, incluindo equipamentos comerciais de alto padrão. Seria possível criar uma certifi-
cação inteira tendo como tema os recursos de rede do Linux. Tendo isso em mente, esta lição
abordará somente algumas ferramentas básicas de configuração e resolução de problemas.
Embora não estejam incluídos nos objetivos oficiais, farejadores de pacotes (packet sniffers)
como o tcpdump são ferramentas úteis para a resolução de problemas. Os sniffers de pa-
cotes permitem visualizar e gravar os pacotes que entram ou saem de uma interface de rede.
Ferramentas como visualizadores hexadecimais e analisadores de protocolo podem, ser usadas
para visualizar esses pacotes com mais detalhes do que um farejador de pacotes normalmente
permitiria. É bom saber que essas opções existem.
Sobre o comando ip
O comando ip é um utilitário bastante recente, usado para visualizar e definir quase tudo
relacionado às configurações de rede. Esta lição cobre alguns dos subcomandos mais usados
do ip, embora mal arranhe a superfície do que está disponível. Vale a pena ler a documentação
para aprender a usá-lo da maneira mais eficaz.
472
473 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Cada subcomando de ip tem sua própria página de manual. A seção SEE ALSO da página do
manual de ip inclui uma lista deles:
root@debian10:/home/debian# man ip
...
SEE ALSO
ip-address(8), ip-addrlabel(8), ip-l2tp(8), ip-link(8), ip-maddress(8),
ip-monitor(8), ip-mroute(8), ip-neighbour(8), ip-netns(8), ip-
ntable(8), ip-route(8), ip-rule(8), ip-tcp_metrics(8), ip-token(8), ip-
tunnel(8), ip-xfrm(8)
IP Command reference ip-cref.ps
...
Em vez de passar por aqui toda vez que você precisar da página de manual, simplesmente
adicione -e o nome do subcomando a ip, por exemplo, man ip-route.
Outra boa fonte de informações é a função de ajuda. Para visualizar a ajuda integrada,
adicione help após o subcomando:
Os protocolos roteáveis permitem que os designers de rede segmentem as redes para reduzir os
requisitos de processamento dos dispositivos de conectividade, fornecer redundância e gerenciar
o tráfego.
474 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Os endereços IPv4 e IPv6 têm duas seções. O primeiro conjunto de bits constitui a seção da
rede, ao passo que o segundo representa a seção do host. O número de bits que constituem a
seção da rede é determinado pela máscara de rede (também chamada de máscara de sub-rede).
Ele também pode ser chamado de comprimento do prefixo. Independentemente de como é
chamado, trata-se do número de bits que a máquina trata como sendo a parte da rede do
endereço. No IPv4, ele às vezes é especificado em notação decimal com pontos.
Veja abaixo um exemplo usando IPv4. Observe como os dígitos binários mantêm seu valor de
posição nos octetos, mesmo quando são divididos pela máscara de rede.
192.168.130.5/20
Network = 192.168.128.0
Host = 2.5
A seção da rede de um endereço é usada pelas máquinas IPv4 ou IPv6 para pesquisar em qual
interface um pacote deve ser enviado em sua tabela de roteamento. Quando um host IPv4
ou IPv6 com roteamento habilitado recebe um pacote que não é destinado ao próprio host,
ele busca uma correspondência para a parte da rede do destino em uma rede da tabela de
roteamento. Se uma entrada correspondente for encontrada, ele envia o pacote ao destino
especificado na tabela. Se nenhuma entrada for encontrada e uma rota padrão estiver config-
urada, ele é enviado para a rota padrão. Se nenhuma entrada for encontrada e nenhuma rota
padrão estiver configurada, o pacote é descartado.
Antes de configurar uma interface, devemos primeiro saber quais interfaces estão disponíveis.
Há algumas maneiras de fazer isso. Uma delas é usar a opção -a de ifconfig:
475 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# ifconfig -a
Outra forma é usar ip. Há diversos exemplos com ip addr, ip a e alguns com ip address.
Eles são todos sinônimos. Oficialmente, o subcomando é ip address. Assim, para visualizar a
página de manual, usamos man ip-address e não man ip-addr.
root@debian10:/home/debian# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group
default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:54:18:57 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff
Pressupondo que o sistema de arquivos sys esteja montado, também podemos listar o conteúdo
de /sys/class/net
root@debian10:/home/debian# ls /sys/class/net
enp0s3 enp0s8 lo
Para configurar uma interface com o ifconfig, você deve estar logado como root ou rodar um
utilitário como sudo para executar o comando com privilégios de root. Siga o exemplo abaixo:
Note como, no IPv6, a palavra-chave add foi usada. Se um endereço IPv6 não for precedido
por add, será exibida uma mensagem de erro.
476 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Uma tarefa comum para ip link é desabilitar ou habilitar uma interface. Isso também pode ser
feito com o ifconfig:
Às vezes é necessário ajustar o MTU de uma interface. Da mesma forma que é possível
habilitar/desabilitar interfaces, esse ajuste também pode ser feito com ifconfig ou ip link:
A tabela de roteamento
Os comandos route, netstat -r e ip route podem ser usados para visualizar a tabela de rotea-
mento. Se quiser modificar as rotas, use route ou ip route. Eis abaixo alguns exemplos de
visualização de uma tabela de roteamento:
root@debian10:/home/debian# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8
root@debian10:/home/debian# ip route
default via 10.0.2.2 dev enp0s3 proto dhcp metric 100
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
192.168.150.0/24 dev enp0s8 proto kernel scope link src 192.168.150.200
root@debian10:/home/debian# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8
Observe como não há saída relacionada ao IPv6. Para visualizar a tabela de roteamento do
IPv6, usamos route -6, netstat -6r e ip -6 route.
root@debian10:/home/debian# route -6
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2001:db8::/64 [::] U 256 0 0 enp0s8
fe80::/64 [::] U 100 0 0 enp0s3
2002:a00::/24 [::] !n 1024 0 0 lo
[::]/0 2001:db8::1 UG 1 0 0 enp0s8
localhost/128 [::] Un 0 2 84 lo
2001:db8::10/128 [::] Un 0 1 0 lo
fe80::a00:27ff:fe54:5359/128 [::] Un 0 1 0 lo
ff00::/8 [::] U 256 1 3 enp0s3
ff00::/8 [::] U 256 1 6 enp0s8
Um exemplo de netstat -r6 foi omitido porque sua saída é idêntica à de route -6. Algumas
das saídas do comando route acima são autoexplicativas. A coluna Flag fornece algumas
informações sobre a rota. O sinalizador U indica que uma rota está ativa. Um ! significa rota
rejeitada, ou seja, uma rota com um ! não será usada. O sinalizador n indica que a rota não
foi armazenada em cache. O kernel mantém um cache de rotas separadamente de todas as
rotas conhecidas para permitir pesquisas mais rápidas. O sinalizador G indica um gateway. A
coluna Metric ou Met não é usada pelo kernel. Ela se refere à distância administrativa até o
alvo. Essa distância administrativa é usada pelos protocolos de roteamento para determinar
478 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
rotas dinâmicas. A coluna Ref é a contagem de referência ou o número de usos de uma rota.
Assim como Metric, ela não é usada pelo kernel do Linux. A coluna Use mostra o número de
pesquisas para uma rota.
Na saída de netstat -r, MSS indica o tamanho máximo do segmento para as conexões TCP
nessa rota. A coluna Window mostra o tamanho da janela TCP padrão. irtt mostra o tempo
de ida e volta dos pacotes nesta rota.
1. Destino;
2. Endereço opcional seguido pela interface;
3. O protocolo de roteamento usado para adicionar a rota;
4. O escopo da rota. Se omitido, trata-se de um escopo global ou um gateway;
5. A métrica da rota. Ela é usada pelos protocolos de roteamento dinâmico para determinar
o custo da rota. Não é usada pela maioria dos sistemas;
6. Se for uma rota IPv6, a preferência da rota RFC4191.
Exemplo de IPv4
Exemplo de IPv6
1. O destino é fc0::/64;
2. Ele é acessível através da interface enp0s8;
3. Foi adicionado automaticamente pelo kernel;
4. O escopo foi omitido, portanto é global;
5. A rota tem um valor de custo de 256;
6. Ela tem uma preferência de IPv6 medium.
479 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Gerenciando as rotas
As rotas podem ser gerenciadas com route ou ip route. Veja abaixo um exemplo de adição
e remoção de uma rota usando o comando route. Com route, adicionamos a opção -6 para
IPv6:
A melhor maneira de testar uma conexão de rede é tentar usar seu aplicativo. Se isso não
funcionar, existem muitas ferramentas disponíveis para ajudar a diagnosticar o problema.
$ ping6 -c 3 2001:db8::10
PING 2001:db8::10(2001:db8::10) 56 data bytes
64 bytes from 2001:db8::10: icmp_seq=1 ttl=64 time=0.425 ms
64 bytes from 2001:db8::10: icmp_seq=2 ttl=64 time=0.480 ms
64 bytes from 2001:db8::10: icmp_seq=3 ttl=64 time=0.725 ms
A opção -c é usada para especificar o número de pacotes a enviar. Se você omitir esta opção,
ping e ping6 continuarão a enviar pacotes até que você os interrompa, normalmente com a
combinação de teclas Ctrl+C
Não é possível executar ping em um host, mas isso não significa que você não pode se conectar
a ele. Muitas empresas têm firewalls ou listas de controle de acesso ao roteador que bloqueiam
tudo, exceto o mínimo necessário para que os sistemas funcionem. Isso inclui as solicitações
e respostas de eco ICMP. Como esses pacotes podem incluir dados arbitrários, um invasor
astuto poderia usá-los para extrair dados.
Traçando Rotas
Os programas traceroute e traceroute6 servem para mostrar a rota que um pacote faz para
chegar ao seu destino. Para isso, eles enviam diversos pacotes ao destino, incrementando o
campo Time-To-Live (TTL) do cabeçalho IP com cada pacote subsequente. Cada roteador
ao longo do caminho responde com uma mensagem ICMP de TTL excedido:
Por padrão, o traceroute envia 3 pacotes UDP com dados inúteis para a porta 33434,
incrementando-os a cada vez que envia um pacote. Cada linha na saída do comando é uma
interface de roteador que o pacote atravessa. Os tempos mostrados em cada linha da saída
são o tempo de ida e volta de cada pacote. O endereço IP é o endereço da interface do
roteador em questão. Se o traceroute puder, ele usa o nome DNS da interface do roteador.
Às vezes, aparece * no lugar de uma hora. Quando isso acontece, significa que o traceroute
nunca recebeu a mensagem de TTL excedido para este pacote. Isso geralmente indica que a
última resposta é o último salto da rota.
Se você tiver acesso a root, a opção -I configura o traceroute para usar solicitações de eco
ICMP ao invés de pacotes UDP. Elas geralmente são mais eficazes do que o UDP porque o
host de destino tem mais probabilidade de responder a uma solicitação de eco ICMP do que
ao pacote UDP:
Algumas empresas bloqueiam solicitações e respostas de eco ICMP. Para contornar isso, pode-
mos usar o TCP. Usando uma porta TCP aberta conhecida, garantimos que o host de destino
responderá. Para usar o TCP, inclua a opção -T junto com -p para especificar a porta. Como
no caso das solicitações de eco ICMP, é necessário ter acesso de root para fazer isso:
1 * * *
2 096-034-094-106.biz.spectrum.com (96.34.94.106) 12.178 ms 12.229 ms 12.175 ms
3 dtr01hlrgnc-gbe-4-15.hlrg.nc.charter.com (96.34.64.172) 12.134 ms 12.093 ms 12.062
ms
4 acr01mgtnnc-vln-492.mgtn.nc.charter.com (96.34.67.202) 31.146 ms 31.192 ms 31.828 ms
5 bbr01gnvlsc-bue-3.gnvl.sc.charter.com (96.34.2.112) 39.057 ms 46.706 ms 39.745 ms
6 bbr01aldlmi-tge-0-0-0-13.aldl.mi.charter.com (96.34.0.161) 50.590 ms 58.852 ms
58.841 ms
7 prr01ashbva-bue-3.ashb.va.charter.com (96.34.3.51) 34.556 ms 37.892 ms 38.274 ms
8 bx2-ashburn.bell.ca (206.126.236.203) 38.249 ms 36.991 ms 36.270 ms
9 tcore4-ashburnbk_0-12-0-0.net.bell.ca (64.230.125.190) 66.779 ms 63.218 ms tcore3-
ashburnbk_100ge0-12-0-0.net.bell.ca (64.230.125.188) 60.441 ms
10 tcore4-toronto47_2-8-0-3.net.bell.ca (64.230.51.22) 63.932 ms 63.733 ms 68.847 ms
11 agg2-toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.118) 60.144 ms 60.443 ms agg1-
toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.114) 60.851 ms
12 dis4-clarkson16_5-0.net.bell.ca (64.230.131.98) 67.246 ms dis4-clarkson16_7-0.net.bell
.ca (64.230.131.102) 68.404 ms dis4-clarkson16_5-0.net.bell.ca (64.230.131.98)
67.403 ms
13 207.35.12.142 (207.35.12.142) 66.138 ms 60.608 ms 64.656 ms
14 unassigned-117.001.centrilogic.com (66.135.117.1) 70.690 ms 62.190 ms 61.787 ms
15 unassigned-116.122.akn.ca (66.135.116.122) 62.692 ms 69.470 ms 68.815 ms
16 208.94.166.201 (208.94.166.201) 61.433 ms 65.421 ms 65.247 ms
17 208.94.166.201 (208.94.166.201) 64.023 ms 62.181 ms 61.899 ms
Como o ping, o traceroute tem suas limitações. É possível que firewalls e roteadores bloqueiem
os pacotes enviados ou devolvidos ao traceroute. Se você tiver acesso de root, há opções que
podem ajudar a obter resultados precisos.
root@debian10:/home/debian# nc -l 1234
LPI Exemplo
A saída de LPI Example aparece após o exemplo abaixo, que mostra a configuração de um
remetente netcat para enviar pacotes para net2.example.net na porta 1234. A opção -l é usada
para especificar que nc deve receber dados em vez de enviá-los:
O netcat funciona com endereços IPv4 e IPv6. Ele funciona com TCP e UDP. Pode inclusive
ser usado para configurar um shell remoto rudimentar.
484 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/home/debian# hostname
net2
root@debian10:/home/debian# nc -u -e /bin/bash -l 1234
A opção -u significa UDP. -e instrui o netcat a enviar tudo o que recebe para a entrada padrão
do executável que vem em seguida. Neste exemplo, /bin/bash.
root@debian10:/home/debian# hostname
net1
root@debian10:/home/debian# nc -u net2.example.net 1234
hostname
net2
pwd
/home/emma
dhclient
root@debian10:/home/debian# ss -tulnp
root@debian10:/home/debian# ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:
Port
udp UNCONN 0 0 :68 *:
users:(("dhclient",pid=693,fd=6))
tcp LISTEN 0 128 :22 *:
users:(("sshd",pid=892,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 :
users:(("master",pid=1099,fd=13))
tcp LISTEN 0 128 [::]:22 [::]:*
users:(("sshd",pid=892,fd=4))
tcp LISTEN 0 100 [::1]:25 [::]:*
users:(("master",pid=1099,fd=14))
A coluna Recv-Q é o número de pacotes que um socket recebeu, mas não passou para seu
programa. A coluna Send-Q é o número de pacotes que um socket enviou e que não foram
confirmados pelo receptor. As colunas restantes são autoexplicativas.
486 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
• Fonte: - https://access.redhat.com/articles/ip-command-cheat-sheet
109.4 Configurar o DNS do lado
487
do cliente
45
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]
46
Introdução
Pense comigo, o que é mais fácil de gravar:
200.139.14.15 ou 4linux.com.br?
200.100.50.99 ou youtube.com?
Classes DNS
O DNS tem três classes de registro: IN, HS e CH. Nesta aula, todas as consultas de DNS
serão do tipo IN. A classe IN se refere a endereços da internet que usam a pilha TCP/IP. CH
488
489 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
significa ChaosNet, uma tecnologia de rede que teve vida curta e não está mais em uso. A
classe HS refere-se ao Hesiod. O Hesiod é uma maneira de armazenar coisas como passwd e
entradas de grupo no DNS. O Hesiod está além do escopo desta aula.
Entendendo /etc/nsswitch.conf
Se liga em um exemplo simples de /etc/nsswitch.conf tirado da man page:
passwd: compat
group: compat
shadow: compat
Suponha que um processo esteja tentando resolver o nome do host lpi.4linux.com.br. Ele faria
uma chamada apropriada à biblioteca C (provavelmente gethostbyname). Esta função então
lê /etc/nsswitch.conf. Como o processo está procurando um nome de host, ele encontrará
a linha que começa com hosts. Em seguida, ele tenta usar o DNS para resolver o nome. A
coluna seguinte [!UNAVAIL=return] indica que, se o serviço não estiver indisponível, não é
necessário tentar a próxima fonte, ou seja, se o DNS estiver disponível, ele para de tentar
resolver o nome do host, mesmo se os servidores de nome forem incapazes de fazê-lo. Se o
DNS estiver indisponível, ele prossegue para a próxima fonte. Neste caso, a próxima fonte é
files.
Quando vemos uma coluna no formato [resultado=ação], isso significa que quando uma
pesquisa do resolvedor na coluna à esquerda resultar em resultado, então a ação é execu-
tada. Se resultado for precedido por !, isso quer dizer que, se o resultado não for resultado,
a ação deve ser executada. Para obter descrições dos resultados e ações possíveis, consulte a
página do manual.
Agora, suponha que um processo esteja tentando resolver um número de porta para um nome
490 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
de serviço. Ele leria a linha services. A primeira fonte listada é NIS. NIS significa Network
Information Service (às vezes apelidado de Páginas Amarelas). Este é um serviço antigo que
permitia o gerenciamento central de coisas como usuários. Raramente é usado devido à sua
fraca segurança. A coluna seguinte, [NOTFOUND=return], indica que se a pesquisa foi bem-
sucedida, mas o serviço não foi encontrado, é preciso parar de procurar. Se a condição acima
mencionada não se aplicar, ele usará arquivos locais.
O arquivo /etc/resolv.conf
O arquivo /etc/resolv.conf é usado para configurar a resolução do host via DNS. Algumas
distribuições têm scripts de inicialização, daemons e outras ferramentas que gravam neste
arquivo. Lembre-se disso ao editá-lo manualmente. Verifique a documentação de sua dis-
tribuição e de quaisquer ferramentas de configuração de rede, se esse for o seu caso. Algumas
ferramentas, como o NetworkManager, deixam um comentário no arquivo informando que as
alterações manuais serão sobrescritas.
A opção mais comum é nameserver. Ela é usada para especificar o endereço IPv4 ou IPv6
de um servidor DNS. Na data em que esta aula foi escrita, era possível especificar até três
servidores de nomes. Se o seu /etc/resolv.conf não tiver a opção nameserver, o sistema usará
por padrão o servidor de nomes da máquina local.
Veja abaixo um exemplo simples, mas representativo de configurações que são comuns:
search 4linux.com.br
nameserver 10.0.0.53
nameserver fd00:ffff::2:53
Outra opção comum é domain. Ela é usada para definir o nome de domínio local. Se esta
opção estiver ausente, o padrão é usar tudo após o primeiro . no nome de host da máquina.
Se o nome do host não contiver um ., presume-se que a máquina faça parte do domínio raiz.
491 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Como no caso de search, domain pode ser usado para pesquisas curtas de nomes.
Lembre-se de que domain e search são mutuamente exclusivos. Se ambos estiverem presentes,
será usada a última instância no arquivo.
Muitas opções podem ser definidas de forma a afetar o comportamento do resolvedor. Para
configurá-las, use a palavra-chave option, seguida pelo nome da opção a ser configurada e, se
for o caso, um : seguido pelo valor. Veja abaixo um exemplo de configuração da opção de
tempo limite (timeout), ou seja, o período de tempo em segundos que o resolvedor espera por
um servidor de nome antes de desistir:
option timeout:3
Existem outras opções para resolv.conf, mas essas são as mais comuns.
O arquivo /etc/hosts
O arquivo /etc/hosts é usado para resolver nomes para endereços IP e vice-versa. Há suporte
a IPv4 e IPv6. A coluna da esquerda é o endereço IP, o resto são nomes associados a esse
endereço. O uso mais comum de /etc/hosts é para hosts e endereços nos quais o DNS não é
possível, como endereços de loopback. No exemplo abaixo, são definidos os endereços IP dos
componentes críticos da infraestrutura.
127.0.0.1 localhost
127.0.1.1 proxy
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.1.53 dns1.4linux.com.br
fd00:ffff::1:53 dns1.4linux.com.br
10.0.2.53 dns2.4linux.com.br
fd00:ffff::2:53 dns2.4linux.com.br
492 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
systemd-resolved
O systemd inclui um serviço chamado systemd-resolved. Ele fornece mDNS, DNS e LLMNR.
Quando está em execução, ele escuta as solicitações de DNS em 127.0.0.53. Ele não fornece
um servidor DNS completo. Quaisquer solicitações de DNS que recebe são pesquisadas nos
servidores configurados em /etc/systemd/resolv.conf ou /etc/resolv.conf. Se você deseja
empregar o serviço, use resolve para hosts em /etc/nsswitch.conf. Lembre-se de que o pacote
do sistema operacional que possui a biblioteca systemd-resolution pode não estar instalado
por padrão.
O comando getent
O utilitário getent é usado para exibir entradas de bancos de dados de serviços de nome. Ele
é capaz de recuperar registros de qualquer fonte configurável por /etc/nsswitch.conf.
Para usar o getent, inclua o tipo de nome que deseja resolver após o comando e, opcionalmente,
uma entrada específica a pesquisar. Se você especificar apenas o tipo de nome, o getent tentará
exibir todas as entradas referentes àquele tipo de dados:
A partir da versão 2.2.5 do glibc, é possível forçar o getent a usar uma fonte de dados específica
com a opção -s. O exemplo abaixo demonstra isso:
208.94.166.198 lpi.4linux.com.br
O comando host
host é um programa simples para procurar entradas DNS. Sem opções, se host receber um
nome, ele retorna os conjuntos de registros A, AAAA e MX. Se um endereço IPv4 ou IPv6 for
fornecido, ele produzirá o registro PTR, caso haja um disponível:
Se você estiver procurando por um tipo de registro específico, pode usar host -t:
host também pode ser usado para consultar um servidor de nomes específico caso não se
queira usar os que estão em /etc/resolv.conf. Basta adicionar o endereço IP ou nome de host
do servidor que se deseja usar como último argumento:
O comando dig
Outra ferramenta para consultar servidores DNS é o dig. Esse comando é muito mais detalhado
do que host. Por padrão, dig consulta os registros A. Ele provavelmente é prolixo demais para
simplesmente buscar um endereço IP ou nome de host. O dig funciona para pesquisas simples,
mas é mais adequado para solucionar problemas de configuração do servidor DNS:
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: ca7a415be1cec45592b082665ef87f3483b81ddd61063c30 (good)
;; QUESTION SECTION:
;lpi.4linux.com.br. IN A
;; ANSWER SECTION:
lpi.4linux.com.br. 600 IN A 208.94.166.198
;; AUTHORITY SECTION:
4linux.com.br. 86400 IN NS dns2.easydns.net.
4linux.com.br. 86400 IN NS dns1.easydns.com.
4linux.com.br. 86400 IN NS dns3.easydns.ca.
;; ADDITIONAL SECTION:
dns1.easydns.com. 172682 IN A 64.68.192.10
dns2.easydns.net. 170226 IN A 198.41.222.254
dns1.easydns.com. 172682 IN AAAA 2400:cb00:2049:1::a29f:1835
dns2.easydns.net. 170226 IN AAAA 2400:cb00:2049:1::c629:defe
Como vemos, o dig fornece muitas informações. A saída é dividida em seções. A primeira
seção exibe informações sobre a versão do dig instalada e a consulta enviada, junto com as
opções usadas para o comando. Em seguida vêm informações sobre a consulta e a resposta.
A seção seguinte mostra informações sobre as extensões EDNS usadas e a consulta. No exem-
plo, a extensão cookie é usada. O dig está procurando um registro A para lpi.4linux.com.br.
registros NS para o servidor, junto com os registros A e AAAA dos servidores no registro NS
do domínio.
Como host, você pode especificar um tipo de registro com a opção -t:
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 185c67140a63baf46c4493215ef8906f7bfbe15bdca3b01a (good)
;; QUESTION SECTION:
;4linux.com.br. IN SOA
;; ANSWER SECTION:
4linux.com.br. 600 IN SOA dns1.easydns.com. zone.easydns.com. 1593109612 3600 600
1209600 300
;; AUTHORITY SECTION:
4linux.com.br. 81989 IN NS dns1.easydns.com.
4linux.com.br. 81989 IN NS dns2.easydns.net.
4linux.com.br. 81989 IN NS dns3.easydns.ca.
;; ADDITIONAL SECTION:
dns1.easydns.com. 168271 IN A 64.68.192.10
dns2.easydns.net. 165815 IN A 198.41.222.254
dns3.easydns.ca. 107 IN A 64.68.196.10
dns1.easydns.com. 168271 IN AAAA 2400:cb00:2049:1::a29f:1835
dns2.easydns.net. 165815 IN AAAA 2400:cb00:2049:1::c629:defe
O dig tem muitas opções que permitem refinar a saída e a consulta enviada ao servidor. Essas
opções começam com +. Uma delas é a opção short, que suprime todas as saídas, exceto o
resultado:
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;4linux.com.br. IN MX
;; ANSWER SECTION:
4linux.com.br. 468 IN MX 0 aspmx.l.google.com.
4linux.com.br. 468 IN MX 10 aspmx4.googlemail.com.
4linux.com.br. 468 IN MX 10 aspmx5.googlemail.com.
4linux.com.br. 468 IN MX 10 aspmx2.googlemail.com.
4linux.com.br. 468 IN MX 10 aspmx3.googlemail.com.
4linux.com.br. 468 IN MX 5 alt2.aspmx.l.google.com.
4linux.com.br. 468 IN MX 5 alt1.aspmx.l.google.com.
;; AUTHORITY SECTION:
4linux.com.br. 77130 IN NS dns2.easydns.net.
4linux.com.br. 77130 IN NS dns3.easydns.ca.
4linux.com.br. 77130 IN NS dns1.easydns.com.
;; ADDITIONAL SECTION:
dns1.easydns.com. 76140 IN A 64.68.192.10
dns2.easydns.net. 73684 IN A 198.41.222.254
dns1.easydns.com. 76140 IN AAAA 2400:cb00:2049:1::a29f:1835
dns2.easydns.net. 73684 IN AAAA 2400:cb00:2049:1::c629:defe
• Fonte: https://www.scribd.com/document/395026391/DNS-CheatSheet-V1-02-1
498 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
47
Introdução
A segurança é fundamental na administração de qualquer sistema. Como um bom admin-
istrador de sistemas Linux, você deve ficar atento a uma série de coisas, como permissões
especiais em arquivos, validade das senhas de usuário, portas e sockets abertos, limitações no
uso de recursos do sistema, gestão de usuários conectados e escalonamento de privilégios por
meio su e sudo. Nesta lição, trataremos de cada um desses tópicos.
O bit SUID permite que o arquivo seja executado com privilégios de proprietário do arquivo.
Numericamente, ele é representado por 4000 e, simbolicamente, por s ou S no bit de permissão
de execução do proprietário. Um exemplo clássico de arquivo executável com a permissão SUID
definida é passwd:
root@debian10:/home/debian# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63736 Jul 27 2018 /usr/bin/passwd
499
500 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
execução. Se, no lugar dele, houvesse um S maiúsculo (rwS), isso significaria que a permissão
de execução presumida não foi definida.
Por outro lado, o bit SGID pode ser definido tanto em arquivos quanto em diretórios. Nos
arquivos, seu comportamento é equivalente ao de SUID, mas os privilégios serão os mesmos
do proprietário do grupo. Quando definido em um diretório, no entanto, ele permite que
todos os arquivos criados ali herdem a propriedade do grupo do diretório. Como o SUID, o
SGID é simbolicamente representado por s ou S no bit de permissão de execução do grupo.
Numericamente, ele é representado por 2000. Para definir o SGID em um diretório, usamos
chmod. É necessário adicionar 2 (SGID) às permissões tradicionais (755, em nosso caso):
Para encontrar arquivos com SUID e/ou SGID definidos, use o comando find com a opção
-perm. Podemos incluir valores numéricos e simbólicos. Os valores, por sua vez, podem ser
passados sozinhos ou precedidos por travessão (-) ou barra (/). O significado é o seguinte:
Por exemplo, para localizar arquivos com apenas o SUID definido no diretório de trabalho
atual, usaríamos o seguinte comando:
./arquivo
Observe que, uma vez que não existiam arquivos contendo exclusivamente o SUID, criamos
um para mostrar algumas saídas. Podemos executar o mesmo comando em notação simbólica:
Se estiver procurando por arquivos no mesmo diretório com o bit SGID definido, execute find
/usr/bin/ -perm -2000 ou find /usr/bin/ -perm -g+s.
Finalmente, para encontrar arquivos com qualquer uma das duas permissões especiais definidas,
adicione 4 e 2 e use /:
/usr/bin/ssh-agent
/usr/bin/bsd-write
/usr/bin/crontab
/usr/bin/newgrp
/usr/bin/wall
/usr/bin/chsh
/usr/bin/su
root@debian10:/tmp# passwd -S
root P 02/06/2021 0 99999 7 -1
Além de relatar o status da conta, o comando passwd empregado com permissão de root
serve para realizar algumas manutenções básicas de conta. Ele permite bloquear e desbloquear
contas, forçar um usuário a alterar sua senha no próximo login e excluir a senha de um usuário
com as opções -l, -u, -e e -d, respectivamente.
Para testar essas opções, é conveniente apresentarmos o comando su neste momento. Através
do su, você pode trocar de usuário durante uma sessão de login. Assim, por exemplo, usaríamos
passwd como root para bloquear a senha de root. Em seguida, mudaríamos para a conta de
503 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
root para verificar no status da conta se a senha foi de fato bloqueada (L) e não pode ser
alterada. Finalmente, voltando ao usuário root, desbloqueamos a senha de root.
Com as opções -f ou –inactive, usermod também serve para definir o número de dias
até que uma conta com a senha expirada seja desabilitada (p. ex. usermod -f 3 carol).
Além de passwd e usermod, o comando mais direto para lidar com senhas e validade de contas
é chage (“change age”, ou alterar idade). Como root, você pode passar para chage a opção -l
(ou –list) seguida por um nome de usuário para imprimir na tela a senha atual desse usuário
e as informações de expiração da conta; como usuário comum, você pode ver suas próprias
informações:
Quando executado sem opções e seguido apenas por um nome de usuário, chage se comporta
de maneira interativa:
504 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Para aprender mais sobre passwd, usermod e chage - e suas opções - consulte as
páginas de manual respectivas.
lsof significa “list open files”, o que não é pouca coisa, já que, para o Linux tudo é arquivo.
Na verdade, se você digitar lsof no terminal, aparecerá uma enorme lista de arquivos comuns,
arquivos de dispositivos, sockets etc. Porém, nesta lição, vamos nos concentrar principalmente
nas portas. Para imprimir a lista de todos os arquivos de rede da “Internet”, execute lsof com
a opção -i:
root@debian10:/tmp# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 494 avahi 12u IPv4 17676 0t0 UDP *:mdns
avahi-dae 494 avahi 13u IPv6 17677 0t0 UDP *:mdns
avahi-dae 494 avahi 14u IPv4 17678 0t0 UDP *:59828
avahi-dae 494 avahi 15u IPv6 17679 0t0 UDP *:58016
sshd 554 root 3u IPv4 18629 0t0 TCP *:ssh (LISTEN)
sshd 554 root 4u IPv6 18640 0t0 TCP *:ssh (LISTEN)
dhclient 593 root 6u IPv4 19584 0t0 UDP *:bootpc
dhclient 2422 root 8u IPv4 42129 0t0 UDP *:bootpc
sshd 2574 root 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
sshd 2691 debian 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
Além do serviço bootpc que é usado pelo DHCP a saída mostra dois serviços ouvindo conexões
ssh e o servidor web Apache (http) bem como duas conexões SSH estabelecidas. Podemos
especificar um determinado host com a notação @ip-address para verificar suas conexões:
Para imprimir apenas os arquivos de rede IPv4 e IPv6, use as opções -i4 e -i6, respec-
tivamente.
Da mesma forma, é possível filtrar por porta, passando para a opção -i (ou -i@ip-address) o
argumento :port:
Ao incluir mais de uma porta, nós as separamos com vírgulas (os intervalos são especificados
com um traço):
O lsof tem uma quantidade impressionante de opções disponíveis. Para saber mais,
consulte a página de manual.
root@debian10:/tmp# fuser .
/tmp: 2924c
root@debian10:/tmp# fuser -v .
USER PID ACCESS COMMAND
/tmp: root kernel mount /tmp
root 2924 ..c.. bash
– r: Diretório raiz;
– m: Arquivo mmap ou biblioteca compartilhada;
– .: Espaço reservado (omitido no modo de exibição padrão).
• Coluna COMMAND: O comando afiliado ao arquivo (bash).
fuser também pode ser usado para eliminar os processos que estão acessando o arquivo,
com as opções -k ou –kill (p. ex.: fuser -k 80/tcp). Consulte a página de manual para
saber mais detalhes.
Vamos olhar o netstat agora. O netstat é uma ferramenta de rede muito versátil usada
principalmente para imprimir “estatísticas de rede”.
Executado sem opções, netstat exibe as conexões ativas da Internet e os sockets Unix. Devido
ao tamanho da lista, vale a pena canalizar a saída para less:
Se você está interessado apenas em informações numéricas sobre portas e hosts, pode usar a
opção -n ou –numeric para imprimir apenas os números de portas e endereços IP. Note como
509 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Como vemos, é possível tornar os comandos netstat muito úteis e produtivos combinando
algumas de suas opções. Navegue pelas páginas de manual para aprender mais e encontrar as
combinações que melhor atendem às suas necessidades.
• Múltiplos hosts: Separando-os com espaços (p. ex.: nmap localhost 192.168.1.7);
• Intervalos de hosts: Usando um traço (p. ex.: nmap 192.168.1.3-20);
• subredes: Usando um curinga ou notação CIDR (p. ex.: nmap 192.168.1. * ou nmap
192.168.1.0/24). Podemos excluir determinados hosts (p. ex.: nmap 192.168.1.0/24
–exclude 192.168.1.7).
Para escanear uma porta específica, use a opção -p seguida pelo número da porta ou nome
do serviço (nmap -p 22 e nmap -p ssh terão a mesma saída):
Também podemos escanear várias portas ou intervalos de portas usando vírgulas e travessões,
respectivamente:
O ulimit lida com os limites soft (flexíveis) e hard (rígidos), especificados pelas opções -S e
-H, respectivamente. Quando executado sem opções ou argumentos, o ulimit exibe os blocos
511 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
root@debian10:/tmp# ulimit
unlimited
Com a opção -a, o ulimit mostra todos os limites flexíveis atuais (o mesmo que -Sa); para
exibir todos os limites rígidos atuais, use -Ha:
root@debian10:/tmp# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1765
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1765
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Assim, para exibir os limites, usaríamos ulimit seguido por -S (soft) ou -H (hard) e a opção
referente ao recurso; se nenhum -S ou -H for fornecido, os limites flexíveis (soft) serão mostra-
dos:
root@debian10:/tmp# ulimit -u
1765
root@debian10:/tmp# ulimit -Su
1765
root@debian10:/tmp# ulimit -Hu
1765
Da mesma maneira, para definir novos limites para um recurso determinado, especificamos -S
ou -H seguidos pela opção de recurso desejada e o novo valor. Esse valor pode ser um número
ou as palavras especiais soft (limite flexível atual), hard (limite rígido atual) ou unlimited (sem
limite). Se nem -S nem -H forem especificados, ambos os limites serão definidos. Por exemplo,
vamos primeiro ler o valor do tamanho máximo atual para os arquivos gravados pelo shell e
seus filhos:
Agora, vamos alterar o valor de unlimited para 500 sem especificar -S ou -H. Observe como
os limites flexíveis e rígidos são alterados:
Os limites rígidos só podem ser aumentados pelo usuário root. Por outro lado, os usuários
comuns podem diminuir os limites rígidos e aumentar os limites flexíveis até o valor dos
limites rígidos. Para tornar persistentes os novos valores de limites após a reinicialização, eles
devem ser gravados no arquivo /etc/security/limits.conf. Este também é o arquivo usado pelo
administrador para aplicar restrições a usuários específicos.
Saiba que não existe uma página de manual para ulimit. Trata-se de uma ferramenta
nativa do bash e, por isso, é preciso consultar a man page do bash para saber mais
sobre ela.
O last imprime uma lista dos últimos usuários logados, com as informações mais recentes no
topo:
root@debian10:/tmp# last
debian pts/1 192.168.100.23 Tue Jul 13 10:29 still logged in
debian tty2 tty2 Tue Jul 13 10:26 still logged in
reboot system boot 4.19.0-13-amd64 Tue Jul 13 10:21 still running
debian pts/1 10.11.10.245 Thu Jul 8 14:15 - crash (4+20:05)
debian tty2 tty2 Thu Jul 8 14:15 - crash (4+20:06)
wtmp begins Sat Feb 6 03:20:38 2021
A linha wtmp begins Sat Feb 6 03:20:38 2021 se refere a /var/log/wtmp, o arquivo
especial de log no qual last obtém as informações.
Podemos passar um nome de usuário a last para ver apenas as entradas referentes a ele:
Em relação à segunda coluna (terminal), pts significa Pseudo Terminal Slave em oposição a
um terminal TeleTYpewriter ou tty; 0 refere-se ao primeiro (a contagem começa em zero).
Os utilitários who e w concentram-se nos usuários atualmente logados e são bastante semel-
hantes. O primeiro exibe quem está conectado, ao passo que o último também exibe infor-
mações sobre o que eles estão fazendo.
Quando executado sem opções, o who exibe quatro colunas correspondentes ao usuário conec-
tado, terminal, data e hora e nome do host:
root@debian10:/tmp# who
debian tty2 2021-07-13 10:26 (tty2)
debian pts/1 2021-07-13 10:29 (192.168.100.23)
O who aceita uma série de opções, dentre as quais podemos destacar as seguintes:
root@debian10:/tmp# w
11:45:40 up 1:24, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
debian tty2 tty2 10:26 1:23m 59.26s 13.12s /usr/bin/gnome-software --
gapplication-service
debian pts/1 192.168.100.23 10:29 0.00s 0.80s 0.04s sshd: debian [priv]
A linha superior fornece informações sobre a hora atual (17:56:12), há quanto tempo o sistema
está ativo (up 40 min), o número de usuários atualmente logados (2 users) e os números
médios de carga (load average: 0.04, 0.12, 0.09). Esses valores referem-se ao número médio
de trabalhos na fila de execução nos últimos 1, 5 e 15 minutos, respectivamente.
root@debian10:/tmp# w debian
11:47:16 up 1:25, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
debian tty2 tty2 10:26 1:25m 59.53s 13.14s /usr/bin/gnome-software --
gapplication-service
debian pts/1 192.168.100.23 10:29 2.00s 0.80s 0.04s sshd: debian [priv]
debian@debian10:~$ su - root
Password:
root@debian10:~# logout
debian@debian10:~$ su -
Password:
root@debian10:/home/debian#
O uso do traço (-) garante que o ambiente do usuário de destino seja carregado. Sem ele,
será mantido o ambiente do antigo usuário:
debian@debian10:~$ su
Password:
root@debian10:/home/debian#
Por outro lado, existe o comando sudo. Com ele, é possível executar um comando como
516 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
usuário root ou qualquer outro usuário. Do ponto de vista da segurança, sudo é uma opção
muito melhor do que su, pois apresenta duas vantagens principais:
1. Para executar um comando como root, você não precisa da senha do usuário root, mas
apenas a do usuário atual, em conformidade com uma política de segurança. A política
de segurança padrão é sudoers, especificada em /etc/sudoers e /etc/sudoers.d/*;
2. O sudo permite executar comandos simples com privilégios elevados em vez de lançar
um novo subshell para root, como faria su.
O uso básico de sudo é sudo -u target-username command. Porém, para executar um comando
como usuário root, a opção -u target-username não é necessária:
O sudoers usa uma marca temporal por usuário (e por terminal) para ocultar as cre-
denciais, sendo assim possível usar o sudo sem uma senha por um período padrão
de quinze minutos. Esse valor padrão pode ser modificado adicionando-se a opção
timestamp_timeout como configuração de Defaults em /etc/sudoers (p. ex.: De-
faults timestamp_timeout=1 define o tempo limite do cache de credenciais como um
minuto).
O arquivo /etc/sudoers
O arquivo de configuração principal do sudo é /etc/sudoers (também existe o diretório /etc/-
sudoers.d). É ali que os privilégios de sudo dos usuários são determinados. Em outras palavras,
aqui você especifica quem pode executar quais comandos, sob quais nomes de usuário e em
quais máquinas, bem como outras configurações. A sintaxe usada é a seguinte:
A especificação de privilégio para o usuário root é ALL=(ALL:ALL) ALL. Isso se traduz assim:
517 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
o usuário root (root) pode se logar com todos os hosts (ALL), em nome de todos os usuários
e todos os grupos ((ALL:ALL)), além de executar todos os comandos (ALL). O mesmo vale
para os membros do grupo sudo, note como os nomes de grupos são identificados com um
símbolo de porcentagem (%).
Assim, para que a usuário debian seja capaz de verificar o status de apache2 de qualquer host
em nome de qualquer usuário ou grupo, adicionaríamos a seguinte linha ao arquivo sudoers:
Para evitar o debian o incômodo de precisar fornecer sua senha para executar o comando
systemctl status apache2, modificamos a linha desta maneira:
Digamos que agora você queira restringir seus hosts a 192.168.1.7 e permitir que root execute
systemctl status apache2 no nome do usuário debian. A linha teria de ser modificada desta
forma:
Se debian fosse promovido a sysadmin e você quisesse conceder a ele todos os privilégios, a
maneira mais fácil seria incluí-la no grupo especial sudo com usermod e a opção -G (e talvez
também a opção -a, que garante que o usuário não seja removido de nenhum outro grupo ao
518 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Em vez de editar /etc/sudoers diretamente, use simplesmente o comando visudo como root
(p. ex. visudo), que abre /etc/sudoers usando o editor de texto predefinido. Para alterar o
editor de texto padrão, adicione a opção editor como configuração de Defaults em /etc/su-
doers.
Além dos usuários e grupos, também podemos utilizar aliases em /etc/sudoers. É possível
definir três categorias principais de aliases: aliases de host (Host_Alias), aliases de usuário
(User_Alias) e aliases de comando (Cmnd_Alias). Eis um exemplo:
A partir deste arquivo sudoers de amostra, vamos explicar os três tipos de aliases com um
519 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
• Aliases de host: Incluem uma lista separada por vírgulas de nomes de host, endereços
IP, redes e grupos de rede (precedidos por +). Máscaras de rede também podem estar
especificadas. O alias de host SERVERS inclui um endereço IP e dois nomes de host:
• Aliases de usuário: Incluem uma lista separada por vírgulas de usuários especificados
como nomes de usuários, grupos (precedidos por %) e grupos de rede (precedidos por +).
Para excluir usuários específicos, usamos !. O alias de usuário ADMINS, por exemplo,
inclui o usuário debian, os membros do grupo sudo e os membros do alias de usuário
PRIVILEGE_USERS que não pertencem ao alias de usuário REGULAR_USERS:
• Aliases de comando: Incluem uma lista separada por vírgulas de comandos e diretórios.
Se um diretório for especificado, qualquer arquivo que esteja nesse diretório será incluído,
mas os subdiretórios serão ignorados. O alias do comando SERVICES inclui um único
comando com todos os seus subcomandos, conforme especificado pelo asterisco ( * ):
• Fonte: - https://quickref.me/lsof
TCPDUMP
• Fonte: - https://www.comparitech.com/net-admin/tcpdump-cheat-sheet/
520 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
NMAP
• Fonte: - https://dementium2.com/admin-da-rede/folha-de-dicas-do-nmap/
SS
• Fonte: - https://br.pinterest.com/pin/426505027211060187/
Fabio Gonçalves De Melo Santana / [email protected]
48
110.2 Configurar a segurança do
host
Introdução
Este capítulo explica quatro maneiras básicas de melhorar a segurança do host:
521
522 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
Porém, nos sistemas modernos, a senha não é mais armazenada no arquivo /etc/passwd.
Em vez disso, o campo de senha contém apenas um x minúsculo. O arquivo /etc/passwd
precisa ser legível por todos os usuários; portanto, não é uma boa ideia armazenar senhas nele.
O x indica que a senha criptografada (com hash) está na verdade armazenada no arquivo
/etc/shadow. Este arquivo não deve ser legível para todos os usuários.
As configurações de senha são definidas com os comandos passwd e chage. Ambos os co-
mandos alteram a entrada referente ao usuário joatham no arquivo /etc/shadow. Como
superusuário, você pode definir a senha do usuário joatham com o seguinte comando:
Em seguida, o sistema pede que a nova senha seja confirmada duas vezes.
Para listar o tempo de expiração da senha e outras configurações de expiração de senha para
o usuário joatham, use:
Para evitar que o usuário joatham faça login no sistema, o superusuário pode definir uma data
de expiração da senha anterior à data atual. Por exemplo, se a data de hoje fosse 29/03/2020,
poderíamos definir uma data mais antiga para a expiração da senha do usuário:
para bloquear a conta temporariamente através da opção -l em passwd. Para testar os efeitos
dessas alterações, tente fazer o login como o usuário joatham:
Login incorrect
Para evitar que todos os usuários, exceto o usuário root, se loguem no sistema temporaria-
mente, o superusuário pode criar um arquivo chamado /etc/nologin. Esse arquivo pode conter
uma mensagem para os usuários notificando-os sobre o motivo pelo qual não podem fazer lo-
gin no momento (por exemplo, notificações de manutenção do sistema). Para saber mais,
consulte man 5 nologin. Note que também existe um comando nologin que pode ser usado
para impedir um login quando definido como o shell padrão de um usuário. Por exemplo:
Antigamente, a disponibilidade de recursos do computador era muito menor. Não era acon-
selhável executar muitos serviços em modo autônomo ao mesmo tempo. Em vez disso, um
superdaemon era usado para escutar as conexões de rede de entrada e iniciar o serviço apro-
priado sob demanda. Este método de construção de uma conexão de rede era um pouco mais
demorado. inetd e xinetd são superdaemons bastante conhecidos. Nos sistemas atuais basea-
dos em systemd, a unidade systemd.socket pode ser usada de maneira semelhante. Nesta
seção, usaremos o xinetd para interceptar conexões com o daemon sshd e iniciar este daemon
no momento adequado para demonstrar como o superdaemon era usado.
Antes de configurar o serviço xinetd, é necessária uma pequena preparação. Não importa
se você usa um sistema baseado em Debian ou Red Hat. Embora estas explicações tenham
sido testadas no Debian/GNU Linux 9.9, elas devem funcionar em qualquer sistema Linux
atual com systemd sem nenhuma alteração significativa. Primeiro, verifique se os pacotes
openssh-server e xinetd estão instalados. Em seguida, confira se o serviço SSH funciona com:
524 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
Verifique também se o serviço SSH está escutando em sua porta de rede padrão 22:
No caso de você querer tornar esta mudança permanente, sobrevivendo à reinicialização, use
systemctl disable sshd.service.
Agora você pode criar o arquivo de configuração do xinetd /etc/xinetd.d/ssh com algumas
configurações básicas:
service ssh
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/sshd
server_args = -i
flags = IPv4
interface = 192.168.178.1
}
525 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
Verifique nas conexões SSH de entrada qual serviço está escutando no momento.
Podemos ver que o serviço xinetd assumiu o controle do acesso à porta 22.
Eis mais alguns dados sobre a configuração do xinetd. O arquivo de configuração principal é
/etc/xinetd.conf:
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
includedir /etc/xinetd.d
Além das configurações padrão, há apenas uma diretiva para definir um diretório de inclusão.
Neste diretório você pode definir um arquivo de configuração único para cada serviço que
deseja que o xinetd gerencie. Fizemos isso acima para o serviço SSH e chamamos o arquivo de
/etc/xinetd.d/ssh. O nome dos arquivos de configuração pode ser escolhido arbitrariamente,
exceto por nomes de arquivos que contenham um ponto (.) ou que terminem com um til (~).
Mas é comum atribuir ao arquivo o nome do serviço que se deseja configurar.
$ ls -l /etc/xinetd.d
total 52
-rw-r--r-- 1 root root 640 Feb 5 2018 chargen
-rw-r--r-- 1 root root 313 Feb 5 2018 chargen-udp
526 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
Esses arquivos podem ser usados como modelos no raro caso de ser necessário usar alguns
serviços legados, como o daytime, uma implementação ainda incipiente de um servidor de
horário. Todos esses arquivos de modelo contêm a diretiva disable = yes.
Eis mais alguns detalhes sobre as diretivas usadas para ssh no arquivo de exemplo /etc/x-
inetd.d/ssh, acima.
service ssh
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/sshd
server_args = -i
flags = IPv4
interface = 192.168.178.1
}
• service: Lista o serviço que o xinetd deve controlar. Podemos usar um número de porta,
como 22, ou o nome mapeado para o número da porta em /etc/services, por exemplo
ssh;
• {: Abrimos uma chave para iniciar as configurações detalhadas;
• disable: Para ativar essas configurações, defina esta diretiva como no. Se quiser desabil-
itar a configuração temporariamente, use yes;
• socket_type: Escolha stream para os sockets TCP ou dgram para os sockets UDP e
outros;
• protocol: Escolha TCP ou UDP;
• wait: Para as conexões TCP, esta diretiva costuma estar definida como no;
• user: O serviço iniciado nesta linha será propriedade deste usuário;
• server: Caminho completo para o serviço que deve ser iniciado por xinetd;
• server_args: Aqui, podemos adicionar opções para o serviço. Quando iniciados por um
super-servidor, muitos serviços requerem uma opção especial. Para o SSH, essa opção
seria -i;
527 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
Os sucessores dos serviços iniciados pelo super-servidor xinetd são as unidades de socket do
systemd. Configurar essas unidades é muito simples, porque já existe uma unidade de socket
do systemd predefinida para SSH. É preciso garantir que os serviços xinetd e SSH não estejam
em execução.
Para verificar qual serviço está escutando agora na porta 22, usamos lsof novamente. Observe
que a opção -P foi usada para mostrar o número da porta em vez do nome do serviço na saída:
Para completar esta sessão, tentamos fazer o login no servidor com um cliente SSH à escolha.
Nos sistemas baseados em SyS-V-init, podemos verificar o status de todos os serviços com o
seguinte comando:
Verifique se cada um dos serviços listados na saída do comando é necessário e desative todos
os que forem desnecessários com (para sistemas baseados em Debian):
528 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
Nos sistemas modernos baseados em systemd, podemos usar o seguinte comando para listar
todos os serviços em execução:
Este comando interrompe o serviço e o remove da lista de serviços, evitando assim que seja
lançado na próxima inicialização do sistema.
Além disso, para obter um levantamento dos serviços de rede que estão à escuta, podemos
usar netstat em sistemas mais antigos (desde que o pacote net-tools esteja instalado):
$ netstat -ltu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN
tcp6 0 0 [::]:http [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
Ou, nos sistemas modernos, rodamos o comando equivalente ss (que significa “serviços de
socket”):
$ ss -ltu
Netid State Recv-Q Send-Q Local Address:Port Peer
Address:Port
udp UNCONN 0 0 0.0.0.0:bootpc
529 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]
0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:ssh
0.0.0.0:*
tcp LISTEN 0 80 127.0.0.1:mysql
0.0.0.0:*
tcp LISTEN 0 128 *:http
*:*
tcp LISTEN 0 128 [::]:ssh
[::]:*
Usaremos novamente o serviço SSH como exemplo básico. O serviço em nosso host de exemplo
deve ser acessível apenas a partir da rede local. Primeiro, verificamos se o daemon SSH usa
a biblioteca libwrap, que oferece suporte a TCP wrappers:
sshd: ALL
sshd: LOCAL
• Fonte: - https://www.xmind.net/m/ZBi6/
110.3 Proteção de dados com
531
criptografia
49
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]
50
Introdução
SSH é um protocolo seguro usado como meio principal de conexão remota a servidores Linux.
Ele fornece uma interface baseada em texto gerando um shell remoto. Depois de conectar,
todos os comandos que você digita em seu terminal local são enviados para o servidor remoto
e executados lá.
532
533 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Gerando e trabalhando com chaves SSH Esta seção cobrirá como gerar chaves SSH em uma
máquina cliente e distribuir a chave pública aos servidores onde devem ser usadas. Esta é uma
boa seção para começar, caso você não tenha gerado chaves anteriormente, devido à maior
segurança que permite para conexões futuras.
534 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Vários algoritmos criptográficos podem ser usados para gerar chaves SSH, incluindo RSA, DSA
e ECDSA. As chaves RSA são geralmente preferidas e são o tipo de chave padrão.
root@debian10:/home/debian# ssh-keygen
Este prompt permite que você escolha o local para armazenar sua chave privada RSA. Pressione
ENTER para deixar isso como o padrão, o que os armazenará no .sshdiretório oculto no
diretório inicial do usuário. Deixar o local padrão selecionado permitirá que seu cliente SSH
encontre as chaves automaticamente.
O próximo prompt permite que você insira uma frase secreta de comprimento arbitrário para
proteger sua chave privada. Por padrão, você terá que inserir qualquer senha definida aqui toda
vez que usar a chave privada, como uma medida de segurança adicional. Sinta-se à vontade
para pressionar ENTER para deixar em branco se não quiser uma senha longa. Porém, lembre-
se de que isso permitirá que qualquer pessoa que obtenha o controle de sua chave privada
faça o login em seus servidores.
Se você optar por inserir uma frase secreta, nada será exibido enquanto você digita. Esta é
uma precaução de segurança.
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+
Este procedimento gerou um par de chaves RSA SSH, localizado no .sshdiretório oculto dentro
do diretório inicial do usuário. Esses arquivos são:
Para fazer isso, inclua o -bargumento com o número de bits que deseja. A maioria dos
servidores oferece suporte a chaves com comprimento de pelo menos 4096 bits. Chaves mais
longas podem não ser aceitas para fins de proteção DDOS:
Se você já criou uma chave diferente, será perguntado se deseja substituir a chave anterior:
Overwrite (y/n)?
Se você escolher “sim”, sua chave anterior será substituída e você não poderá mais fazer login
nos servidores usando essa chave. Por isso, certifique-se de substituir as chaves com cuidado.
Nota: Para alterar ou remover a frase secreta, você deve conhecer a frase secreta original. Se
você perdeu a frase secreta da chave, não há recurso e você terá que gerar um novo par de
chaves.
root@debian10:/home/debian# ssh-keygen -p
Você pode digitar a localização da chave que deseja modificar ou pressionar ENTER para
aceitar o valor padrão:
Digite a senha antiga que deseja alterar. Em seguida, será solicitada uma nova senha longa:
root@debian10:/home/debian# ssh-keygen -l
Você pode pressionar ENTER se esse for o local correto da chave, caso contrário, insira o local
revisado. Você receberá uma string que contém o comprimento de bits da chave, a impressão
digital, a conta e o host para o qual foi criada e o algoritmo usado:
537 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Se você atualmente tem acesso SSH baseado em senha configurado para o seu servidor e tem
o ssh-copy-idutilitário instalado, este é um processo simples. A ssh-copy-idferramenta está
incluída em muitos pacotes OpenSSH de distribuições Linux, portanto, muito provavelmente,
pode ser instalada por padrão.
Se você tiver essa opção, poderá transferir facilmente sua chave pública digitando:
Agora você pode fazer login nessa conta sem uma senha:
Você pode enviar o conteúdo da chave e canalizá-lo para o sshcomando. No lado remoto,
você pode garantir que o ~/.sshdiretório existe e, em seguida, anexar o conteúdo canalizado
ao ~/.ssh/authorized_keysarquivo:
Após inserir a senha, sua chave será copiada, permitindo que você faça o login sem uma senha:
Em sua máquina local, você pode encontrar o conteúdo de seu arquivo de chave pública
digitando:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+
tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+
dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+
PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+
ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12
N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+
xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/
zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+
ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/
YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/
lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test
Você pode copiar esse valor e colá-lo manualmente no local apropriado no servidor remoto.
Você terá que fazer login no servidor remoto por outros meios (como o console da web
DigitalOcean).
Agora você deve conseguir fazer login no servidor remoto sem uma senha.
A forma mais simples assume que seu nome de usuário em sua máquina local é o mesmo que
no servidor remoto. Se isso for verdade, você pode se conectar usando:
Se o seu nome de usuário for diferente no servidor remoto, você precisa passar o nome do
usuário remoto desta forma:
Na primeira vez em que se conectar a um novo host, você verá uma mensagem semelhante a
esta:
Se você estiver usando autenticação de senha, será solicitada a senha da conta remota aqui.
Se você estiver usando chaves SSH, será solicitada a senha de sua chave privada, se houver
uma definida, caso contrário, você será conectado automaticamente.
Isso se conectará ao host remoto, fará a autenticação com suas credenciais e executará o
comando que você especificou. A conexão será encerrada imediatamente em seguida.
Você pode fazer isso especificando o número da porta com a opção -p:
541 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Para evitar ter que fazer isso sempre que efetuar login no servidor remoto, você pode criar
ou editar um arquivo de configuração no diretório ~/.ssh dentro do diretório inicial do seu
computador local.
Aqui, você pode definir opções de configuração específicas do host. Para especificar sua nova
porta, use um formato como este:
• ~/.ssh/config
Host remote_alias
HostName remote_host
Port port_num
Isso permitirá que você efetue login sem especificar o número da porta específica na linha de
comando.
Para evitar ter que fazer isso repetidamente, você pode executar um agente SSH. Este pequeno
utilitário armazena sua chave privada após você inserir a senha pela primeira vez. Ele estará
disponível durante a sua sessão de terminal, permitindo que você se conecte no futuro sem
inserir novamente a senha.
Isso também é importante se você precisar encaminhar suas credenciais SSH (mostradas pos-
teriormente).
Para iniciar o Agente SSH, digite o seguinte em sua sessão de terminal local:
542 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
eval $(ssh-agent)
Isso iniciará o programa do agente e o colocará em segundo plano. Agora, você precisa
adicionar sua chave privada ao agente, para que ele possa gerenciar sua chave:
root@debian10:/home/debian# ssh-add
Você terá que inserir sua senha (se houver). Depois disso, seu arquivo de identidade é adi-
cionado ao agente, permitindo que você use sua chave para entrar sem ter que digitar a senha
novamente.
Para começar, você deve ter seu agente SSH iniciado e sua chave SSH adicionada ao agente
(veja anteriormente). Depois de fazer isso, você precisa se conectar ao seu primeiro servidor
usando a opção -A. Isso encaminha suas credenciais para o servidor para esta sessão:
A partir daqui você pode fazer SSH em qualquer outro host que sua chave SSH está autorizada
a acessar. Você se conectará como se sua chave SSH privada estivesse localizada neste servidor.
Para fazer isso, conecte-se ao servidor remoto e abra o arquivo /etc/ssh/sshd_config com
privilégios de root ou sudo:
root@debian10:/home/debian# vi /etc/ssh/sshd_config
PasswordAuthentication no
Depois de fazer a alteração, salve e feche o arquivo. Para implementar as mudanças, você
deve reiniciar o serviço SSH.
Agora, todas as contas no sistema não poderão fazer login com SSH usando senhas.
Para alterar a porta de escuta do daemon SSH, você terá que fazer login no servidor remoto.
Abra o arquivo sshd_config no sistema remoto com privilégios de root, fazendo login com esse
usuário ou usando sudo:
root@debian10:/home/debian# vi /etc/ssh/sshd_config
544 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Depois de entrar, você pode alterar a porta em que o SSH é executado, encontrando a
especificação Port 22 e modificando-a para refletir a porta que deseja usar. Por exemplo, para
alterar a porta para 4444, coloque isso em seu arquivo:
#Port 22
Port 4444
Salve e feche o arquivo quando terminar. Para implementar as mudanças, você deve reiniciar
o daemon SSH.
Depois que o daemon for reiniciado, você precisará autenticar especificando o número da porta
(demonstrado em uma seção anterior).
Em seu servidor remoto, abra este arquivo agora com privilégios de root ou sudo:
root@debian10:/home/debian# vi /etc/ssh/sshd_config
O primeiro método de especificar as contas que têm permissão para fazer login é usando
a diretiva AllowUsers. Procure a diretiva AllowUsers no arquivo. Se não existir, crie-o em
qualquer lugar. Após a diretiva, liste as contas de usuário que devem ter permissão para fazer
login por meio de SSH:
The programs included with the Debian GNU/Linux system are free software;
(...)
Last login: Sun Jun 28 13:47:27 2020 from 127.0.0.1
Eis a explicação: com a opção -L, especificamos que, a porta local 8585 deve se conectar
à porta http 80 em www.gnu.org usando o processo SSH executado em debian, nosso host
local. Poderíamos ter escrito ssh -L 8585:www.gnu.org:80 localhost com o mesmo efeito. Se
agora visitássemos http://localhost:8585 com um navegador web, seríamos encaminhados a
www.gnu.org. Para fins de demonstração, usaremos o lynx (o navegador web clássico em
modo texto):
* Language
* Clean Reload
* Printer Version
* Search
* _
(...)
Se você quisesse fazer exatamente a mesma coisa, mas se conectando por meio de um processo
SSH em execução no halof, o procedimento seria o seguinte:
• Graças à opção -N, não fizemos login no halof, mas sim o encaminhamento de porta;
• A opção -f disse ao SSH para rodar em segundo plano;
• Especificamos o usuário ina para o encaminhamento: [email protected]
Agora, qualquer pessoa que estabelecer uma conexão com o halof na porta 8585 verá a página
inicial padrão do Apache2 do Debian:
This is the default welcome page used to test the correct operation of the Apache2
server after
installation on Debian systems. If you can read this page, it means that the Apache HTTP
server
installed at this site is working properly. You should replace this file (located at
/var/www/html/index.html) before continuing to operate your HTTP server.
(...)
Túneis X11
Agora que você já conhece os túneis de portas, vamos encerrar esta lição discutindo o tunela-
mento X11 (também conhecido como X11forwarding). Por meio de um túnel X11, o X Window
System no host remoto é encaminhado para sua máquina local. Para isso, basta passar a opção
-X ao ssh:
Agora você pode iniciar um aplicativo gráfico, como o navegador firefox, com o seguinte
resultado: o aplicativo será executado no servidor remoto, mas sua exibição será encaminhada
ao seu host local.
Se iniciarmos uma nova sessão SSH com a opção -x, X11forwarding será desabilitado. Tente
iniciar o firefox agora e aparecerá um erro semelhante ao seguinte:
Para contornar esse problema, o GPG conta com um conceito de segurança conhecido como
criptografia de chave pública. A ideia é que você pode dividir os estágios de criptografia e
descriptografia da transmissão em duas partes separadas. Dessa forma, você pode distribuir
livremente a parte de criptografia, desde que proteja a parte de descriptografia.
Isso permitiria uma transferência de mensagem unilateral que pode ser criada e criptografada
por qualquer pessoa, mas apenas descriptografada pelo usuário designado (aquele com a chave
de descriptografia privada). Se ambas as partes criarem pares de chaves pública / privada
e fornecerem uma à outra suas chaves de criptografia públicas, ambas podem criptografar
mensagens uma para a outra.
Portanto, neste cenário, cada parte tem sua própria chave privada e a chave pública do outro
usuário.
Outro benefício desse sistema é que o remetente de uma mensagem pode “assinar” a mensagem
com sua chave privada. A chave pública que o receptor possui pode ser usada para verificar
se a assinatura está realmente sendo enviada pelo usuário indicado.
Se por algum motivo o GPG não estiver instalado, no Ubuntu e no Debian, você pode atualizar
o índice de repositório local e instalá-lo digitando:
549 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Para começar a usar o GPG para criptografar suas comunicações, você precisa criar um par
de chaves. Você pode fazer isso emitindo o seguinte comando:
Isso o levará por algumas perguntas que irão configurar suas chaves:
Neste ponto, gpg irá gerar as chaves usando entropia. Entropia descreve a quantidade de
imprevisibilidade e não determinismo que existe em um sistema. O GPG precisa dessa entropia
para gerar um conjunto seguro de chaves.
Este processo pode demorar muito, dependendo de quão ativo o seu sistema está e do tamanho
da chave que você selecionou.
Isso deve ser feito assim que você fizer o par de chaves, não quando for necessário. Essa chave
de revogação deve ser gerada com antecedência e mantida em um local separado e seguro
para o caso de o computador estar comprometido ou inoperante. Para gerar uma chave de
550 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
revogação, digite:
Posteriormente, será solicitado que você forneça um comentário e, por fim, que confirme as
seleções. Antes de criar o certificado de revogação, você precisará inserir a senha de sua
chave GPG para confirmar sua identidade. O certificado de revogação será gravado no arquivo
especificado pelo –outputsinalizador ( revocation.crtem nosso exemplo):
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system of
your machine might store the data and make it available to others!
Você deve restringir imediatamente as permissões no arquivo de certificado gerado para evitar
o acesso não autorizado:
O certificado de revogação deve ser mantido em segurança para que outros usuários não
possam revogar sua chave. Como afirma a mensagem, você deve considerar fazer o backup do
certificado em outras máquinas e imprimi-lo, contanto que possa protegê-lo adequadamente.
Você pode importar a chave pública de alguém de várias maneiras. Se você obteve uma chave
pública de alguém em um arquivo de texto, o GPG pode importá-la com o seguinte comando:
Também existe a possibilidade de que a pessoa com quem você deseja se comunicar tenha
carregado sua chave em um servidor de chave pública. Esses servidores de chaves são usados
para hospedar as chaves públicas de pessoas de todo o mundo.
Um servidor de chave popular que sincroniza suas informações com uma variedade de outros
servidores é o servidor de chave pública MIT. Você pode pesquisar pessoas por nome ou
endereço de e-mail acessando aqui em seu navegador da web:
Você pode usar este método de pesquisa por nome ou endereço de e-mail. Você pode importar
as chaves que encontrar seguindo os prompts.
Como você sabe que a pessoa que está lhe dando a chave pública é quem ela diz ser? Em alguns
casos, isso pode ser simples. Você pode estar sentado ao lado da pessoa com seus laptops
abertos e trocando as chaves. Essa deve ser uma maneira bastante segura de identificar se
você está recebendo a chave correta e legítima.
Mas existem muitas outras circunstâncias em que esse contato pessoal não é possível. Você
pode não conhecer a outra parte pessoalmente ou pode estar separado por uma distância
física. Se você nunca deseja se comunicar através de canais inseguros, a verificação da chave
pública pode ser problemática.
552 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Felizmente, em vez de verificar todas as chaves públicas de ambas as partes, você pode sim-
plesmente comparar a “impressão digital” derivada dessas chaves. Isso lhe dará uma garantia
razoável de que ambos estão usando as mesmas informações de chave pública.
Isso produzirá uma sequência de números muito mais gerenciável para comparação. Você
pode comparar essa string com a própria pessoa ou com outra pessoa que tenha acesso a essa
pessoa.
Quando você assina a chave, significa que você confia que a pessoa é quem ela afirma ser.
Isso pode ajudar outras pessoas a decidir se também devem confiar nessa pessoa. Se alguém
confia em você e vê que você assinou a chave dessa pessoa, é mais provável que também
confie em sua identidade.
Você deve permitir que a pessoa cuja chave você está assinando tire vantagem de seu rela-
cionamento de confiança, enviando-lhes de volta a chave assinada. Você pode fazer isso
digitando:
Você terá que digitar sua senha novamente. Depois, a chave pública, assinada por você,
será exibida. Envie isso a eles, para que eles possam se beneficiar ao obter o seu “selo de
553 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Quando eles recebem essa nova chave assinada, eles podem importá-la, adicionando as in-
formações de assinatura que você gerou em seu banco de dados GPG. Eles podem fazer isso
digitando:
Eles agora podem demonstrar a outras pessoas que você confia que a identidade deles está
correta.
Com isso em mente, pode ser benéfico tornar sua chave pública disponível publicamente. As
pessoas podem então encontrar suas informações para enviar mensagens com segurança desde
sua primeira interação.
Você pode enviar sua chave pública a qualquer pessoa, solicitando-a no sistema GPG:
mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .
Você pode então enviar esse arquivo para a outra parte por meio de uma mídia apropriada.
Se você deseja publicar sua chave em um servidor de chaves, pode fazê-lo manualmente por
meio dos formulários disponíveis na maioria dos sites de servidor.
Outra opção é fazer isso por meio da interface GPG. Procure sua ID de chave digitando:
554 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
Para enviar sua chave para um determinado servidor de chaves, você pode usar esta sintaxe:
Criptografar mensagens
Você pode criptografar mensagens usando o sinalizador “–encrypt” para GPG. A sintaxe básica
seria:
Isso criptografa a mensagem usando a chave pública do destinatário, assina-a com sua própria
chave privada para garantir que ela está vindo de você e gera a mensagem em formato de
texto em vez de bytes brutos. O nome do arquivo será igual ao nome do arquivo de entrada,
mas com uma extensão .asc.
Você deve incluir um segundo destinatário “-r” com seu próprio endereço de e-mail se quiser
ler a mensagem criptografada. Isso ocorre porque a mensagem será criptografada com a chave
555 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]
pública de cada pessoa e só poderá ser descriptografada com a chave privada associada.
Portanto, se ela fosse criptografada apenas com a chave pública da outra parte, você não
conseguiria ver a mensagem novamente, a menos que de alguma forma obtivesse a chave
privada. Adicionar a si mesmo como segundo destinatário criptografa a mensagem duas vezes
diferentes, uma para cada destinatário.
Descriptografar mensagens
Se, em vez de um arquivo, você tiver a mensagem como um fluxo de texto bruto, poderá
copiá-la e colá-la após digitar gpg sem nenhum argumento. Você pode pressionar “CTRL-D”
para significar o fim da mensagem e o GPG irá descriptografá-la para você.
Manutenção Chave
Existem vários procedimentos que você pode precisar usar regularmente para gerenciar seu
banco de dados de chaves.
Para listar as chaves GPG disponíveis de outras pessoas, você pode emitir este comando:
Suas informações de chave podem ficar desatualizadas se você estiver contando com infor-
mações obtidas de servidores de chaves públicas. Você não quer depender de chaves revogadas,
porque isso significaria que você está confiando em chaves potencialmente comprometidas.
Você pode receber mensagens de erro se alguma de suas chaves não puder ser encontrada no
servidor de chaves.
• Fonte: - https://www.reddit.com/r/Cheatography/comments/ilezuq/openssh_cheat_sheet_by_mis-
terrabinhalder/