皮皮网
皮皮网

【投稿不给源码】【分时最佳买点源码】【日程管理源码查询】grep源码分析

时间:2024-12-29 09:38:58 来源:dw交源码

1.如何用grep对PHP进行代码审计
2.Linux grep命令搜索神器详解
3.手把手学习 grep
4.分析、源码还原一次typecho入侵事件
5.GREP是分析全球正则表达式程序的英文缩写吗?
6.深入研究ast-grep的模式: 一文解析Tree-Sitter核心概念

grep源码分析

如何用grep对PHP进行代码审计

       æˆ‘们首先使用带有正则表达式的grep查找$_GET:

       grep -i -r “\$_GET”

*

       é€‰é¡¹-i表示忽略大小写,选项-r表示递归查找子目录。正则表达式“\$_GET”用来匹配$_GET,其中反斜杠\用来转义$,因为$号在正则表达式中有特殊含义。我们使用通配符*告诉grep在任何文件中进行搜索。

       æ­£å¦‚你所见我们从简单的grep命令找到了许多结果,让我们尝试更具体的操作缩小潜在的可能性。在PHP中,通常使用echo进行输出。我们来搜索直接回显用户输入的代码有哪些。命令:grep -i -r “\$_GET” * | grep “echo”

Linux grep命令搜索神器详解

       Linux中不可或缺的grep命令,简称“全局正则表达式打印”,源码它是分析一种强大的文本搜索工具,广泛存在于各种发行版中。源码这个命令的分析投稿不给源码主要功能是通过正则表达式在文件中查找特定模式的文本,使得搜索变得灵活且高效。源码

       grep命令的分析语法简单实用,例如,源码执行如下的分析命令:grep -i "abc" output.txt,其中-i选项表示忽略大小写。源码如果省略文件名(如FILE为-),分析grep会从标准输入读取数据,源码如果没有提供,分析它会在当前目录下递归搜索。源码

       grep提供了多种选项,涵盖了通用程序信息、正则表达式模式匹配、控制匹配行为、输出格式调整、指定搜索范围等多个方面,使得用户可以根据实际需求进行精细的操作。例如,-v选项用于反向匹配,-n选项则在匹配行前显示行号,-C选项则显示上下文行。

       在实际应用中,grep能处理复杂的正则表达式,如查找特定模式、替换文本等。深入学习grep的源码和官方文档,可以更深入地理解和掌握这个强大的工具。man pages是查阅grep命令详细说明的权威来源,为用户提供了丰富的使用参考。

       总的来说,grep是Linux中搜索文本的强大工具,熟练掌握其用法,能够大大提高工作效率,是分时最佳买点源码每个Linux用户必备的技能之一。

手把手学习 grep

       理解并运用 grep 命令在 Linux 环境下的强大功能是许多开发者的基本技能。接下来,通过具体实例,我们将探索 grep 的强大之处。

       假设你正在维护一个小型商城项目,一位同事在进行代码审查后,生成了一份包含代码优化建议的 Word 文档。你的任务是找到项目中所有以 "TODO" 开头的注释,并将它们与文件名一同列出,以评估当前的待办事项。

       已知一个源代码文件夹,如何实现这一需求?你只需执行以下命令:

       grep -nR --color=auto --exclude-dir vendor --with-filename '^\s*//\s*TODO'

*

       这一命令的含义是从左到右解释的:

       1. `-n` 参数用于显示匹配行的行号。

       2. `-R` 参数表示递归搜索文件夹内的所有子文件。

       3. `--color=auto` 参数可使匹配结果以不同颜色显示,便于识别。

       4. `--exclude-dir vendor` 排除特定目录(如供应商的代码)的搜索。

       5. `--with-filename` 参数确保在输出中包含文件名。

       6. `'^\s*//\s*TODO'` 是正则表达式,用于匹配以 "TODO" 开头的注释。

       若需将结果保存至文件,可将命令修改为:

       grep -nR --color=auto --exclude-dir vendor --with-filename '^\s*//\s*TODO' * > TODO

       经过实际操作,你发现虽然 grep 不能智能地在每个注释前添加文件名,但其基本功能已经满足需求。进一步,你可以探索 grep 的其他常用参数和选项,如 `-i`(忽略大小写)、`-v`(显示未匹配行)等,来适应更多场景。

       总之,grep 是 Linux 环境下不可或缺的工具,通过掌握其基本命令和参数,你可以高效地执行各种文本搜索和替换任务,为代码维护和项目管理提供便利。

