【问题标题】:Perl script in cgi-bin not executing shell script with argumentscgi-bin 中的 Perl 脚本不执行带参数的 shell 脚本
【发布时间】:2014-10-08 21:38:26
【问题描述】:

我的 perl 脚本存在于 cgi-bin/rel 位置。这段代码的 sn-p 有问题:

system("./upd_test.sh $res_file $label >log/upload.log 2>&1 &"); ->does not work
system("./upd_test.sh"); ->works fine

我很不明白为什么会这样。使用 Apache 服务器。

perl 脚本的文件权限是

-rwxr-xr-x 1 root   apache 1935 Oct  8 12:37 upload_label.pl

shell 脚本的文件权限是

-rwxrwxr-x 1 root   apache  945 Oct  8 14:27 upd_test.sh

如果我可以在没有参数的情况下调用 shell 脚本,为什么当我使用参数调用它时会出现问题?该脚本根本不会被调用。我在 shell 脚本中添加了一个 print 写入 /tmp 位置以验证它是否被执行。

我刚刚发现如果我删除重定向它工作正常,所以 system("./upd_test.sh $res_file $label") 工作正常,但我想重定向日志,因为它对我的工作非常重要。

【问题讨论】:

  • Re "脚本根本没有被调用",你怎么知道的?如果这是真的,shell 将向 STDERR 发出错误。你遇到了什么错误?
  • 您已更新问题,但未回答问题。你得到什么错误?

标签: linux perl shell cgi


【解决方案1】:

当前工作目录不是您的 CGI 脚本所在的目录,因此使用 ./ 将不起作用。

尝试使用 FindBin (https://metacpan.org/pod/FindBin) 来获取目录,或者只是硬编码 upd_test.sh 脚本的完整路径。

但是...从 CGI 脚本(实际上是从网页)运行 system() 是危险的。

【讨论】:

    【解决方案2】:

    错误在于权限而不是重定向。我不得不对 upd_test.sh 做一个 chown,这样所有者就是 apache。 虽然如果我尝试在 shell 上运行 ./upd_test.sh $res_file $label >log/upload.log 2>&1 & 它会引发错误。 我认为在 shell 上调用它的正确方法是 ./upd_test.sh $res_file $label >& log/upload.log &.

    附:我以为我已经编辑并发布了回复,但似乎情况并非如此。很抱歉这么晦涩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-15
      • 2021-02-20
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2015-05-27
      相关资源
      最近更新 更多