Forum Stats

  • 3,768,888 Users
  • 2,252,870 Discussions
  • 7,874,785 Comments

Discussions

Como extrair IP pelo hostname

Jonts
Jonts Member Posts: 10 Green Ribbon
edited Jan 14, 2019 2:39PM in Portuguese Discussions

Tudo bem?

Sou iniciante no contexto de PL\SQL Oracle.

Oracle Database 11g Release 11.2.0.4.0 - 64bit Production

Tenho uma tabela de log que mostra quantas vezes o computador acessou uma aplicação, mas mostra somente o nome do computador.

select UPPER(ds_maquina) ds_maquina, <br/>count(ds_maquina) qtd_estacao<br/>from Log_Acesso where dt_acesso between '01/10/2018' AND '10/10/2018'<br/>and ds_maquina is not null<br/>group by UPPER(ds_maquina)<br/>order by UPPER(ds_maquina)

Pesquisei e achei SELECT UTL_INADDR.get_host_address mas não sei como poderia montar o select.

Como posso mostrar o IP pelo nome do hostname? Queria criar uma coluna IP ao lado do host.

Jonts

Best Answer

  • J.Laurindo Chiappa
    J.Laurindo Chiappa Member Posts: 28
    edited Jan 2, 2019 4:17PM Accepted Answer

    Bom, vc não diz mas eu Entendo que nessa tua tabela LOG_ACESSO essa coluna DS_MAQUINA é o HOSTNAME que está registrado na Rede, é isso mesmo ?? SE SIM, e ** SE ** ambas as máquinas (tanto o servidor Oracle QUANTO a máquina-cliente cujo hostname tá registrado nessa tabela) se comunicam via rede é super-simples, basta vc informar esse HOSTNAME numa chamada à built-in GET_HOST_ADDRESS.... E como Acredito que vc sabe, vc PODE SIM chamar built-ins que não façam DML ou DDL naturalmente num SELECT qquer, exemplo :

    ==> vou passar como Argumento um host name que EXISTE na Rede, mas não está registrado no mesmo DNS em uso pelo servidor Oracle :

    [email protected]:SQL>SELECT UTL_INADDR.get_host_address('Dell15R') FROM dual;

    SELECT UTL_INADDR.get_host_address('Dell15R') FROM dual

           *

    ERRO na linha 1:

    ORA-29257: host Dell15R unknown

    ORA-06512: at "SYS.UTL_INADDR", line 19

    ORA-06512: at "SYS.UTL_INADDR", line 40

    ORA-06512: at line 1

    ==> Agora vou usar um HOSTNAME que existe e o servidor Oracle sabe como resolver :

    [email protected]:SQL>SELECT UTL_INADDR.get_host_address('VM01') FROM dual;

    UTL_INADDR.GET_HOST_ADDRESS('VM01')

    -----------------------------------------------------------------

    192.168.10.175

    [email protected]:SQL>

    ==> Funciona perfeitamente, achou o IP... O efeito vice-versa, ie, achar o HOST fornecendo um IP, é similar, muda só o built-in  :

    [email protected]:SQL>SELECT UTL_INADDR.get_host_name('192.168.10.175') from dual;

    UTL_INADDR.GET_HOST_NAME('192.168.10.175')

    ---------------------------------------------------------------------------------------------------------

    VM01

    [email protected]:SQL>

    ==> No seu caso, SE essa tal coluna contém um hostname válido E resolvível pela rede a partir do servidor Oracle, tua query vai ser simplesmente :

        select UPPER(ds_maquina) ds_maquina,

                UTL_INADDR.get_host_address(ds_maquina) IP_DA_MAQUINA_CLIENTE,

        count(ds_maquina) qtd_estacao 

        from Log_Acesso where dt_acesso between '01/10/2018' AND '10/10/2018' 

        and ds_maquina is not null 

        group by UPPER(ds_maquina), UTL_INADDR.get_host_address(ds_maquina) 

        order by UPPER(ds_maquina)  ;

        

    ==> okdoc ?? E se vc não quiser ficar repetindo as mesmas chamadas no GROUP BY, vc pode usar o exemplo abaixo (onde eu APROVEITEI para CORRIGIR a sua lógica, se essa coluna DT_ACESSO realmente é do datatype DATE, que no Oracle contém data E hora) :

    select DS_MAQUINA, IP_DA_MAQUINA_CLIENTE, count(ds_maquina) QTD_ESTACAO

      from (select UPPER(ds_maquina)                       ds_maquina,

                    UTL_INADDR.get_host_address(ds_maquina) ip_da_maquina_cliente,

                    from Log_Acesso

                          where dt_acesso between TO_DATE('01/10/2018 00:00:00', 'dd/mm/yyyy hh24:mi:ss')

                                        and TO_DATE('10/10/2018 23:59:59', 'dd/mm/yyyy hh24:mi:ss')

                     and ds_maquina is not null 

                  )

    group by DS_MAQUINA, IP_DA_MAQUINA_CLIENTE

    order by DS_MAQUINA;

    Abraços,

       Chiappa

    Jonts

