Como você simplificaria este comando?

10

Sou muito novo em strace / netstat / etc. Estou usando este comando para obter um rastreamento do processo do apache manipulando meu pedido (telnet). Existe uma maneira de simplificar um pouco?

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

Obrigado!

    
por Andrei Serdeliuc 20.06.2012 / 17:30

4 respostas

1

Eu posso melhorar o Mark Henderson um pouco, com $ () em vez de '' e removendo o grep com um melhor sed:

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

Pessoalmente, acho que os backticks dificultam a leitura; além disso, eles não aninham, ao contrário da sintaxe $ ()

    
por 05.07.2012 / 16:50
2

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

Contanto que você tenha apenas um telnet em execução, isso será strace do servidor correspondente, se houver.

Se não houver um ( ex. você telnet ed para um servidor externo), strace falhará com strace: option requires an argument -- 'p'

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

Ou formatado para facilitar a leitura e com os sinalizadores de strace do OP intactos:

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

Divisão, primeiro mais interno:

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

Mostre-me, sem resolver endereços IP para nomes DNS, todas as conexões TCP ativas. Pipe that awk, que imprime o quinto campo em qualquer linha que termina em /telnet , onde os campos são separados por um ou mais espaços e dois pontos. Este campo será a porta de origem.

Para melhorar : Poderia ser muito mais robusto adicionando um | head -n 1 ao final ou um ;exit dentro da porção de ação do awk, mas sua versão original não tinha um equivalente, então Eu não queria fazer isso mais tempo.

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

O **** aqui é a parte que eu já expliquei acima. Aqui, estou procurando por qualquer linha em netstat -tnp que tenha a mesma porta que a porta de origem que eu descobri acima e seja de propriedade do Apache; quando o encontro, imprimo o sétimo campo (delimitado por um ou mais espaços ou barras). Este é o PID da criança do Apache.

Para melhorar : Além de apenas retornar um PID (pelos mesmos métodos acima), a maior coisa que posso imaginar é ser mais discriminativo quando se trata de realmente corresponder ao dport em oposição a outra coisa. Isso só acontece para se encaixar no padrão. Isso teria sido fácil, adicionando-se dois pontos ao FS ( -F ), mas o problema ocorre em situações mistas de IPv4 versus IPv6, onde pode haver dois pontos no próprio endereço e, como tal, pode ficar muito rápido. Isso parecia bastante robusto, especialmente com o espaço à direita.

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

Esta é uma cópia direta da sua pergunta original; Eu não modifiquei nem um pouco.

Se você me permitir alguns caracteres extras, a versão que eu executei pode ser:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \;exit}") / && /apache2/ {print \;exit}")
    
por 03.07.2012 / 23:10
0

Tente isso, espere que ajude:

sudo strace -o /tmp/strace -f -s4096 -r -p 'netstat -antlp | \
  grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"'
    
por 02.07.2012 / 19:02