`

获取oracle client登录IP的方法

 
阅读更多

一、UTL_INADDR包获取ip地址

今天有朋友在MSN上问我如何获得已经连接用户的IP地址。

我们知道,通过SYS_CONTEXT函数可以获得这部分信息,当前用户的ip等信息可以通过如下命令轻易获取:

SQL> select sys_context('userenv','host') from dual;

SYS_CONTEXT('USERENV','HOST')
--------------------------------------------------------------------------------
WORKGROUP/GQGAI

SQL> select sys_context('userenv','ip_address') from dual;

SYS_CONTEXT('USERENV','IP_ADDR
--------------------------------------------------------------------------------
172.16.34.20

可是如果我们希望获取其它session的地址信息等,通过SYS_CONTEXT函数就只能通过LOGON触发器来完成。

而如果没有触发器记录,则我们可以通过UTL_INADDR Package来实现。
我们看一下UTL_INADDR包获取ip等信息的实现原理。

我们在数据库中进行如下查询:

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Oct 25 11:24:22 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

SQL> !
[oracle@jumper oracle]$ ps -ef|grep sql
oracle 14700 14663 1 11:24 pts/0 00:00:00 sqlplus
oracle 14732 14702 0 11:24 pts/0 00:00:00 grep sql
[oracle@jumper oracle]$ ps -ef|grep LO
oracle 14701 14700 0 11:24 ? 00:00:00 oracleeygle (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 14734 14702 0 11:24 pts/0 00:00:00 grep LO
[oracle@jumper oracle]$ exit
exit

SQL> SELECT UTL_INADDR.get_host_address('www.anysql.net') from dual;

UTL_INADDR.GET_HOST_ADDRESS('WWW.ANYSQL.NET')
---------------------------------------------------------------------
208.113.151.109

在Linux中我们通过strace跟踪这个进程,可以得到以下堆栈信息:

[oracle@jumper oracle]$ strace -p 14701
Process 14701 attached - interrupt to quit
read(7, "/0/313/0/0/6/0/0/0/0/0/3^/10a/200/0/0/0/0/0/0@/342/22/10"..., 2064) = 203
gettimeofday({1161746697, 269895}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 30000}, ru_stime={0, 10000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 270542}, NULL) = 0
gettimeofday({1161746697, 270670}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 271614}, NULL) = 0
gettimeofday({1161746697, 271748}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 272347}, NULL) = 0
gettimeofday({1161746697, 272699}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 272989}, NULL) = 0
gettimeofday({1161746697, 273140}, NULL) = 0
gettimeofday({1161746697, 273273}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 10000}, ...}) = 0
gettimeofday({1161746697, 273771}, NULL) = 0
gettimeofday({1161746697, 275526}, NULL) = 0
getpid() = 14701
open("/etc/resolv.conf", O_RDONLY) = 12
fstat64(12, {st_mode=S_IFREG|0644, st_size=46, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fba000
read(12, "search hurray.com.cn/nnameserver "..., 4096) = 46
read(12, "", 4096) = 0
close(12) = 0
munmap(0xb6fba000, 4096) = 0
socket(PF_UNIX, SOCK_STREAM, 0) = 12
connect(12, {sa_family=AF_UNIX, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)
close(12) = 0
open("/etc/host.conf", O_RDONLY) = 12
fstat64(12, {st_mode=S_IFREG|0644, st_size=17, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fba000
read(12, "order hosts,bind/n", 4096) = 17
read(12, "", 4096) = 0
close(12) = 0
munmap(0xb6fba000, 4096) = 0
futex(0xb71a1a20, FUTEX_WAKE, 2147483647) = 0
open("/etc/hosts", O_RDONLY) = 12
fcntl64(12, F_GETFD) = 0
fcntl64(12, F_SETFD, FD_CLOEXEC) = 0
fstat64(12, {st_mode=S_IFREG|0644, st_size=175, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fba000
read(12, "# Do not remove the following li"..., 4096) = 175
read(12, "", 4096) = 0
close(12) = 0
munmap(0xb6fba000, 4096) = 0
open("/opt/oracle/product/9.2.0/lib/libnss_dns.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libnss_dns.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/i686/libnss_dns.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libnss_dns.so.2", O_RDONLY) = 12
read(12, "/177ELF/1/1/1/0/0/0/0/0/0/0/0/0/3/0/3/0/1/0/0/0/240/16"..., 512) = 512
fstat64(12, {st_mode=S_IFREG|0755, st_size=18632, ...}) = 0
old_mmap(NULL, 17100, PROT_READ|PROT_EXEC, MAP_PRIVATE, 12, 0) = 0xb6fb6000
old_mmap(0xb6fba000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 12, 0x3000) = 0xb6fba000
close(12) = 0
open("/opt/oracle/product/9.2.0/lib/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/i686/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libresolv.so.2", O_RDONLY) = 12
read(12, "/177ELF/1/1/1/0/0/0/0/0/0/0/0/0/3/0/3/0/1/0/0/0/320(/0"..., 512) = 512
fstat64(12, {st_mode=S_IFREG|0755, st_size=76508, ...}) = 0
old_mmap(NULL, 73604, PROT_READ|PROT_EXEC, MAP_PRIVATE, 12, 0) = 0xb6fa4000
old_mmap(0xb6fb3000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 12, 0xf000) = 0xb6fb3000
old_mmap(0xb6fb4000, 8068, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6fb4000
close(12) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 12
connect(12, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("208.113.151.109")}, 28) = 0
send(12, "/324#/1/0/0/1/0/0/0/0/0/0/3www/5anysql/3com/0/0/1/0/1", 31, 0) = 31
gettimeofday({1161746697, 286025}, NULL) = 0
poll([{fd=12, events=POLLIN, revents=POLLIN}], 1, 5000) = 1
ioctl(12, FIONREAD, [74]) = 0
recvfrom(12, "/324#/201/200/0/1/0/1/0/1/0/0/3www/5anysql/3com/0/0/1/0"..., 1024, 0,
{sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("208.113.151.109")}, [16]) = 74
close(12) = 0
gettimeofday({1161746697, 290245}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
gettimeofday({1161746697, 291553}, NULL) = 0
write(10, "/2/275/0/0/6/0/0/0/0/0/20/31/266/344/217/3700/320/341S"..., 701) = 701
read(7, "/0/215/0/0/6/0/0/0/0/0/3^/t@/0/0/0/1/0/0/0/0/0/0/0/0/0"..., 2064) = 141
gettimeofday({1161746697, 294898}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
gettimeofday({1161746697, 295496}, NULL) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 40000}, ru_stime={0, 20000}, ...}) = 0
gettimeofday({1161746697, 295847}, NULL) = 0
gettimeofday({1161746697, 295981}, NULL) = 0
lseek(9, 1024, SEEK_SET) = 1024
read(9, "/30/0$/0007/0@/0J/0V/0`/0i/0t/0~/0/232/0/245/0/320/0/330"..., 512) = 512
lseek(9, 47104, SEEK_SET) = 47104
read(9, "/f/0^/5/0/0P/0x/5/0/0/214/0y/5/0/0/250/0z/5/0/0/313/0{"..., 512) = 512
gettimeofday({1161746697, 297024}, NULL) = 0
write(10, "/0/202/0/0/6/0/0/0/0/0/4/1/0/0/0/1/1/0/0/0{/5/0/0/0/0/1"..., 130) = 130
read(7,
Process 14701 detached

在这个信息中,我们注意到Oracle顺序访问了如下文件来完成地址定位:

open("/etc/resolv.conf", O_RDONLY) = 12
open("/etc/host.conf", O_RDONLY) = 12
open("/etc/hosts", O_RDONLY) = 12

首先获取域名解析服务器,在根据host.conf文件确定解析顺序,因为缺省hosts文件优先,又继续读取/etc/hosts文件。

如果hosts文件存在解析关系,则返回信息;如果不存在,则继续问询DNS服务器,获得解析地址,如果不能解析,则会出错:

SQL> select UTL_INADDR.get_host_address('www.a.com') from dual;
select UTL_INADDR.get_host_address('www.a.com') from dual
*
ERROR at line 1:
ORA-29257: host www.a.com unknown
ORA-06512: at "SYS.UTL_INADDR", line 35
ORA-06512: at "SYS.UTL_INADDR", line 40
ORA-06512: at line 1


也就是说,UTL_INADDR的数据获取已经不依赖于数据库信息了,而SYS_CONTEXT的信息获取仍然来自数据库内部。

这就是UTL_INADDR包的工作原理。

from:http://www.eygle.com/archives/2006/10/how_to_getip_address.html

二、listener.log

cat $ORACLE_HOME/network/log/listener.log |grep IP(or hostname)

ora10glin->more listener.log |grep PC-20090909DEDJ
10-NOV-2009 15:41:28 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=demo)(CID=(PROGRAM=D:/Program Files/PLSQL Developer/plsqldev.exe)(HOST=PC-20090909DEDJ)(USER=Administrator))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.27)(PORT=3527)) * establish * demo * 0
10-NOV-2009 15:41:28 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=demo)(CID=(PROGRAM=D:/Program Files/PLSQL Developer/plsqldev.exe)(HOST=PC-20090909DEDJ)(USER=Administrator))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.27)(PORT=3528)) * establish * demo * 0
10-NOV-2009 15:41:52 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=demo)(CID=(PROGRAM=D:/Program Files/PLSQL Developer/plsqldev.exe)(HOST=PC-20090909DEDJ)(USER=Administrator))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.27)(PORT=3538)) * establish * demo * 0

