AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 424390
Accepted
dot
dot
Asked: 2018-02-16 06:28:30 +0800 CST2018-02-16 06:28:30 +0800 CST 2018-02-16 06:28:30 +0800 CST

script bash: capturar o tráfego tcp em um servidor remoto às vezes funciona, às vezes falha. Sem erros

  • 772

Fundo

Estou executando o BusyBox no servidor remoto.

Eu tenho um script bash que faz duas coisas:
1. via ssh, inicia um subprocesso para monitorar o tráfego tcp usando o comando tcpdump. Salve os resultados em um arquivo - na máquina remota ou na máquina local. Tentei ambos.
2. inicia um segundo subprocesso para gerar tráfego TCP.

Fragmento de código:

#html_tcpdumpfile="$(ssh remotemachine.mydomain.net \"mktemp\")"
html_tcpdumpfile=$(mktemp)

test_steps=(
    #"{ ssh remotemachine.mydomain.net \"timeout -t 20 tcpdump -nvi eth0 port 5060 > "$html_tcpdumpfile" \" ; }" 
    "{ ssh remotemachine.mydomain.net \"timeout -t 20 tcpdump -i eth0 port 5060 \"> $html_tcpdumpfile; }"   
    "{ ssh remotemachine.mydomain.net \"timeout -t 15 cat /tmp/htmlemail.txt | /etc/postfix/process_email.py \"; }"
 )
pids=()
for index in ${!test_steps[@]}; do       
      (echo "${test_steps[$index]}" | bash) &
      pids[${index}]=$!
      echo "$pids[${index}] is the pid"
done

#shouldn't really need this because of the timers but... just in case...
for pid in ${pids[*]}; 
do   
  wait $pid; 
done;
# ============ ANALYZE TEST RESULTS
echo "========== html_tcpdumpfile CONTENTS ============="
cat $html_tcpdumpfile
echo "========== html_tcpdumpfile CONTENTS ============="

Problema

Às vezes, o comando tcpdump não captura nada e, outras vezes, sim. Não há mensagens de erro quando há falha na captura.

O que eu tentei até agora

  1. Como você pode ver, tentei alterar a localização do arquivo dump entre a máquina remota e a local. Isso não parece fazer diferença.

  2. Eu provei que o tráfego TCP SEMPRE é gerado ... toda vez que executo o script porque tenho outra sessão ssh aberta e posso ver o tráfego sendo gerado. É que meu script falha intermitentemente em capturá-lo.

  3. Tentei aumentar o valor do tempo limite na sessão tcp para algo enorme para garantir que eu desse tempo suficiente. Mas não acho que seja esse o problema.

Qualquer sugestão seria apreciada. Obrigado.

EDITAR 1

Tentei introduzir um sono entre o lançamento de cada subprocesso:

pids=()
for index in ${!test_steps[@]}; do       
      (echo "${test_steps[$index]}" | bash) &
      sleep 5
      pids[${index}]=$!
      echo "$pids[${index}] is the pid"
done

Mas isso também não faz diferença.

EDITAR 2

Alterei o comando tcpdump para ficar assim:

test_steps=(     
    "{ ssh remotemachine.mydomain.net \"timeout -t 30 tcpdump -nlc 100 -i eth0 port 5060 \"> $rtf_tcpdumpfile; }" 
    "{ ssh remotemachine.mydomain.net \"timeout -t 20 tail -f /var/log/messages \" > $syslog; }"    
    "{ ssh remotemachine.mydomain.net \"timeout -t 15 cat /tmp/htmlemail.txt | /etc/postfix/process_email.py \"; }"
 )

O tcpdump ainda falha na captura de forma intermitente, mas... o interessante é que o syslog sempre é capturado com sucesso. (o script python realmente grava no syslog quando é invocado e assim posso ver/provar que o script está funcionando)

bash shell-script
  • 1 1 respostas
  • 2306 Views

1 respostas

  • Voted
  1. Best Answer
    Rui F Ribeiro
    2018-02-16T08:46:24+08:002018-02-16T08:46:24+08:00

    Em primeiro lugar, se você estiver lidando com um dispositivo/iOT com espaço limitado, eu lidaria com a saída no lado da chamada, ou seja, usando o > após os sshcomandos como em

    ssh "command" > output.txt
    

    Quanto a tcpdumpeu não mataria como política o tempo todo, arriscando perder buffers. Você pode não ter produzido talvez por causa disso.

    Eu colocaria um limite nos pacotes capturados. Eu também tentaria não resolver o DNS. Como em, para capturar 100 pacotes:

    tcpdump -nc 100 -i eth0 port 5600
    

    Ao armazenar o arquivo de captura no sistema local, você deve executar apenas catlocalmente e não remotamente e localmente.

    Da mesma forma, quando você está executando os dois remotamente tcpdump, catestá iniciando os dois ao mesmo tempo, e o remoto e o local catnão terão nada para mostrar.

    Seguindo a sugestão de @MarkPlotnick, também adicionei -lpara tcpdumptorná-lo em buffer de linha. Isso pode evitar a necessidade da -copção. Eu usaria os dois.

    Então, eu mudaria esse script para:

    #!/bin/bash
    html_tcpdumpfile=$(mktemp)
    
    ssh remotemachine.mydomain.net "timeout -t 20 tcpdump -nlc 100 -i eth0  port 5060 " > $html_tcpdumpfile
    
    cat $html_tcpdumpfile
    
    rm $html_tcpdumpfile
    

    Ou talvez nem precisemos criar explicitamente um arquivo temporário:

    #!/bin/bash
    
    ssh remotemachine.mydomain.net "timeout -t 20 tcpdump -nlc 100 -i eth0  port 5060 " \
    | less
    

    Por fim, aconselho excluir todos os arquivos temporários criados, especialmente no lado remoto.

    PS: o OP mencionado nos comentários do sistema remoto é o BusyBox e, como tal, as timeoutopções são diferentes das do coretutilspacote. Eu também edito a pergunta para mencionar o BusyBox.

    • 2

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • MySQL Select com função IN () com array bash

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve