El uso de cURL para recuperar la IP pública para la configuración de tmux crea demasiadas conexiones

El uso de cURL para recuperar la IP pública para la configuración de tmux crea demasiadas conexiones

Actualmente estoy usando el comando: curl icanhazip.comy la opción set -g status-left ...en mi tmux.conf para recuperar y mostrar mi IP pública en la barra de estado.

Esto funciona muy bien, aunque realmente me molesta elnúmero de solicitudesque se están realizando para recuperar la misma IPuna y otra vezde nuevo.

Pregunta:

¿Cómo puedo lograr esto (recuperar/mostrar IP pública en la barra de estado de tmux) con solo un flujo de comunicación por sesión (o algo menos redundante) usando la configuración de tmux?

Revisé la página de manual de curl y probé varios argumentos de limitación de velocidad en el comando [sin éxito], aunque creo que esto es algo específico de tmux.

Podría usar un script externo o una función de algún tipo para lograr esto, aunque me gustaría que esto sea simple.

¡Cualquier sugerencia para resolver esto o métodos alternativos por completo sería genial!

editar: formateo

Respuesta1

Almacenar en caché la información:

  1. Agregue un trabajo cron que se ejecute cada 5 o 10 minutos:

    curl http://icanhazip.com > ~/.cache/my-ip
    

    Algunas fuentes proporcionan esta información a través de protocolos sin conexión y, por lo tanto, no serán tan estrictas con sus límites como las fuentes HTTP basadas en conexión:

    dig +short myip.opendns.com @208.67.222.222 > ~/.cache/my-ip
    
  2. En tmux, cambie el comando para simplemente leer desde su archivo de caché:

    cat ~/.cache/my-ip
    

Esto también se podría hacer con un solo script, peroharíaser mucho menos simple:

#!/usr/bin/env perl
use LWP::Simple;

sub read_cached_ip {
    my ($file) = @_;
    return undef if !-e $file; # check if file exists
    my $mtime = (stat $file)[9];
    return undef if time - $mtime >= 5*60; # check if file has expired
    if (open(my $fh, "<", $file)) {
        chomp(my $ip = <$fh>);
        close($ip);
        return $ip;
    }
    return undef;
}

sub update_ip {
    my ($file) = @_;
    my $ip = LWP::Simple::get("http://icanhazip.com");
    if (open(my $fh, ">", $file)) {
        print $fh "$ip\n";
        close($ip);
    }
    return $ip;
}

my $file = $ENV{HOME}."/.cache/my-ip";
my $ip = read_cached_ip($file) // update_ip($file);
print "$ip\n";

información relacionada