簡體   English   中英

在Linux下通過PHP網頁運行C編譯程序

[英]Running a C compiled program through a PHP webpage under linux

我的page.php文件目前看起來像這樣:

    <?php

    $cmd = './foo < input.txt > output.txt';

    $result = shell_exec($cmd);

    echo system('date'); //just to see change when refreshing the page

    ?>

每當我在shell中鍵入相同的命令時,它就可以完美地工作(使用input.txt文件並帶有示例輸入)。

我的想法是使用php創建一個接口來與input.txt文件進行通信,然后與output.txt文件進行通信以在頁面上返回結果。 但是,首先,我需要確保我可以運行我擁有的程序。

我已經用

    gcc -Wall -o foo foo.c

foo可執行文件與page.php位於同一目錄中。

我嘗試對所有文件(page.php,input.txt和foo)使用777權限

該網站已啟動且正在運行,當我刷新頁面時日期會更改,但目錄上沒有output.txt。

我試過了

    $cmd = 'ls -la';

    $result = shell_exec($cmd);

    echo $result;

並按預期工作,顯示正確目錄的內容。

可能導致這種類型問題的一件事是,如果Apache沒有對output.txt本應到達的目錄的寫訪問權。 執行ls -l ../來查看您是否實際上具有必要的權限。 我還將回顯結果,因為這可能使您對正在發生的事情有更多的了解。

如評論中所述,問題是基於權限的。 此功能所需的最低權限如下

“可執行文件上有711,輸入文件上有644,輸出文件上有666,包含文件夾中有755。”

感謝您的所有貢獻。

另一個可能的問題是,如果您啟用了SELinux(這是Fedora和Red Hat中的默認設置),它將阻止Apache運行尚未標記為在Apache上下文中的命令。 這是一項安全功能,旨在使它能夠在有人入侵您的Web服務器或Web應用程序的情況下無法使用它在您的服務器上運行任意命令。

要為應用程序設置正確的上下文,您需要運行命令chcon -t httpd_sys_script_exec_t execname (將execname替換為可執行文件的名稱)。 您還需要更改輸入和輸出文件的上下文,以允許它們通過chcon由apache腳本編寫。 你要使用類型httpd_sys_script_ro_t只讀輸入文件,並鍵入httpd_sys_script_rw_t讀/寫輸出文件或鍵入httpd_sys_script_ra_t進行讀/追加輸出文件。 chcon命令通常只會更改內容,直到下次服務器重新啟動為止。 當時,文件上下文是根據目錄重新映射的,因此從長遠來看,您將需要調整策略以將這些上下文設置為這些文件的默認上下文。 但是,我不記得該怎么做,所以您需要查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM