Я хочу сохранить след посещенного мной URL-адреса, поэтому использую следующую командную строку:
tcpdump -ien1 -v -X 'tcp порт 80' | sed -nl 's/^.0x[0-9a-f]{4}:.{43}(.)$/\1/p' |perl break.pl |perl -pe 's/(GET|POST).(.?).HTTP/1....Хост:.([a-zA-Z._0-9-])../"\nBEGURL ".localtime().": $1 http://$3$2\n"/ge' | grep "^BEGURL"
Работает нормально, один URL на строку. Но если я сделаю
tcpdump -ien1 -v -X 'tcp порт 80' | sed -nl 's/^.0x[0-9a-f]{4}:.{43}(.)$/\1/p' |perl break.pl |perl -pe 's/(GET|POST).(.?).HTTP/1....Хост:.([a-zA-Z._0-9-])../"\nBEGURL ".localtime().": $1 http://$3$2\n"/ge' | grep "^BEGURL">> /tmp/out
(обратите внимание на конец >> /tmp/out) Тогда файл пуст! Знаете почему? Для меня это совершенно нелогично.
Я также пробовал перенаправить stdout и stderr в /tmp/out, он все еще пуст. Файл имеет доступ на запись. Понятия не имею, что это может быть. Есть ли что-то еще, кроме stdout и stderr??
за любую помощь.
решение1
Вы можете иметь в виду, что уже пробовали это, когда говорите: «Я также пробовал перенаправить stdout и stderr в /tmp/out», но это кажется наиболее вероятной проблемой: поэтому попробуйте добавить 2>&1 в конец.
Если нет, то для облегчения отладки попробуйте добавить 2>/dev/null к первой команде и посмотрите, получите ли вы по-прежнему вывод.
Также, можете ли вы упростить команду для тестирования? Например, это работает:
tcpdump -ien1 -v -X 'tcp port 80' >> /tmp/out
решение2
У меня была та же проблема всего несколько дней назад. Попробуйте использовать -w
опцию, чтобы записывать пакеты в файл. Для получения дополнительной информации см. man tcpdump
.