Aktuelle IP-Adresse aus dem Dateisystem lesen?

Aktuelle IP-Adresse aus dem Dateisystem lesen?

Ich schreibe ein Programm, das die aktuelle IPv4-Adresse des Systems (über DHCP empfangen) kennen muss, wenn es verbunden ist und eine hat. Der Argumentation halber ist die Sprache irrelevant und ich muss aus einer Datei auf der Festplatte lesen. Gibt es eine solche Datei, in der immer die aktuelle IPv4-Adresse gespeichert ist?

Antwort1

Es gibt eine Datei /proc/net/tcp, die die IP-Adresse im Little-Endian-Format mit vier Bytes Hexadezimalzahlen speichert. Dabei wird jedoch vorausgesetzt, dass eine Sitzung geöffnet ist, um die IP-Adresse zu finden. Ansonsten können Sie ip addr showauch den Befehl verwenden.

Um die IP-Adresse zu erhalten, müssen Sie die Zeichenfolge umkehren. SieheDasAntwort auf die Frage, wie man die Ausgabe aus der Datei erhält /proc/net/tcp.

Antwort2

Es gibt keine Datei auf der Festplatte, die garantiert die aktuelle IP-Adresse enthält. Wenn Sie Ihre IP-Adresse über DHCP erhalten haben, hat DHCP die Adresse wahrscheinlich irgendwo geschrieben, aber es gibt keinen Standardspeicherort.

Der normale, portable Weg, die aktuelle IP-Adresse zu erhalten, wäre, die Ausgabe von ifconfigoder (nur Linux) zu analysieren ip addr show. Beachten Sie, dass es neben der Adresse der primären Internetverbindung auch die Loopback-Adresse 127.0.0.1 gibt und oft noch weitere (für interne Netzwerke, virtuelle Maschinen usw.). Ein guter Tipp ist, die Adresse der Schnittstelle abzurufen, die die erste Standardroute bereitstellt.

default_interface=$(route -n | awk '$1 == "0.0.0.0" {print $8; exit}')
ip_address=$(ifconfig "$default_interface" | awk 'sub(/.* inet addr:/, "") {print $1}')

Antwort3

Ich habe mir den Ordner von Linux Mint (basierend auf Ubuntu 14.04) angesehen /var/lib/dhcp/und die einzige Datei dort war leer.

Aber als ich jede Datei durchsuchte, fand ich:

  • /var/lib/NetworkManager/dhclient-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-eth0.lease
    (mit den x's fast zufälligen Buchstaben und Zahlen) mit einer fixed-address xxx.xxx...Zeile, die wie die eingefügte Datei aus der Antwort von linuxfan aussieht

  • Einträge in/var/log/syslogbei der IP-Adresse (hier z.B. 192.168.1.2) könntest du eine davon auswählen (evtl. die letzte, falls sie sich häufig ändert)

    8. Jan. 17:49:45 Mint dhclient: DHCPREQUEST von 192.168.1.2 auf eth0 an 255.255.255.255 Port 67 (xid=0xXXXXXXXX)
    8. Jan. 17:49:45 Mint dhclient: DHCPOFFER von 192.168.1.2 von 192.168.1.1
    8. Jan. 17:49:45 Mint dhclient: DHCPACK von 192.168.1.2 von 192.168.1.1
    8. Jan. 17:49:45 Mint dhclient: gebunden an 192.168.1.2 – Erneuerung in 38149 Sekunden.
    8. Jan 17:49:45 mint NetworkManager[1363]: Adresse 192.168.1.2
    8. Jan 17:49:45 mint avahi-daemon[1117]: Beitritt zur mDNS-Multicast-Gruppe auf Schnittstelle eth0.IPv4 mit Adresse 192.168.1.2.
    8. Jan 17:49:45 mint avahi-daemon[1117]: Registrierung eines neuen Adressdatensatzes für 192.168.1.2 auf eth0.IPv4.

Oder, falls Sie eine Bash oder ein anderes Shell-Skript oder etwas Shell-freundliches verwenden, hier ist eine Pipe-freundliche Grep- und Cut-Methode, um die IP abzurufen und sie nach Belieben oder sogar für alle zu ifconfigändern .eth0-a

ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d ' ' -f 1

Es dauert nicht viel länger timeals grep-ing einer einzelnen Datei, das obige dauert, real 0m0.002s, user 0m0.000s, sys 0m0.000swährend grep-ing einer Datei dauertreal 0m0.001s, user 0m0.000s, sys 0m0.000s

Antwort4

Alle DHCP-Lease-Informationen werden gespeichert in/var/lib/dhcp/dhclient.eth0.leases

# tail -14 /var/lib/dhcp/dhclient.eth0.leases 
lease {
  interface "eth0";
  fixed-address 192.168.0.13;
  option subnet-mask 255.255.255.0;
  option routers 192.168.0.1;
  option dhcp-lease-time 604800;
  option dhcp-message-type 5;
  option domain-name-servers 75.75.75.75,75.75.76.76;
  option dhcp-server-identifier 192.168.0.1;
  option domain-name "hsd1.ca.comcast.net.";
  renew 6 2015/01/10 10:38:07;
  rebind 2 2015/01/13 16:19:22;
  expire 3 2015/01/14 13:19:22;
}

Allerdings schadet es nicht, auch die Ausgabe vonifconfig

verwandte Informationen