Skip to content

Instantly share code, notes, and snippets.

@matheuseduardo
Last active September 2, 2025 16:44
Show Gist options
  • Save matheuseduardo/8438b0d9c7498d84197f14d2a05985b9 to your computer and use it in GitHub Desktop.
Save matheuseduardo/8438b0d9c7498d84197f14d2a05985b9 to your computer and use it in GitHub Desktop.
htpsswd manager é uma forma rápida de gerenciar usuários em um arquivo .htpssw

Guia do Script de Gerenciamento de .htpasswd

Este documento explica o funcionamento do script shell htpasswd_manager.sh, que gerencia usuários e senhas em um arquivo .htpasswd.

Pré-requisitos

  • Um arquivo .htpasswd existente.
  • OpenSSL instalado para criptografia de senhas.
  • Permissões de leitura/escrita no arquivo .htpasswd.

Uso

Execute o script com o parâmetro -f ou --file seguido do caminho do arquivo .htpasswd:

./htpasswd_manager.sh -f caminho/para/.htpasswd

Se o parâmetro não for fornecido ou o arquivo não existir, o script exibe uma mensagem de erro e termina.

Funcionalidades

O script apresenta um menu interativo com as seguintes opções:

  1. Adicionar usuário

    • Solicita um nome de usuário e uma senha.
    • Criptografa a senha usando o algoritmo APR1 (via OpenSSL).
    • Adiciona a entrada ao arquivo .htpasswd no formato: username:encrypted_password # Added YYYY-MM-DD HH:MM:SS.
  2. Excluir usuário

    • Lista todos os usuários do arquivo com números sequenciais.
    • Solicita o número do usuário a ser excluído.
    • Remove a linha correspondente do arquivo.
  3. Editar usuário

    • Lista os usuários com números sequenciais.
    • Solicita o número do usuário a ser editado.
    • Mantém o mesmo nome de usuário, mas solicita uma nova senha.
    • Remove a linha antiga e adiciona uma nova com a senha atualizada e um comentário com a data/hora: username:encrypted_password # Modified YYYY-MM-DD HH:MM:SS.
  4. Sair (Q)

    • Encerra o script.

Observações

  • O script usa um arquivo temporário para manipulações, garantindo segurança nas alterações.
  • A data e hora nos comentários seguem o formato YYYY-MM-DD HH:MM:SS.
  • Entradas inválidas (como números fora do intervalo na exclusão/edição) são tratadas com mensagens de erro.

Exemplo de Arquivo .htpasswd

Após adicionar/editar usuários, o arquivo pode se parecer com:

user1:$apr1$... # Added 2025-06-24 18:48:23
user2:$apr1$... # Modified 2025-06-24 18:50:10
#!/bin/bash
# .htpasswd Manager Script
#
# Changelog:
# [2025-09-02]
# - Adicionado tratamento para interrupção com CTRL+C (trap).
# - Aceita arquivo diretamente sem precisar de -f/--file.
# - Evita duplicação de usuários ao adicionar.
# - Ajustado formato de comentários (# Added / # Modified) para linha separada (melhor compatibilidade).
# - Ajustado chmod 600 no arquivo de senhas por segurança.
# - Melhorias na listagem de usuários (exibe só username).
# Trap para CTRL+C
trap 'echo -e "\n\n⚠️ Interrompido pelo usuário. Saindo..."; exit 130' INT
# Verifica parâmetro
if [[ "$1" == "-f" || "$1" == "--file" ]]; then
HTPASSWD_FILE="$2"
else
HTPASSWD_FILE="$1"
fi
if [[ -z "$HTPASSWD_FILE" ]]; then
echo "Uso: $0 [-f|--file] <arquivo.htpasswd>"
exit 1
fi
# Verifica se arquivo existe, senão cria
if [[ ! -f "$HTPASSWD_FILE" ]]; then
echo "⚠️ Arquivo $HTPASSWD_FILE não existe. Criando..."
touch "$HTPASSWD_FILE"
fi
# Garante permissões seguras
chmod 600 "$HTPASSWD_FILE"
# Função: adicionar usuário
add_user() {
read -p "Digite o nome do usuário: " username
if grep -q "^$username:" "$HTPASSWD_FILE"; then
echo "❌ Erro: usuário '$username' já existe."
return
fi
read -s -p "Digite a senha: " password
echo
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
encrypted=$(echo "$password" | openssl passwd -apr1 -stdin)
{
echo "# Added $timestamp"
echo "$username:$encrypted"
} >> "$HTPASSWD_FILE"
echo "✅ Usuário '$username' adicionado com sucesso."
}
# Função: listar usuários
list_users() {
echo "📜 Usuários em $HTPASSWD_FILE:"
grep -v "^#" "$HTPASSWD_FILE" | awk -F: '{print NR ") " $1}'
}
# Função: deletar usuário
delete_user() {
list_users
read -p "Digite o número do usuário para excluir: " user_number
if [[ ! "$user_number" =~ ^[0-9]+$ ]]; then
echo "❌ Erro: digite um número válido."
return
fi
total_users=$(grep -vc "^#" "$HTPASSWD_FILE")
if [[ "$user_number" -lt 1 || "$user_number" -gt "$total_users" ]]; then
echo "❌ Erro: número inválido."
return
fi
temp_file=$(mktemp)
awk -F: -v n="$user_number" 'BEGIN{c=0} !/^#/ {c++} c!=n {print}' "$HTPASSWD_FILE" > "$temp_file"
mv "$temp_file" "$HTPASSWD_FILE"
echo "🗑️ Usuário removido com sucesso."
}
# Função: editar usuário
edit_user() {
list_users
read -p "Digite o número do usuário para editar: " user_number
if [[ ! "$user_number" =~ ^[0-9]+$ ]]; then
echo "❌ Erro: digite um número válido."
return
fi
total_users=$(grep -vc "^#" "$HTPASSWD_FILE")
if [[ "$user_number" -lt 1 || "$user_number" -gt "$total_users" ]]; then
echo "❌ Erro: número inválido."
return
fi
username=$(grep -v "^#" "$HTPASSWD_FILE" | awk -F: -v n="$user_number" 'NR == n {print $1}')
read -s -p "Digite a nova senha para $username: " password
echo
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
encrypted=$(echo "$password" | openssl passwd -apr1 -stdin)
temp_file=$(mktemp)
# Remove linha antiga e adiciona nova
awk -F: -v n="$user_number" 'BEGIN{c=0} !/^#/ {c++} c!=n {print}' "$HTPASSWD_FILE" > "$temp_file"
{
echo "# Modified $timestamp"
echo "$username:$encrypted"
} >> "$temp_file"
mv "$temp_file" "$HTPASSWD_FILE"
echo "✏️ Usuário '$username' atualizado com sucesso."
}
# Menu principal
while true; do
echo -e "\n===== .htpasswd Manager ====="
echo "1) Adicionar usuário"
echo "2) Excluir usuário"
echo "3) Editar usuário"
echo "Q) Sair"
read -p "Escolha uma opção: " choice
case $choice in
1) add_user ;;
2) delete_user ;;
3) edit_user ;;
[Qq]) echo "👋 Saindo..."; exit 0 ;;
*) echo "❌ Opção inválida." ;;
esac
done
// fonte: https://grok.com/share/bGVnYWN5_ffc94a5e-6a99-4afb-8529-2449da2ccb8e
// rev2: https://chatgpt.com/c/68b71b53-2d74-8325-82f5-36c5fdb7d748
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment