正常方法失败时如何在Linux上查找可执行文件的位置?

时间:2009-10-21 23:00:40

标签: c++ inetd

在另一个问题中,答案指出在具有/proc的Unix上,真正直接且可靠的方式是readlink("/proc/self/exe", buf, bufsize),然后它继续提供备份解决方案,如下所示:

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

  • 如果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]的目录。

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

现在在我的情况下,遗憾的是,以上都不起作用:

  1. /proc/self/exe exists但由于权限被拒绝而未能readlink()错误13。
  2. argv[0]对于绝对或相对路径没有/
  3. $PATH不包含argv[0]中的可执行文件。
  4. 当sgid应用程序运行时,似乎也遇到了这个问题。就我而言,它不是sgid,而是inetd的推出。

4 个答案:

答案 0 :(得分: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并改为使用它。

答案 1 :(得分:0)

我认为答案是:放弃。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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