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


Я совершенно новый для 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')

Благодаря!


10
2018-06-20 15:30


Источник


Вы запускаете это до или после запуска процесса telnet? - deltaray
после его запуска вам нужно подождать несколько секунд, чтобы он подключился к apache, тогда вы можете запустить strace - Andrei Serdeliuc
Если ваша команда работает, не беспокойтесь о ее упрощении. - Tom O'Connor


Ответы:


Я могу немного улучшить Mark Henderson, с $ () вместо `` и удалить grep с лучшим sed:

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

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


1
2017-07-05 14:50



+1, превосходный скрипт Фу и хороший пример обучения для некоторых функций оболочки. - Jeff Ferland
Этот скрипт straces в telnet, а не в процесс Apache, который обслуживает его. - BMDan


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

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

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


2
2017-07-03 17:03





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

Или, отформатированный для упрощения чтения, и с флагом strace 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}")

1
2017-07-03 21:10





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

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

0
2017-07-02 17:02



Ответ будет выглядеть лучше, если вам не нужно прокручивать направо, чтобы увидеть все это. - djangofan
Эта straceс telnet, а не Apache. - Pierre Carrier