gpt4 book ai didi

oracle - oracle只能通过辅助组关联读取本地文件吗?

转载 作者:行者123 更新时间:2023-12-03 15:02:23 24 4
gpt4 key购买 nike

我正在尝试从 Oracle 运行一个非常简单的 python 脚本。 Oracle 与脚本在同一个 linux 机器上。它打开一个文件并创建一个校验和。它由 oracle 中的“侦察”用户触发。

只要文件所有者是“oracle”,或者组是“oinstall”(oracle 的默认组),或者 public 设置为 rx,脚本就可以从 Oracle 中运行脚本。

问题是我们必须使用不同的用户:组,并且我们不能使用公共(public)权限。我们将 oracle 用户添加到文件的组中。

uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),202175(efs_data)

当我们像以前一样在 Oracle 中运行时,它现在失败了,但是,当 sudo 进入 oracle 用户并直接运行脚本时,它可以工作,所以我们知道 linux 权限是好的。

什么可能导致这种情况?我猜 Oracle 正在做一些覆盖 linux 权限的其他类型的访问检查,这会忽略辅助组并只查看 gid。

作为“侦察”模式:
set serveroutput on size unlimited
declare
x number;
begin
x := run_cmd('/home/oracle/bin_dir/pytest.py');
dbms_output.put_line('return:' || x);
end;

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

Util.RunThis:
import java.io.*;
import java.lang.*;

public class Util extends Object
{

public static int RunThis(java.lang.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;
}
}
}

/home/oracle/bin_dir/pytest.py:
#! /usr/bin/python -W ignore::DeprecationWarning
import paramiko
import logging
import datetime
import pwd
import md5
import os

def test_file_open(local_file):
print 'Trying to open: '+ local_file
logging.info('Trying to open: ' + local_file)
local_file_data = open(local_file, "rb").read()
checksum = md5.new(local_file_data).hexdigest()
return checksum

def main():
logging.basicConfig(filename='/mounts/users/dmz/pytest.log', level=logging.INFO)
logging.info('==========================================')
logging.info('START: ' + str(datetime.datetime.now()))
logging.info('getuid: ' + pwd.getpwuid( os.getuid() ).pw_name)
logging.info('geteuid: ' + pwd.getpwuid( os.geteuid() ).pw_name)

checksum = test_file_open('/test.txt')

print 'Success!, checksum: ' + checksum
logging.info('Success! checksum: ' + checksum)
logging.info('END: ' + str(datetime.datetime.now()))

if __name__ == '__main__':
main()

输出(以 oracle 作为文件所有者):
-rwxrwx---. 1 oracle efs_data 0 Jun  7 19:56 /test.txt

INFO:root:==========================================
INFO:root:START: 2018-06-07 19:45:32.005429
INFO:root:getuid: oracle
INFO:root:geteuid: oracle
INFO:root:Trying to open: /test.txt
INFO:root:Success! checksum: 9f1e1404fd72b59121d45a8beb4dab5d
INFO:root:END: 2018-06-07 19:45:32.007078

输出(仅通过组关联获得权限):
-rwxrwx---. 1 root efs_data 0 Jun  7 19:57 /test.txt

INFO:root:==========================================
INFO:root:START: 2018-06-07 19:44:15.748559
INFO:root:getuid: oracle
INFO:root:geteuid: oracle
INFO:root:Trying to open: /test.txt

最佳答案

我对 DIRECTORY 和外部表也有类似的问题,其中 linux 组访问似乎被忽略了。我能够通过使用 acl 并让 oracle 用户拥有所需的权限,同时让文件的所有权保留给另一个用户来解决。

ll test.txt
-rwx------. 1 lunc users 940 Jun 13 09:34 test.txt

setfacl -m u:oracle:rwx test.txt

getfacl test.txt

# file: test.txt
# owner: lunc
# group: users
user::rwx
user:oracle:rwx
group::---
mask::rwx
other::---

ll test.txt
-rwxrwx---+ 1 lunc users 940 Jun 13 09:34 test.txt

Oracle 接受这一点(至少对于外部表)并且能够访问该文件。

关于oracle - oracle只能通过辅助组关联读取本地文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com