我有一个使用 OCI 与数据库通信的 C 应用程序。我使用的是即时客户端方法,因此服务器上没有独立的 Oracle 安装 - 只是应用程序链接的几个库。
通常,应用程序以用户 dai 身份运行,一切正常。但是,如果应用程序作为另一个用户(在组 dai 中)运行,它将无法运行,报告:
Error while trying to retrieve text for error ORA-12705
所以我可以想象这是一个权限错误,但我不确定它试图访问哪些文件。Oracle 库的权限是
dai:/dai/oracle/lib> ls -l
total 201872
-rwxrwxrwx 1 dai dai 24719097 16 Feb 2009 libclntsh.a
-rwxrwxrwx 1 dai dai 5972457 16 Feb 2009 libocci.a
-rwxrwxrwx 1 dai dai 72651344 04 Jun 2010 libociei.so
您可以猜到主要的 OCI 库是静态链接的,但是有一个动态链接的库(不知道为什么,但是 AIX Instantclient 包附带了这些文件......)。从两个用户来看,我的 LIBPATH 看起来都不错:
LIBPATH=/dai/oracle/lib
我还需要检查哪些其他权限?
编辑:我刚刚尝试运行truss
(AIX 相当于 Linux strace
)看看发生了什么。以 dai 用户身份运行时,我看不到它读取任何意外文件。Truss 似乎在跟踪 set-uid 程序时遇到问题 - C 应用程序的权限设置如下:
dai:/dai/bin> ls -l stats_backup
-rwsrwsr-x 1 dai dai 6173358 Aug 12 10:08 stats_backup
所以我做了chmod a-s
并再次尝试,它现在可以工作了!
所以程序在没有 s-bit 的情况下运行正常,但只要我把它放回去,它就会再次中断。我无法使用 s-bit 集运行 truss,这使得很难找出为什么会这样。如果没有设置 s 位,该程序在其他情况下无法运行,因此这不是一个可行的解决方案,但希望是指向问题所在位置的指针。