Dominando o Linux: Comandos Essenciais e Automação com Shell

Vim: Muito Além de um Editor de Texto

O vim é uma ferramenta onipresente. Sua filosofia de design foca na eficiência através de comandos combinados, onde a ação precede a digitação.

O editor opera em diferentes modos, sendo o modo normal o ponto de partida para navegação e execução de comandos, o modo de inserção para edição de texto e o modo visual para seleção de blocos.

graph TD
    A[Modo Normal] -->|i, a, o| B(Modo Inserção)
    B -->|Esc| A
    A -->|v, V, Ctrl+v| C(Modo Visual)
    C -->|Esc| A
    A -->|:| D[Modo Linha de Comando]
    D -->|Enter/Esc| A

A sintaxe do Vim pode ser comparada a uma linguagem natural, combinando verbos e objetos. Por exemplo, para deletar até o final da linha, usa-se d$. Para modificar as próximas três palavras, c3w. Para copiar até o fim do arquivo, yG.

Para comentar múltiplas linhas, como da linha 20 à 25 em um arquivo de configuração, pode-se usar substituição:

:20,25 s/^/# /

O Vim também possui um poderoso motor de busca com suporte a expressões regulares. Para encontrar endereços IPv6, por exemplo:

/[0-9a-fA-F]\{4\}\(:[0-9a-fA-F]\{4\}\)\{2,7\}

Configurações recomendadas no .vimrc para melhorar a busca:

set incsearch     " Busca incremental
set ignorecase    " Ignorar maiúsculas/minúsculas
set smartcase     " Diferenciar se houver maiúsculas na busca

Para trabalhar com múltiplos arquivos, abra-os simultaneamente e use :ls para listar os buffers. A divisão de tela com :sp (horizontal) ou :vsp (vertical) facilita a comparação de arquivos. A navegação entre janelas é feita com Ctrl+w seguido das setas direcionais ou h/j/k/l.

Atalhos e Navegação no Terminal

Os atalhos do shell funcionam como um acelerador para o fluxo de trabalho. É crucial entender a diferença entre os sinais de controle:

  • Ctrl+C (SIGINT): Encerra o processo em primeiro plano.
  • Ctrl+Z (SIGTSTP): Suspende o processo e o envia para o plano de fundo. Pode ser retomado com fg (primeiro plano) ou bg (plano de fundo).
  • Ctrl+D (EOF): Indica o fim da entrada de dados, fechando o shell ou o programa em execução.

O autocompletar com a tecla Tab é essencial. Para otimizar o comportamento, adicione ao .inputrc:

set show-all-if-ambiguous on
set completion-ignore-case on

A busca reversa no histórico com Ctrl+R permite localizar comandos antigos rapidamente. Para maximizarr o histórico, configure no .bashrc:

export HISTSIZE=10000
export HISTFILESIZE=20000
shopt -s histappend
export PROMPT_COMMAND="history -a; history -c; history -r"

Na navegação de diretórios, cd - alterna para o diretório anterior. Para listar arquivos com detalhes e cores, crie um alias:

alias la='ls -lAh --color=auto'

Para obter o caminho absoluto do diretório onde um script está localizado, garantindo que ele funcione independentemente de onde seja executado:

DIRETORIO_ATUAL="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
ARQUIVO_CONF="$DIRETORIO_ATUAL/configuracao.ini"

Gestão de Permissões e Segurança

O modelo de segurança do Linux baseia-se no isolamento de permissões através do modelo UGO (User, Group, Others) e das permissões de Leitura (r), Escrita (w) e Execução (x).

As permissões podem ser representadas numericamente (octal). Por exemplo, 640 significa que o dono tem leitura e escrita (6), o grupo tem apenas leitura (4) e outros não têm acesso (0).

Permissões especiais incluem:

  • SUID (4000): Permite que um executável seja executado com as permissões do dono do arquivo. Exemplo: chmod u+s /usr/bin/meu_script.
  • SGID (2000): Em diretórios, faz com que novos arquivos herdem o grupo do diretório pai. Exemplo: chmod g+s /var/log/minha_app/.
  • Sticky Bit (1000): Em diretórios como /tmp, impede que usuários excluam arquivos de outros usuários. Exemplo: chmod +t /tmp.

