So erhalten Sie die IP-Adresse des Raspberry Pi für SSH

11

Ich verwende Mac OSx, um über SSH auf meinen Pi zuzugreifen. Um darauf zuzugreifen, weiß ich, dass ich die IP-Adresse des Pi benötige. Deshalb habe ich mich für einige Python-Befehle entschieden, denen es immer gelungen ist, mir die lokale IP zu geben.

import socket
host_name = socket.gethostname()
host_ip = socket.gethostbyname(host_name)
print host_ip

Seltsamerweise habe ich nur die lokale Host-IP (127.0.1.1) erhalten.

Kann mir bitte jemand sagen, wie ich die richtige lokale / globale IP (je nachdem, was besser ist, dies muss vorerst nur über LAN funktionieren) für den PI erhalte?

xxmbabanexx
quelle
1
Haben Sie sogar versucht, dies zu googeln?
Alexander - Reinstate Monica
Werfen Sie einen Blick auf lsleases , siehe meine Antwort für [SSH in Raspberry PI ohne Kenntnis der IP-Adresse] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
Sebastian
Versuchen Sie, den Pi dazu zu bringen, seine eigene Adresse zu erhalten? Wie hilft dir sshdas dabei? Sicherlich brauchen Sie die IP-Adresse vor sich ssh.
Strg-Alt-Delor

Antworten:

12

Wenn Python ein Muss ist, können Sie diesen Artikel lesen : http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Sie weisen zu Recht darauf hin, dass ein Computer so viele IP-Adressen wie Netzwerkschnittstellen hat.

Hier ist ihr Code, um die IP-Adresse eines Netzwerkadapters zu erhalten. Ich habe den Code getestet und er funktioniert:

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

print get_ip_address('lo')
print get_ip_address('eth0')

Wenn Ihr RPi über WLAN verbunden ist, sollte der Adaptername lauten wlan0

Andernfalls können Sie es mit dem ipBefehl erhalten:

ip addr show eth0 | grep inet

Sie sollten etwas bekommen wie:

inet 192.168.0.140/24 brd ....

Das ist deine IP-Adresse.

Natürlich funktioniert nichts davon, wenn Sie nur Ihr RPi starten und keine Verbindung herstellen können, weil Sie die IP-Adresse nicht kennen! Wenn dies der Fall ist, kann Ihr DHCP-Server Ihnen sicherlich mitteilen, welche IP-Adresse er gerade dem RPi gegeben hat (oder Sie probieren einfach alle aus :))

Das heißt, Sie könnten davon profitieren, wenn Sie Ihr RPi nach Namen referenzieren. Da Sie einen Mac verwenden, ist es wahrscheinlich die beste Lösung, avahi-daemon zu installieren:

sudo apt-get install avahi-daemon

Dies implementiert die Apple Zeroconf-Spezifikation (wie Bonjour). Sie können dann mit Namen zu Ihrem RPi ssh:

ssh pi@raspberry.local

Ich habe für meine beiden Himbeeren ( ygdrasill und dvalinn ) einen anderen Ansatz verwendet : Ich habe mich für eine feste IP (192.168.0.140 und 192.168.0.142) entschieden, damit ich auf einigen meiner anderen Computer auch die Datei etc / hosts verwenden kann.

Ich hätte ein internes DNS einrichten oder mich auf Wins verlassen können, aber die aktuelle Lösung funktioniert für mich.

Remo.D
quelle
Hallo Remo, danke, dass du das ausführlich erklärt hast. Ich habe versucht, Sie Code auf Python 3.5 unter Rasp Pi 3 auszuführen. Es funktioniert nicht und führt zu einem Laufzeitfehler. "struct.error: Argument für 's' muss ein Byte-Objekt sein"
Amit Rai Sharma
Ich glaube, dies sollte ssh [email protected]der Standard-Hostname für ein RPi sein raspberrypi. Warum Avahi-Daemon in der Debian-Welt nicht universell installiert ist, ist mir ein Rätsel. Ad-hoc-Netzwerke sind ein Traum, wenn sie sofort funktionieren.
Heath Raftery
Im Gegensatz zu meinem vorherigen Kommentar funktionieren im letzten Raspbian (19. April) ab sofort (19. Mai) sowohl die raspberrypi.local-Auflösung als auch die automatische Zuweisung von 169.254.xx ohne sofortige Konfiguration!
Heath Raftery
2

Dieser Code:

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

print get_ip_address('lo')
print get_ip_address('eth0')

funktioniert nur unter Python 2.7, es funktioniert nicht mit Python 3, Sie erhalten die Fehlermeldung, dass das Argument für 's' ein Byte-Objekt sein muss ...

Odolyte
quelle
Was hilft die Antwort auf die Frage? Haben Sie eine Version, die unter funktioniert python3?
Ingo
0

Der Socket gibt möglicherweise den lokalen Host zurück, je nachdem, wie das Betriebssystem eingerichtet ist. Es ist also nicht tragbar.

Diese Stackoverflow-Antwort zum Abrufen von IP über Python ist hilfreich. Sie erklärt das Problem mit / etc / hosts und bietet eine angemessene Problemumgehung. Es ist nicht perfekt (ipv6), und wenn Sie mehrere gebundene IPs haben, findet es möglicherweise nicht die routingfähige Version, aber für Ihre Anforderungen ist es ein guter Oneliner.

Von der Kommandozeile ifconfigist dein Freund. In der Regel werden alle gebundenen Schnittstellen und dergleichen aufgelistet.

tedder42
quelle