Abaixo esta o script que foi usado - foi usado o dbschema e alguns comandos de manipulação de arquivos do linux;
#!/bin/bash
# ==========================================================================================================
# Autor: Claudemar Martins
# Funcao: Pesquisa no banco de dados Informix os usuarios com acesso de CONNECT e compara com os usuarios
# cadastrados no sistema operacional - o final desta comparacao vai gerar dois arquivo:
#
# (*) As permissoes do banco dos usuarios que nao estao cadastrados no S.O;
# (*) O outro arquivo com os comandos de REVOKE dessas permissoes do banco.
#
# Este script criei para fazer uma faxina dos usuarios nos bancos Informix;
#
# Criado: 09/06/2014
# ==========================================================================================================
LOG1="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_1.log"
LOG2="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_2.log"
LOG3="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_3.log"
LOG4="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_4.log"
LOG5="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_5.log"
LOG6="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_6.log"
LOG7="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_7.log"
LOG8="usuarios_com_acesso_no_banco_1234_pode_deletar_1234_8.log"
DATA_ATUAL=`date +%d_%m_%Y_%T`;
REVOKE_LOG="REVOKE_$DATA_ATUAL.sql"
GRANTS_LOG="GRANTS_$DATA_ATUAL.sql"
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n " "
echo -n " ***** INFORMIX BASIC SERVICES ***** "
echo -n " "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo -n "Digite o NOME DO BANCO DE DADOS ..........: "
read DATABASE
# ==========================================================================================================
# Vamos pegar quem tem a permissao de CONNECT no banco
# ==========================================================================================================
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n " "
echo -n " ***** INFORMIX BASIC SERVICES ***** "
echo -n " "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo
echo
echo " +---------------------------------------------------------+"
echo " | |"
echo " | aguarde alguns segundos ... |"
echo " | |"
echo " +---------------------------------------------------------+"
dbschema -d $DATABASE -p all | grep -E ' connect to ' > $LOG1
# ==========================================================================================================
# Gravando um arquivo com - FINGER USERNAME - para a gente saber quem esta cadastrado no SO
# ==========================================================================================================
cat $LOG1 | awk '{print "finger " $4 " " }' > $LOG2
# ==========================================================================================================
# Listando os usuarios que nao estao cadastrados no sistema operacional
# ==========================================================================================================
chmod 755 $LOG2
./$LOG2 >/dev/null 2> $LOG3 # jogo a saida STDOUT para a /dev/null e a STDERR em arquivo
# ==========================================================================================================
# Filtrando - vamos tirar o : do usuario
# ==========================================================================================================
cat $LOG3 | awk '{print $2}' > $LOG4
sed -i 's/://' $LOG4
# ==========================================================================================================
# Agora vamos ligar todas as permissoes dos usuarios nas tabelas
# ==========================================================================================================
# cat $LOG4 | awk '{print ("dbschema -d '$DATABASE' -p " $1 " | grep connect | grep grant \n" )}' > $LOG5
cat $LOG4 | awk '{print ("dbschema -d '$DATABASE' -p " $1 " \n" )}' > $LOG5
chmod 755 $LOG5
./$LOG5 > $LOG6
clear
echo "-------------------------------------------------------------------------------------------------"
echo -n
echo -n "$(date "+%d/%m/%Y")"
echo -n " "
echo -n " ***** INFORMIX BASIC SERVICES ***** "
echo -n " "
echo "$(date "+%T")"
echo "-------------------------------------------------------------------------------------------------"
echo " Database $DATABASE"
echo
echo
echo " +---------------------------------------------------------------------------------------+"
echo " | |"
echo " | Usuarios com acesso no banco mais sem usuario cadatrado no Sistema Operacional. |"
echo " | |"
echo " +---------------------------------------------------------------------------------------+"
echo ""
echo " +---------------------------------------------------------+"
echo " | |"
echo " | Arquivo do GRANTS - $GRANTS_LOG |"
echo " | |"
echo " | Arquivo do REVOKES - $REVOKE_LOG |"
echo " | |"
echo " +---------------------------------------------------------+"
echo
# ==========================================================================================================
# Backup das permissoes antes de retirar os acessos
# Quero somente os 'CONNECT|GRANT' nao quero que me traga nada 'PUBLIC'
# ==========================================================================================================
cat $LOG6 | grep -E 'connect|grant' | grep -v 'public' > $LOG7
cp $LOG7 $GRANTS_LOG
# ==========================================================================================================
# Mostra os comandos para retirar acessos dos usuarios - este vai ser o comando REVOKE
# ==========================================================================================================
sed -i 's/grant/revoke/' $LOG7
# sed -i 's/grant update on /revoke update on /' $LOG7
# sed -i 's/grant insert on /revoke insert on /' $LOG7
# sed -i 's/grant delete on /revoke delete on /' $LOG7
# sed -i 's/grant select on /revoke select on /' $LOG7
# sed -i 's/grant update on /revoke update on /' $LOG7
# sed -i 's/grant index on /revoke index on /' $LOG1
sed -i 's/ to / from /' $LOG7
cp $LOG7 $REVOKE_LOG
rm $LOG1
rm $LOG2
rm $LOG3
rm $LOG4
rm $LOG5
rm $LOG6
rm $LOG7
echo
Fiz uma melhora nesse script, não testei
ResponderEliminar#!/bin/bash
# ==========================================================================================================
# Autor original: Claudemar Martins
# Versão Refatorada: 2025
# Função: Identifica usuários no Informix que não existem no S.O. e gera scripts de REVOKE.
# ==========================================================================================================
# Configurações de Cores e Ambiente
DATA_ATUAL=$(date +%d_%m_%Y_%H%M)
REVOKE_LOG="REVOKE_$DATA_ATUAL.sql"
GRANTS_LOG="GRANTS_$DATA_ATUAL.sql"
TEMP_USERS="users_list.tmp"
header() {
clear
echo "------------------------------------------------------------------------"
echo "$(date "+%d/%m/%Y %T") ***** INFORMIX CLEANER SERVICES *****"
echo "------------------------------------------------------------------------"
}
header
echo -n "Digite o NOME DO BANCO DE DADOS: "
read -r DATABASE
if [ -z "$DATABASE" ]; then
echo "Erro: Nome do banco não pode ser vazio."
exit 1
fi
echo -e "\n[*] Aguarde, analisando permissões e Sistema Operacional...\n"
# 1. Coletar todos os usuários com permissão de CONNECT no banco
# O awk captura o 4º campo (username) e remove as aspas, se existirem.
USERS_IN_DB=$(dbschema -d "$DATABASE" -p all | grep -E ' connect to ' | awk '{print $4}' | tr -d '"')
if [ -z "$USERS_IN_DB" ]; then
echo "Nenhum usuário com acesso CONNECT encontrado no banco $DATABASE."
exit 0
fi
# Limpar arquivos de saída caso já existam
> "$GRANTS_LOG"
> "$REVOKE_LOG"
# 2. Processar cada usuário encontrado
for USERNAME in $USERS_IN_DB; do
# Ignorar o usuário 'public'
if [[ "$USERNAME" == "public" ]]; then continue; fi
# Verificar se o usuário NÃO existe no Sistema Operacional
if ! id "$USERNAME" &>/dev/null; then
# Coletar permissões específicas do usuário (Grants)
# Filtramos para pegar apenas as linhas de permissão e ignorar cabeçalhos do dbschema
USER_PERMS=$(dbschema -d "$DATABASE" -p "$USERNAME" | grep -Ei 'grant|connect' | grep -v "public")
if [ ! -z "$USER_PERMS" ]; then
# Salva o backup do GRANT
echo "-- User: $USERNAME" >> "$GRANTS_LOG"
echo "$USER_PERMS" >> "$GRANTS_LOG"
# Converte GRANT para REVOKE
# Troca 'grant' por 'revoke' e 'to' por 'from'
REVOKE_CMD=$(echo "$USER_PERMS" | sed -e 's/grant/revoke/Ig' -e 's/ to / from /Ig')
echo "-- User: $USERNAME (Not in OS)" >> "$REVOKE_LOG"
echo "$REVOKE_CMD" >> "$REVOKE_LOG"
echo "[!] Usuário '$USERNAME' não existe no S.O. - Adicionado ao REVOKE."
fi
fi
done
header
echo " Processamento Concluído!"
echo "------------------------------------------------------------------------"
echo " Banco de Dados: $DATABASE"
echo "------------------------------------------------------------------------"
echo " [✓] Backup de Grants: $GRANTS_LOG"
echo " [✓] Script de Revoke: $REVOKE_LOG"
echo "------------------------------------------------------------------------"
echo " Verifique os arquivos gerados antes de executar os comandos no banco."