Как бы вы упростили эту команду?

10

Я совершенно новичок в strace / netstat / и т.д. Я использую эту команду для отслеживания процесса apache, обрабатывающего мой запрос (telnet), есть ли способ немного его упростить?

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \ 
    grep $(lsof -p `pidof telnet` | grep TCP | \
    perl -n -e'/localhost:(\d+)/ && print $1') | grep apache2 | \ 
    perl -n -e'/ESTABLISHED (\d+)/ && print $1')

Спасибо!

Андрей Серделюк
источник
Вы запускаете это до или после запуска процесса telnet?
Дельтарай
после его запуска нужно подождать несколько секунд, пока он подключится к apache, затем вы можете запустить strace
Андрей Серделюк
1
Если ваша команда работает, не беспокойтесь об ее упрощении.
Том О'Коннор

Ответы:

1

Я могу немного улучшить Марк Хендерсона, используя $ () вместо `` и удалив grep с помощью лучшего sed:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \
   sed -e "/telnet/s/^.*ESTABLISHED\ \|\/.*$//g")

Лично я думаю, что черты затрудняют чтение; кроме того, они не вкладываются, в отличие от синтаксиса $ ()

dotplus
источник
+1, превосходный сценарий Фу и хороший пример обучения для некоторых функций оболочки.
Джефф Ферланд
Этот скрипт straceвходит в телнет, а не в обслуживающий его процесс Apache.
BMDan
2

strace -p $(ss -npt|sed -n "/:$(ss -npt|sed -n '/telnet/s/^.*\?:\([0-9]\+\).*/\1/p') \+u/s/.*,\(.*\),.*/\1/p")

Пока у вас есть только один telnetзапущенный, это будет straceсоответствующий сервер, если таковой имеется.

Если его нет ( например, вы telnetпоследний раз редактировали внешний сервер), straceпроизойдет сбой сstrace: option requires an argument -- 'p'

Пьер Карьер
источник
1
strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+' 
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")

Или, отформатированный для более легкого чтения, и с целыми флагами OP:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5}") / && /apache2/ {print \$7}")

Разбивка, сначала внутренняя:

netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}"

Покажите мне, без разрешения IP-адресов для DNS-имен, все активные соединения TCP. Передайте это в awk, который печатает пятое поле в любой строке, заканчивающейся на /telnet, где поля разделены одним или несколькими пробелами и двоеточиями. Это поле будет портом источника.

Для улучшения : можно сделать намного более надежным, добавив | head -n 1в конец или ;exitвнутри часть действия awk, добавив в конец действия, но вашей оригинальной версии не хватало эквивалента, поэтому я не хотел делать его длиннее.

netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")

****Здесь часть я уже объяснил выше. Здесь я ищу любую линию netstat -tnpс тем же портом, что и порт источника, который я обнаружил выше, и принадлежит Apache; когда я нахожу его, я печатаю седьмое поле (ограниченное одним или несколькими пробелами или косой чертой). Это PID ребенка Apache.

Для улучшения : Помимо возвращения только одного PID (с помощью тех же методов, что и выше), самое большое, что я могу себе представить, это быть более разборчивым, когда речь идет о фактическом сопоставлении dport, а не о чем-то еще, что просто соответствует шаблону. Это было бы легко сделать, добавив двоеточия в FS ( -F), но проблема возникает в смешанных ситуациях IPv4 и IPv6, где в самом адресе могут быть двоеточия, и, как таковые, они могут довольно быстро стать неприятными. Это казалось чертовски крепким, особенно в конце.

sudo strace -o /tmp/strace -f -s4096 -r -p

Это прямая копия вашего оригинального вопроса; Я не изменил это ни в малейшей степени.

Если вы позволите мне добавить несколько дополнительных символов, возможно, будет использоваться следующая версия:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5;exit}") / && /apache2/ {print \$7;exit}")
BMDan
источник
0

Попробуйте это, надеюсь, это поможет:

sudo strace -o /tmp/strace -f -s4096 -r -p `netstat -antlp | \
  grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"`
Логика крушение
источник
Ответ выглядел бы лучше, если бы вам не пришлось прокручивать вправо, чтобы увидеть все это.
Джангофан
Это straceS в telnet, не Apache.
Пьер Кэрриер