Я установил 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
передаются три аргумента:
shell
tcpdump
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
команда будет передана
shell
tcpdump
'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)'