分析、还原一次typecho入侵事件

       朋友的博客遭遇入侵,通过虚拟空间的日志分析,我参与了这次应急响应。日志经过去敏处理,日程管理源码查询可用于学习,密码为:bykr。分析中,我使用了grep命令,而其他Windows用户则可借助Notepad++进行搜索。我搜索了常见的恶意函数,包括Eval、assert、phpinfo()和pwd等,发现了大量的页面访问记录。通过这些信息,我得出了一句话木马地址为/1.php和/1_1.php。由于Apache日志默认不记录POST数据,这些文件的出现显得异常。通过IP反查,我找到了可疑的IP地址:...、...和...。根据访问频率和时间,最终锁定了...为攻击者IP。在3月日访问了/index.php/action/links-edit后,入侵者在3月日进入了后台。我怀疑这是一次XSS安全事件,而通过GitHub查看源码,发现源程序中并无action/links-edit这些函数方法。问题的根源在于一款名为typecho-links的插件,它是一款管理友情链接的拓展。分析源码后,发现了垂直越权(前台添加links)、XSS(links未过滤,直接入库)和CSRF(以管理员权限执行操作)的漏洞利用链。在本地进行了复现,搭建博客并添加插件后,即使未登录,也能成功添加Link。尝试插入XSS payload后,通过xss.js引入JQuery并调用Ajax方法,传递cookie,成功进入后台并触发.php页面的minix net源码解析访问。整体分析流程虽然简单,但旨在记录下初次分析日志的经验。

GREP是全球正则表达式程序的英文缩写吗?

       GREP,全称为 "Global Regular Expression Program",在中文中被简称为“全局正则表达式程序”。这个缩写词在计算机领域中具有高度的识别度,它的流行度达到了次,主要应用于计算机编程和文本处理中。GREP是一个用于搜索、替换和分析文本的强大工具,它基于正则表达式,能够在全球范围内查找模式匹配。

       GREP的中文拼音为“quán jú zhèng zé biǎo dá shì chéng xù”,它在英语中的使用频率反映了其在技术社区中的广泛接受度。在分类上,GREP属于Computing领域,特别适用于搜索引擎优化、数据挖掘和文本分析等场景。例如,开发人员可能会使用GREP来搜索源代码中的特定字符串,或者在大量文本文件中查找特定模式。

       尽管GREP最初可能源自特定的编程语言,但其概念和应用已经超越了这个范围。它作为一种强大的文本处理工具,被广泛应用于各种计算机相关的任务中。请记住,尽管这些信息在网络上广泛流传,但使用者应自行确认其适用性和准确性,以确保在实际操作中的正确使用。

