Usar o cURL para recuperar o IP público para o tmux config cria muitas conexões

0

No momento, estou usando o comando: curl icanhazip.com e a opção set -g status-left ... no meu tmux.conf para recuperar e exibir meu IP público na barra de status.

Isso funciona muito bem, embora eu esteja realmente incomodado com o número de solicitações que estão sendo feitas para recuperar o mesmo IP várias vezes novamente.

Pergunta:

How can I acheive this (retrieve/display public IP in tmux status–bar) with only one communication stream per session (or something less redundant) using the tmux configuration?

Eu examinei a página de manual do curl e tentei vários argumentos limitadores de taxa no comando [sem sucesso], embora eu ache que isso é algo específico para o tmux.

Eu poderia usar um script ou função externa de algum tipo para conseguir isso, embora eu queira manter isso simples.

Todas as sugestões para resolver este ou outros métodos alternativos seriam excelentes!

editar: formatando

    
por jredd 15.08.2014 / 15:47

1 resposta

1

Cache da informação:

  1. Adicione um trabalho cron que seja executado a cada 5 ou 10 minutos:

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

    Algumas fontes fornecem essas informações através de protocolos sem conexão e, portanto, não serão tão rigorosas com seus limites quanto as fontes HTTP baseadas em conexão:

    dig +short myip.opendns.com @208.67.222.222 > ~/.cache/my-ip
    
  2. No tmux, altere o comando para simplesmente ler o seu arquivo de cache:

    cat ~/.cache/my-ip
    

Isso também pode ser feito por um único script, mas seria muito menos simples:

#!/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";
    
por 15.08.2014 / 16:29