我写了一个小小的go脚本,并使用strace跟踪了该脚本,我试图使用netlink协议从内核中获取审核消息,就像auditd一样。
以下是我的旅途中strace的输出脚本- http://paste.ubuntu.com/8272760/
我试图找到auditd提供给sendto函数的参数。当我在auditd上运行strace时,我得到以下输出
sendto(3, "\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0", 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16
当我追踪我的go文件时,我得到以下输出。我想解码此语句的第二个参数
sendto(3, "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t", 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17
再具体一点
"\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
现在我想将其转换为字符串或字节数组,有什么办法可以将其转换为字符串或字节数组?
在我实际的go代码中,此参数是一个字节数组。
https://github.com/mozilla/Audit- Go/blob/testing/netlink_old.go#L58
我对您的问题的理解是,您通过比较strace的输出尝试将auditd发送的内容与程序发送的内容进行比较,并且遇到将strace提供的字符串转换为Go [] byte数据类型的问题。
strace输出遵循字符串文字的GNU C表示形式,其字符可以按以下方式转义:
\\ Backslash character. \? Question mark character. \' Single quotation mark. \" Double quotation mark. \a Audible alert. \b Backspace character. \e <ESC> character. (This is a GNU extension.) \f Form feed. \n Newline character. \r Carriage return. \t Horizontal tab. \v Vertical tab. \o, \oo, \ooo Octal number. \xh, \xhh, \xhhh, ... Hexadecimal number.
请注意,八进制或十六进制数字的数量可以变化。在Go中,字符也可以转义,但是规则不同- 请参见http://golang.org/ref/spec#Rune_literals
特别是,八进制值系统地用3位数字表示,以避免任何歧义。要声明具有此类字符序列的[] byte,您将必须编写如下内容:
// In strace, it was "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t" wb := []byte("\021\000\000\000\350\003\005\000\001\000\000\000\000\000\000\000\t")
请注意,strace中的- x选项将对不可打印的字符使用固定长度的十六进制编码,这使得在Go程序中直接使用这些字符串变得更加容易。-xx选项即使对于可打印字符也将输出十六进制编码的字节,这使IMO更加容易。
无论如何,使用文字字符串初始化[] byte不一定是一种好的样式(甚至不是一个好主意)。字符串适用于UTF-8字符,不适用于二进制数据。