標籤:
--要擷取伺服器端的IP14:45:34 SYS@XXX> select utl_inaddr.get_host_address from dual;GET_HOST_ADDRESS--------------------------------------------------10.19.2.XX--解析網域名稱14:45:32 SYS@XXX> SELECT UTL_INADDR.get_host_address(‘www.anysql.net‘) from dual;UTL_INADDR.GET_HOST_ADDRESS(‘WWW.ANYSQL.NET‘)--------------------------------------------------173.236.176.151--根據IP地址反向解析主機名稱14:47:14 SYS@XXX> select utl_inaddr.get_host_name(‘173.236.176.151‘) from dual;UTL_INADDR.GET_HOST_NAME(‘173.236.176.151‘)--------------------------------------------------apache2-argon.footprint.dreamhost.com--擷取用戶端IP14:48:48 SYS@XXX> select SYS_CONTEXT(‘USERENV‘,‘IP_ADDRESS‘) ip_address from dual;IP_ADDRESS--------------------------------------------------10.19.2.XX--擷取用戶端主機名稱14:48:50 SYS@XXX> select sys_context(‘userenv‘,‘host‘) from dual;SYS_CONTEXT(‘USERENV‘,‘HOST‘)--------------------------------------------------WORKGROUP\WXX-THINK
UTL_INADDR包擷取ip等資訊的實現原理:
可參考蓋神的文章:http://www.eygle.com/archives/2006/10/how_to_getip_address.html
在Linux可使用strace 命令進行相關命令的跟蹤,在跟蹤資訊中獲知
Oracle順序訪問了如下檔案來完成地址定位:
open("/etc/resolv.conf", O_RDONLY) = 12open("/etc/host.conf", O_RDONLY) = 12open("/etc/hosts", O_RDONLY) = 12
首先擷取網域名稱解析伺服器,在根據host.conf檔案確定解析順序,因為預設hosts檔案優先,又繼續讀取/etc/hosts檔案。
如果hosts檔案存在解析關係,則返回資訊;如果不存在,則繼續問詢DNS伺服器,獲得解析地址,如果不能解析,則會出錯:
14:49:31 SYS@XXX> select UTL_INADDR.get_host_address(‘www.a.com‘) from dual;select UTL_INADDR.get_host_address(‘www.a.com‘) from dual *第 1 行出現錯誤:ORA-29257: 未知的主機 www.a.comORA-06512: 在 "SYS.UTL_INADDR", line 19ORA-06512: 在 "SYS.UTL_INADDR", line 40ORA-06512: 在 line 1
也就是說,UTL_INADDR的資料擷取已經不依賴於資料庫資訊了,而SYS_CONTEXT的資訊擷取仍然來自資料庫內部。
oracle擷取主機伺服器IP