Wie würden Sie diesen Befehl vereinfachen?


10

Ich bin ziemlich neu in strace / netstat / etc. Ich verwende diesen Befehl, um eine Spur des Apache-Prozesses zu erhalten, der meine Anfrage (Telnet) verarbeitet. Gibt es eine Möglichkeit, dies ein wenig zu vereinfachen?

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

Vielen Dank!


Führen Sie dies vor oder nach dem Start des Telnet-Prozesses aus?
Deltaray

Nachdem es gestartet wurde, müssen Sie einige Sekunden warten, bis es sich mit Apache verbindet, dann können Sie strace ausführen
Andrei Serdeliuc

1
Wenn Ihr Befehl funktioniert, müssen Sie ihn nicht vereinfachen.
Tom O'Connor

Antworten:


1

Ich kann Mark Hendersons ein wenig verbessern, mit $ () anstelle von `` und den Grep mit einem besseren Sed entfernen:

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

Persönlich denke ich, dass die Backticks das Lesen erschweren; Außerdem werden sie im Gegensatz zur Syntax $ () nicht verschachtelt


+1, überlegenes Script Fu und gutes Lernbeispiel für einige Shell-Funktionen.
Jeff Ferland

Dieses Skript befindet stracesich im Telnet und nicht im Apache-Prozess, der es bereitstellt.
BMDan

2

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

Solange nur einer telnetausgeführt wird, wird straceder entsprechende Server angezeigt, falls vorhanden.

Wenn es keinen gibt ( z. B. wenn Sie zuletzt telnetauf einen externen Server gegangen sind), straceschlägt dies fehlstrace: option requires an argument -- 'p'


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

Oder zum leichteren Lesen formatiert und mit intakten Strace-Flags des OP:

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

Zusammenbruch, innerste zuerst:

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

Zeigen Sie mir alle aktiven TCP-Verbindungen, ohne IP-Adressen in DNS-Namen aufzulösen. Leiten Sie das an awk weiter, wodurch das fünfte Feld in einer Zeile gedruckt wird, die mit endet /telnet, wobei die Felder durch ein oder mehrere Leerzeichen und Doppelpunkte getrennt sind. Dieses Feld ist der Quellport.

Zur Verbesserung : Könnte durch Hinzufügen eines | head -n 1am Ende oder ;exitinnerhalb des Aktionsbereichs der awk wesentlich robuster gemacht werden , aber Ihrer Originalversion fehlte ein Äquivalent, sodass ich diese nicht länger machen wollte.

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

Das ****hier ist der Teil, den ich oben bereits erklärt habe. Hier suche ich nach einer Zeile netstat -tnp, die denselben Port wie der oben entdeckte Quellport hat und Apache gehört. Wenn ich es finde, drucke ich das siebte Feld (begrenzt durch ein oder mehrere Leerzeichen oder Schrägstriche). Dies ist die PID des Apache-Kindes.

Zur Verbesserung : Abgesehen davon, dass nur eine PID zurückgegeben wird (über die gleichen Methoden wie oben), kann ich mir nur vorstellen, dass ich diskriminierender bin, wenn es darum geht, den dport tatsächlich abzugleichen, im Gegensatz zu etwas anderem, das zufällig zum Muster passt. Dies wäre einfach durch Hinzufügen von Doppelpunkten zum FS ( -F) möglich gewesen, aber das Problem tritt in gemischten IPv4- und IPv6-Situationen auf, in denen die Adresse selbst möglicherweise Doppelpunkte enthält und als solche ziemlich schnell unangenehm werden kann. Dies schien verdammt robust zu sein, besonders mit dem nachlaufenden Raum.

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

Dies ist eine direkte Kopie Ihrer ursprünglichen Frage. Ich habe es nicht im geringsten geändert.

Wenn Sie mir ein paar zusätzliche Zeichen erlauben, könnte die folgende Version lauten:

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

Versuchen Sie dies, hoffe es hilft:

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

Die Antwort würde besser aussehen, wenn Sie nicht nach rechts scrollen müssten, um alles zu sehen.
Djangofan

Dies ist stracein den telnet, nicht Apache.
Pierre Carrier
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.