2016-02-23 48 views
2

我有以下.c文件:Ç - 获得.c文件的路径

/home/eamorr/project1/eamorr.c

我编译罚款和exe文件在位于:

/home/eamorr/project1/a.out

现在,我有一个PHP文件在:

/home/eamorr/project1/a/b/c/eamorr.php

它需要调用a.out

<?php 
$cmd=__DIR__."../../../a.out"; 
$result=`$cmd`; 
?> 

这里的eamorr.c程序:

#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main (int argc, char *argv[]){ 
setuid (0); 

char temp[2048]; 
char pwd[1024]; 

realpath(argv[0],pwd); 


sprintf(temp,"/bin/bash %s/doMagic.sh",pwd); 
system((char *)temp); 

return 0; 
} 

不幸的是,PWD变量包含错误的道路!

/home/eamorr/project1/a.out/doMagic.sh

如何摆脱从路径a.out的位?我没有在C程序很多时候,我已经在这个超过现在一个小时......

+0

在调用程序并避免所有目录欺骗之前,您可能会考虑从PHP执行chdir。 –

+0

我使用C的原因是因为我需要一个Web用户来执行特权程序。是的,我知道...用户通过身份验证,用户被限制在IP范围内。 – Eamorr

+0

我没有说不使用C程序。你可以在执行C程序之前先执行'chdir()',然后调用'。/ doMagic.sh'而不是用完整路径尝试前缀。 –

回答

3

如果我理解正确的,你想获得是一样的东西:

/home/eamorr/project1/doMagic.sh 

首先,我通常不会在C中进行这种路径处理。但是,我快速查看了一下,并且似乎可以使用dirname()功能。看看这里http://man7.org/linux/man-pages/man3/basename.3.html。请小心,因为我会想象这些是Linux的东西,不知道你会怎么做在DOS中。

+0

是的,但'dirname'是'a.out' exe的路径或调用.php文件的路径?我想不出来...... – Eamorr

+0

我怀疑如何在DOS下做到这一点并不重要,因为没有人仍然使用DOS,特别是,@Eamorr几乎肯定不是在DOS上运行PHP。 – immibis

+0

@Andres - 'dirname()'很好用!非常感谢!我确实尝试过'basename()'...这不起作用。但是dirname()不会... – Eamorr