Ich verwende derzeit den Befehl: curl icanhazip.com
und die Option set -g status-left ...
in meiner tmux.conf, um meine öffentliche IP abzurufen und in der Statusleiste anzuzeigen.
Das funktioniert super, allerdings stört mich dieAnzahl der Anfragendie zum Abrufen derselben IP-Adresse durchgeführt werdenüber und überwieder.
Frage:
Wie kann ich dies (Abrufen/Anzeigen der öffentlichen IP in der Tmux-Statusleiste) mit nur einem Kommunikationsdatenstrom pro Sitzung (oder etwas weniger Redundantem) unter Verwendung der Tmux-Konfiguration erreichen?
Ich habe die Manpage von curl durchgesehen und verschiedene Rate-Limiting-Argumente im Befehl ausprobiert [ohne Erfolg], obwohl ich glaube, dass dies etwas Tmux-Spezifisches ist.
Ich könnte hierfür ein externes Skript oder eine Funktion irgendeiner Art verwenden, ich möchte es aber lieber einfach halten.
Alle Vorschläge zur Lösung dieses Problems oder zu alternativen Methoden sind willkommen!
bearbeiten: Formatierung
Antwort1
Zwischenspeichern der Informationen:
Fügen Sie einen Cron-Job hinzu, der alle 5 oder 10 Minuten ausgeführt wird:
curl http://icanhazip.com > ~/.cache/my-ip
Einige Quellen stellen diese Informationen über verbindungslose Protokolle bereit und sind daher mit ihren Beschränkungen nicht so streng wie verbindungsbasierte HTTP-Quellen:
dig +short myip.opendns.com @208.67.222.222 > ~/.cache/my-ip
Ändern Sie in tmux den Befehl, um einfach aus Ihrer Cache-Datei zu lesen:
cat ~/.cache/my-ip
Dies könnte auch mit einem einzigen Skript erledigt werden, aber eswürdeviel weniger einfach sein:
#!/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";