2011-11-09 28 views
2

我試圖讓通過網絡引發的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運行的腳本是否需要比平常更多的權限?

感嘆。

+1

檢查'$ filename'實際上是設置在PHP中的東西調用它。 php不會因爲你在exec()調用中使用它而隱藏/隱藏它。如果它沒有在exec()調用之上正確構建,那麼exec將得到一個填充爲「xmlfile」的「空白」參數。 –

+0

我已經把問題縮小了一些。 –

+0

Apache與命令行擁有不同的權限(它將以www數據或其他方式運行,而不是您的用戶標識),並且從Apache啓動的shell具有與常規shell提示符不同的環境。 –

回答

1

在您的通話exec()你有標誌爲--xmlfile,但你在命令行--xmlfilename

+0

好眼!不過,我解決了這個問題,但這不是問題。 –