Jhonatan Pinheiro
Cargando página...
Jhonatan Pinheiro
Cargando página...
Jhonatan Pinheiro
Cargando página...
Tuberías y redirección, sed y awk, scripts de shell, systemd, cron, SSH, red, discos y registros: 200 ítems con ejemplos prácticos.
Você já navega, edita e instala pacote. Estes 200 itens são a virada de chave: combinar comandos, automatizar com script, administrar serviços com systemd, agendar tarefas, dominar SSH e diagnosticar disco, rede e log.
É o conjunto que separa quem usa o terminal de quem administra o servidor.
A filosofia Unix em uma frase: cada comando faz uma coisa bem-feita, e o pipe (
|) junta tudo. A maior parte deste post é sobre isso.
O que transforma comandos isolados em uma ferramenta só.
Manda a saída de um comando para a entrada do próximo.
ps aux | grep nginx | wc -l> sobrescreve o arquivo; >> acrescenta ao fim.
comando > saida.txt
comando >> log.txt1 é a saída padrão, 2 é o erro.
comando > saida.txt 2> erros.txtA ordem importa: redirecione o arquivo primeiro, depois junte o 2 ao 1.
comando > tudo.txt 2>&1
comando &> tudo.txt # atalho do bash/dev/null é o ralo do sistema.
comando 2>/dev/null
comando >/dev/null 2>&1< alimenta o comando com o conteúdo do arquivo.
sort < nomes.txt
while read linha; do echo "$linha"; done < lista.txtBloco de texto direto no comando. Muito usado para configuração e SQL.
cat <<EOF > config.yml
servidor: producao
porta: 8080
EOFManda uma string direto para a entrada.
grep "erro" <<< "$conteudo"Salva em arquivo e continua o pipe. Essencial com sudo.
comando | tee saida.txt
echo "linha" | sudo tee -a /etc/hostsAlguns comandos não leem do pipe; o xargs resolve.
find . -name "*.log" | xargs rm
cat urls.txt | xargs -n1 curl -sI-P processa vários de uma vez. Ganho enorme em tarefa repetitiva.
cat urls.txt | xargs -P 8 -n 1 curl -sO$(...) insere a saída de um comando dentro de outro.
echo "Hoje é $(date +%F)"
kill $(pgrep -f meu-script)<(...) transforma a saída de um comando em arquivo temporário.
diff <(ls pasta1) <(ls pasta2)
comm -13 <(sort a.txt) <(sort b.txt)Gera listas e sequências sem laço.
mkdir -p projeto/{src,test,docs}
touch arquivo{1..5}.txt
cp config.yml{,.bak}Faz contas no próprio shell.
echo $((2 + 3 * 4))
total=$((total + 1))Aspas duplas expandem variáveis; simples não expandem nada.
nome="Jhonatan"
echo "Olá $nome" # Olá Jhonatan
echo 'Olá $nome' # Olá $nomeSem aspas, um espaço no valor vira dois argumentos — origem de metade dos bugs em script.
arquivo="meu arquivo.txt"
rm "$arquivo" # certo
rm $arquivo # tenta apagar "meu" e "arquivo.txt"$? guarda o resultado do último comando: 0 é sucesso.
comando
if [ $? -ne 0 ]; then echo "falhou"; fiSem isso, um pipe só falha se o último comando falhar.
set -o pipefail
falso | true; echo $? # agora reporta a falhaExecuta conforme o sucesso do comando anterior.
make build && make deploy
comando || echo "falhou" >&2O trio que processa texto em qualquer servidor, sem instalar nada.
Padrões em vez de texto fixo.
grep -E "^[0-9]{3}-[0-9]{4}$" telefones.txtExtrai o trecho, não a linha inteira.
grep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}" access.log | sort | uniq -c | sort -nrHabilita lookahead, \d, \s e afins.
grep -P "(?<=usuario=)\w+" app.logBusca dentro de log rotacionado sem descompactar.
zgrep "erro" /var/log/syslog.2.gz
grep -a "texto" arquivo.binEvita varrer node_modules e .git.
grep -r "TODO" . --exclude-dir={node_modules,.git,dist}A operação mais usada: trocar texto.
sed 's/antigo/novo/' arquivo.txt # primeira ocorrência da linha
sed 's/antigo/novo/g' arquivo.txt # todas-i grava no próprio arquivo. Sempre faça backup com -i.bak.
sed -i.bak 's/porta=8080/porta=9090/' config.iniEvita escapar barras ao mexer em caminhos.
sed 's|/var/www|/srv/www|g' config.confRestringe a substituição a uma linha ou faixa.
sed '3s/erro/ok/' arquivo.txt
sed '10,20s/dev/prod/g' arquivo.txtRemove por número, por padrão ou vazias.
sed '5d' arquivo.txt
sed '/^#/d' config.conf # comentários
sed '/^$/d' arquivo.txt # linhas em brancoAntes (i), depois (a) ou no lugar (c).
sed '1i #!/bin/bash' script.sh
sed '/\[servidor\]/a porta=8080' config.ini-n cala a saída padrão; p imprime o que interessa.
sed -n '10,20p' arquivo.txt
sed -n '/INICIO/,/FIM/p' log.txtCaptura partes e reordena.
echo "2026-08-10" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'Substituição em lote, combinada com find.
find . -name "*.md" -exec sed -i 's/http:/https:/g' {} +Divide a linha em campos automaticamente.
awk '{print $1, $3}' arquivo.txt
ps aux | awk '{print $2, $11}'-F define o separador de campos.
awk -F: '{print $1}' /etc/passwd
awk -F, '{print $2}' dados.csvSó processa as linhas que casam com a condição.
awk '$3 > 100 {print $1, $3}' vendas.txt
awk '/erro/ {print}' app.logAcumula valores e imprime no fim.
awk '{soma += $2} END {print "Total:", soma}' vendas.txtContador e soma no mesmo passe.
awk '{soma += $1; n++} END {print "Média:", soma/n}' numeros.txtArray associativo: o "GROUP BY" do terminal.
awk '{contagem[$1]++} END {for (chave in contagem) print chave, contagem[chave]}' acessos.logNR é o número da linha; NF, a quantidade de campos.
awk 'NR > 1 {print $1}' dados.csv # pula o cabeçalho
awk '{print NF}' arquivo.txt # campos por linhaprintf dá controle total do formato.
awk '{printf "%-20s %8.2f\n", $1, $2}' precos.txtCombina filtros como em SQL.
awk -F, '$3 == "SP" && $4 > 1000 {print $1}' clientes.csvOFS define como os campos saem.
awk -F: 'BEGIN {OFS=","} {print $1, $3}' /etc/passwdReceita clássica: top 10 IPs que mais acessaram.
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10Combinação de awk com filtro de status.
awk '$9 == 500 {print $7}' access.log | sort | uniq -c | sort -nr | headExtrai a métrica direto do log.
awk '{soma += $NF; n++} END {printf "média: %.3fs\n", soma/n}' tempos.logcut é mais rápido para colunas fixas; awk lida com espaços variáveis.
cut -d, -f1,3 dados.csv # simples e rápido
awk '{print $1, $3}' saida.txt # espaçamento irregularJunta arquivos por coluna ou por chave, como um JOIN.
paste nomes.txt idades.txt
join -t, -1 1 -2 1 clientes.csv pedidos.csvDeixa uma saída bagunçada legível.
mount | column -t
cat /etc/passwd | column -t -s:Automatizar o que você repete — com o mínimo de armadilhas.
Primeira linha: diz qual interpretador executa o arquivo.
#!/usr/bin/env bashSem permissão de execução, o script não roda.
chmod +x script.sh
./script.shAs três linhas que evitam a maioria dos bugs: sai no erro, reclama de variável indefinida e propaga falha do pipe.
set -euo pipefailSem espaço em volta do =. Aspas ao usar.
nome="Jhonatan"
echo "Olá, $nome"Sem local, tudo é global — e um nome repetido vira bug silencioso.
minha_funcao() {
local contador=0
contador=$((contador + 1))
}$1, $2... e $@ para todos.
echo "primeiro: $1"
echo "todos: $@"
echo "quantidade: $#"Usa o padrão quando a variável está vazia.
porta="${PORTA:-8080}"
destino="${1:?informe o destino}" # aborta com mensagemCondicional com colchetes duplos (recurso do bash, mais seguro).
if [[ -f config.yml ]]; then
echo "config encontrado"
fiEncadeamento completo.
if [[ $1 == "prod" ]]; then
echo "produção"
elif [[ $1 == "hml" ]]; then
echo "homologação"
else
echo "ambiente desconhecido" >&2
exit 1
fiExiste, é diretório, é legível, tem conteúdo.
[[ -e caminho ]] # existe
[[ -f arquivo ]] # é arquivo
[[ -d pasta ]] # é diretório
[[ -r arquivo ]] # legível
[[ -s arquivo ]] # não está vazioVazio, igual, diferente, casa com padrão.
[[ -z "$var" ]] # vazia
[[ -n "$var" ]] # não vazia
[[ "$a" == "$b" ]]
[[ "$arquivo" == *.log ]]Comparação de números usa operadores próprios.
[[ $n -eq 10 ]] # igual
[[ $n -ne 10 ]] # diferente
[[ $n -gt 10 ]] # maior
[[ $n -lt 10 ]] # menorMais legível que uma pilha de elif.
case "$1" in
start) iniciar ;;
stop) parar ;;
restart) parar; iniciar ;;
*) echo "uso: $0 {start|stop|restart}"; exit 1 ;;
esacItera sobre valores literais.
for ambiente in dev hml prod; do
echo "implantando em $ambiente"
doneUse o glob direto — nunca a saída do ls.
for arquivo in *.log; do
gzip "$arquivo"
doneFaixa de números com sequência ou estilo C.
for i in {1..10}; do echo "$i"; done
for ((i = 0; i < 10; i++)); do echo "$i"; doneRepete enquanto a condição for verdadeira.
contador=0
while [[ $contador -lt 5 ]]; do
echo "$contador"
contador=$((contador + 1))
doneO jeito correto de processar arquivo: IFS= e -r preservam espaços e barras.
while IFS= read -r linha; do
echo "Linha: $linha"
done < arquivo.txtO inverso do while: repete até a condição virar verdadeira.
until curl -sf http://localhost:8080/health; do
echo "aguardando o serviço..."
sleep 2
doneSai do laço ou pula para a próxima iteração.
for i in {1..10}; do
[[ $i -eq 5 ]] && continue
[[ $i -eq 8 ]] && break
echo "$i"
doneAgrupam lógica e recebem argumentos como o script.
saudacao() {
local nome="$1"
echo "Olá, $nome"
}
saudacao "Jhonatan"return devolve código de saída; para devolver texto, use echo e capture.
soma() { echo $(( $1 + $2 )); }
resultado=$(soma 2 3)Lista indexada, com todos os elementos em [@].
servidores=("web1" "web2" "db1")
echo "${servidores[0]}"
echo "${#servidores[@]}" # quantidade
for s in "${servidores[@]}"; do echo "$s"; doneMapa chave-valor no bash 4+.
declare -A porta
porta[web]=80
porta[api]=3000
for servico in "${!porta[@]}"; do echo "$servico: ${porta[$servico]}"; doneTamanho, fatia e remoção de prefixo/sufixo, sem chamar comando externo.
s="arquivo.tar.gz"
echo "${#s}" # tamanho
echo "${s%.gz}" # remove sufixo
echo "${s#*.}" # remove até o primeiro ponto
echo "${s/tar/zip}" # substituiGarante que o temporário seja apagado mesmo se o script morrer.
temporario=$(mktemp)
trap 'rm -f "$temporario"' EXIT
# ... use o arquivomktemp cria com nome único e permissão segura.
arquivo=$(mktemp)
pasta=$(mktemp -d)-p mostra o prompt; -s esconde o que é digitado.
read -p "Nome: " nome
read -s -p "Senha: " senha; echoProteção mínima em script destrutivo.
read -p "Apagar tudo? (s/N) " resposta
[[ "$resposta" == "s" ]] || exit 0Parsing de flags no padrão do Unix.
while getopts "a:p:v" opcao; do
case $opcao in
a) ambiente="$OPTARG" ;;
p) porta="$OPTARG" ;;
v) verboso=1 ;;
*) exit 1 ;;
esac
doneFunção de log simples que salva depuração depois.
log() { echo "[$(date +'%F %T')] $*"; }
log "iniciando implantação"Mensagem de erro não deve poluir a saída do script.
echo "erro: arquivo não encontrado" >&2flock impede duas instâncias simultâneas — essencial em cron.
flock -n /tmp/meu-script.lock ./meu-script.sh || echo "já está rodando"-x imprime cada comando executado.
bash -x script.sh
set -x # liga no meio do script
set +x # desligaAponta os erros clássicos antes de você sofrer com eles. Use sempre.
shellcheck script.shComo um serviço sobe no boot, reinicia sozinho e registra o que fez.
Estado atual, PID e as últimas linhas de log.
systemctl status nginxO trio do dia a dia.
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginxRelê a configuração mantendo as conexões abertas.
sudo systemctl reload nginx
sudo systemctl reload-or-restart nginxenable só configura; --now também inicia agora.
sudo systemctl enable nginx
sudo systemctl enable --now nginxImpede que suba no próximo boot.
sudo systemctl disable --now nginxRetorna código de saída — perfeito para script.
systemctl is-active nginx
systemctl is-enabled nginxTudo que existe ou só o que está rodando.
systemctl list-units --type=service
systemctl list-units --type=service --state=runningA primeira consulta ao entrar num servidor com problema.
systemctl --failedArquivo unit mínimo para rodar sua aplicação.
# /etc/systemd/system/minha-api.service
[Unit]
Description=Minha API
After=network.target
[Service]
Type=simple
User=app
WorkingDirectory=/opt/minha-api
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.targetObrigatório após criar ou editar qualquer arquivo de serviço.
sudo systemctl daemon-reloadCria um override em vez de alterar o arquivo do pacote.
sudo systemctl edit nginx
sudo systemctl cat nginx # mostra a unit efetivaArquivo separado, fora do git, com as credenciais.
# na unit:
EnvironmentFile=/etc/minha-api/env
# no arquivo:
DATABASE_URL=postgres://...After ordena; Requires obriga o outro a estar ativo.
[Unit]
After=postgresql.service
Requires=postgresql.servicesystemd aplica cgroups sem você precisar configurá-los à mão.
[Service]
MemoryMax=512M
CPUQuota=50%Opções que reduzem muito o estrago em caso de invasão.
[Service]
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/minha-apiImpede que suba de qualquer jeito, nem por dependência.
sudo systemctl mask apache2
sudo systemctl unmask apache2Modo gráfico, multiusuário ou resgate.
systemctl get-default
sudo systemctl set-default multi-user.target
sudo systemctl isolate rescue.targetMostra quem está atrasando a inicialização.
systemd-analyze
systemd-analyze blame | head -20Entende por que um serviço sobe antes de outro.
systemctl list-dependencies nginxAlternativa moderna ao cron, com log integrado e controle de dependências.
# /etc/systemd/system/backup.timer
[Unit]
Description=Backup diário
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
# sudo systemctl enable --now backup.timer
# systemctl list-timersTarefas que rodam sozinhas — e os detalhes que fazem elas falharem em silêncio.
Abre o agendamento do seu usuário.
crontab -e
sudo crontab -e -u www-data # de outro usuárioVer o que está agendado; -r apaga tudo (cuidado).
crontab -l
crontab -rMinuto, hora, dia do mês, mês, dia da semana.
# * * * * * comando
# │ │ │ │ └── dia da semana (0-7, 0 e 7 = domingo)
# │ │ │ └──── mês (1-12)
# │ │ └────── dia do mês (1-31)
# │ └──────── hora (0-23)
# └────────── minuto (0-59)Os agendamentos que cobrem quase tudo.
0 3 * * * /opt/backup.sh # todo dia às 3h
*/15 * * * * /opt/checa-saude.sh # a cada 15 minutos
0 9 * * 1 /opt/relatorio.sh # segundas às 9h
0 0 1 * * /opt/fechamento.sh # primeiro dia do mêsMais legíveis que os cinco campos.
@daily /opt/backup.sh
@hourly /opt/sync.sh
@reboot /opt/inicia.shO cron roda com ambiente mínimo. Use sempre caminho absoluto.
# Falha silenciosa:
0 3 * * * backup.sh
# Certo:
0 3 * * * /usr/local/bin/backup.shSem redirecionar, a saída vai para e-mail local — que ninguém lê.
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1Declaradas no topo do arquivo, valem para todas as linhas.
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""Basta soltar um script executável nessas pastas.
ls /etc/cron.daily/
ls /etc/cron.d/
cat /etc/crontabTarefa lenta pode começar de novo antes de terminar. flock resolve.
*/5 * * * * flock -n /tmp/sync.lock /opt/sync.shExecuta uma única vez em um horário futuro.
echo "/opt/manutencao.sh" | at 02:00
atq # lista
atrm 3 # removeRode com o mesmo ambiente do cron para pegar problema de PATH.
env -i /bin/bash --noprofile --norc -c "/opt/backup.sh"O acesso remoto — e como usá-lo sem senha e sem risco.
Usuário, host e porta.
ssh usuario@servidor
ssh -p 2222 usuario@servidorEd25519 é o padrão atual: menor e mais segura que RSA.
ssh-keygen -t ed25519 -C "voce@email.com"Habilita login sem senha.
ssh-copy-id usuario@servidor
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidorO SSH recusa a chave se a permissão estiver frouxa.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keysApelidos que evitam decorar IP, porta e usuário.
# ~/.ssh/config
Host prod
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519
# agora: ssh prodGuarda a chave destravada na sessão.
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -lRoda e volta, sem abrir sessão interativa.
ssh prod "df -h && uptime"Traz uma porta remota para a sua máquina — o jeito seguro de acessar banco.
ssh -L 5432:localhost:5432 prod
# agora localhost:5432 é o Postgres do servidorExpõe uma porta sua no servidor remoto.
ssh -R 8080:localhost:3000 prodNavegue como se estivesse na rede do servidor.
ssh -D 1080 prodAcessa a máquina interna passando pelo host de borda.
ssh -J bastion usuario@servidor-internoEvita a queda por inatividade.
# ~/.ssh/config
Host *
ServerAliveInterval 60
ServerAliveCountMax 3Multiplexing: a segunda conexão ao mesmo host é instantânea.
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10mAs três mudanças que mais reduzem ataque.
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
Port 2222
sudo systemctl reload sshdValide antes de recarregar — erro aqui tranca você para fora.
sudo sshd -t-v mostra cada passo da autenticação.
ssh -vvv usuario@servidorChave do servidor mudou? Remova a entrada antiga (e confirme que não é ataque).
ssh-keygen -R servidorscp e rsync usam a mesma configuração do ~/.ssh/config.
scp arquivo.txt prod:/tmp/
rsync -avz ./site/ prod:/var/www/site/Diagnosticar conectividade, portas e tráfego de verdade.
Vale até o próximo reboot — útil em manutenção.
sudo ip addr add 192.168.1.50/24 dev eth0
sudo ip link set eth0 upAdiciona ou troca o gateway.
sudo ip route add default via 192.168.1.1
ip route get 8.8.8.8 # por onde sai o tráfegoConfiguração persistente moderna.
# /etc/netplan/01-config.yaml
network:
version: 2
ethernets:
eth0:
addresses: [192.168.1.50/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
# sudo netplan applyComum em RHEL e desktops.
nmcli device status
nmcli connection show
sudo nmcli connection modify eth0 ipv4.addresses 192.168.1.50/24Quem está conectado a quê, agora.
ss -tan state established
ss -tp # com o processoDetecta cliente abusando ou ataque simples.
ss -tan | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | headVê o pacote de verdade. Insubstituível quando o log não explica.
sudo tcpdump -i eth0 port 80 -n
sudo tcpdump -i any host 192.168.1.10 -w captura.pcap-A mostra o conteúdo ASCII — bom para HTTP.
sudo tcpdump -i eth0 -A -s0 'tcp port 80 and host api.exemplo.com'Descobre o que está aberto. Só varra o que é seu.
nmap -sT localhost
nmap -p 1-1000 192.168.1.10
nmap -sV 192.168.1.10 # detecta serviço e versãoTesta porta, transfere arquivo e sobe servidor improvisado.
nc -zv servidor 443
nc -l 9000 # escuta na porta
nc servidor 9000 < arquivo.txtMostra onde o tempo é gasto: DNS, conexão, TLS, resposta.
curl -w "dns:%{time_namelookup} conn:%{time_connect} tls:%{time_appconnect} total:%{time_total}\n" -o /dev/null -s https://exemplo.comValidade, cadeia e emissor.
openssl s_client -connect exemplo.com:443 -servername exemplo.com < /dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuerCamada simples sobre o iptables, comum no Ubuntu.
sudo ufw status verbose
sudo ufw allow 22/tcp
sudo ufw allow from 192.168.1.0/24 to any port 5432
sudo ufw enablePadrão no RHEL e Fedora.
sudo firewall-cmd --list-all
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reloadO que está realmente aplicado no kernel.
sudo iptables -L -n -v
sudo nft list ruleset # nftables, o sucessorEm sistemas com systemd-resolved, o /etc/resolv.conf engana.
resolvectl status
cat /etc/resolv.confDepois de mudar registro, o cache local atrapalha o teste.
sudo resolvectl flush-cachesiperf3 mede a vazão real do link.
# no servidor
iperf3 -s
# no cliente
iperf3 -c 192.168.1.10 -t 30Descobre quem está consumindo a rede.
sudo nethogs
sudo iftop -i eth0Endereço físico e ligar máquina remotamente.
ip link show eth0 | grep ether
wakeonlan 00:11:22:33:44:55Do disco cru ao ponto de montagem que sobrevive ao reboot.
Visão de dispositivos, partições e pontos de montagem.
lsblk -f
sudo fdisk -lInterativo, para tabela MBR e GPT simples.
sudo fdisk /dev/sdb
# n (nova) · p (primária) · w (grava)Melhor para disco maior que 2 TB (GPT).
sudo parted /dev/sdb mklabel gpt
sudo parted -a opt /dev/sdb mkpart primary ext4 0% 100%Cria o sistema de arquivos na partição.
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb1Use UUID no fstab: o nome do dispositivo pode mudar entre boots.
sudo e2label /dev/sdb1 dados
blkid /dev/sdb1Entrada no fstab com UUID e opções.
# /etc/fstab
UUID=abcd-1234 /mnt/dados ext4 defaults,noatime 0 2
sudo mount -a # testa sem reiniciarnoatime reduz escrita; ro protege; nosuid/nodev/noexec endurecem.
sudo mount -o noatime,nodev,nosuid /dev/sdb1 /mnt/dadosSó com a partição desmontada.
sudo umount /dev/sdb1
sudo fsck -f /dev/sdb1Aumenta o filesystem depois de crescer a partição.
sudo resize2fs /dev/sdb1 # ext4
sudo xfs_growfs /mnt/dados # xfs (a quente)Cria e ativa área de troca.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --showQuanto o kernel prefere usar swap. Em servidor de banco, valores baixos.
cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10Volume lógico permite crescer o disco sem reparticionar.
sudo pvs # volumes físicos
sudo vgs # grupos
sudo lvs # volumes lógicosDo disco cru ao volume montável.
sudo pvcreate /dev/sdb
sudo vgcreate dados-vg /dev/sdb
sudo lvcreate -L 50G -n dados-lv dados-vg
sudo mkfs.ext4 /dev/dados-vg/dados-lvA grande vantagem: crescer sem downtime.
sudo lvextend -L +20G /dev/dados-vg/dados-lv
sudo resize2fs /dev/dados-vg/dados-lvFoto do volume para backup consistente.
sudo lvcreate -L 5G -s -n snap /dev/dados-vg/dados-lvAcessa o conteúdo sem gravar mídia.
sudo mount -o loop imagem.iso /mnt/isoNFS e SMB/CIFS.
sudo mount -t nfs servidor:/export /mnt/nfs
sudo mount -t cifs //servidor/compartilhado /mnt/win -o username=userAntecipa falha de hardware.
sudo smartctl -a /dev/sda
sudo smartctl -t short /dev/sdaDescobre quem está martelando o disco.
sudo iotop -o
pidstat -d 1Latência e utilização por dispositivo. %util perto de 100 é gargalo.
iostat -xz 1Onde o servidor conta o que aconteceu.
O log unificado do systemd.
journalctl
journalctl -n 100Filtra pela unit — o comando que você mais vai usar.
journalctl -u nginx
journalctl -u nginx -f # ao vivoRecorta a janela de tempo do incidente.
journalctl --since "2026-08-10 14:00" --until "2026-08-10 15:00"
journalctl --since "1 hour ago"Só erro e acima.
journalctl -p err
journalctl -p warning..emergBoot atual ou anterior — essencial após queda.
journalctl -b
journalctl -b -1
journalctl --list-bootsMensagens do kernel, com timestamp legível.
dmesg -T | tail -50
journalctl -kConfirma se o kernel matou seu processo por falta de memória.
dmesg -T | grep -i "out of memory"
journalctl -k | grep -i oomFormato JSON para análise em ferramenta externa.
journalctl -u nginx -o json > nginx.json
journalctl -u nginx --since today > nginx.txtEle cresce até o limite configurado — e enche disco.
journalctl --disk-usage
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=30dOnde os serviços tradicionais escrevem.
ls -lh /var/log/
sudo tail -f /var/log/auth.log # autenticação
sudo tail -f /var/log/syslogRotaciona, comprime e descarta log antigo — quem impede o disco de encher.
cat /etc/logrotate.conf
sudo logrotate -d /etc/logrotate.d/nginx # simula
sudo logrotate -f /etc/logrotate.d/nginx # forçaArquivo próprio em /etc/logrotate.d/.
/var/log/minha-api/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}Faz seu script aparecer no log do sistema.
logger -t meu-script "backup concluído"
logger -p user.err -t meu-script "falha ao conectar"Combinação de grep com contexto e horário.
journalctl -u minha-api --since "30 min ago" | grep -i -C 5 "exception"Falhas de autenticação SSH — o primeiro sinal de ataque.
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | headEndurecer o básico e automatizar o que se repete.
Edite sempre com visudo: ele valida antes de salvar e evita travar o sudo.
sudo visudo
sudo visudo -f /etc/sudoers.d/deployPermite só o necessário, em vez de acesso irrestrito.
# /etc/sudoers.d/deploy
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart minha-apiBloqueia IP após tentativas de login falhas.
sudo apt install fail2ban
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 192.168.1.10Deixa o servidor aplicar correção crítica sozinho.
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgradesAuditoria simples: o que está escutando deveria estar?
sudo ss -tulpn | grep LISTENInvestigação pós-incidente.
sudo find /etc -mtime -2 -type f
sudo find / -mmin -60 -type f -not -path "/proc/*" 2>/dev/nullDetecta binário do sistema modificado.
sudo debsums -c # Debian/Ubuntu
sudo rpm -Va # RHEL/FedoraAuditoria — e o lembrete de que o seu também fica registrado.
sudo cat /home/usuario/.bash_historyGPG para proteger backup ou arquivo sensível.
gpg -c segredo.txt # cifra com senha
gpg -d segredo.txt.gpg > segredo.txtSem depender de site de terceiro.
openssl rand -base64 32
head -c 32 /dev/urandom | base64