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!

Andrei Serdeliuc
la source
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 $ ()

dotplus
la source
+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'

Pierre Carrier
la source
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}")
BMDan
la source
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"`
Épave logique
la source
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