中国网管论坛's Archiver

花香公子 发表于 2006-12-6 23:43

如何利用java过程执行操作系统命令

下方法在WINNT,LINUX下的oracle9i上测试通过

首先给使用java存储过程的用户授予一定的权限
<<ALL FILE>>表示所有文件,也可以单独指定文件。
r w e d表示四种操作

[url=http://www.oracle.com.cn/thread-19232-1-1.html###][Copy to clipboard][/url]
CODE:
begin

Dbms_Java.Grant_Permission('HR',
'java.io.FilePermission', '<<ALL FILE>>',
'read ,write, execute, delete');

Dbms_Java.Grant_Permission('HR',
'java.io.FilePermission', 'd:\aa.bat',
'read ,write, execute, delete');

  dbms_java.grant_permission
   ('HR',
    'java.lang.RuntimePermission',
    '*',
    'writeFileDescriptor' );
  end;
  /
PL/SQL procedure successfully completed.

See

[url=http://java.sun.com/j2se/1.3/docs/api/java/lang/RuntimePermission.html]http://java.sun.com/j2se/1.3/doc ... timePermission.html[/url]

[url=http://java.sun.com/j2se/1.3/docs/api/java/security/SecurityPermission.html]http://java.sun.com/j2se/1.3/doc ... rityPermission.html[/url]

[url=http://java.sun.com/j2se/1.3/docs/api/java/io/FilePermission.html]http://java.sun.com/j2se/1.3/docs/api/java/io/FilePermission.html[/url]

and

[url=http://download-east.oracle.com/docs/cd/A81042_01/DOC/java.816/a81353/perf.htm#1001971]http://download-east.oracle.com/ ... 53/perf.htm#1001971[/url]
From the “Java Developer’s Guide”, Part No. A81353-01, Chapter 5:

Table 5–1 Permission Types
n java.util.PropertyPermission
n java.io.SerializablePermission
n java.io.FilePermission
n java.net.NetPermission
n java.net.SocketPermission
n java.lang.RuntimePermission
n java.lang.reflect.ReflectPermission
n java.security.SecurityPermission
n oracle.aurora.rdbms.security.PolicyTablePermission
n oracle.aurora.security.JServerPermission


相关的java类如下

[url=http://www.oracle.com.cn/thread-19232-1-1.html###][Copy to clipboard][/url]
CODE:
SQL> connect hr/hr@ts
已连接。

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;
     }
     }
   }
  /

Java created.

建立函数

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

Function created.

建立一过程调用函数
  create or replace procedure RC(p_cmd in varchar2)
  as
    x number;
  begin
   x := run_cmd(p_cmd);
  end;
  /

Procedure created.

SQL> variable x number;
SQL>  set serveroutput on
SQL> exec dbms_java.set_output(100000);

PL/SQL procedure successfully completed.

可以执行相应的命令和bat文件

[url=http://www.oracle.com.cn/thread-19232-1-1.html###][Copy to clipboard][/url]
CODE:
SQL>  exec :x := RUN_CMD('ipconfig');

Windows 2000 IP Configuration

Ethernet adapter 本地连接
:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 172.18.25.102
        Subnet Mask . . . . . . .
. . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 172.18.25.1

PL/SQL 过程已成功完成。


也可以执行服务器上的bat文件
SQL>   exec :x := RUN_CMD('c:\aa.bat');
c:\oracle\ora92\DATABASE>cmd /c
c:\oracle\ora92\DATABASE>dir
Volume in drive C is 本地磁盘
Volume Serial Number is 5CE1-2622
Directory of c:\oracle\ora92\DATABASE
2004-05-15  15:47       <DIR>          .
2004-05-15  15:47       <DIR>          ..
2002-12-24  20:13       <DIR>          archive
1998-09-09  18:31               31,744 oradba.exe
2004-05-08  11:48                  568 OraDim.Log
2004-03-17  11:53                1,536 PWDweblish.ora
2004-05-15  15:47            1,871,872 SNCFWEBLISH.ORA
2003-12-29  13:24                2,560 SPFILEWEBLISH.ORA
2004-05-08  11:48               12,852 sqlnet.log
6 File(s)      1,921,132 bytes
3 Dir(s)   7,141,621,760 bytes free

-----------------
c:\aa.bat如下:

cmd /c
dir

半支煙 发表于 2007-6-26 11:40

谢谢了 

页: [1]

Powered by Discuz! Archiver 6.1.0  © 1999-2008 bbs.bitsCN.com