Назад | Перейти на главную страницу

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

Я новичок в 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')

Спасибо!

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'

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}")

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

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

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

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

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