Итак, мне остается заключить, что причина, по которой tcpdump отображает пакеты только один раз в секунду, заключается в том, что ядро доставляет их так часто.
Да - когда tcpdump открывает устройство для захвата с помощью pcap_open_live ()
или с помощью pcap_create ()
и pcap_activate ()
, он указывает тайм-аут, равный 1 второй. Это означает, что во многих ОС (включая дистрибутивы Linux с более новыми версиями ядра и libpcap, а также * BSD, OS X и Solaris) ядро буферизует пакеты до тех пор, пока либо его буфер не заполнится, либо не истечет 1 секунда. истек, и для эффективности доставит весь буфер пакетов.
Новые версии tcpdump отключают эту буферизацию при печати пакетов, а не сохраняют их в двоичной форме в файл.
Как я могу заставить его выводить пакеты, как только они будут получены ядром?
Запустите более новую версию tcpdump или измените tcpdump, чтобы указать более короткий тайм-аут или полностью отключить тайм-аут.
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:][-*]"
, чтобы также заменить все пробелы на тире.