Как декодировать эту информацию из strace output

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

Ниже приводится вывод strace на моем скрипте go– http: //paste.ubuntu.com/8272760/

Я пытаюсь найти аргумент, который auditd предоставляет функции sendto. Когда я запускаю strace on 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 

И когда я трачу свой файл 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

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

    Выход 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. 

    Обратите внимание, что число восьмеричных или шестнадцатеричных цифр может быть переменной. В 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 в strace будет использовать шестнадцатеричное кодирование с фиксированной длиной для непечатаемых символов, что упрощает прямое использование этих строк в программе Go. Параметр -xx выводит шестнадцатеричные кодированные байты даже для печатаемых символов, что делает его еще проще ИМО.

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

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

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

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

    • \a Напишите символ .
    • \b Напишите символ .
    • \c Игнорировать оставшиеся символы в этой строке.
    • \e Напишите символ .
    • \f Напишите символ .
    • \r Напишите символ .
    • \n Напишите символ .
    • \t Напишите символ .
    • \v Напишите символ .
    • \' Напишите символ .
    • \" Напишите символ .
    • \\ Напишите символ обратной косой черты.
    • \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" 

    Для получения большего количества примеров синтаксического анализа проверьте: как разбирать strace в оболочке в обычный текст?

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