2016-02-23 67 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