0

在另一个问题中,答案指出,在带有 的 Unix 上/proc,真正直接可靠的方法是 to 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 existsreadlink()但由于权限被拒绝 errno 13而失败。
  2. argv[0]没有/绝对或相对路径。
  3. $PATH不包含在 中找到的可执行文件argv[0]

当 sgid 应用程序运行时,似乎也面临这个问题。就我而言,它不是 sgid,而是 inetd 启动。

4

4 回答 4

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 变量并改用它。

于 2009-10-23T14:34:07.237 回答
0

我认为答案是:放弃。

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

于 2009-10-22T00:28:18.253 回答
0

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

于 2009-10-22T02:28:50.440 回答
0

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

于 2009-10-22T02:39:09.873 回答