以下程序在Perl中。Perl特定代码
cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:[email protected][-`{-};`-{/" -;;s;;$_;see'
有人能帮我理解它是如何工作的吗?
以下程序在Perl中。Perl特定代码
cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:[email protected][-`{-};`-{/" -;;s;;$_;see'
有人能帮我理解它是如何工作的吗?
这段代码已被问及on the Debian forums。
根据该线程的主持人Lacek的说法,代码最初做的是rm -rf /
,尽管他们提到他们已经改变了那个版本,所以人们试图弄清楚它是如何工作的并不会删除整个文件系统。还有一些关于Perl代码的各个部分的解释。
(你发布此知道它的所作所为,或者是你不知道吗?)
引述它Lacek的帖子:
反正这里是脚本如何工作的。
它基本上是两个正则表达式替换和一个音译。 管道任何东西到其标准输入没有区别,perl 代码不会以任何方式使用其输入。如果你在表达 边界分割线长,你会得到这样的:
$??s:;s:s;;$?:: s;;=]=>%-{\\>%<-{;; y; -/:[email protected][-`{-};`-{/" -;; s;;$_;see
第一行是什么也不做保存使得代码 看起来更困难的条件。如果前面的命令源自perl 代码没有成功,它会在标准输入(程序不使用,因此它有效地代替 没有任何输入)上执行一些替换。由于没有以前的命令存在,$?始终为0,所以 的第一行永远不会被执行。
第二行代替 标准输入(无)看似无意义的垃圾。
第三行是音译操作符。它定义了4个范围,在 中,字符被替换为音译替换中给出的一个范围和4个个字符。我宁愿不要 在这里写整个音译表,因为它有点长。 如果您真的感兴趣,只需在定义的 范围(空格为'/',':'至'@','['至'(反向)'和'{'至'}')中写入字符, 在替换范围('(backtick)'到 '{')旁边写入字符,最后从替换模式中写入剩余字符(/,“,空格和 - ) 。有这样的表,你可以看到 什么字符被替换到什么。
最后一行执行 代与导致串 (这是“的xterm”的任何结果的命令。这本来就是“系统“RM -rf /“',并保存在$ _中的 ),评估s作为一种表达的表达和执行。
(我在这里用实际反引号字符替代'反引号',这样代码自动格式化不会启动。)
其实我发现有一个人要求尝试这个程序,但我无法理解代码,所以在这里问。 –