strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+'
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")
Или, отформатированный для более легкого чтения, и с целыми флагами OP:
sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5}") / && /apache2/ {print \$7}")
Разбивка, сначала внутренняя:
netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}"
Покажите мне, без разрешения IP-адресов для DNS-имен, все активные соединения TCP. Передайте это в awk, который печатает пятое поле в любой строке, заканчивающейся на /telnet
, где поля разделены одним или несколькими пробелами и двоеточиями. Это поле будет портом источника.
Для улучшения : можно сделать намного более надежным, добавив | head -n 1
в конец или ;exit
внутри часть действия awk, добавив в конец действия, но вашей оригинальной версии не хватало эквивалента, поэтому я не хотел делать его длиннее.
netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")
****
Здесь часть я уже объяснил выше. Здесь я ищу любую линию netstat -tnp
с тем же портом, что и порт источника, который я обнаружил выше, и принадлежит Apache; когда я нахожу его, я печатаю седьмое поле (ограниченное одним или несколькими пробелами или косой чертой). Это PID ребенка Apache.
Для улучшения : Помимо возвращения только одного PID (с помощью тех же методов, что и выше), самое большое, что я могу себе представить, это быть более разборчивым, когда речь идет о фактическом сопоставлении dport, а не о чем-то еще, что просто соответствует шаблону. Это было бы легко сделать, добавив двоеточия в FS ( -F
), но проблема возникает в смешанных ситуациях IPv4 и IPv6, где в самом адресе могут быть двоеточия, и, как таковые, они могут довольно быстро стать неприятными. Это казалось чертовски крепким, особенно в конце.
sudo strace -o /tmp/strace -f -s4096 -r -p
Это прямая копия вашего оригинального вопроса; Я не изменил это ни в малейшей степени.
Если вы позволите мне добавить несколько дополнительных символов, возможно, будет использоваться следующая версия:
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}")