我正在尝试使用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运行的脚本是否需要比平常更多的权限?
叹息。
答案 0 :(得分:1)
在exec()
来电中,您的标记为--xmlfile
,但您从命令行调用--xmlfilename