O sistema operacional Linux oferece uma vasta gama de comandos e ferramentas que auxiliam na execução de tarefas administrativas de maneira ágil e eficaz.
No papel de administrador de sistemas, suas responsabilidades incluem a instalação e gerenciamento de softwares, controle de acessos, monitoramento de desempenho, garantia da disponibilidade dos sistemas, realização de backups e restauração dos mesmos, além da resolução de problemas emergenciais. 😜
Neste artigo, vamos explorar alguns dos comandos mais utilizados no dia a dia por administradores de sistemas Linux.
uname
O comando `uname`, quando usado com a opção `-a`, exibe informações detalhadas sobre o sistema. Isso inclui o nome do kernel, sua versão e release, o nome do host, o tipo de processador e dados sobre a plataforma de hardware.
[email protected]:~$ uname -a Linux ubuntu18 5.3.0-1028-azure #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Analisando a saída:
Nome do kernel: Linux Nome do host: ubuntu18 Versão do kernel: 5.3.0-1028-azure Release do kernel: #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 Arquitetura do hardware: x86_64 Processador: x86_64 Plataforma de hardware: x86_64 Sistema operacional: GNU/Linux
df
Utilize o comando `df` para verificar o espaço em disco utilizado e disponível no sistema de arquivos. Sem opções adicionais, a saída é exibida em blocos de 1K.
[email protected]:~$ df Filesystem 1K-blocks Used Available Use% Mounted on udev 437208 0 437208 0% /dev tmpfs 91100 692 90408 1% /run /dev/sda1 30309264 2383952 27908928 8% / ....
A opção `-h` apresenta os resultados em um formato mais amigável, com unidades em MB e GB.
[email protected]:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 427M 0 427M 0% /dev tmpfs 89M 692K 89M 1% /run /dev/sda1 29G 2.3G 27G 8% / tmpfs 445M 0 445M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 445M 0 445M 0% /sys/fs/cgroup /dev/sda15 105M 3.6M 101M 4% /boot/efi /dev/sdb1 3.9G 16M 3.7G 1% /mnt tmpfs 89M 0 89M 0% /run/user/1001
Para excluir um sistema de arquivos específico, como o `tmpfs` (que geralmente apresenta informações menos relevantes), utilize a opção `-x`, resultando em uma saída mais limpa.
[email protected]:~$ df -h -x tmpfs Filesystem Size Used Avail Use% Mounted on udev 427M 0 427M 0% /dev /dev/sda1 29G 2.3G 27G 8% / /dev/sda15 105M 3.6M 101M 4% /boot/efi /dev/sdb1 3.9G 16M 3.7G 1% /mnt
Para listar apenas um tipo específico de sistema de arquivos, use a opção `-t`. Por exemplo, para visualizar apenas sistemas `ext4`:
[email protected]:~$ df -h -t ext4 Filesystem Size Used Avail Use% Mounted on /dev/sda1 29G 2.3G 27G 8% / /dev/sdb1 3.9G 16M 3.7G 1% /mnt
Incluir a opção `–total` adicionará uma linha com os totais gerais de espaço em disco.
[email protected]:~$ df -h -t ext4 --total Filesystem Size Used Avail Use% Mounted on /dev/sda1 29G 2.3G 27G 8% / /dev/sdb1 3.9G 16M 3.7G 1% /mnt total 33G 2.3G 31G 8% -
du
O comando `du` é usado para examinar o uso de espaço em disco de diretórios. Por exemplo, para verificar o espaço consumido em `/var/log`, utilize-o com a opção `-h` para uma saída legível.
[email protected]:~$ sudo du -h /var/log 24K /var/log/Microsoft/Azure/NetworkWatcherAgent/Logs 28K /var/log/Microsoft/Azure/NetworkWatcherAgent 32K /var/log/Microsoft/Azure 36K /var/log/Microsoft 60K /var/log/apt 4.0K /var/log/samba 177M /var/log/journal/0f4f926f583b4691af7de11025b19ff6 177M /var/log/journal ... 204M /var/log
Para visualizar apenas o uso total, use a opção `-s` (sumário).
[email protected]:~$ sudo du -hs /var/log 204M /var/log
free
O comando `free` exibe o uso de memória do sistema, incluindo total, utilizada e livre. Use a opção `-h` para um formato mais fácil de entender.
[email protected]:~$ free -h total used free shared buff/cache available Mem: 889M 272M 100M 712K 517M 443M Swap: 0B 0B 0B
total - Memória total instalada (memtotal + swaptotal) used - Memória utilizada free - Memória não utilizada (memfree + swapfree) buffers - Memória usada por buffers do kernel cache - Memória usada por caches de página buff/cache - Soma de buffers e cache available - Memória estimada disponível para iniciar novas aplicações, sem swap
ps
O comando `ps` exibe informações sobre os processos em execução no sistema. Para visualizar todos os processos de um usuário específico, use a opção `-u` seguida do nome do usuário.
[email protected]:~$ ps -u ubuntu PID TTY TIME CMD 7804 ? 00:00:00 systemd 7805 ? 00:00:00 (sd-pam) 7940 ? 00:00:00 sshd 7941 pts/0 00:00:00 bash 8111 ? 00:00:00 sshd 8112 pts/1 00:00:00 bash 13868 ? 00:00:00 sshd 13869 pts/2 00:00:00 bash 13885 pts/0 00:00:00 man 13895 pts/0 00:00:00 pager 18111 pts/2 00:00:00 man 18121 pts/2 00:00:00 pager 18485 pts/1 00:00:00 ps
Para visualizar todos os processos, use a opção `aux`.
[email protected]:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.7 160076 7020 ? Ss Jun29 0:34 /sbin/init root 2 0.0 0.0 0 0 ? S Jun29 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< Jun29 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< Jun29 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< Jun29 0:00 [kworker/0:0H-kb] ....
Significado dos campos:
Cabeçalho
Significado
PID
Número de Identificação do Processo
%CPU
Percentual de tempo de CPU que o processo está usando
%MEM
Percentual de RAM que o processo está usando
VSZ
Memória virtual sendo usada em KB
RSS
Memória física que o processo está usando em KB
TTY
Terminal associado ao processo
ESTADO
R – Em execução ou pronto para execução, S – Em suspensão, I – Inativo, T – Parado, Z – Zumbi, D – Aguardando E/S de disco, X – Inativo, W – Trocado, N – Processo de baixa prioridade, < – Processo de alta prioridade
top
Enquanto o comando `ps` mostra um “retrato” do estado dos processos em um determinado momento, o `top` apresenta uma lista continuamente atualizada (a cada três segundos por padrão) dos processos do sistema, ordenados por atividade da CPU.
A saída do comando `top` é dividida em duas partes principais: o resumo do sistema no topo e a tabela de processos classificados por atividade da CPU.
top - 14:25:32 up 44 days, 11:37, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 114 total, 1 running, 59 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 910992 total, 101208 free, 274712 used, 535072 buff/cache KiB Swap: 0 total, 0 free, 0 used. 458492 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 50497 ubuntu 20 0 44528 3944 3368 R 0.7 0.4 0:00.15 top 1 root 20 0 160076 7020 4400 S 0.0 0.8 0:34.85 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:+ 9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_+
Alguns campos do resumo do sistema:
uptime
Tempo de atividade do sistema. Tempo desde que a máquina foi iniciada.
load average
A média de carga refere-se ao número de processos que estão aguardando para serem executados, um valor menor que 1,0 significa que a máquina não está sobrecarregada. Existem três valores. O primeiro é a média dos últimos 60 segundos, o segundo é a média dos últimos 5 minutos e o terceiro mostra a média dos últimos 15 minutos.
%Cpu(s)
Esta linha descreve as atividades da CPU.
0,3 us, usuário
0,3% da CPU está sendo usada para processos de usuário.
0,0 sy, sistema
0,0% da CPU está sendo usada para processos do sistema.
0,0 ni, nice
0,0% da CPU está sendo usada por processos de baixa prioridade.
99,7 id, idle
99,7% da CPU está ociosa.
0,0 wa, wait I/O
0,0% da CPU está esperando por E/S.
0,0 hi
Tempo gasto em interrupções de hardware.
0,0 si
Tempo gasto em interrupções de software.
0,0 st
Tempo roubado da VM pelo hypervisor.
Campos na tabela de processos:
PID
Número de Identificação do Processo
USER
Proprietário do processo
PR
Prioridade
NI
Valor Nice
VIRT
Memória virtual usada pelo processo (KB)
RES
Memória física usada pelo processo
SHR
Memória compartilhada usada pelo processo
S
Situação do processo. R – Running (executando), S – Sleeping (dormindo), I – Idle (ocioso), T – Stopped (parado), Z – Zombie, D – Waiting for disk I/O (esperando por E/S de disco), W- Swapped (trocado), X – Dead (morto)
%CPU
Percentual de tempo de CPU que o processo está usando
%MEM
Percentual de memória física que o processo está usando
TIME[+]
Tempo total de CPU usado pelo processo
COMMAND
Nome do programa
Com o `top` em execução, diversos comandos podem ser utilizados. Pressione `h` ou `?` para ver a lista de comandos disponíveis. Pressione `k` para encerrar um processo e `q` para sair do `top`.
dig
O comando `dig` é uma excelente ferramenta para realizar consultas DNS, sendo usado da seguinte forma:
dig <servidor DNS> <domínio> <tipo-de-consulta>
Onde:
- <servidor DNS> é o nome do servidor DNS a ser consultado.
- <domínio> é o nome de domínio sobre o qual a consulta será feita.
- <tipo-de-consulta> é o tipo de registro DNS que se deseja obter (A, MX, NS, SOA, etc.).
Para simplificar a saída, use a opção `+short`.
Para obter um registro A para `google.com`:
[email protected]:~$ dig google.com +short 172.217.164.174
Para visualizar os registros MX para `google.com`:
[email protected]:~$ dig google.com MX +short 50 alt4.aspmx.l.google.com. 10 aspmx.l.google.com. 20 alt1.aspmx.l.google.com. 40 alt3.aspmx.l.google.com. 30 alt2.aspmx.l.google.com.
Se você precisar consultar registros DNS na internet, pode usar também ferramentas de pesquisa DNS online.
who e w
O comando `who` mostra os usuários que estão atualmente logados no sistema.
[email protected]:~$ who ubuntu pts/0 2020-08-14 17:28 (183.83.211.129) ubuntu pts/1 2020-08-14 17:58 (183.83.211.129)
O comando `w` exibe os usuários logados e os processos que estão executando. O cabeçalho mostra a hora atual, tempo de atividade do sistema, o número de usuários conectados e as médias de carga do sistema.
[email protected]:~$ w 18:07:33 up 46 days, 15:19, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ubuntu pts/0 183.83.211.129 17:28 2.00s 0.10s 0.00s w ubuntu pts/1 183.83.211.129 17:58 9:07 0.05s 0.01s vi
A próxima parte da saída exibe os nomes de usuário, o terminal e o IP remoto de onde estão conectados, tempo de login, tempo ocioso, JCPU, PCPU e o programa que estão executando. JCPU é o tempo utilizado por todos os processos ligados ao terminal e PCPU é o tempo utilizado pelo processo atual.
tar
Com o GNU `tar` é possível arquivar vários arquivos em um único arquivo.
Por exemplo, vamos criar um diretório `myfiles` e três arquivos `a.txt`, `b.txt` e `c.txt` dentro dele:
[email protected]:~$ mkdir myfiles ; touch myfiles/{a.txt,b.txt,c.txt}
Para criar um arquivo chamado `allfiles.tar` com todos os arquivos dentro do diretório `myfiles`:
[email protected]:~$ tar -cvf allfiles.tar myfiles myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt
Listando todos os arquivos no diretório atual, podemos ver o diretório `myfiles` e o arquivo `allfiles.tar`:
[email protected]:~$ ls allfiles.tar myfiles
Para extrair um arquivo, use a opção `-x`. Para extrair o arquivo `allfiles.tar`:
[email protected]:~$ tar -xvf allfiles.tar myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt
Também é possível compactar este arquivo usando a opção `-z`, o que cria um arquivo compactado com `gzip`.
[email protected]:~$ tar -zcvf allfiles.tar.gz myfiles myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt [email protected]:~$ ls allfiles.tar.gz myfiles
Para extrair um arquivo compactado, use `-z` junto com a opção `-x`.
[email protected]:~$ tar -zxvf allfiles.tar.gz myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt
grep
O comando `grep` é utilizado para buscar um padrão em um arquivo ou em um conjunto de arquivos. Ele imprime todas as linhas que correspondem ao padrão. Por exemplo, para buscar a linha que contém `ServerRoot` em `/etc/apache2/apache2.conf`:
[email protected]:~$ grep ServerRoot /etc/apache2/apache2.conf # ServerRoot: The top of the directory tree under which the server's #ServerRoot "/etc/apache2"
Para pesquisar em todos os arquivos dentro de um diretório, use `*`. Para incluir subdiretórios na pesquisa, use a opção `-r` (recursivo). Para buscar linhas que contenham o padrão `VirtualHost` em todos os arquivos dentro de `/etc/apache2`:
[email protected]:~$ cd /etc/apache2 [email protected]:/etc/apache2$ grep -r VirtualHost * apache2.conf:# If you do not specify an ErrorLog directive within a <VirtualHost> apache2.conf:# logged here. If you *do* define an error logfile for a <VirtualHost> conf-available/localized-error-pages.conf:# even on a per-VirtualHost basis. If you include the Alias in the global server conf-available/other-vhosts-access-log.conf:# Define an access log for VirtualHosts that don't define their own logfile ports.conf:# have to change the VirtualHost statement in sites-available/000-default.conf:<VirtualHost *:80> ...
rsync
O `rsync` é uma ferramenta de linha de comando eficaz para sincronizar arquivos e diretórios entre dois locais. Pode ser usado para cópias locais e remotas. Ele é rápido pois envia apenas as diferenças entre os arquivos de origem e os existentes no destino.
É amplamente utilizado para backups e como um comando de cópia otimizado para uso diário.
Um exemplo:
Para copiar todos os arquivos do diretório `myfiles` para o diretório `backups`:
[email protected]:~$ rsync -avh myfiles/ /backups sending incremental file list ./ a.txt b.txt c.txt sent 218 bytes received 76 bytes 588.00 bytes/sec total size is 0 speedup is 0.00
Para sincronizar todos os arquivos do diretório `myfiles` para o diretório `backups` em um host remoto, inclua `remote_user@remote_host` no nome do destino. Para sincronizar a pasta `myfiles` para um host remoto com o IP 10.0.0.50:
[email protected]:~$ rsync -avh myfiles/ [email protected]:/home/vagrant [email protected]'s password: sending incremental file list ./ a.txt b.txt c.txt sent 230 bytes received 76 bytes 47.08 bytes/sec total size is 0 speedup is 0.00
ss
O comando `ss` é usado para exibir estatísticas de sockets, similar ao utilitário legado `netstat`. Para exibir sockets TCP, utilize a opção `-t`.
[email protected]:~$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 10.0.0.4:53852 168.63.129.16:8037 ESTAB 0 0 10.0.0.4:ssh 183.83.211.129:64118 ESTAB 0 0 10.0.0.4:33256 169.254.169.254:http ESTAB 0 1080 10.0.0.4:ssh 222.186.30.35:11527 ESTAB 0 0 10.0.0.4:ssh 183.83.211.129:63049
A saída padrão não inclui sockets em modo de escuta. Para visualizar todos os sockets, incluindo os em escuta e os não escuta, use as opções `-t` e `-a`.
[email protected]:~$ ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 80 127.0.0.1:mysql 0.0.0.0:* LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:* ESTAB 0 0 10.0.0.4:53852 168.63.129.16:8037 ESTAB 0 0 10.0.0.4:ssh 183.83.211.129:64118 ESTAB 0 0 10.0.0.4:33256 169.254.169.254:http ESTAB 0 1080 10.0.0.4:ssh 222.186.30.35:11527 ESTAB 0 120 10.0.0.4:ssh 183.83.211.129:63049 LISTEN 0 128 [::]:ssh [::]:* LISTEN 0 128 *:http *:*
locate
O comando `locate` utiliza um banco de dados para pesquisar arquivos, sendo geralmente mais rápido que o comando `find`. Seu uso é simples, por exemplo, para buscar um arquivo chamado `apache2.conf`:
[email protected]:~$ locate apache2.conf /etc/apache2/apache2.conf /var/lib/dpkg/info/apache2.conffiles
Você pode utilizar a opção `-c` para obter apenas a contagem de arquivos que correspondem ao padrão de busca.
[email protected]:~$ locate -c apache2.conf 2
Pode ser necessário atualizar o banco de dados usado pelo `locate` (o `mlocate`). Para isso, use o comando `updatedb`, que requer privilégios de superusuário.
[email protected]:~$ sudo updatedb
find
Um dos comandos mais utilizados no Linux, o `find` permite buscar arquivos baseando-se em nomes, permissões, IDs de usuário e grupo, tamanho, tipo e outros critérios.
Para buscar um arquivo por nome dentro do diretório atual, utilize a opção `-name` seguida do nome do arquivo:
[email protected]:~$ find . -name a.txt ./myfiles/a.txt
Para buscar diretórios, use a opção `-type d`:
[email protected]:~$ find . -type d . ./.ssh ./myfiles ./.cache ./.gnupg ./.gnupg/private-keys-v1.d ./docker
Para buscar arquivos por tamanho, por exemplo, arquivos maiores que 20MB, utilize a opção `-size`:
[email protected]:~$ find . -size +20M ./docker/docker-ce-cli_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb ./docker/docker-ce_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb
systemctl
Com a substituição do `init` pelo `systemd` na maioria das distribuições Linux, o comando `systemctl` é usado para gerenciar serviços e unidades do `systemd`.
Para iniciar um serviço, como o `apache2`:
[email protected]:~$ sudo systemctl start apache2.service
O sufixo `.service` pode ser omitido.
Para parar um serviço:
[email protected]:~$ sudo systemctl stop apache2
Para verificar o status de um serviço, utilize o comando `systemctl status`. O exemplo abaixo mostra o status do `apache2` em execução:
[email protected]:~$ sudo systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Wed 2020-08-19 11:34:04 UTC; 2s ago Process: 25346 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS) Process: 18202 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS) Process: 25536 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 25555 (apache2) Tasks: 55 (limit: 1024) CGroup: /system.slice/apache2.service ├─25555 /usr/sbin/apache2 -k start ├─25558 /usr/sbin/apache2 -k start └─25559 /usr/sbin/apache2 -k start Aug 19 11:34:04 ubuntu18 systemd[1]: Starting The Apache HTTP Server... Aug 19 11:34:04 ubuntu18 systemd[1]: Started The Apache HTTP Server.
ufw
O UFW (Uncomplicated Firewall) é um front-end para o `iptables`, mais fácil de usar. Ele está disponível por padrão em distribuições baseadas em Ubuntu. Em CentOS, o `ufw` pode ser instalado a partir do repositório EPEL.
Para habilitar o `ufw`:
$ sudo ufw enable
Verifique o status do firewall com o comando `ufw status`:
$ sudo ufw status Status: active
As políticas padrão do `ufw` permitem todo tráfego de saída e bloqueiam todo o tráfego de entrada.
O comando abaixo permite tráfego de entrada na porta HTTP:
$ sudo ufw allow http Rule added Rule added (v6)
É possível negar tráfego em qualquer porta. Um exemplo para bloquear tráfego na porta 21:
$ sudo ufw deny 21 Rule added Rule added (v6)
journalctl
Use `journalctl` para visualizar os logs coletados pelo `systemd`. O `systemd` armazena os logs em um local central, em formato binário. Para visualizar estes logs:
[email protected]:~$ sudo journalctl -- Logs begin at Mon 2020-06-29 02:48:31 UTC, end at Wed 2020-08-19 15:07:59 UTC. -- Jun 29 02:48:31 ubuntu kernel: Linux version 5.3.0-1028-azure ([email protected]) (gcc version 7.5.0 (Ubuntu Jun 29 02:48:31 ubuntu kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.3.0-1028-azure root=UUID=b0dd9d06-536e-41 Jun 29 02:48:31 ubuntu kernel: KERNEL supported cpus: Jun 29 02:48:31 ubuntu kernel: Intel GenuineIntel ...
Geralmente, é mais útil visualizar os logs em ordem inversa, ou seja, os logs mais recentes primeiro:
[email protected]:~$ sudo journalctl -r -- Logs begin at Mon 2020-06-29 02:48:31 UTC, end at Wed 2020-08-19 15:10:16 UTC