Come ottenere l'indirizzo IP del Raspberry Pi per SSH


11

Sto usando Mac OSx per accedere al mio Pi tramite SSH. Per accedervi, so che ho bisogno dell'indirizzo IP del Pi. Così, ho deciso di utilizzare alcuni comandi Python che sono sempre riusciti a darmi l'IP locale.

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

Stranamente, ho ottenuto solo l'IP host locale (127.0.1.1).

Qualcuno può dirmi come ottenere il corretto local / global (qualunque sia la migliore, per ora deve funzionare solo su LAN) IP per il PI?


1
Hai mai provato a cercarlo su Google?
Alexander - Ripristina Monica

Dai un'occhiata a lsleases , vedi la mia risposta per [SSH in Raspberry PI senza conoscere l'indirizzo IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian,

Stai cercando di ottenere il Pi per ottenere il proprio indirizzo? In che modo ti aiuta ssh? Sicuramente hai bisogno dell'indirizzo IP prima di te ssh.
ctrl-alt-delor

Risposte:


12

Se Python è un must, puoi consultare questo articolo: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Indicano giustamente che un computer ha tanti indirizzi IP quante interfacce di rete.

Ecco il loro codice per ottenere l'indirizzo IP di una scheda di rete, ho testato il codice e funziona:

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

Se il tuo RPi è collegato tramite WiFi, dovrebbe essere il nome dell'adattatore wlan0

Altrimenti puoi ottenerlo con il ipcomando:

ip addr show eth0 | grep inet

Dovresti ottenere qualcosa del tipo:

inet 192.168.0.140/24 brd ....

Questo è il tuo indirizzo IP.

Ovviamente nulla di tutto questo funzionerà se avvii il tuo RPi e non riesci a connetterti perché non conosci l'indirizzo IP! In tal caso, il tuo server DHCP sarà sicuramente in grado di dirti quale indirizzo IP ha appena fornito all'RPi (o semplicemente provali tutti :))

Detto questo, potresti trarre vantaggio dal fare riferimento al tuo RPi per nome e, poiché stai usando un Mac, probabilmente la soluzione migliore sarebbe installare avahi-daemon:

sudo apt-get install avahi-daemon

che implementa la specifica Apple Zeroconf (come Bonjour). Puoi quindi ssh sul tuo RPi per nome:

ssh pi@raspberry.local

Ho usato un approccio diverso per i miei due Raspberrys (chiamati ygdrasill e dvalinn ): ho optato per un IP fisso (192.168.0.140 e 192.168.0.142) in modo da poter usare anche il file etc / hosts su alcune delle mie altre macchine.

Avrei potuto impostare un DNS interno o fare affidamento su Win, ma la soluzione attuale funziona per me.


Ciao Remo, grazie per aver spiegato questo in dettaglio. Ho provato il tuo codice su Python 3.5 in esecuzione su Rasp PI 3. Non funziona e provoca un errore di runtime. "struct.error: l'argomento per 's' deve essere un oggetto byte"
Amit Rai Sharma,

Credo che dovrebbe essere ssh pi@raspberrypi.localassegnato il nome host predefinito per un RPi raspberrypi. Perché avahi-daemon non sia installato universalmente nel mondo Debian è oltre me. Le reti ad hoc sono un sogno quando funziona fuori dagli schemi.
Heath Raftery,

Contrariamente al mio precedente commento, nell'ultimo Raspbian (19 aprile) a partire da ora (19 maggio), sia la risoluzione raspberrypi.local che l'assegnazione automatica 169.254.xx funzionano senza configurazione pronta all'uso!
Heath Raftery,

2

Questo codice:

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

funziona solo con Python 2.7, non funziona con Python 3, otterrai l'errore che l'argomento per 's' deve essere un oggetto byte ...


Cosa aiuta la risposta alla domanda? Hai una versione che funziona sotto python3?
Ingo,

0

socket può restituire il localhost, a seconda della configurazione del sistema operativo. Quindi non è portatile.

Questa risposta allo stackover su come ottenere IP tramite Python è utile: spiega il problema con / etc / hosts e offre una soluzione decente. Non è perfetto (ipv6), e se hai diversi IP associati potrebbe non trovare la versione instradabile, ma per le tue esigenze è un buon oneliner.

Dalla riga di comando, ifconfigè tuo amico. Elencherà in genere tutte le interfacce associate e così via.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.