Answers

  • J.Laurindo Chiappa
    J.Laurindo Chiappa Member Posts: 28
    edited Jan 2, 2019 4:17PM Accepted Answer

    Bom, vc não diz mas eu Entendo que nessa tua tabela LOG_ACESSO essa coluna DS_MAQUINA é o HOSTNAME que está registrado na Rede, é isso mesmo ?? SE SIM, e ** SE ** ambas as máquinas (tanto o servidor Oracle QUANTO a máquina-cliente cujo hostname tá registrado nessa tabela) se comunicam via rede é super-simples, basta vc informar esse HOSTNAME numa chamada à built-in GET_HOST_ADDRESS.... E como Acredito que vc sabe, vc PODE SIM chamar built-ins que não façam DML ou DDL naturalmente num SELECT qquer, exemplo :

    ==> vou passar como Argumento um host name que EXISTE na Rede, mas não está registrado no mesmo DNS em uso pelo servidor Oracle :

    [email protected]:SQL>SELECT UTL_INADDR.get_host_address('Dell15R') FROM dual;

    SELECT UTL_INADDR.get_host_address('Dell15R') FROM dual

           *

    ERRO na linha 1:

    ORA-29257: host Dell15R unknown

    ORA-06512: at "SYS.UTL_INADDR", line 19

    ORA-06512: at "SYS.UTL_INADDR", line 40

    ORA-06512: at line 1

    ==> Agora vou usar um HOSTNAME que existe e o servidor Oracle sabe como resolver :

    [email protected]:SQL>SELECT UTL_INADDR.get_host_address('VM01') FROM dual;

    UTL_INADDR.GET_HOST_ADDRESS('VM01')

    -----------------------------------------------------------------

    192.168.10.175

    [email protected]:SQL>

    ==> Funciona perfeitamente, achou o IP... O efeito vice-versa, ie, achar o HOST fornecendo um IP, é similar, muda só o built-in  :

    [email protected]:SQL>SELECT UTL_INADDR.get_host_name('192.168.10.175') from dual;

    UTL_INADDR.GET_HOST_NAME('192.168.10.175')

    ---------------------------------------------------------------------------------------------------------

    VM01

    [email protected]:SQL>

    ==> No seu caso, SE essa tal coluna contém um hostname válido E resolvível pela rede a partir do servidor Oracle, tua query vai ser simplesmente :

        select UPPER(ds_maquina) ds_maquina,

                UTL_INADDR.get_host_address(ds_maquina) IP_DA_MAQUINA_CLIENTE,

        count(ds_maquina) qtd_estacao 

        from Log_Acesso where dt_acesso between '01/10/2018' AND '10/10/2018' 

        and ds_maquina is not null 

        group by UPPER(ds_maquina), UTL_INADDR.get_host_address(ds_maquina) 

        order by UPPER(ds_maquina)  ;

        

    ==> okdoc ?? E se vc não quiser ficar repetindo as mesmas chamadas no GROUP BY, vc pode usar o exemplo abaixo (onde eu APROVEITEI para CORRIGIR a sua lógica, se essa coluna DT_ACESSO realmente é do datatype DATE, que no Oracle contém data E hora) :

    select DS_MAQUINA, IP_DA_MAQUINA_CLIENTE, count(ds_maquina) QTD_ESTACAO

      from (select UPPER(ds_maquina)                       ds_maquina,

                    UTL_INADDR.get_host_address(ds_maquina) ip_da_maquina_cliente,

                    from Log_Acesso

                          where dt_acesso between TO_DATE('01/10/2018 00:00:00', 'dd/mm/yyyy hh24:mi:ss')

                                        and TO_DATE('10/10/2018 23:59:59', 'dd/mm/yyyy hh24:mi:ss')

                     and ds_maquina is not null 

                  )

    group by DS_MAQUINA, IP_DA_MAQUINA_CLIENTE

    order by DS_MAQUINA;

    Abraços,

       Chiappa

    Jonts
  • Jonts
    Jonts Member Posts: 10 Green Ribbon
    edited Jan 3, 2019 7:06AM

    Bom dia Chiappa, Obrigado pelo retorno completo rsrsr, O "DS_MAQUINA" é hostname, isso mesmo. Vou implementar aqui e já te dou feedback... Muito Obrigado...

  • Jonts
    Jonts Member Posts: 10 Green Ribbon
    edited Jan 7, 2019 9:58AM

    Boa tarde Chiappa, Deu certo muito obrigado...

  • Jonts
    Jonts Member Posts: 10 Green Ribbon
    edited Jan 7, 2019 10:06AM

    Boa tarde,

    Uma pergunta sobre o select enviado, como faço para tratar quando na lista dos Hostname aparece um que mostra desconhecido, nesse caso não mostra IP mas não lista as informações. Está em anexo o erro que mostra

    Como faço para mostrar mesmo não tendo IP?

  • Jonts
    Jonts Member Posts: 10 Green Ribbon
    edited Jan 7, 2019 10:06AM
  • J.Laurindo Chiappa
    J.Laurindo Chiappa Member Posts: 28
    edited Jan 14, 2019 1:51PM

    Blz ? Então, como eu disse o RDBMS Oracle simplesmente acessa os serviços de rede do servidor : se é reportado pela Servidor que um hostname não pôde ser resolvido, Não Tem o que fazer dentro do RDBMS - o RDBMS é um simples "cliente"/usuário dos serviços de Rede do servidor....

    Jonts
  • Jonts
    Jonts Member Posts: 10 Green Ribbon
    edited Jan 14, 2019 2:03PM

    Boa tarde,

    Obrigado pela orientação Chiappa.

  • J.Laurindo Chiappa
    J.Laurindo Chiappa Member Posts: 28
    edited Jan 14, 2019 2:39PM

    Uma coisa que vc pode fazer para não mostrar erro pro usuário é, ao invés de chamar diretamente a função Oracle na sua SELECT, vc chamar ao invés uma função sua que por sua vez chama a built-in Oracle : aí na sua função vc controla / manipula erros via EXCEPTION... Tipo :

    create or replace function RETORNA_IP (P_HOSTNAME in VARCHAR2) return VARCHAR2 is

       v_IP  varchar2(50);

    BEGIN

       Begin

          v_ip := UTL_INADDR.get_host_address(P_HOSTNAME);

       Exception

          when OTHERS then

             v_ip := 'Desconhecido do servidor Oracle!!';

       End;

       return v_ip;

    END;

    /

    Aí teu select passa a ser :

    select DS_MAQUINA, IP_DA_MAQUINA_CLIENTE, count(ds_maquina) QTD_ESTACAO

      from (select UPPER(ds_maquina)                       ds_maquina,

                    RETORNA_IP(ds_maquina) ip_da_maquina_cliente,

              from Log_Acesso

             where dt_acesso between TO_DATE('01/10/2018 00:00:00', 'dd/mm/yyyy hh24:mi:ss')

                                 and TO_DATE('10/10/2018 23:59:59', 'dd/mm/yyyy hh24:mi:ss')

               and ds_maquina is not null

             )

    group by DS_MAQUINA, IP_DA_MAQUINA_CLIENTE

    order by DS_MAQUINA;  

    ==> Okdoc ??? Eu não testei, escrevo de cabeça aqui, então NÃO USE diretamente esse código, assuma que é um MODELO, um EXEMPLO apenas, certo ?? E  isso que eu fiz é manipulação e controle de erro naturais do PL/SQL, blz ?? Se vc não tinha o conceito de como o usar, dá uma lida no manual PL/SQL correspondente....

    Jonts