调整perl脚本以从cgi

时间:2016-01-05 14:12:58

标签: mongodb perl shell cgi

我有一个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,但是我的env完全是防火墙。我既没有访问CPAN,也没有访问rh repos和perl mongoDB驱动程序有太多的手动安装它。

1 个答案:

答案 0 :(得分:2)

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

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

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