【问题标题】:Adapt perl script to run from cgi调整 perl 脚本以从 cgi 运行
【发布时间】:2016-01-05 23:41:25
【问题描述】:

我有一个 perl 脚本,它可以在 shell 上正常工作,但不能在 web (lighttpd + mod_cgi) 上工作。我发现问题出在以下字符串

my $lastupdate = `/opt/mongo/bin/mongo 127.0.0.1:27117/getVersion -u test -p test --eval 'db.polling.find({},{"_id":0,"host":0,"ports":0}).sort({"date":-1}).limit(1).forEach(function(x){printjson(x)})' | awk -F'"' '/date/{print \$4}' |sed 's/T/,/;s/Z//'`;

据我了解,从 cgi 运行时,字符串不会被拆分。所以我自己做了这个

my $lastupdate = system('/opt/mongo/bin/mongo', '127.0.0.1:27117/getVersion', '-u', 'test', '-p', 'test', '--eval', 'db.polling.find({},{"_id":0,"host":0,"ports":0}).sort({"date":-1}).limit(1).forEach(function(x){printjson(x)})', '|', 'awk', '-F', '"', '/date/{print', '\$4}', '|sed', 's/T/,/;s/Z//');

脚本现在可以工作,但给了我意想不到的价值(不同于 shell 的运行值)。
我错过了什么?
附言我知道有更聪明的方法可以从 perl 交互 mongoDB,但我的环境完全是防火墙。我既无法访问 CPAN,也无法访问 rh 存储库,而且 perl mongoDB 驱动程序的依赖项太多,无法手动安装。

【问题讨论】:

  • 我认为问题可能与输出到 awk 命令的管道有关。这个Perlmonks post 可能会为您指明正确的方向
  • 你应该在 perl 中执行 awk 和 sed 部分。
  • 您无法捕获system 的输出。你会想要使用IPC::Open2
  • 另外,您真的很想了解如何保护您的 perl CGI 脚本。毫无疑问,谷歌上有很多信息,perldoc.perl.org/search.html?q=cgi
  • @glenn 我切换到 IPC::Run my $testo = IPC::Run::run \@cmd, '|', \@awk - 返回布尔值 我如何分配运行的输出到变量

标签: mongodb perl shell cgi


【解决方案1】:

从 shell 运行程序的环境与从 Web 服务器运行同一程序时所获得的环境完全不同。最明显的是,它将以不同的用户身份运行 - 一个比普通用户拥有更多受限文件系统权限的用户。

您可以(部分)通过计算出您的 Web 服务器以哪个用户身份运行(可能是 apache、www 或 nobody)并使用sudo 以该用户身份运行您的程序来模拟这一点。这很可能会揭示问题所在。

您不能只从反引号切换到system()。反引号返回运行命令行的输出,system() 返回value which requires some interpretation。这就是为什么您会看到不同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 2012-03-10
    • 2015-05-27
    • 2013-12-31
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多