【发布时间】: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 - 返回布尔值 我如何分配运行的输出到变量