在RedHat 6服务器上,第三方应用程序需要root才能运行并且需要访问sqlplus。我有一个正在运行的数据库,我可以用'oracle'运行sqlplus。以root用户身份登录时,'sqlplus usr / pwd @ dbname'按预期工作。麻烦的是这个代理需要运行没有参数的sqlplus,它总是返回ORA-12546:TNS:权限被拒绝。
我已经阅读了十几次,让root用户启动Oracle是一个安全问题,但我别无选择。
运行Oracle 11.2.0.1.0。
任何帮助都会非常感激,因为我用Google搜索了2天但没有成功。
答案 0 :(得分:1)
From the documentation,ORA_12546是:
ORA-12546:TNS:许可被拒绝
原因:用户没有足够的权限执行请求的操作。 操作:获取必要的权限,然后重试。
哪个不完全有用,但各种论坛和博客帖子(链接太多,谷歌搜索错误显示了很多类似的建议)提到了安装的特定部分的权限,$ORACLE_HOME/bin/oracle
,这是大多数服务的关键和核心部分。
通常,该文件的权限为-rws-r-s--x
,文件归oracle:dba
所有,当字可写标志 - 该模式中的最终x
时,可能会发生此错误 - 未设定。 dba
组中的任何人仍然可以执行它,但外面的人不会。
通过在连接字符串中指定@dbname
,您可以远程连接您的监听器。监听器以oracle
运行(通常可以是grid
HA,RAC或ASM),因此它位于dba
组中,可以愉快地将连接切换到oracle
的实例{1}}可执行文件。
当您通过侦听器进行连接时,您必须能够自己执行该文件。似乎root
无法执行它(或者可能是其他文件,但这通常是罪魁祸首,显然),这意味着世界可写的位确实没有设置。
据我所知,您有三种选择:
chmod o+x $ORACLE_HOME/bin/oracle
设置全局可写位;但这会为每个人开放权限,并且可能是因为某种原因而被限制; root
或dba
将usermod
添加到/etc/group
群组;这也可能削弱安全性; @dbname
,也可以使用SQL * Net,方法是将export TWO_TASK=dbname
添加到root
环境。你说你在另一台服务器上没有这个问题,而且文件权限是一样的;在这种情况下,root
可能位于该框中的dba
组中。但我认为第三种选择似乎是最简单和最安全的。我想有第四个选项,要安装一个单独的instant client,但你必须设置TWO_TASK
并重新审视SQL * Net,你已经排除了这一点。
我不会详述将sqlplus
(或者确实需要它的应用程序)作为root
运行是否是一个好主意,但是只会提到你可能会有一个脚本或称为sqlplus
的函数,通过su
切换到权限较低的帐户以运行实际可执行文件,这对应用程序可能是透明的。除非您切换到oracle
帐户,这也不是一个好主意,否则您将拥有相同的权限问题和选项。