Як би ви спростили цю команду?


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, тоді ви можете запустити
напругу

1
Якщо ваша команда працює, не намагайтеся її спрощувати.
Том О'Коннор

Відповіді:


1

Я можу трохи покращитись на Марка Хендерсона, з $ () замість `` і зняти греп з кращою sed:

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

Особисто я вважаю, що задній план ускладнює читання; крім того, вони не гніздяться, на відміну від синтаксису $ ()


+1, чудовий сценарій Fu та хороший приклад навчання для деяких функцій оболонки.
Джефф Ферланд

Цей скрипт знаходиться straceв telnet, а не в процесі 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}")

Або відформатований для легшого читання та недоторканих прапорців напруженої сили:

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-з'єднання. Pipe that to awk, який друкує п’яте поле на будь-якій лінії, що закінчується /telnet, де поля розділені одним або декількома пробілами та двокрапками. Це поле буде вихідним портом.

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

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

****Тут частина я вже пояснив вище. Тут я шукаю будь-яку лінію в netstat -tnpтакому ж порту, що і вихідний порт, який я виявив вище, і належить Apache; коли я знаходжу це, я друкую сьоме поле (відмежоване одним або декількома пробілами чи косою рисою). Це ПІД дитини Apache.

Для покращення : окрім лише повернення одного PID (за допомогою тих же методів, що і вище), найбільше, що я можу собі уявити, є більш дискримінаційним, коли мова йде про фактичне відповідність депорту на відміну від чогось іншого, що так трапляється, щоб відповідати шаблону. Це було б легко зробити, додавши колони до 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}")

0

Спробуйте це, сподіваюся, що це допоможе:

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

Відповідь виглядатиме приємніше, якби вам не довелося прокручувати праворуч, щоб побачити все це.
djangofan

Це straceв telnet, а не в Apache.
П’єр Перевізник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.