2016-02-23 3 views
2

У меня есть следующий файл .c:C - получить путь .c файла

/home/eamorr/project1/eamorr.c

Я отлично компилируюсь и его ех находится по адресу:

/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

Вы можете подумать о том, чтобы сделать chdir от PHP до вызова программы и полностью обойти всю обходную директорию. –

+0

Причина, по которой я использую C, заключается в том, что мне нужен веб-пользователь, чтобы иметь возможность выполнять привилегированную программу. Да, я знаю ... Пользователь аутентифицирован и пользователь ограничен диапазоном IP. – Eamorr

+0

Я не говорил, что не использую программу на С. Вы можете выполнить 'chdir()' перед выполнением программы C, а затем вызвать './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 почти наверняка не запускает PHP на DOS. – immibis

+0

@ Andres - 'dirname()' отлично работает! Спасибо огромное! Я попробовал 'basename()' ... Это не сработало. Но dirname() делает ... – Eamorr