2009-10-21 30 views
0

在另一个问题,回答指出,在Unix系统与/proc,真正直接和可靠的方法是readlink("/proc/self/exe", buf, bufsize)后,进入给备份解决方案如下:如何在正常方法失败时在Linux上找到可执行文件的位置?

在Unix系统中没有的/ proc(即,如果上面的失败) :

  • 如果argv [0]以“/”(绝对路径)开头,则为路径。
  • 否则,如果argv [0]包含“/”(相对路径),则将其追加到cwd(假设它尚未更改)。
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); 
strncat(buf, argv[0], bufsize-strlen(buf)-1); 
  • 否则搜索目录中$PATH可执行argv[0]

之后,检查可执行文件是否实际上不是符号链接可能是合理的。如果它解决了它相对于symlink目录。

现在,在我的情况,不幸的是,没有上述作品:

  1. /proc/self/exe exists但未能readlink()由于许可被拒绝错误号13
  2. argv[0]没有/绝对或相对路径。
  3. $PATH不包含在argv[0]中找到的可执行文件。

当sgid应用程序运行时,也会出现这个问题。在我的情况下,它不是sgid,而是inetd的启动。

回答

0

尝试从suid二进制文件中查找/ proc。

+0

是的,我认为,但这似乎是相当极端的解决这个问题。 – WilliamKF 2009-10-22 22:30:27

0

我认为答案是:放弃。

要求用户将安装目录(或您正在查找的任何内容)作为命令行参数传递。

+0

用户,客户端不知道位置。 – WilliamKF 2009-10-22 02:26:31

0

作为最后的手段,解析/etc/xinetd.d/myApp文件以提取服务器行,其中包含通过inetd召集的可执行文件的完整路径。

1

解决这是/etc/xinetd.d/myApp配置文件中的最好的方式,要添加的环境变量指定的二进制文件的这样的位置:

service myApp 
{ 
    socket_type = stream 
    protocol = tcp 
    wait = no 
    user = root 
    server = /usr/local/bin/myAppd 
    env = MY_APP_HOME=/usr/local/bin 
    port = 2354 
    disable = no 
} 

然后,如果/ proc/self/exe是权限被拒绝,请检查env varible并使用它。

相关问题