首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在perl中运行sed搜索并替换

在perl中运行sed搜索并替换
EN

Stack Overflow用户
提问于 2020-07-29 00:14:22
回答 1查看 71关注 0票数 0

我正在尝试为我正在编写的更大的脚本测试下面的代码片段。但是,我无法使用圆括号和变量进行搜索。

感谢任何人能给我的帮助。

代码片段:

代码语言:javascript
运行
复制
#!/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`;

谢谢,

灰分

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 00:41:45

在子进程中运行命令并在perl中等待其终止的语法为system "cmd", "arg1", "arg2",...

代码语言:javascript
运行
复制
#!/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被要求解释的代码是:

代码语言:javascript
运行
复制
/usr/bin/sed -i cb 's/Help (Test)/Testing/g' test4.html

这至少可以在FreeBSD或macOS上很好地工作。如果$filetest$(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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63217146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档