我試圖讓通過網絡引發的PHP程序提交告訴bash腳本使用單個命令行參數運行的腳本。我正在使用shflags命令行解析器進行bash。通過PHP變量來砸使用shflags
PHP腳本的相關部分如下:
// generate unique filename
$destinationFolder = Mage::getBaseDir('media') . DS . 'webforms' . DS . 'xml';
$filename = $destinationFolder . DS . $result->getId().'.xml';
// create folder
if (!(@is_dir($destinationFolder) || @mkdir($destinationFolder, 0777, true))) {
throw new Exception("Unable to create directory '{$destinationFolder}'.");
}
// export to file
$xmlObject->getNode()->asNiceXml($filename);
// define parameters to pass
exec ('/opt/bitnami/apache2/htdocs/sfb/scripts/xform.sh --xmlfile'.' '.$filename);
}
}
?>
的bash腳本(xform.sh)(只是一個測試腳本)如下。
#!/bin/bash
. ./shflags
echo "foo" >> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/$$".txt"
echo "foo" >> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt
DEFINE_string 'xmlfilename' 'test' 'filename of current x.xml file from webforms' 'Z'
FLAGS "[email protected]" || exit 1
eval set -- "${FLAGS_argv}"
echo "xml file was" ${FLAGS_xmlfilename} >> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt
的bash腳本命令行正常工作,即
$xform.sh --xmlfilename 1.xml
寫道: 「XML文件是1.XML」 到foo.txt的文件。
當PHP腳本從網頁觸發,第一部分正常工作,即它寫道:「foo」的兩個目標文件,foo.txt的和$$。TXT。但是,xmlfilename變量不會出現,我真的需要將該文件名傳遞給命令行! (注意:我不應該需要使用escapeshellarg,因爲是由我的PHP程序生成的文件名,而不是由用戶輸入。)
我已經檢查了所有文件的權限我能想到的。 xform.sh和shflags都是Apache擁有的www-data(Apache)組和a + x的成員。
我的懷疑是該問題的相關要麼一)我的PHP命令格式或b)文件權限。除了在這行中的xform.sh之後,一切都按預期工作!
exec ('/opt/bitnami/apache2/htdocs/sfb/scripts/xform.sh --xmlfile'.' '.$filename);
UPDATE:
我用一些測試代碼分離的問題收窄的問題更多一些。附:
$script="echo";
$xmlfilename="$filename";
$target=">> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt";
exec ("$script $xmlfilename $target");
...
PHP正確寫入$ filename來foo.txt的,所以當值是 「回聲」 和$文件名工作太$腳本工作。
當我設置$腳本到XForm的腳本(只),將數據寫入到文件中,也可以正常工作的一個不同的簡單形式。
所以這個問題是特別有當PHP嘗試寫入$文件名作爲命令行變量,會發生什麼。如果包含命令行變量,由Apache運行的腳本是否需要比平常更多的權限?
感嘆。
檢查'$ filename'實際上是設置在PHP中的東西調用它。 php不會因爲你在exec()調用中使用它而隱藏/隱藏它。如果它沒有在exec()調用之上正確構建,那麼exec將得到一個填充爲「xmlfile」的「空白」參數。 –
我已經把問題縮小了一些。 –
Apache與命令行擁有不同的權限(它將以www數據或其他方式運行,而不是您的用戶標識),並且從Apache啓動的shell具有與常規shell提示符不同的環境。 –