20 Comandos Essenciais Linux para Administradores de Sistemas

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