Проблема с получением tcpdump для захвата данных с Android

Я пытаюсь написать сценарий bash в Ubuntu, чтобы установить приложение на эмуляторе Android, отправить случайные команды в приложение с помощью «обезьяны» и захватить все данные с помощью tcpdump. Код:

#!/bin/bash

#store all apks files in array
shopt -s nullglob
packageArray=(*.apk)


function getPackageName()
{
    myResult= aapt dump badging $1 | grep package | awk '{print $2}' | sed   s/name=//g | sed s/\'//g
}

#loop through array installing, testing and capturing data, and uninstalling
for i in "${packageArray[@]}";
do
    :
    myResult=$(getPackageName "$i")

echo "------------------INSTALLING-----------------"

sudo adb install $i
echo "*****************INSTALLED****************************"

echo "*****************TESTING****************************"

#-------THESE COMMANDS ARE THE TROUBLE-------

(sudo -i xterm -e "tcpdump src 10.0.2.11 -vvv >   /home/seed/Documents/autoTcpLogs/$myResult.pcap" &
sudo -i xterm -e "adb shell monkey -p $myResult -v 500")
echo "------------------DONE TESTING-----------------"

sudo adb uninstall $myResult
echo "*****************PACKAGE UNINSTALLED****************************"

done

Проблема: Мне нужен хороший способ закрытия tcpdump после того, как обезьяна завершила отправку 500 случайных команд. Я пробовал использовать команду KILL несколькими способами, но, похоже, это не помогает.


person yalpsid eman    schedule 02.08.2016    source источник
comment
ты пробовал killall -TERM tcpdump ?   -  person pah    schedule 02.08.2016
comment
Да, я пробовал это после команды обезьяны.   -  person yalpsid eman    schedule 02.08.2016
comment
Смотрите ответ. PID tcpdump хранится в переменной и используется как аргумент kill. Если это не удается, обновите свой вопрос, указав причину сбоя (сохраните где-нибудь вывод команды kill и вставьте его сюда)   -  person pah    schedule 02.08.2016
comment
Хм, неважно, вы используете sudo, а сохраненный PID будет sudo, а не tcpdump процесса.   -  person pah    schedule 02.08.2016
comment
Определенно хорошая мысль, хотя могут быть некоторые вариации, которые приведут к успеху.   -  person yalpsid eman    schedule 02.08.2016
comment
да, дайте немного подумать. Сейчас я удалю ответ и проведу некоторое тестирование.   -  person pah    schedule 02.08.2016
comment
Вы можете использовать sudo blah &, а затем sudo kill $SUDO_PID   -  person Barmar    schedule 03.08.2016
comment
Будет ли у вас запущен только один tcpdump? Или в любой момент времени может быть запущено несколько tcpdump?   -  person pah    schedule 03.08.2016
comment
@Barmar, который убьет sudo, но не процесс tcpdump. Я также думал, что sudo направит сигнал дочернему процессу, но этого, к сожалению, не происходит.   -  person pah    schedule 03.08.2016
comment
Я думаю, что это также должно убить всех детей sudo. Я попробовал это с sudo sleep 100 &, и это также убило sleep.   -  person Barmar    schedule 03.08.2016
comment
Я запущу tcpdump, запущу обезьяну (пока tcpdump захватывает все данные, выдаваемые эмулятором), а затем закрою tcpdump. Так что только по 1 разу.   -  person yalpsid eman    schedule 03.08.2016
comment
@ Бармар, да, ты прав. Также проверил справочную страницу и четко указал, что он передает некоторые сигналы (включая SIGTERM) дочернему элементу... но теперь странная часть заключается в том, что мой сценарий ответа должен работать независимо от того, используется sudo или нет... и этого не происходит... Я выполняю некоторые отладки и буду обновлять их всякий раз, когда получу правильный ответ.   -  person pah    schedule 03.08.2016
comment
В качестве другого решения я только что понял, что могу настроить tcpdump на захват только определенного количества пакетов перед выходом, что гарантирует получение всех данных, которые я хочу, без перекрывающихся файлов tcpdump. Спасибо за помощь!   -  person yalpsid eman    schedule 03.08.2016


Ответы (1)


Рассмотрим следующий пример:

#!/bin/bash

sudo -- tcpdump > /dev/null &
SUDO_TCPDUMP_PID=$!
echo "Waiting 3 seconds"
sleep 3;
echo "3 seconds elapsed"
sudo -- setsid kill -TERM "${SUDO_TCPDUMP_PID}"

EDIT (прочитайте комментарии к вопросу): нам нужно использовать setsid, чтобы заставить сигнал быть отправленным из другого сеанса, иначе sudo не передаст сигнал (см. sudo справочную страницу).

PID sudo tcpdump ... (в данном случае pid sudo) будет храниться в переменной SUDO_TCPDUMP_PID, которая будет использоваться в качестве аргумента kill:

$ ./tcp.sh
Waiting 3 seconds
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
3 seconds elapsed
0 packets captured
2 packets received by filter
0 packets dropped by kernel
$
person pah    schedule 02.08.2016