Кто-нибудь может объяснить мне, как работает этот сценарий?

Итак, мне остается заключить, что причина, по которой tcpdump отображает пакеты только один раз в секунду, заключается в том, что ядро ​​доставляет их так часто.

Да - когда tcpdump открывает устройство для захвата с помощью pcap_open_live () или с помощью pcap_create () и pcap_activate () , он указывает тайм-аут, равный 1 второй. Это означает, что во многих ОС (включая дистрибутивы Linux с более новыми версиями ядра и libpcap, а также * BSD, OS X и Solaris) ядро ​​буферизует пакеты до тех пор, пока либо его буфер не заполнится, либо не истечет 1 секунда. истек, и для эффективности доставит весь буфер пакетов.

Новые версии tcpdump отключают эту буферизацию при печати пакетов, а не сохраняют их в двоичной форме в файл.

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

Запустите более новую версию tcpdump или измените tcpdump, чтобы указать более короткий тайм-аут или полностью отключить тайм-аут.

0
01.02.2018, 18:51
1 ответ
find./* -depth -type d -exec sh -c '... ' {} \;

findпросматривает все каталоги(-type d)в дереве и запускает этот фрагмент оболочки для каждого из них, при этом $0устанавливается на текущее имя. -depthзаставляет сначала обрабатывать содержимое каждого каталога, а сам каталог — в последнюю очередь. (иначе переименование все испортит.)

t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");

${0%/*}удаляет из $0последнюю косую черту и все, что после нее, т.е. оставляет имя каталога. ${0##*/}в основном наоборот. (Это тип расширения параметра .)printf | trиспользуется для преобразования последней части имени в нижний регистр. Результат присваивается t.($(...)это замена команды)

[ "$t" = "$0" ] || mv -i "$0" "$t"

Проверяет , чтобы увидеть, совпадают ли новое имя в tи старое имя в $0, и если не , то вызывает mvдля них.


Глупые части здесь в том, что findможно вызывать так же, как find. -depth..., нет необходимости в подстановочном знаке имени файла (find./*), так как поиск имен файлов — это то, что делает find. Если бы они использовали -execdirвместо -exec, не было бы необходимости иметь дело с частью имени файла, относящейся к каталогу. И использовать $0для имени целевого файла — это немного дурной тон, он предназначен для имени самого скрипта.


Вы упомянули переименование файлов и каталогов и замену пробелов на тире. Насколько я вижу, команда здесь не делает ни того, ни другого. find -type dперехватывает только каталоги, вам нужно использовать -type fдля перехвата только обычных файлов или оставить его, чтобы игнорировать тип. Кроме того, в trнет ничего о пробелах, но вы можете изменить его, скажем, на tr "[:upper:][:space:]" "[:lower:][-*]", чтобы также заменить все пробелы на тире.

2
28.01.2020, 02:32

Теги

Похожие вопросы