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

发布于 2024-12-14 15:02:26 字数 2302 浏览 2 评论 0原文

我正在尝试制作一个由 Web 提交触发的 PHP 程序,告诉 bash 脚本使用单个命令行参数运行。我正在使用 bash 的 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 "$@" || 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 file was 1.xml”写入 foo.txt 文件。

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

我已经检查了我能想到的所有文件权限。 xform.sh 和 shflags 都是 www-data (Apache) 组的成员,该组由 Apache 和 a+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,因此当值为“echo”时 $script 可以工作,并且 $filename 也可以工作。

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

因此,问题出在 PHP 尝试将 $filename 写入命令行变量时发生的情况。如果 Apache 运行的脚本包含命令行变量,是否需要比平时更多的权限?

叹。

I am trying to make a PHP program triggered by a web submit tell a bash script to run with a single command line parameter. I am using the shflags command line parser for bash.

The pertinent part of the PHP script is as follows:

// 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);      

}

}
?>

The bash script (xform.sh) (just a test script) is as follows.

#!/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

The bash script works correctly from the command line, i.e.

$xform.sh --xmlfilename 1.xml

writes "xml file was 1.xml" to the foo.txt file.

When the PHP script is triggered from the web, the first part works correctly, i.e. it writes "foo" to the two target files, foo.txt and $$.txt. However, the xmlfilename variable is not coming along, and I really need that file name to be passed to the command line! (Note I should not need to use escapeshellarg because the file name is generated by my PHP program, not by user input.)

I have checked all the file permissions I can think of. xform.sh and shflags are both members of the www-data (Apache) group, owned by Apache, and a+x.

My suspicions are that the problem is related either to a) my PHP exec syntax or b) file permissions. Everything works as intended except the bit after xform.sh in this line!

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

UPDATE:

I've narrowed the problem some more by isolating the problem with some test code. With:

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

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

...

PHP correctly writes the $filename to foo.txt, so $script works when value is "echo" and $filename works too.

When I set $script to a different simple form of the xform script that (only) writes the data to the file, that also works correctly.

So the problem is specifically with something that happen when PHP tries to write the $filename as a command line variable. Does a script run by Apache need more permissions than usual if it includes a command line variable?

Sigh.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落花浅忆 2024-12-21 15:02:26

在您的 exec() 调用中,您的标志为 --xmlfile 但您从命令行调用它为 --xmlfilename

In your exec() call you have the flag as --xmlfile but you are calling it from the command line as --xmlfilename

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文