Jak uprościsz to polecenie?


10

Jestem całkiem nowy w strace / netstat / itp. Używam tego polecenia, aby uzyskać ślad procesu apache obsługującego moje żądanie (telnet), czy istnieje sposób, aby to nieco uprościć?

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')

Dzięki!


Czy uruchamiasz to przed czy po uruchomieniu procesu Telnet?
deltaray

po uruchomieniu musisz poczekać kilka sekund, aż połączy się z Apache, a następnie możesz uruchomić strace
Andrei Serdeliuc

1
Jeśli twoje polecenie działa, nie zawracaj sobie głowy jego upraszczaniem.
Tom O'Connor,

Odpowiedzi:


1

Mogę trochę poprawić Mark Henderson za pomocą $ () zamiast `` i usuwanie grep za pomocą lepszego sed:

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

Osobiście uważam, że backticks utrudniają czytanie; ponadto nie zagnieżdżają się, w przeciwieństwie do składni $ ()


+1, lepsze Script Fu i dobry przykład do nauki niektórych funkcji powłoki.
Jeff Ferland,

Ten skrypt znajduje stracesię w telnecie, a nie w procesie Apache, który go obsługuje.
BMDan

2

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

Tak długo, jak masz tylko jeden telneturuchomiony, będzie straceto odpowiedni serwer, jeśli taki istnieje.

Jeśli nie ma ani jednego ( np ty telneted do zewnętrznego serwera ostatni), stracenie powiedzie sięstrace: option requires an argument -- 'p'


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

Lub sformatowane w celu łatwiejszego czytania i przy nienaruszonych flagach śledzenia PO:

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

Podział, od najbardziej wewnętrznego:

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

Pokaż, bez rozpoznawania adresów IP na nazwy DNS, wszystkie aktywne połączenia TCP. Pipe to awk, który drukuje piąte pole na dowolnej linii kończącej się na /telnet, gdzie pola są oddzielone jedną lub więcej spacjami i dwukropkami. To pole będzie portem źródłowym.

Aby poprawić : można by uczynić znacznie bardziej niezawodnym przez dodanie | head -n 1do końca lub ;exitwewnętrznej części awk akcji, ale w twojej oryginalnej wersji brakowało odpowiednika, więc nie chciałem, aby ten był dłuższy.

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

****Oto część I już wyjaśnione powyżej. Tutaj szukam dowolnej linii, netstat -tnpktóra ma ten sam port co port źródłowy, którą odkryłem powyżej i jest własnością Apache; kiedy go znajdę, wypisuję siódme pole (ograniczone jedną lub kilkoma spacjami lub ukośnikami). To jest PID dziecka Apache.

Aby poprawić : oprócz zwracania tylko jednego PID (tymi samymi metodami, co powyżej), największą rzeczą, jaką mogę sobie wyobrazić, jest bardziej dyskryminujące, jeśli chodzi o faktyczne dopasowanie dport w przeciwieństwie do czegoś innego, co akurat pasuje. Byłoby to łatwe, dodając dwukropki do FS ( -F), ale problem występuje w mieszanych sytuacjach IPv4 vs. IPv6, w których w samym adresie mogą znajdować się dwukropki i jako takie mogą stać się nieprzyjemne dość szybko. Wydawało się to cholernie solidne, szczególnie w przypadku tylnego miejsca.

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

To jest bezpośrednia kopia z twojego oryginalnego pytania; Ja przynajmniej tego nie zmodyfikowałem.

Jeśli pozwolisz mi na kilka dodatkowych znaków, wersją, którą uruchomię, może być:

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

Wypróbuj to, mam nadzieję, że to pomoże:

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

Odpowiedź wyglądałaby ładniej, gdyby nie trzeba było przewijać w prawo, aby zobaczyć wszystko.
djangofan

To stracedotyczy telnet, nie Apache.
Pierre Carrier
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.