Comment obtenir l'adresse IP du Raspberry Pi pour SSH

11

J'utilise Mac OSx pour accéder à mon Pi via SSH. Pour y accéder, je sais que j'ai besoin de l'adresse IP du Pi. J'ai donc décidé d'utiliser quelques commandes Python qui ont toujours réussi à me donner l'adresse IP locale.

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

Curieusement, je n'ai obtenu que l'adresse IP de l'hôte local (127.0.1.1).

Quelqu'un peut-il s'il vous plaît me dire comment obtenir le bon IP local / global (selon ce qui est le mieux, cela ne doit fonctionner que sur LAN pour le moment) pour le PI?

xxmbabanexx
la source
1
Avez-vous même essayé de googler cela?
Alexander - Rétablir Monica
Jetez un oeil à lsleases , voir ma réponse pour [SSH dans Raspberry PI sans connaître l'adresse IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian
Essayez-vous d'obtenir le Pi pour obtenir sa propre adresse? Comment cela vous aide- ssht-il? Vous avez sûrement besoin de l'adresse IP avant vous ssh.
ctrl-alt-delor

Réponses:

12

Si Python est un must, vous pouvez consulter cet article: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Ils soulignent à juste titre qu'un ordinateur a autant d'adresses IP que d'interfaces réseau.

Voici leur code pour obtenir l'adresse IP d'une carte réseau, j'ai testé le code et ça marche:

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')

Si votre RPi est connecté via WiFi, le nom de l'adaptateur doit être wlan0

Sinon, vous pouvez l'obtenir avec la ipcommande:

ip addr show eth0 | grep inet

Vous devriez obtenir quelque chose comme:

inet 192.168.0.140/24 brd ....

Voilà votre adresse IP.

Bien sûr, rien de tout cela ne fonctionnera si vous démarrez simplement votre RPi et ne pouvez pas vous y connecter car vous ne connaissez pas l'adresse IP! Si c'est le cas, votre serveur DHCP sera sûrement en mesure de vous dire quelle adresse IP il vient de donner au RPi (ou vous les essayez tous :))

Cela dit, vous pourriez bénéficier du référencement de votre RPi par son nom et, puisque vous utilisez un Mac, la meilleure solution serait probablement d'installer avahi-daemon:

sudo apt-get install avahi-daemon

qui implémente la spécification Apple Zeroconf (comme Bonjour). Vous pouvez ensuite accéder à votre RPi par nom:

ssh pi@raspberry.local

J'ai utilisé une approche différente pour mes deux framboises (nommées ygdrasill et dvalinn ): j'ai opté pour une IP fixe (192.168.0.140 et 192.168.0.142) afin que je puisse également utiliser le fichier etc / hosts sur certaines de mes autres machines.

J'aurais pu configurer un DNS interne ou compter sur Wins, mais la solution actuelle fonctionne pour moi.

Remo.D
la source
Salut Remo, Merci d'avoir expliqué cela en détail. Je vous ai essayé de coder sur python 3.5 fonctionnant sur rasp pi 3. Cela ne fonctionne pas et entraîne une erreur d'exécution. "struct.error: l'argument pour 's' doit être un objet octets"
Amit Rai Sharma
Je crois que cela devrait être ssh [email protected]donné le nom d'hôte par défaut pour un RPi est raspberrypi. Pourquoi avahi-daemon n'est pas installé universellement dans le monde Debian me dépasse. Les réseaux ad-hoc sont un rêve lorsqu'il fonctionne dès le départ.
Heath Raftery
Contrairement à mon commentaire précédent, dans le dernier Raspbian (avril 19) à partir de maintenant (19 mai), la résolution raspberrypi.local et l'assignation automatique 169.254.xx fonctionnent sans configuration prête à l'emploi!
Heath Raftery
2

Ce 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')

ne fonctionne que sous python 2.7, il ne fonctionne pas avec python 3, vous obtiendrez l'erreur que l'argument pour 's' doit être un objet octet ...

Odolyte
la source
Qu'est-ce que la réponse aide à la question? Avez-vous une version qui fonctionne sous python3?
Ingo
0

socket peut renvoyer l'hôte local, selon la configuration du système d'exploitation. Ce n'est donc pas portable.

Cette réponse de stackoverflow sur l'obtention d'IP via python est utile - elle explique le problème avec / etc / hosts et donne une solution de contournement décente. Ce n'est pas parfait (ipv6), et si vous avez plusieurs IP liées, il peut ne pas trouver la version routable, mais pour vos besoins c'est un bon oneliner.

Depuis la ligne de commande, ifconfigc'est votre ami. Il répertorie généralement toutes vos interfaces liées et autres.

tedder42
la source