Die Verwendung von cURL zum Abrufen einer öffentlichen IP für die tmux-Konfiguration führt zu zu vielen Verbindungen

Die Verwendung von cURL zum Abrufen einer öffentlichen IP für die tmux-Konfiguration führt zu zu vielen Verbindungen

Ich verwende derzeit den Befehl: curl icanhazip.comund 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:

  1. 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
    
  2. Ä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";

verwandte Informationen