Нужна помощь в форматировании командной строки Tshark из скрипта bash - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь запустить несколько параллельных экземпляров tshark, чтобы прочесать большое количество файлов pcap в каталоге и скопировать отфильтрованное содержимое в новый файл. Я столкнулся с проблемой, из-за которой Tshark выдает ошибку по команде, которой я его кормлю.

Это должно быть как-то связано с тем, как tshark интерпретирует командную строку, поскольку я могу скопировать / вставить отформатированную командную строку в консоль, и она прекрасно работает. Я попытался отформатировать команду несколькими способами и прочитать темы от других, у которых были подобные проблемы. Я верю, что форматирую правильно ... но все равно получаю ошибку.

Вот с чем я работаю:

Сценарий № 1: - фильтр

#Takes user arguments <directory> and <filter> and runs a filter on all captures for a given directory.
#
#TO DO:
#Add user prompts and data sanitization to avoid running bogus job.
#Add concatenation via mergecap /w .pcap suffix
#Delete filtered, unmerged files
#Add mtime filter for x days of logs
starttime=$(date)
if [$1 = '']; then echo "no directory specified, you must specify a directory (VLAN)"
else if [$2 = '']; then echo "no filter specified, you must specify a valid tshark filter expression"
     else
        echo $2 > /home/captures-user/filtered/filter-reference
        find /home/captures-user/Captures/$1 -type f | xargs -P 5 -L 1 /home/captures-user/tshark-worker
        rm /home/captures-user/filtered/filter-reference
     fi
fi
echo Start time is $starttime
echo End time is $(date)

Сценарий № 2: - tshark-рабочий

# $1 = path and file name

#takes the output from the 'filter' command stored in a file and loads a local variable with it
filter=$(cat /home/captures-user/filtered/filter-reference)

#strips the directory off the current working file
file=$(sed 's/.*\///' <<< $1 )

echo $1 'is the file to run' $filter 'on.'

#runs the filter and places the filtered results in the /filtered directory
command=$"tshark -r $1 -Y '$filter' -w /home/captures-user/filtered/$file-filtered"
echo $command
$command

Когда я запускаю ./filter ICE 'ip.addr == 1.1.1.1', я получаю следующий вывод для каждого файла. Обратите внимание, что включение == в выражение фильтра не является проблемой, я попытался заменить 'или' и получить тот же результат. Кроме того, у tshark нет псевдонимов, и нет сценария с таким именем. Это сырой исполняемый файл tshark в /usr/sbin.

Выход:

/home/captures-user/Captures/ICE/ICE-2019-05-26_00:00:01 is the file to run ip.addr == 1.1.1.1 on.

tshark -r /home/captures-user/Captures/ICE/ICE-2019-05-26_00:00:01 -Y 'ip.addr == 1.1.1.1' -w /home/captures-user/filtered/ICE-2019-05-26_00:00:01-filtered

tshark: Display filters were specified both with "-d" and with additional command-line arguments.

1 Ответ

0 голосов
/ 06 июня 2019

Как я уже упоминал в комментариях, я думаю, что это проблема с цитированием и тем, как ваша команда построена из-за пробелов в фильтре (и, возможно, в имени файла и / или пути).

Выможно попробовать изменить скрипт tshark-worker на что-то вроде следующего:

# $1 = path and file name

#takes the output from the 'filter' command stored in a file and loads a local variable with it
filter="$(cat /home/captures-user/filtered/filter-reference)"

#strips the directory off the current working file
file="$(sed 's/.*\///' <<< $1 )"

echo $1 'is the file to run' $filter 'on.'

#runs the filter and places the filtered results in the /filtered directory
tshark -r "${1}" -Y "${filter}" -w "${file}"-filtered
...