В настоящее время я использую команду: curl icanhazip.com
и опцию set -g status-left ...
в моем tmux.conf для получения и отображения моего публичного IP-адреса в строке состояния.
Это работает отлично, хотя меня действительно беспокоитколичество запросовкоторые делаются для получения того же IPвновь и вновьснова.
Вопрос:
Как можно добиться этого (получить/отобразить публичный IP-адрес в строке состояния tmux) с помощью только одного потока связи на сеанс (или чего-то менее избыточного), используя конфигурацию tmux?
Я просмотрел страницу руководства curl и попробовал различные аргументы ограничения скорости в команде [безрезультатно], хотя я думаю, что это что-то специфичное для tmux.
Я мог бы использовать внешний скрипт или какую-нибудь функцию для достижения этой цели, хотя мне бы хотелось сохранить простоту.
Любые предложения по решению этой проблемы или полностью альтернативные методы были бы замечательными!
правка: форматирование
решение1
Кэшируйте информацию:
Добавьте задание cron, которое запускается каждые 5 или 10 минут:
curl http://icanhazip.com > ~/.cache/my-ip
Некоторые источники предоставляют эту информацию по протоколам без установления соединения и поэтому не будут столь строги в отношении своих ограничений, как HTTP-источники с установлением соединения:
dig +short myip.opendns.com @208.67.222.222 > ~/.cache/my-ip
В 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";