¿Cómo simplificarías este comando?


10

Soy bastante nuevo en strace / netstat / etc. Estoy usando este comando para obtener un rastro del proceso de apache que maneja mi solicitud (telnet), ¿hay alguna manera de simplificarlo un poco?

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

¡Gracias!


¿Está ejecutando esto antes o después de iniciar el proceso de telnet?
deltaray

después de que comience, debe esperar unos segundos para que se conecte a apache, luego puede ejecutar strace
Andrei Serdeliuc

1
Si su comando funciona, no se moleste en simplificarlo.
Tom O'Connor

Respuestas:


1

Puedo mejorar un poco a Mark Henderson, con $ () en lugar de `` y eliminando el grep con un mejor sed:

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

Personalmente, creo que los backticks dificultan la lectura; además, no anidan, a diferencia de la sintaxis $ ()


+1, Script Fu superior y buen ejemplo de aprendizaje para algunas funciones de shell.
Jeff Ferland

Este script straceestá en el telnet, no en el proceso de Apache que lo sirve.
BMDan

2

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

Siempre que solo tenga uno en telnetejecución, este será straceel servidor correspondiente, si lo hay.

Si no hay uno ( p . Ej. , Lo telneteditó a un servidor externo en último lugar), stracefallará constrace: option requires an argument -- 'p'


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

O, formateado para una lectura más fácil, y con los indicadores de strace del OP intactos:

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

Desglose, lo más interno primero:

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

Muéstrame, sin resolver las direcciones IP a los nombres DNS, todas las conexiones TCP activas. Canalice eso a awk, que imprime el quinto campo en cualquier línea que termine en /telnet, donde los campos están separados por uno o más espacios y dos puntos. Este campo será el puerto de origen.

Para mejorar : podría hacerse mucho más robusto agregando un | head -n 1al final o ;exitdentro de la parte de acción del awk, pero su versión original carecía de un equivalente, por lo que no quería alargarla.

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

El ****aquí es la parte ya he explicado, arriba. Aquí, estoy buscando cualquier línea netstat -tnpque tenga el mismo puerto que el puerto de origen que descubrí anteriormente, y es propiedad de Apache; cuando lo encuentro, imprimo el séptimo campo (delimitado por uno o más espacios o barras). Este es el PID del niño Apache.

Para mejorar : además de devolver solo un PID (a través de los mismos métodos que el anterior), lo más importante que puedo imaginar es ser más discriminatorio cuando se trata de hacer coincidir el dport en lugar de algo más que simplemente se ajusta al patrón. Esto habría sido fácil de hacer agregando dos puntos al FS ( -F), pero el problema ocurre en situaciones mixtas de IPv4 frente a IPv6, donde podría haber dos puntos en la dirección en sí, y como tal podría volverse desagradable bastante rápido. Esto parecía bastante robusto, especialmente con el espacio final.

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

Esta es una copia directa de su pregunta original; No lo modifiqué en lo más mínimo.

Si me permite algunos caracteres adicionales, la versión que ejecutaría podría ser:

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

Prueba esto, espero que ayude:

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

La respuesta se vería mejor si no tuviera que desplazarse hacia la derecha para verlo todo.
djangofan

Esto straceestá en el telnet, no en Apache.
Pierre Carrier
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.