fping - Como tornar o resultado do fping sempre sequencial em ordem de linha de comando

0

Eu quero obter o resultado de fping sempre sequencial na ordem dos argumentos da linha de comando.

Por exemplo, o comando:

fping -e 151.101.129.164 8.8.8.8

pode fornecer a saída:

8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)

O resultado acima está em uma ordem diferente dos argumentos para o comando fping , onde 151.101.129.164 é colocado primeiro no comando fping , mas o resultado é o segundo.

Como o 151.101.129.164 pode aparecer primeiro no resultado sem alterar a ordem do primeiro comando fping?

    
por Ras 04.03.2018 / 21:24

1 resposta

0

Uma maneira é escrever um script de wrapper:

#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
        case "$arg" in
          (-*)  # Ignore options
                ;;
          (*)   grep "^$arg " "$myfile"
        esac
done
rm "$myfile"

Então, se você chamar isso de myfping , e você executa myfping -e 151.101.129.164 8.8.8.8 (onde você precisa prefixar ./ ou colocar o script em um diretório que esteja no seu PATH), ele será executado

fping -e 151.101.129.164 8.8.8.8
com saída para um arquivo temporário, e depois percorrer os argumentos na ordem da linha de comando (da esquerda para a direita) e puxe os resultados em ordem.

Notas:

  • O analisador de endereços IPv4 é muito flexível; na maioria dos sistemas (se não todos), ele interpretará 127.0.1 como equivalente a 127.0.0.1 . Então, se você fping 127.0.1 , e fping produz uma linha de saída que inicia 127.0.1 , e você também tem um argumento como 1.7.0.1 , que será tratado como uma expressão regular que corresponde a 127.0.1 . Você pode superar isso da seguinte maneira:

    #!/bin/bash
    myfile=$(mktemp)
    ./fping "$@" > "$myfile"
    for arg
    do
            case "$arg" in
              (-*)  # Ignore options
                    ;;
              (*)   darg=$(sed 's/\./\./g' <<< "$arg")
                    grep "^$darg " "$myfile"
            esac
    done
    rm "$myfile"
    

    em que arg de 1.7.0.1 será convertido em darg de 1\.7\.0\.1 , que não corresponderá a 127.0.1 .

    O script acima é específico do bash por causa da "string aqui" ( <<< "$arg" ). Você pode tornar isso compatível com POSIX alterando a linha darg= para

    darg=$(printf "%s" "$arg" | sed 's/\./\./g')
    
  • O texto acima pode ser um arenque vermelho. Se você fping 127.0.1 , então fping pode normalizar o endereço e relatar o resultado para 127.0.0.1 ; então o grep não acharia isso. Ou talvez não; verifique sua versão de fping .
  • Se você usar alguma opção com argumentos, como -c count ou -I interface , a lógica case no meu script tratará os argumentos da opção como se fossem argumentos comuns; isto é, nomes / endereços de host de destino. Isso provavelmente não importará.
  • Se você tiver um argumento que contenha * , [] , ou alguns outros caracteres especiais, grep pode produzir resultados inesperados. Isso não parece ser um problema na vida real.
  • Se fping gerar alguma informação que não corresponde a um argumento de nome / endereço de host de destino, você não vai ver.
  • Este script não sai com o status de saída de fping . Correção que é deixada como um exercício.
por 05.03.2018 / 21:41