我正在尝试为我正在编写的更大的脚本测试下面的代码片段。但是,我无法使用圆括号和变量进行搜索。
感谢任何人能给我的帮助。
代码片段:
#!/usr/bin/perl
$file="test4.html";
$Search="Help (Test)";
$Replace="Testing";
print "/usr/bin/sed -i cb 's/$Search/$Replace/g' $file\n";
`/usr/bin/sed -i cb 's/$Search/$Replace/g' $file`;谢谢,
灰分
发布于 2020-07-29 00:41:45
在子进程中运行命令并在perl中等待其终止的语法为system "cmd", "arg1", "arg2",...
#!/usr/bin/perl
$file="test4.html";
$Search="Help (Test)";
$Replace="Testing";
print "/usr/bin/sed -icb -e 's/$Search/$Replace/g' -- $file\n";
system "/usr/bin/sed", "-icb", "-e", "s/$Search/$Replace/g", "--", $file;(作为练习留下的错误检查,请参阅perldoc -f system了解详细信息)
请注意,-i不是标准的sed选项。支持它的几个实现(您的实现必须是FreeBSD实现,因为您已经将cb备份扩展从-i中分离出来)实际上已经从perl复制了它!在这里从perl调用sed确实让人觉得有点傻。
看看你的方法:
shell操作符本身让人联想到等效的`...` `...`操作符。在perl中,在$var、@var中,内部内容的计算就好像在双引号中一样。展开perl变量,并以-c和结果字符串作为参数启动shell,并将其标准输出重定向到管道。
shell将该参数解释为shell语法中的代码。Perl从管道的另一端读取内联shell脚本的输出,这构成了`...`的扩展。除了没有剥离零字节或尾随换行符之外,与shell命令替换中的相同。
sed -i不会产生任何输出,所以在这里尝试用`...`捕获它的输出是没有意义的。
现在,在您的例子中,sh被要求解释的代码是:
/usr/bin/sed -i cb 's/Help (Test)/Testing/g' test4.html这至少可以在FreeBSD或macOS上很好地工作。如果$file是test$(reboot).html,情况会更糟。
在这里,因为您拥有在解释器(这里是sh)中最终被解释为代码的变量的内容,所以存在潜在的任意命令插入漏洞。
在system方法中,我们删除了sh,这样特定的漏洞就被删除了。然而,sed也是某种语言的解释器。这种语言并不像sh那样无所不能,但是例如sed可以用它的w命令写入任意文件。GNU实现(您似乎没有使用它)也可以运行任意命令。
因此,在使用来自外部源的$Search或$Replace的情况下,仍然可能存在代码插入漏洞。
如果是这样的话,您需要确保在运行sed之前正确地清理了这些值。请参阅示例:How to ensure that string interpolated into sed substitution escapes all metachars
https://stackoverflow.com/questions/63217146
复制相似问题