分享到:
评论

相关推荐

    C#基类库(苏飞版)

    实现了计算机的信息获取功能,计算机名,IP,硬盘信息,网卡信息,操作系统信息等 2.Api_Win32_Mac类工具包 一个Win32的Api包,实现了大部分的Api操作帮助方法 3.在c#程序中放音乐的帮助类 使用C#播放音乐的帮助...

    vc++ 应用源码包_6

    清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚...登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览...

    vc++ 应用源码包_5

    清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚...登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览...

    vc++ 应用源码包_1

    清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚...登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览...

    vc++ 应用源码包_2

    清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚...登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览...

    vc++ 应用源码包_3

    清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚...登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

    java开源包1

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    mysql基础只是总结

    mssql 2000 Access DB2 oracle 【mysql安装】 1、官方下载mysql win32 msi 2、点击安装 3、配置 4、查看是否安装成功 通过cmd 输入netstat -a搜索3306端口是否处于listening状态 【mysql服务的启动与停止】 1...

    citrix 中文管理操作手册

    选择资源类型和发布方法 40 定位要发布的应用程序 41 验证已发布应用程序的命令行参数 42 在内容与已发布应用程序之间建立信任关系 42 禁用所选已发布应用程序的命令行验证 42 禁用服务器上所有已发布应用程序的...

    vc++ 开发实例源码包

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    Linux环境数据库管理员指南

    5.3.3 配置Sybase Client/Server 库 150 5.3.4 在引导时启动数据库服 务器和备份服务器 151 5.3.5 设置系统管理员口令 151 5.3.6 配置数据库设备和数据库 152 5.3.7 建立用户登录和权限 153 5.4 测试数据库 156 5.5...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    而越来越多专业知识的 Blog 的出现,让我们看到了 Blog 更多所蕴涵的巨大的信息价值:不同的 Blog 选择不同的内容,收集和整理成为很多人关注的专业 Blog ——目前越来越多的人获取信息的来源是一些固定的 Blog 。...

    java开源包11

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

    java开源包2

    3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...

Global site tag (gtag.js) - Google Analytics