Я новичок в strace / netstat / и т. Д. Я использую эту команду, чтобы получить трассировку процесса apache, обрабатывающего мой запрос (telnet), есть ли способ немного упростить его?
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')
Спасибо!
strace -p $(ss -npt|sed -n "/:$(ss -npt|sed -n '/telnet/s/^.*\?:\([0-9]\+\).*/\1/p') \+u/s/.*,\(.*\),.*/\1/p")
Пока у вас есть только один telnet
работает, это будет strace
соответствующий сервер, если таковой имеется.
Если его нет (например ты telnet
ed на внешний сервер последним), strace
потерпит неудачу с strace: option requires an argument -- 'p'
strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+'
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")
Или отформатирован для облегчения чтения и с неповрежденными флагами strace 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}")
Я могу немного улучшить Марка Хендерсона, используя $ () вместо `` и удалив grep с помощью лучшего sed:
sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \
sed -e "/telnet/s/^.*ESTABLISHED\ \|\/.*$//g")
Лично я считаю, что обратные кавычки затрудняют чтение; кроме того, они не вложены, в отличие от синтаксиса $ ()
Попробуйте это, надеюсь, это поможет:
sudo strace -o /tmp/strace -f -s4096 -r -p `netstat -antlp | \
grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"`