Использование cURL для получения публичного IP-адреса для конфигурации tmux создает слишком много подключений

Использование cURL для получения публичного IP-адреса для конфигурации tmux создает слишком много подключений

В настоящее время я использую команду: curl icanhazip.comи опцию set -g status-left ...в моем tmux.conf для получения и отображения моего публичного IP-адреса в строке состояния.

Это работает отлично, хотя меня действительно беспокоитколичество запросовкоторые делаются для получения того же IPвновь и вновьснова.

Вопрос:

Как можно добиться этого (получить/отобразить публичный IP-адрес в строке состояния tmux) с помощью только одного потока связи на сеанс (или чего-то менее избыточного), используя конфигурацию tmux?

Я просмотрел страницу руководства curl и попробовал различные аргументы ограничения скорости в команде [безрезультатно], хотя я думаю, что это что-то специфичное для tmux.

Я мог бы использовать внешний скрипт или какую-нибудь функцию для достижения этой цели, хотя мне бы хотелось сохранить простоту.

Любые предложения по решению этой проблемы или полностью альтернативные методы были бы замечательными!

правка: форматирование

решение1

Кэшируйте информацию:

  1. Добавьте задание cron, которое запускается каждые 5 или 10 минут:

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

    Некоторые источники предоставляют эту информацию по протоколам без установления соединения и поэтому не будут столь строги в отношении своих ограничений, как HTTP-источники с установлением соединения:

    dig +short myip.opendns.com @208.67.222.222 > ~/.cache/my-ip
    
  2. В tmux измените команду так, чтобы она просто считывала данные из файла кэша:

    cat ~/.cache/my-ip
    

Это можно было бы сделать и одним скриптом, но этобыбыть гораздо менее простым:

#!/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";

Связанный контент