深入研究ast-grep的模式: 一文解析Tree-Sitter核心概念

       如果你对代码重构工具有兴趣,你可能听说过 ast-grep,它是一个基于 Tree-sitter 的工具,可以进行结构搜索和替换。 ast-grep 允许你编写代码模式,根据代码的结构,而不仅仅是文本来查找和修改代码。但它是如何在引擎盖下工作的呢?在这篇文章中,我将为你深入介绍ast-grep的好用的源码推荐模式。它还能帮助你理解Tree-sitter的核心概念。

       模式是一种写和读描述语法树的表达式的方便方法。 它类似于代码,但有一些特殊的语法和语义,允许你根据语法树的结构、类型或内容来匹配部分。

       ast-grep的模式易学难精。它要求你了解目标语言的Tree-sitter语法和含义,以及ast-grep的规则和惯例。

       在本文中,我们将帮助你掌握所有基于Tree-sitter的工具所共有的核心概念。我们还将向你展示如何编写ast-grep模式,让它的全部威力都为你所用。

       什么是Tree-sitter? ast-grep使用 Tree-sitter作为它的底层解析框架,这是因为它的流行度、高性能和健壮性。

       Tree-sitter是一个生成解析器的工具,并提供一个增量解析库。

       解析器是一个将源代码文件作为输入并产生一个描述代码组织的树状结构的程序。(该树状结构不是抽象语法树,我们将在后面看到)。

       为各种编程语言编写优秀的解析器是一项艰巨的任务,尤其是对于像ast-grep这样的单一项目。幸运的是,Tree-sitter是一个被社区广为传唱的好工具。许多主流语言,如C、Java、JavaScript、Python、Rust等,都被Tree-sitter支持。使用Tree-sitter作为ast-grep的底层解析库,可以让这个工具支持任何具有良好维护的语法的语言。

       Tree-sitter的另一个好处是它的增量性质。增量解析器是指当源代码文件被编辑时能够有效地更新语法树的解析器,而不需要重新解析整个文件。在 ast-grep的交互式编辑中,它可以非常快速地运行在每一个代码变化上。

       最后,Tree-sitter还可以优雅地处理语法错误,它可以在同一个文件中解析多种语言。这使得模式代码的解析更加稳健,更容易编写。在未来,我们还可以像Vue那样支持多语言的源代码。

       当你使用 ast-grep 来搜索源代码中的模式时,你需要了解文本匹配和结构匹配之间的区别。

       源代码输入是文本,是遵循某些语法规则的字符序列。你可以使用常见的搜索工具,如 silver-searcher或 ripgrep来搜索源代码中的文本模式。

       然而,ast-grep并不直接与文本匹配模式。相反,它将文本解析成一个代表代码语法的树状结构。这使得ast-grep能够根据代码的语义来匹配模式,而不仅仅是其表面现象。这就是所谓的 结构搜索,它搜索的是具有特定结构的代码,而不仅仅是特定的文本。

       因此,你写的模式也必须是有效的语法,可以与代码树进行比较。

       ast-grep中的文本搜索 虽然pattern在结构上匹配代码,但你可以使用ref=" ast-grep.github.io/guid...">原子规则regex通过指定正则表达式来匹配节点的文本。这样,就可以在ast-grep中结合文本和结构匹配。

       我们可以用两种类型的树结构来表示代码的语法和语义: AST和CST。

       AST代表 抽象语法树,它是代码的简化表示,省略了一些细节,如标点符号和空白处。CST代表 具体语法树(Concrete Syntax Tree),它是对代码的一种更保真的表示,包括所有的细节。

       Tree sitter是一个库,可以将代码解析为许多编程语言的CST。因此,ast-grep与它的名字相反,是根据CST模式而不是AST来搜索和重写代码的。

       让我们通过一个例子来看看为什么CST更有意义。考虑一下1 + 1这个JavaScript片段。它的AST表示法 看起来像这样:

       精明的读者应该注意到重要的运算符+并没有在AST中被编码。与此同时,代码的CST则忠实地表达了所有的关键信息。

       你可能会想,使用CST是否会让不重要的空白影响你的搜索结果。幸运的是,ast-grep使用了一种智能匹配算法,可以在适当的时候跳过CST中的琐碎节点,帮你节省了很多麻烦。

       如果不关心标点符号和空白,我们就可以将CST转换为AST。Tree-sitter有两种类型的节点:命名节点和匿名节点(未命名节点)。

       更重要的命名节点在语法规则中被定义为常规名称,如binary_expression或identifier。不太重要的匿名节点是用字面字符串定义的,如", "或 "+"。

       命名节点对于理解代码的结构和意义更为重要,而匿名节点则不那么重要,有时会被 ast-grep 的匹配算法跳过。

       下面的例子改编自 Tree-sitter的官方指南,显示了语法定义的不同。

       实际上,命名的节点有一个叫做kind的属性,表示它们的名字。你可以使用ast-grep的ref=" ast-grep.github.io/guid...">原子规则kind来找到具体的AST节点。下面的例子的 Playground链接。

       更进一步,ast-grep的元变量默认只匹配命名的节点。return $A 只匹配下面的第一条语句。 Playground链接。

       我们可以使用两个米元符号(非笔误)$$VAR在模式匹配的结果中包括匿名节点。return $$A将匹配上面的两个语句。 Playground链接。

       有时,仅仅使用kind并不足以找到我们想要的节点。一个节点可能有几个具有相同kind的子节点,但在代码中的作用不同。例如,在JavaScript中,一个对象可能有多个键和值,但它们都可以是字符串。

       为了区分它们,我们可以使用field来指定一个节点和它的父节点之间的关系。在ast-grep中,field可以用在两个 关系规则中:has和inside。

       has和inside接受一个特殊的配置项,叫做field。field的值是父-子关系的字段名。例如,JavaScript对象中的键值对有两个孩子:一个字段是key,另一个字段value。我们可以用 这个规则来匹配string的key节点。

       field可以帮助我们缩小搜索范围,使模式更加精确。

       我们也可以用has重写上面的规则,搜索带有字符串key的键值对。 Playground链接。

       kind和field的关键区别: kind是节点本身的属性。只有命名节点才有。 field是父子关系的属性。匿名节点也可以有。

       一个节点同时拥有kind和field可能会让新用户感到困惑。kind属于节点本身,在ast-grep的Playground上用蓝色文本表示。子节点只有相对于它的父节点才有field,反之亦然。字段在Playground中用深**文本表示。由于field是节点关系的一个属性,匿名节点也可以有field。例如,binary_expression的1 + 1中的+的field就是operator。

       ast-grep比Tre-sitter走得更远。它有关于节点的 "重要性 "的概念。

       即使是“重要性”这个概念也是不够的。 大多数Tree-Sitter语言没有在命名节点AST中编码所有的关键语义。即使我们定义了范围更广的显著节点,也不足以表示代码的意义。我们必须保留一些琐碎节点来进行精确匹配。

       Tree-sitter一般不会用命名节点来编码所有的语义。例如,class A { get method() { } } 和 class A { method() { } } 在Tree-sitter的AST中是等同的。关键标记get没有命名,也没有field。它是一个琐碎节点!

       如果你不关心这个方法是getter方法、静态方法还是实例方法,你可以使用class $A { method() { } }来 一次性匹配所有三种方法。如果你需要区分getter方法和普通方法,你可以 拼出完整的方法修饰符。

       感谢你阅读到这里! 这篇文章中有许多概念。让我们用一段话来总结一下。

       ast-grep使用Tree-sitter将文本源代码解析成一个详细的树状结构,称为CST。我们可以从CST中得到AST,只保留命名节点,这些节点有kind。为了搜索语法树中的节点,可以同时使用节点kind和节点field,后者是一个子节点相对于其父节点的特殊标记。一个有kind或者有field的节点就是一个重要的节点。

