题
在另一个问题答案的国家在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]
.
后来它可能是合理的,以检查是否是可执行的不是实际上的一个链接.如果它是解决相对于链接目录。
现在在我的情况下,不幸的是,没有任何上述工作:
/proc/self/exe exists
但失败readlink()
由于许可被拒绝errno13.- 的
argv[0]
有没有/
绝对或相对的道路。 - 的
$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.
不隶属于 StackOverflow