Comment simplifieriez-vous cette commande?


10

Je suis assez nouveau dans strace / netstat / etc. J'utilise cette commande pour obtenir une trace du processus apache qui gère ma demande (telnet), existe-t-il un moyen de le simplifier un peu?

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

Merci!


Exécutez-vous cela avant ou après le démarrage du processus Telnet?
deltaray

après avoir commencé, vous devez attendre quelques secondes pour qu'il se connecte à apache, puis vous pouvez exécuter strace
Andrei Serdeliuc

1
Si votre commande fonctionne, ne vous embêtez pas à la simplifier.
Tom O'Connor

Réponses:


1

Je peux améliorer un peu celui de Mark Henderson, avec $ () au lieu de `` et supprimer le grep avec un meilleur sed:

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

Personnellement, je pense que les contre-coups rendent la lecture difficile; de plus, ils ne s'emboîtent pas, contrairement à la syntaxe $ ()


+1, Script Fu supérieur et bon exemple d'apprentissage pour certaines fonctionnalités du shell.
Jeff Ferland

Ce script straceest dans le telnet, pas dans le processus Apache qui le sert.
BMDan

2

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

Tant que vous n'en avez qu'un seul en telnetcours d'exécution, ce sera stracele serveur correspondant le cas échéant.

S'il n'y en a pas ( par exemple, vous avez telnetédité sur un serveur externe en dernier), straceéchouera avecstrace: option requires an argument -- 'p'


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

Ou, formaté pour une lecture plus facile, et avec les indicateurs de strace de l'OP intacts:

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

Répartition, la plus intérieure en premier:

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

Montrez-moi, sans résoudre les adresses IP en noms DNS, toutes les connexions TCP actives. Dirigez cela vers awk, qui imprime le cinquième champ sur n'importe quelle ligne se terminant par /telnet, où les champs sont séparés par un ou plusieurs espaces et deux-points. Ce champ sera le port source.

Pour améliorer : pourrait être rendu beaucoup plus robuste en ajoutant un | head -n 1à la fin ou un ;exità l'intérieur de la partie action de l'awk, mais votre version originale manquait d'équivalent, donc je ne voulais pas prolonger celle-ci.

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

La ****voici la partie que je l' ai déjà expliqué ci-dessus. Ici, je recherche n'importe quelle ligne netstat -tnpqui a le même port que le port source que j'ai découvert ci-dessus et qui appartient à Apache; quand je le trouve, j'imprime le septième champ (délimité par un ou plusieurs espaces ou barres obliques). Il s'agit du PID de l'enfant Apache.

Pour améliorer : En plus de renvoyer un seul PID (via les mêmes méthodes que ci-dessus), la plus grande chose que j'imagine est d'être plus discriminant lorsqu'il s'agit de faire correspondre le dport par opposition à quelque chose d'autre qui se trouve correspondre au modèle. Cela aurait été facile à faire en ajoutant des deux-points à FS ( -F), mais le problème se produit dans des situations mixtes IPv4 vs IPv6, où il pourrait y avoir des deux-points dans l'adresse elle-même, et en tant que tel, pourrait devenir méchant assez rapidement. Cela semblait sacrément robuste, surtout avec l'espace de fuite.

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

Il s'agit d'une copie directe de votre question d'origine; Je ne l'ai pas modifié du tout.

Si vous me permettez quelques caractères supplémentaires, la version que j'utiliserais pourrait être:

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

Essayez ceci, j'espère que cela vous aidera:

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

La réponse serait plus belle si vous n'aviez pas à faire défiler vers la droite pour tout voir.
djangofan

C'est stracedans le telnet, pas Apache.
Pierre Carrier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.