使用sed替换perl中的行
我想取消对etter.conf文件第168行的注释。该命令在终端中运行正常,但在perl中尝试时出错使用sed替换perl中的行,perl,sed,system,Perl,Sed,System,我想取消对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 expect
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"
我认为is与特殊字符和转义符有关。不能在双引号字符串中嵌套裸露的双引号。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});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^
不能将空双引号嵌套在双引号字符串中。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});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^
因此Perl正在进行解析,并找到一个字符串文本
system ("sed -i '168s/.*/redir_command_on = "
^ ^
| |
+-----------------------------------+
接下来应该是)
或操作员,但它是iptables
。您没有正确地形成字符串文字。切换分隔符将达到以下目的:
system(q{sed -i '168s/.*/redir_command_on = "..."/' /etc/etter.conf})
(q{…}
与“…”
相同)
顺便说一下,对系统使用“列表形式”更好,因为它避免了不必要地启动和使用shell
system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf')
因此Perl正在进行解析,并找到一个字符串文本
system ("sed -i '168s/.*/redir_command_on = "
^ ^
| |
+-----------------------------------+
接下来应该是)
或操作员,但它是iptables
。您没有正确地形成字符串文字。切换分隔符将达到以下目的:
system(q{sed -i '168s/.*/redir_command_on = "..."/' /etc/etter.conf})
(q{…}
与“…”
相同)
顺便说一下,对系统使用“列表形式”更好,因为它避免了不必要地启动和使用shell
system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf')
您需要转义嵌套的引号。Perl认为iptables应该是可变的。命令中的双引号正在终止Perl字符串。您为什么要使用sed
?Perl完全能够自行更新文件。您甚至可以在Perl中进行“就地”编辑,完全不需要使用sed。您需要转义嵌套引号。Perl认为iptables应该是可变的。命令中的双引号正在终止Perl字符串。您为什么要使用sed
?Perl完全可以自己更新一个文件。你甚至可以用Perl做“就地”编辑,完全不需要使用sed。很好,你也可以用system(qw)替换system(q{…
){…
自动获取列表表单。@steabert,不。您将获得一个列表,但它不是正确的命令。啊,因为有空格?@steabert,是的。qw
在空格上拆分。它对shell文本一无所知。很好,您还可以用system(qw)替换system(q{…
){…
自动获取列表表单。@steabert,不。您将获得一个列表,但它不是正确的命令。啊,因为有空格?@steabert,是的。qw
在空格上拆分。它对shell文本一无所知。