0

我想取消注释 etter.conf 文件中的第 168 行。该命令在终端中运行正常,但在 perl 中尝试时出现错误。

system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf");

错误是:

Bareword found where operator expected at ./attack.pl line 135, near 
""sed -i '168s'/.*'/redir_command_on = "iptables"

我认为这与特殊字符和转义有关。

4

2 回答 2

5

所以 Perl 正在解析,它找到了一个字符串文字

system ("sed -i '168s/.*/redir_command_on = "
        ^                                   ^
        |                                   |
        +-----------------------------------+

接下来应该是)或运算符,但它是iptables. 你没有正确地形成你的字符串文字。切换分隔符可以解决问题:

system(q{sed -i '168s/.*/redir_command_on = "..."/' /etc/etter.conf})

q{...}与 相同'...'。)

顺便说一句,使用“列表形式”system会更好,因为它可以避免不必要地启动和使用 shell,

system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf')
于 2013-06-25T16:43:29.750 回答
1

您不能在双引号字符串中嵌套裸双引号。Perl 有更多可以使用的引用运算符。

# Instead of
system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf");

# use
system (q{sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^
于 2013-06-25T16:43:17.013 回答