在另一个问题答案的国家在unix,其情形并与 /proc, 真正直和可靠的方法就是 readlink("/proc/self/exe", buf, bufsize) 它然后进行,得到备份的解决方案如下:

在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].

后来它可能是合理的,以检查是否是可执行的不是实际上的一个链接.如果它是解决相对于链接目录。

现在在我的情况下,不幸的是,没有任何上述工作:

  1. /proc/self/exe exists 但失败 readlink() 由于许可被拒绝errno13.
  2. argv[0] 有没有 / 绝对或相对的道路。
  3. $PATH 不包含可执行的现在 argv[0].

出现这一问题所面临的时候也sgid应用程序的运行。在我的情况下,它不是sgid,但inetd启动。

有帮助吗?

解决方案

试试看/proc从suid二进制的。

其他提示

最好的方式来解决这/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,并用它来代替。

我认为答案是:放弃。

要求用户可以通过安装目录(或者你正在寻找)作为命令行参数。

作为最后的手段,分析/etc/xinetd.d/myApp文件拔出的服务线路,包括完整的路径可执行的传唤通过inetd.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top