在另一个问题中,答案指出在具有/proc
的Unix上,真正直接且可靠的方式是readlink("/proc/self/exe", buf, bufsize)
,然后它继续提供备份解决方案,如下所示:
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); strncat(buf, argv[0], bufsize-strlen(buf)-1);
$PATH
中搜索可执行文件argv[0]
的目录。之后检查可执行文件是否实际上不是符号链接可能是合理的。如果它是相对于符号链接目录解析它。
现在在我的情况下,遗憾的是,以上都不起作用:
/proc/self/exe exists
但由于权限被拒绝而未能readlink()
错误13。argv[0]
对于绝对或相对路径没有/
。$PATH
不包含argv[0]
中的可执行文件。当sgid应用程序运行时,似乎也遇到了这个问题。就我而言,它不是sgid,而是inetd的推出。
答案 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。