将php变量传递给使用shflags的bash脚本

时间:2011-11-09 14:44:19

标签: php bash command-line-arguments

我正在尝试使用Web提交触发的PHP程序告诉bash脚本使用单个命令行参数运行。我正在使用shflags命令行解析器进行bash。

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 "$@" || 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文件。

当从Web触发PHP脚本时,第一部分正常工作,即它将“foo”写入两个目标文件foo.txt和$$ .txt。但是,xmlfilename变量没有出现,我真的需要将该文件名传递给命令行! (注意我不需要使用escapeshellarg,因为文件名是由我的PHP程序生成的,而不是由用户输入生成的。)

我已经检查了我能想到的所有文件权限。 xform.sh和shflags都是Apache拥有的www-data(Apache)组的成员,以及+ x。

我怀疑这个问题与a)我的PHP exec语法或b)文件权限有关。一切都按预期工作,除了这行中xform.sh之后的位!

exec ( '/opt/bitnami/apache2/htdocs/sfb/scripts/xform.sh --xmlfile'.' '.$filename); 

更新:

我通过使用一些测试代码隔离问题来进一步缩小问题范围。用:

$script="echo";
$xmlfilename="$filename";
$target=">> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt";

exec ("$script $xmlfilename $target");   

...

PHP正确地将$ filename写入foo.txt,因此$ script在值为“echo”时工作,$ filename也可以。

当我将$ script设置为xform脚本的另一个简单形式时(仅)将数据写入文件,这也可以正常工作。

因此问题特别是当PHP尝试将$ filename作为命令行变量编写时会发生的事情。如果Apache包含命令行变量,那么Apache运行的脚本是否需要比平常更多的权限?

叹息。

1 个答案:

答案 0 :(得分:1)

exec()来电中,您的标记为--xmlfile,但您从命令行调用--xmlfilename