环境与编译
GOREPLAY使用GO语言编写,源码下载后,安装好GO的运行环境,安装PCAP等linux应用后,还需要对GOREPLAY依赖的GO包进行下载并且放到指定的目录,GO通常是通过GIT获取依赖的包,但因为机器在内网,不能连接互联网,所以我采取的方式把依赖下载到本地,再上传到GO的GOPATH,按路径放好,最后go build可以编译出一个可运行的二进制可执行文件。
命令行参数
GOREPLAY支持很多种命令行参数。具体支持的命令行参数可以goreplay --help来查看,我们主要使用GOREPLAY转发HTTP,通常命令为:
goreplay --input-raw :8080 --output-tcp 10.60.20.8:8080
意思就是监听本机的8080端口,把8080端口上的数据报文转发到10.60.20.8:8080。
GOREPLAY是如何处理这些命令行参数的?首先从程序的入口说起,GO语言应用的默认入口在main函数。即在gor.go文件中。但go除了在Package main里的main是入口函数之外,还保留了另一个入口,即在任意package中的init函数。如setting.go中的init函数,该函数会在程序启动时甚至先于main执行。go的函数以及变量的初始化,可以深入读读,这里面有比较深的门路,不深入展开(真实的原因是现在我也不太熟^_^)。
go有一个命令行参数的处理模块,叫flag,使用的过程可以通过一个样例程序大概了解:
package main
import (
"flag"
"fmt"
)
func main() {
var src string
flag.StringVar(&src, "src", "", "source file")
var level *int
level = flag.Int("level", 0, "debug level")
var memo string
flag.StringVar(&memo, "memo", "", "the memory")
flag.Parse()
flag.Usage()
fmt.Printf("src=%s, level=%d, memo=%s\n", src, *level, memo)
}
执行 args.exe -src="123" -level=4 -memo="567",输出如下:
Usage of args.exe:
-level int
debug level
-memo string
the memory
-src string
source file
src=123, level=4, memo=567
大概的过程就是先绑定命令行上的key,parse时就真正的value取出到指定变量上。
继续加来goreplay源码,执行完setting.go里的init函数之后,即把命令行key与变更绑定,在main函数中的flag.parse()之后,即解析到setting的变量中,随后InitPlugins完成根据命令行指定参数模块的初始化加载。当前命令行为:
goreplay --input-raw :8080 --output-tcp 10.60.20.8:8080
即input_raw.go以及output_tcp.go会初始化加载,初始化过程也是挺多go的API的,有一些我也没有非常了解,类似一些反射之类的,还需要继续深入,但goreplay的命令行参数对程序运行影响大体的流程以及意义就像上面所说的了。后续我们要改造goreplay时,就知道如何增加命令行参数,并且增加对应的代码模块。
下一篇会真正真正进入如何解析TCP以及HTTP协议,完成对一个报文转发前的识别,敬请期待。
分享到:
相关推荐
如果要处理附加的命令行参数,可以解析从第二个参数开始的字符串。 另一个重要的函数是CommandLineToArgvW,它可以将命令行字符串转换为一个字符串数组,每个数组元素对应一个参数。其函数原型如下: ```cpp ...
本篇将深入探讨如何在WPF应用中接收并解析命令行参数。 首先,我们需要了解WPF应用程序的基本结构。WPF应用通常包含一个App.xaml文件,这是应用程序的入口点,可以在这里设置启动事件。为了处理命令行参数,我们...
在软件开发中,尤其是在命令行界面(CLI)应用中,解析命令行参数是一项常见的任务。它允许开发者定义可接受的命令行选项,以及如何处理这些选项。这个最新的版本,即 Commons CLI 1.4,提供了更稳定和强大的功能,...
"c语言中命令行参数详解" C语言中命令行参数是指在程序执行时用户可以通过命令行输入的参数,例如在 Windows 中输入 `prog para_1 para_2`,其中 `prog` 是程序名,`para_1` 和 `para_2` 是参数。这些参数可以在...
在使用Chromium或Chrome时,可以通过命令行参数来调整浏览器的行为,进行调试或者实验新的功能。本文将详细介绍一些Chromium的命令行开关及其作用。 1. **/prefetch:** 开关 这些参数主要用于Windows系统的预读取...
mfc程序获得命令行参数,vc6.0实现 // 获取命令行 CString strCommandLine = "获得的命令行参数为:"; strCommandLine += GetCommandLine(); MessageBox(strCommandLine);
在压缩包文件“命令行参数.zip”中,可能包含了用于演示如何处理命令行参数的Python脚本(如`arg1.py`和`arg2.py`),以及与之相关的示例图片。这些脚本可能展示了如何解析和处理不同类型的参数,例如使用`argparse`...
在IT行业中,命令行解析是程序与用户交互的重要方式之一,尤其是在系统工具和脚本编程中。C#作为.NET框架的主要编程语言,提供了强大的命令行参数处理能力。本篇文章将详细探讨C#中的命令行解析,包括其原理、实现...
在IT领域,尤其是在系统管理和软件开发中,命令行参数捕获工具扮演着至关重要的角色。这类工具主要用于跟踪、记录和分析应用程序在启动时接收的命令行参数,这对于调试、自动化脚本编写以及理解软件行为非常有帮助。...
在Microsoft Foundation Classes (MFC)框架中,处理命令行参数是一项重要的功能,它能够帮助应用程序解析来自用户的输入,并根据这些输入执行相应的操作。本文旨在深入探讨MFC中命令行参数处理的方法,包括MFC内嵌的...
Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏...
在VB(Visual Basic)编程环境中,程序通常通过用户界面与用户交互,但有时我们需要让程序在没有用户界面或者从命令行直接启动时接收参数。这就是VB程序接收命令行参数的功能。这种功能允许开发者在启动VB应用程序时...
### C语言程序设计技巧之命令行参数 #### 一、命令行参数简介 在C语言程序设计中,命令行参数是一种非常实用的功能,它允许用户通过命令行传递参数给程序,从而实现对程序行为的定制化调整。命令行参数不仅在实际...
命令行参数简介与功能 命令行参数是计算机编程中的一种基本概念,它允许用户在命令行方式下输入参数,以控制程序的行为。在本文中,我们将深入探讨命令行参数的概念、功能和实现机理。 命令行参数的定义 命令行...
执行程序时,经常会用到命令行参数传递参数这种方式,今天实战一个命令行参数的从头到尾。 博文虽长,但均为干货。 先写个主函数 #include int main(const int argc, const char* argv[]) //argc和argv的类型不一样...
4. **`解析命令行参数`**:如果命令行参数结构复杂,可能需要使用这个函数进行解析,以便将参数和对应的值分离出来,方便后续处理。 学习这些易语言函数,你可以创建更强大的应用程序,能够根据不同的启动条件执行...
在C++编程中,处理命令行参数是一项常见的任务,Google的gflags库提供了一种简单且优雅的方式来解析命令行参数。gflags库支持多种基本数据类型的参数,包括bool、int32、int64、uint64、double以及C++字符串(string...
标题“易语言源码易语言取命令行的简单应用.rar”指的是使用易语言编写的一段源代码,这个源代码主要功能是处理和解析命令行参数。在Windows操作系统中,命令行参数是在程序启动时通过命令行窗口传递给程序的数据,...
编写一个程序,对用户由命令行参数传入的一个名称进行判断。如果是一个文件名,则输出该文件相关属性 ( 文件名、路径、绝对路径、是否可读、是否可写和文件的长度等 ) 。如果是一个目录,则输出该目录下的文件及子...
Java 命令行参数详解 Java 命令行参数是 Java 虚拟机在 DOS 环境下运行时的基本参数设置,掌握这些参数可以更好地利用 Java 虚拟机的功能。本文将详细介绍 Java 命令行参数的使用方法和参数设置。 一、运行 Class ...