为什么我的Perl反引号抱怨“sh:第1行:任何:命令未找到”?

时间:2009-12-05 05:25:15

标签: perl backticks dig

我之前从未编程,但需要编写一个非常简单的webapp来进行工作。

我正试图让这个挖掘查询起作用:

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any

这个perl:

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;

除了在挖掘结束时似乎没有认出“任何”并给我:

sh: line 1: any: command not found

我做错了什么愚蠢的事情?

3 个答案:

答案 0 :(得分:11)

我敢打赌$query中有一个换行符,导致你的shell将any视为新命令。

在系统调用之前尝试执行chomp $query;以删除换行符。更多关于chomp

答案 1 :(得分:2)

你应该使用dig ... '$query'所以当shell看到它时它是单引号。如果你不这样做,那么shell将解释任何元字符。如果有人将"; echo my_key > ~/.ssh/authorized_keys"放入您的网络表单中,那么您就会被搞砸了。即使它仅供内部使用,如果有人在查询中放入带空格的东西(shell会将其拆分并传递给挖掘为两个参数),您不希望它破坏。)

你可以使用perl的

\Q$query\E
来扩展$ query,并且可以使用永久元字符\ escapeped。实际上,这比添加单引号要好得多,如果查询包含单引号字符,它将突破引号。仍然超级容易攻击。这should fix that in into your memory

Perl有安全的方法来使用system()函数将args指定为字符串列表,避免使用/ bin / sh,而不是将一个字符串作为shell命令进行求值。这是最安全的方式,但没有做管道和放大器的情况下没有后退版本。叉子&&执行自己。

答案 2 :(得分:1)

最有可能的是,$ query变量中的某个东西正在破坏命令字符串。你能告诉我们一个失败并给出错误的例子吗?或者展示一下你的剧本?