grep命令

       grep命令是一种强大的文本搜索工具,用于在文件中查找指定的字符串或模式。它通过逐行扫描文件,并将匹配指定模式的行打印出来,从而方便用户快速定位和查找特定信息。

       grep命令的基本语法如下

       bash

       grep [选项] 模式 [文件...]

       详细解释

       1. grep命令的基本功能

       grep命令主要用于在文本文件中搜索指定的字符串或模式。它可以搜索单个文件,也可以搜索多个文件,甚至可以递归地在整个目录结构中搜索文件。grep命令通过正则表达式来匹配文本模式,从而实现对文本的灵活搜索。

       2. grep命令的选项

       grep命令有很多选项,通过选项可以控制搜索的行为和输出格式。常用的选项包括:

       * `-i`:忽略大小写。

       * `-v`:反向匹配,显示不匹配模式的行。

       * `-r`或`-R`:递归搜索。

       * `-l`:仅显示包含匹配内容的文件名。

       * `-n`:显示匹配行的行号。

       * `-w`:匹配整个单词。

       * `-o`:仅输出匹配的部分。

       用户可以根据需要选择合适的选项来定制搜索行为。

       3. grep命令的模式

       模式是指定给grep命令的搜索字符串或正则表达式。通过模式,用户可以指定要搜索的文本内容,以及文本出现的上下文环境等。模式可以是简单的字符串,也可以是复杂的正则表达式,取决于用户的搜索需求。

       4. grep命令的应用场景

       grep命令广泛应用于系统管理员、开发人员和数据分析师等工作中。它可以帮助用户快速定位系统中的特定信息,例如查找特定的日志文件、配置文件、源代码等。grep命令的使用大大提高了文本处理的效率和准确性,是Linux和Unix系统中不可或缺的工具之一。

       总的来说,grep命令是一个功能强大、灵活易用的文本搜索工具,通过掌握其基本语法和常用选项,用户可以轻松实现对文本的搜索和处理任务。

grep命令保留第一行(C语言实现)

        Linux中的 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。特别是在搜索日志、配置文件、过滤时应用非常广泛。

        然而这个命令有个美中不足的地方。它和其他命令配合使用时,把第一行的描述信息给过滤掉了。有时我们想要同时输出的第一行和匹配行。因为第一行的描述信息有助于我们理解后面每个字段的含义。

        比如我们查看和sda有关的文件系统

        这里的G G G 分别表示什么? 哪个才是剩余空间?

        我们希望得到结果是:

        Stackoverflow给出的几种方案,grep 配合 sed 和 awk 使用。但我觉得这些方法不够好,于是我用C语言写了一个程序 grep1 。它可以智能判断标题行,输出彩色标题后调用 grep 完成匹配搜索。因为是调用 grep 的,所以 grep 能用的参数这里也可以用。

        为什么要强调智能判断标题行呢? 不是所有标题都在第一行,有的命令(netstat)标题在第二行。。。。。

        下面给出源码(少于行),编译后移动到 /usr/local/bin/grep1 ,PATH环境变量一般包含 /usr/local/bin

        效果对比:

更多内容请点击【娱乐】专栏