如何从strace输出中解码此信息
我写了一个小的go脚本,并使用strace通过这个脚本跟踪它,我试图使用netlink协议从内核获取审计消息,就像auditd一样。
以下是我去的脚本输出 – 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 []字节数据类型的问题。
strace输出遵循字符串文字的GNU C表示,其字符可以按如下方式进行转义:
\\ Backslash character. \? Question mark character. \' Single quotation mark. \" Double quotation mark. \a Audible alert. \b Backspace character. \e 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.
请注意,八进制或hex数字的数量可以是可变的。 在Go中,字符也可以转义但规则不同 – 请参阅http://golang.org/ref/spec#Rune_literals
特别是,八进制值系统地在3位数上,以避免任何歧义。 要使用这样的字符序列声明[]字节,您必须编写如下内容:
// 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选项将对不可打印的字符使用固定长度hex编码,这使得在Go程序中直接使用这些字符串更容易。 -xx选项将输出hex编码的字节,即使是可打印的字符,这使IMO更容易。
无论如何,使用文字字符串来初始化[]字节不一定是好的风格(甚至是好主意)。 字符串用于UTF-8字符,而不是二进制数据。
\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t
这些是ANSI X3.159-1989
(又名ANSI C89
,请检查此PDF文件 )中定义的字符转义序列。 您可以在port70.net 找到正式的草稿页面。
以下是man printf
简短man printf
:
-
\a
写一个
字符。 -
\b
写一个
字符。 -
\c
忽略此字符串中的剩余字符。 -
\e
写一个
字符。 -
\f
写一个
字符。 -
\r
写一个
字符。 -
\n
写一个
字符。 -
\t
写一个
字符。 -
\v
写一个
字符。 -
\'
写一个
字符。 -
\"
写一个
字符。 -
\\
写一个反斜杠字符。 -
\num
,\0num
写一个8位字符,其ASCII值是1位,2位或3位八进制数。
要将这些字符解释为字符串,可以使用printf
,例如shell中的命令:
printf "%b" "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
有关更多解析示例,请检查: 如何将shell中的strace解析为纯文本?
如果你想让strace
打印hex字符串而不是ASCII和转义序列,请使用-x
或-xx
,请咨询man以获取更多详细信息。