Como você simplificaria esse comando?


10

Eu sou bastante novo no strace / netstat / etc. Estou usando este comando para obter um rastreamento do processo apache que lida com minha solicitação (telnet). Existe uma maneira de simplificá-lo 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!


Você está executando isso antes ou depois de iniciar o processo de telnet?
Deltaray 22/06/12

depois que começou, você tem que esperar alguns segundos para que ele se conecte à apache, então você pode executar strace
Andrei Serdeliuc

1
Se o seu comando funcionar, não se preocupe em simplificá-lo.
Tom O'Connor

Respostas:


1

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

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 $ ()


+1, Script Fu superior e bom exemplo de aprendizado para alguns recursos do shell.
9139 Jeff Ferland

Esse script straceestá no telnet, não no processo Apache que está sendo veiculado.
BMDan

2

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

Contanto que você tenha apenas um em telnetexecução, este será straceo servidor correspondente, se houver.

Se não houver um ( por exemplo, você telneted passado para um servidor externo), stracefalhará comstrace: option requires an argument -- 'p'


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

Ou formatado para facilitar a leitura e com os sinalizadores de rastreamento do 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}")

Desagregação, a mais interna primeiro:

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

Mostre-me, sem resolver endereços IP para nomes DNS, todas as conexões TCP ativas. Canalize para 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 1ao final ou um ;exitdentro da parte de ação do awk, mas sua versão original não possuía um equivalente, por isso não queria prolongar essa.

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

A ****aqui é a parte que eu já expliquei acima. Aqui, estou procurando por qualquer linha netstat -tnpque tenha a mesma porta que a porta de origem que 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 do filho Apache.

Para melhorar : além de retornar apenas um PID (através dos 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 que se encaixa no padrão. Isso seria fácil adicionando dois pontos ao FS ( -F), mas o problema ocorre em situações mistas de IPv4 vs. IPv6, onde pode haver dois pontos no próprio endereço e, como tal, podem se tornar desagradáveis ​​rapidamente. 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 o modifiquei nem um pouco.

Se você me permitir alguns caracteres extras, a versão que eu executaria pode 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

Tente isso, espero que ajude:

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

A resposta seria melhor se você não precisasse rolar para a direita para ver tudo.
djangofan

Isso straceé para o telnetApache, não.
Pierre Carrier
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.