¡Te damos la bienvenida al nuevo sysarmy --help! Para recuperar tu usuario pedí un password reset.

Desafiooooooo

Alguien se anima a simplificar mi UserParam?

UserParameter=gwfibertime,ping -t2 -c1 `ifconfig re0 | awk '/inet\ / {print $2}' | awk -F "." '{print $1"."$2"."$3".1"}'` | awk -F "time=" '/64\ bytes\ from/ {print$2}' | awk '{print $1}' || echo "0"

Es para medir tiempo de respuesta del gw de una conexion de fibertel con ip dinamico.

SO: FreeBSD

Saludos

Respuestas

  • Respuesta medio ladri, creo que se podría reemplazar el awk -F "."  por awk -F \.

     

    Pero es muy ladri jajajajaja

  •  

     

    ping -c1 -t2 -q `ifconfig re0 | sed -En "s/.*inet ([0-9]+\.[0-9]+\.[0-9]+).*/\1/p"`.1 | grep ^rtt| cut -d"/" -f6

    Desglosado:

    `ifconfig re0 | sed -En "s/.*inet ([0-9]+\.[0-9]+\.[0-9]+).*/\1/p"`

    Saco los primeros 3 octetos de la IP,trate de usar otra forma mas compacta de RegEx, pero no me tomaba bien el grupo de captura, asi que lo deje asi, mas largo, luego:

    ping -c1 -t2 -q `ifconfig re0 | sed -En "s/.*inet ([0-9]+\.[0-9]+\.[0-9]+).*/\1/p"`.1

    Le agrego el .1 y tiro el ping, con -q para que solo me de el header y el resumen, quedando la salida como:

    PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.

    --- 192.168.1.1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 1.770/1.770/1.770/0.000 ms

    El grep ^rtt  me da solo la ultima linea:

    rtt min/avg/max/mdev = 1.770/1.770/1.770/0.000 ms

    Y el cut -d"/" -f5 me da la quinta columna usando como separador el /, o sea:

    rtt min/avg/max/mdev = 1.770/1.770/1.770/0.000 ms
                                 ^^^^^ ---> Este numero.

    Lo probe en linux, fijate en *BSD capaz que hay algun separador distinto o parametro que no es igual.
    Si bsd no tiene cut podes usar sed, pero eso te lo dejo para que lo resuelvas vos ;)

     

     

  • alternativa:

    ping -t2 -c1 `ip r | grep re0.*link | rev | awk '{print $1}' | rev` | grep time | cut -d= -f4 | head -1
  • UserParameter=gwfibertime[*],ping -c1 -t2 -q `ip r | perl -ne 'if(m/default via (\S+) dev $1/) {print $$1}'` 2>/dev/null | perl -ne 'if(m/rtt.*\/(\d+\.\d+)\//) {$RTT=$$1} END {if(defined $RTT) {print "$RTT\n"} else {print "0\n"} }'

    al user param le mandas como parametro el "ethX" y no dependes que el gw sea siempre .1

    la linea de comando en limpio seria: ping -c1 -t2 -q `ip r | perl -ne 'if(m/default via (\S+) dev eth0/) {print $1}'` 2>/dev/null | perl -ne 'if(m/rtt.*\/(\d+\.\d+)\//) {$RTT=$1} END {if(defined $RTT) {print "$RTT\n"} else {print "0\n"} }'
  • Aca hay otro mas:

    Linux:

    ping -c1 -t2 -q `ifconfig eth0 | sed -En "s/inet\ addr:(([0-9]{1,3}\.){3}).*/\1/p"`253 | tail -1 | perl -ne '(/rtt.*=\ ([0-9\.]{1,7})\/.*/ && print "$1\n") || print "0\n"'

    FreeBSD:

    ping -c1 -t2 -q `ifconfig re0 | sed -En "s/inet\ (([0-9]{1,3}\.){3}).*/\1/p"`253 | tail -1 | perl -ne '(/rtt.*=\ ([0-9\.]{1,7})\/.*/ && print "$1\n") || print "0\n"'
  • Solución:

    UserParameter=gwfibertime,ping -c1 -t2 -q `ifconfig re0 | sed -n 's/^.*inet:\([^ ]*\).*$/\1/p;'` | sed -n 's,^rtt.*=[^/]*/\([^/]*\)/.*$,\1,p; t; ${ s/^.*$/0/p; };'

    Uso dos "sed" one-liners, ambos con la opción "-n" para controlar qué quiero imprimir:

    1. Filtro la salida de "ifconfig": sólo muestro los caracteres que no sean espacios en blanco de la barra espaciadora (" ") encontrados luego de la cadena "inet:". Eso me da la dirección IP. Lo que está antes y después de ese texto en la línea debo descartarlo; para ello, agrego al principio "^.*" y al final ".*$".
    2. Filtro la salida de "ping": si encuentro una cadena que comience con "rtt", entonces recupero de esa línea solamente los caracteres que no sean "/" luego de la primera "/" después del "="; al resultado lo imprimo con "p". Si la expresión anterior hizo un reemplazo exitoso, salto al final del script con el comando "t" para terminar. En otro caso, voy a la última línea y reemplazo todo por un "0" e imprimo eso. Lo de ir a la última línea es sólo una convención, lo único que me interesa allí es asegurarme de que hago eso sólo una vez para que no me tire un "0" por cada línea. Podría haber elegido la primera línea también o cualquier otra, siempre que esté totalmente seguro de que habrá al menos una línea.

    Siempre prefiero "iproute2" antes que "ifconfig", pero, siendo que estás en BSD, esto no es una opción. Sin embargo, aquí va el "sed" one-liner para el comando "ip":

    ip -o a l dev re0 | sed -n 's/^.*inet \([^/]\+\)\/.*$/\1/p'

    Además, como "iproute2" te lista todas las direcciones IP de una interfaz apropiadamente como una lista con sus respectivas etiquetas (tal como es la estructura de datos en Linux, no sé en BSD), tal vez te convenga agregar un "| head -n 1" o "| tail -n 1". Mejor aún sería conocer la etiqueta y agregarla al match de "ip". Por ejempo:

    ip -o a l dev re0 label re0:1 | sed -n 's/^.*inet \([^/]\+\)\/.*$/\1/p'

    EDITADO:

    Escribí las expresiones regulares basándome en la salida de "ifconfig" en Linux. Según la salida de este comando en BSD, cortesía del comentario de luigibalzani, el UserParameter debería ser:

    UserParameter=gwfibertime,ping -c1 -t2 -q `ifconfig re0 | sed -n 's/^.*inet \([^ ]*\).*$/\1/p;'` | sed -n 's,^rtt.*=[^/]*/\([^/]*\)/.*$,\1,p; t; ${ s/^.*$/0/p; };'

    El cambio está en sustituir ":" por un espacio en blanco regular (" ") luego de "inet".

Este hilo ha sido cerrado.