2014-09-06 9 views
5

Я написал небольшой скрипт go и проследил его, используя strace , хотя этот скрипт я пытаюсь получить сообщения аудита из ядра, используя протокол netlink, точно так же, как auditd.Как декодировать эту информацию из выхода strace

Ниже приведен результат Трассирования на моем пути script- http://paste.ubuntu.com/8272760/

Я пытаюсь найти аргумент, что auditd обеспечивают функции SENDTO. Когда я бегу Трассирование на auditd я получаю следующий вывод

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 

И когда я Трассирование мой файл идти я получаю следующий результат. Ищу декодировать второй аргумент этого утверждения

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

+0

Hrm: он выглядит как 'wb' в вашем исходном коде уже * is * a' [] byte', поэтому я не понимаю поставленный вопрос или почему задействован strace. (Что происходит, что делает 'strace' необходимым, а не полагаться на инструментарий кода Go?) – twotwotwo

+0

Отдельно [традиционно избегать импорта точек] (https://code.google.com/p/go-wiki/wiki/ CodeReviewComments # Import_Dot), как '. "SYSCALL". – twotwotwo

+0

Я не уверен, но, может быть, проблема в том, что вы имеете дело с выходом strace, который * не * все из вашего кода, и вы не знаете, как его разобрать. То, что у меня есть, вероятно, не самый лучший способ сделать это, но я думаю, что JavaScript использует достаточно близко к тем же правилам цитирования, что вы можете просто поместить строку в скрипт: http://jsfiddle.net/2tukw37o/ – twotwotwo

ответ

5

Мое понимание вашей проблемы вы пытаетесь сравнить то, что auditd посылает к тому, что ваша программа посылает путем сравнения выходного Strace, и у вас есть вопросы, чтобы преобразовать строку, представленную Трассирование в Go [] байт типа данных ,

Выход Трассирование следует представление 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 цифры, чтобы избежать какой-либо двусмысленности. Для того, чтобы объявить [] байты с такой последовательностью символов, вы должны написать что-то вроде этого:

// 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") 

Обратите внимание, что опция -x в Трассировании будет использовать фиксированную длину шестнадцатеричного кодирование для непечатаемых символов, что упрощает прямое использование этих строк в программе Go. Параметр -xx выводит шестнадцатеричные кодированные байты даже для печатаемых символов, что делает его еще проще ИМО.

Во всяком случае, это не обязательно хороший стиль (или даже хорошая идея), чтобы использовать литеральные строки для инициализации [] байта. Строки предназначены для символов UTF-8, а не для двоичных данных.

2

\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t

Эти управляющие последовательности символов, как это определено в ANSI X3.159-1989 (ака ANSI C89, проверить это PDF file). Вы можете find официальной черновик страниц на port70.net.

Вот краткое краткое найдено в man printf:

  • \a Написать <bell> характер.
  • \b Напишите символ <backspace>.
  • \c Игнорировать оставшиеся символы этой строки.
  • \e Пишите символ <escape>.
  • \f Напишите символ <form-feed>.
  • \r Напишите символ <carriage return>.
  • \n Напишите символ <new-line>.
  • \t Пишите символ <tab>.
  • \v Напишите символ <vertical tab>.
  • \' Пишите символ <single quote>.
  • \" Напишите символ <double quote>.
  • \\ Напишите символ обратной косой черты.
  • \num, \0num Напишите 8-разрядный символ, значение ASCII которого представляет собой восьмеричное число 1-, 2- или 3-значное.

Чтобы интерпретировать эти символы как строку, вы можете использовать printf, например. Команда в скорлупе:

printf "%b" "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t" 

Дополнительных примеры синтаксического анализа, проверьте: How to parse strace in shell into plain text?

1

Если вы хотите strace печатать шестнадцатеричную строку вместо ASCII и сбежавшей последовательность, используйте -x или -xx, проконсультируйся мужчиной для более подробной информации.