Não é possível encontrar falha lógica no script que deve executar um tcpdump

0

Eu escrevi um script que compara a hora e se é a mesma hora de início como a hora atual e não como a hora final que inicia um tcpdump. E se a hora final é como a hora atual, ele pesquisa o PID e o mata. Mas acho que ainda existe uma falha lógica, mas não sei como resolvê-lo.

Code:
#!/bin/sh
source /media/usbhd-sd[b-d]1/config.conf
pluggedin=true
echo $TIMESTART
echo $TIMEEND
echo $$
echo $Zeit
echo $$ >> /tmp/test.txt
while [ $pluggedin ];do
        Zeit=$(date +"%T")
        if [[ $TIMESTART == $Zeit ]];then
                if [[ $TIMEEND != $Zeit ]] && [ "$(pidof tcpdump)" == "" ];then
                        echo "tcpdump started"
                        sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                        #sudo umount /dev/sdb1
                else
                        pid1=$(ps -eo pid,args|awk '/abfrage2/ && ! /awk/{print $1}')
                        echo $pid1 >> /tmp/test.txt
                        sudo kill $pid1
                        echo "autodump stopped"
                fi

        else
        echo "tcpdump not yet started"
        fi
done

Eu já depurei isso e isso me dá essa saída quando o primeiro se está certo, mas quando o primeiro if não está certo também não verifica o if interno. Funcionaria se eu verificasse o PID e o faça ou no exterior se?

Code:
+ [ true ]
+ date +%T
+ Zeit=08:51:00
+ [[ 08:51:00 == 08:51:00 ]]
+ [[ 08:51:02 != 08:51:00 ]]
+ pidof tcpdump
+ [ 9945 ==  ]
+ awk /abfrage2/ && ! /awk/{print $1}
+ ps -eo pid,args
+ pid1=
+ echo
+ sudo kill -9
kill: you need to specify whom to kill
+ echo autodump stopped
autodump stopped

Atualizar

Eu encontrei algumas falhas por mim mesmo

Esse é o código mais recente. Está funcionando quase agora, mas o tcpdump ainda não é morto. Mas já está escrevendo dados no arquivo.

    #!/bin/sh
source /media/usbhd-sd[b-d]1/config.conf
pluggedin=true
echo $TIMESTART
echo $TIMEEND
echo $$
echo $Zeit
echo $$ >> /tmp/test.txt
while [ $pluggedin ];do
        Zeit=$(date +"%T")
        if [[ $TIMESTART == $Zeit ]] || [[ "$pid1" != "" ]];then
                if [[ $TIMEEND != $Zeit ]];then
                        if [ "$pid1" == "" ];then
                                echo "tcpdump started"
                                sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                                pid1=$(ps -eo pid,args|awk '/abfrage2/ && ! /awk/{print $1}')
                                #sudo umount /dev/sdb1
                        else
                        echo "Tcpdump already running"
                        fi
                else
                        if [ "$pid" != ""];then
                                echo $pid1 >> /tmp/test.txt
                                sudo kill -9 $pid1
                                echo "autodump stopped"
                        else
                                echo "autodump already stopped"
                        fi
                fi

        else
        echo "tcpdump noch yet started"
        fi
done

Agora recebo essa saída por meio de depuração. Quando a hora é 40s, o PID não está disponível:

+ [ true ]
+ date +%T
+ Zeit=10:45:39
+ [[ 10:45:30 == 10:45:39 ]]
+ [[ 30285 !=  ]]
+ [[ 10:45:40 != 10:45:39 ]]
+ [ 30285 ==  ]
+ echo Tcpdump already running
Tcpdump already running
+ [ true ]
+ date +%T
+ Zeit=10:45:40
+ [[ 10:45:30 == 10:45:40 ]]
+ [[ 30285 !=  ]]
+ [[ 10:45:40 != 10:45:40 ]]
+ [  != ]
sh: !=: argument expected
+ echo autodump already stopped
autodump already stopped
    
por apuboard 01.12.2015 / 09:21

1 resposta

1

Boa pergunta, bons exemplos, bons dados, bom esforço, obrigado.

Como o tempo está sempre mudando, você deve usar valores de tempo que podem ser comparados mais facilmente. Use o comando date para alterar todos os valores de tempo para o número de segundos desde a "época" (1970-01-01 00:00:00 UTC).

timestart=$(date +%s -d "$TIMESTART")
timeend=$(date +%s -d "$TIMEEND")

Use o mesmo formato em Zeit , agora você pode comparar as datas como números inteiros, o mais recente é maior:

        Zeit=$(date +"%s")
        if [ $timestart -le $Zeit ];then
                if [ $timeend -le $Zeit ] && [ "$(pidof tcpdump)" == "" ];then

Também vejo que parece que você está tentando matar o plano de fundo tcpdump . Você pode considerar o uso da variável $! incorporada, que contém o PID da tarefa em segundo plano iniciada mais recentemente, por exemplo (todo o código desta resposta não foi testado):

unset tcpdump_pid
while [ $pluggedin ];do
        Zeit=$(date +"%s")
        if [ $timestart -le $Zeit ] && [ "$tcpdump_pid" == "" ]; then
                echo "tcpdump started"
                sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                tcpdump_pid=$$
        fi                            
        if [ $timeend -le $Zeit ] && [ "$tcpdump_pid" != "" ];then
                sudo kill $tcpdump_pid
        fi
        # sleep ?
done

De acordo com a página tcpdump man, o SIGINT ou SIGTERM terminará tcpdump , portanto, o -9 é desnecessário e não deve ser usado. O padrão kill de SIGTERM será suficiente.

    
por 01.12.2015 / 09:58