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

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

Вопрос:

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

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

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

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

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

1 ответ1

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";

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .