admin 管理员组

文章数量: 888297


2024年1月15日发(作者:exploit network)

如何获得所有远程 Session 的客户端 IP 地址

在 Oracle 数据库中没有直接获取远程 session 客户端 IP 地址的方法。但是存在直接获取当前

session 客户端 IP 地址的方法。通过在数据库中创建 after logon 触发器,再结合使用

DBMS_APPLICATION__CLIENT_INFO 存储过程,我们可以通过查询 v$session 来获取所有

远程 session 的客户端 IP 地址。

首先,创建如下触发器:

CREATE OR REPLACE TRIGGER login_on AFTER LOGON ON DATABASE

DECLARE

ipinfo VARCHAR2(30);

BEGIN

SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') INTO ipinfo FROM DUAL;

DBMS_APPLICATION__CLIENT_INFO(ipinfo);

END;

/

然后使用任意的用户远程(TNS)连接到数据库中,然后通过查询以下语句便可查看该 session 的客户端 IP 地址:

21:03:35 system@PROD> conn scott/tiger@prod

Connected.

21:04:05 scott@PROD> col sys_context('userenv','sid') for a40

21:04:18 scott@PROD> select sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SID')

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

125

用 system 用户创建一个 session 连接,在该 session 中来查询 scott 用户创建的 session

的客户端 IP 地址:

21:07:47 sys@PROD> col client_info for a30

21:08:04 sys@PROD> col CLIENT_IDENTIFIER for a30

21:08:17 sys@PROD> select username,sid,serial#,client_info,client_identifier from v$session where sid=125;

USERNAME SID SERIAL# CLIENT_INFO CLIENT_IDENTIFIER

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

SCOTT 125 35 192.168.8.160

21:08:43 sys@PROD> select username,sid,serial#,client_info,client_identifier from v$session where sid=18;

USERNAME SID SERIAL# CLIENT_INFO CLIENT_IDENTIFIER

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

SCOTT 18 17 192.168.8.100

[oracle@dss admin]$ sqlplus scott/tiger@prod

SQL*Plus: Release 11.2.0.3.0 Production on Tue Mar 19 21:20:16 2013

Copyright (c) 1982, 2011, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

21:21:18 scott@PROD> col sys_context('userenv','sid') for a30

21:21:24 scott@PROD> select sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SID')

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

139

21:08:59 sys@PROD> select username,sid,serial#,client_info,client_identifier from v$session where sid=139;

USERNAME SID SERIAL# CLIENT_INFO CLIENT_IDENTIFIER

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

SCOTT 139 163 192.168.8.180


本文标签: 远程 用户 地址 使用