我想在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"
我认为这与特殊角色和逃脱有关。
答案 0 :(得分: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')
答案 1 :(得分:1)
您不能在双引号字符串中嵌套双引号。 Perl有更多quoting operators你可以使用。
# 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});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^