выражение фильтра tcpdump ломается через adb

выражение фильтра tcpdump ломается через adb

Я установил tcpdump на свой планшет Android и запускаю команды из root adb shell. Я работаю изпримеры страниц руководства tcpdump, в частности этот:

Для печати всех HTTP-пакетов IPv4, поступающих на порт 80 и отправляемых с него, т. е. только тех пакетов, которые содержат данные, а не, например, пакетов SYN и FIN, а также пакетов, содержащих только ACK.

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Если я выполню указанную выше команду на моем рабочем столе (Ubuntu), она запустится нормально. Если я попробую выполнить ее на моем устройстве Android, вот так:

adb shell tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Я получаю эту ошибку:

/system/bin/sh: can't create 2)) != 0): Read-only file system
/system/bin/sh: here document missing
tcpdump: syntax error

Следующая команда отлично выполняется на устройстве Android:

tcpdump 'tcp port 80'

Кажется, что выражение фильтра не анализируется должным образом или что-то в этом роде, но я буду честен, я не уверен, как именно это работает, поэтому я не уверен, с чего начать устранение неполадок. Есть идеи, что не так или как это исправить?

решение1

Кавычки приводят к тому, что команде adbпередаются три аргумента:

  1. shell
  2. tcpdump
  3. tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)

Затем, предположительно, он пытается выполнить команду

tcpdump tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)

безкавычки (так как оболочка на машине, на которой вы ввели команду, удалила кавычки) на машине Android.

Вы, вероятно, можете сделать

adb shell tcpdump "'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'"

что означает, что adbкоманда будет передана

  1. shell
  2. tcpdump
  3. 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

так что он попытается выполнить команду

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

на Android-устройстве.

Та же проблема будет существовать, например, с sshкомандой

ssh localhost tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

получает ошибки

bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `tcpdump tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

решение2

Я все еще не уверен, где именно команда была интерпретирована неправильно, но теперь проблема исчезнет, ​​если вместо этого:

adb shell tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Сначала я открываю оболочку, а затем выполняю tcpdump:

adb shell
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Связанный контент