[英]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.