Processamento de Texto com Awk

O awk é uma linguagem de programação projetada para processamento de texto e geração de relatórios. Ele opera no paradigma de padrão-ação.

Variáveis enternas úteis incluem $0 (linha completa), $1, $2 (campos), NR (número do registro/linha) e NF (número de campos).

Exemplo prático: processar um log de acesso HTTP para extrair IPs que geraram erros 5xx.

awk -F" " '
$9 ~ /^5[0-9][0-9]$/ {
    print "IP com Erro 5xx:", $1, "| Status:", $9, "| Rota:", $7
}' /var/log/nginx/access.log

O awk também é excelente para agregar dados. O script abaixo calcula o tempo médio de resposta por endpoint:

awk '
{
    rota = $7
    tempo_ms = $10
    soma_tempo[rota] += tempo_ms
    contagem[rota]++
}
END {
    printf "%-30s | %-15s | %-10s\n", "Endpoint", "Tempo Medio (ms)", "Requisicoes"
    for (r in soma_tempo) {
        media = soma_tempo[r] / contagem[r]
        printf "%-30s | %-15.2f | %-10d\n", r, media, contagem[r]
    }
}' /var/log/nginx/access.log

Engenharia de Scripts Shell

Scripts robustos devem ser modulares e tratar erros adequadamente. Encapsular lógica em funções evita repetição de código.

#!/bin/bash

# Função de log
registrar_log() {
    local nivel=$1
    shift
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$nivel] $*" >&2
}

# Validação de porta
validar_porta() {
    local porta=$1
    if [[ "$porta" =~ ^[0-9]+$ ]] && [ "$porta" -ge 1 ] && [ "$porta" -le 65535 ]; then
        return 0
    fi
    return 1
}

Para garantir que o script falhe de forma segura, utilize o modo estrito no início do arquivo:

set -euo pipefail

Use trap para limpar recursos temporários em caso de interrupção:

DIRETORIO_TEMP="/tmp/processamento_$$"
mkdir -p "$DIRETORIO_TEMP"

limpar_recursos() {
    registrar_log "INFO" "Removendo diretório temporário..."
    rm -rf "$DIRETORIO_TEMP"
}

trap limpar_recursos EXIT INT TERM

Automação e Casos de Uso Reais

A automação de tarefas rotineiras é fundamental. Abaixo, um script para rotacionar e compactar logs antigos de uma aplicação específica.

#!/bin/bash
set -euo pipefail

PASTA_LOGS="/opt/minha_app/logs"
PASTA_BACKUP="/opt/minha_app/logs_historico"
DIAS_RETENCAO=14

mkdir -p "$PASTA_BACKUP"

# Encontrar e compactar logs com mais de 14 dias
find "$PASTA_LOGS" -type f -name "*.log" -mtime +$DIAS_RETENCAO -print0 | while IFS= read -r -d '' arquivo_log; do
    nome_base=$(basename "$arquivo_log")
    data_hoje=$(date +%Y%m%d)
    destino="$PASTA_BACKUP/${nome_base}.${data_hoje}.gz"
    
    gzip -c "$arquivo_log" > "$destino"
    rm -f "$arquivo_log"
    echo "Arquivado: $arquivo_log -> $destino"
done

Outro cenário comum é o monitoramento de recursos do sistema. Um script pode verificar o uso de disco e enviar um alerta se ultrapassar um limite definido.

#!/bin/bash
LIMITE_USO=85
PARTICAO_MONITORADA="/dev/sda1"

uso_atual=$(df -h "$PARTICAO_MONITORADA" | tail -1 | awk '{print $5}' | sed 's/%//')

if [ "$uso_atual" -ge "$LIMITE_USO" ]; then
    mensagem="ALERTA: A partição $PARTICAO_MONITORADA está com ${uso_atual}% de uso."
    echo "$mensagem" | mail -s "Alerta de Disco Cheio" admin@empresa.com
    echo "$mensagem" >> /var/log/alertas_sistema.log
fi

Tags: Linux shell-script vim awk Bash

Publicado em 7-3 07:41