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 1
al final o ;exit
dentro 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 -tnp
que 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}")