Cómo obtener la dirección IP de Raspberry Pi para SSH

11

Estoy usando Mac OSx para acceder a mi Pi a través de SSH. Para acceder a él, sé que necesito la dirección IP de Pi. Entonces, decidí usar algunos comandos de Python que siempre han tenido éxito en darme la IP local.

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

Curiosamente, solo obtuve la IP del host local (127.0.1.1).

¿Alguien puede decirme cómo obtener la IP local / global adecuada (lo que sea mejor, esto solo necesita funcionar a través de LAN por ahora) IP para el PI?

xxmbabanexx
fuente
1
¿Has intentado buscar en Google esto?
Alexander - Restablece a Mónica el
Eche un vistazo a lsleases , vea mi respuesta para [SSH en Raspberry PI sin conocer la dirección IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian
¿Estás intentando que el Pi obtenga su propia dirección? ¿Cómo te ayuda sshesto? Seguramente necesita la dirección IP antes que usted ssh.
ctrl-alt-delor

Respuestas:

12

Si Python es imprescindible, puede consultar este artículo: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Señalan acertadamente que una computadora tiene tantas direcciones IP como interfaces de red.

Aquí está su código para obtener la dirección IP de un adaptador de red, he probado el código y funciona:

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 su RPi está conectado a través de WiFi, el nombre del adaptador debe ser wlan0

De lo contrario, puede obtenerlo con el ipcomando:

ip addr show eth0 | grep inet

Deberías obtener algo como:

inet 192.168.0.140/24 brd ....

Esa es tu dirección IP.

Por supuesto, nada de esto funcionará si solo inicia su RPi y no se puede conectar a él porque no conoce la dirección IP. Si ese es el caso, su servidor DHCP seguramente podrá decirle qué dirección IP le dio al RPi (o simplemente probarlos todos :))

Dicho esto, podría beneficiarse de hacer referencia a su RPi por nombre y, dado que está utilizando una Mac, probablemente la mejor solución sería instalar avahi-daemon:

sudo apt-get install avahi-daemon

que implementa la especificación Apple Zeroconf (como Bonjour). Luego puede enviar ssh a su RPi por nombre:

ssh pi@raspberry.local

Utilicé un enfoque diferente para mis dos Raspberrys (llamados ygdrasill y dvalinn ): opté por una IP fija (192.168.0.140 y 192.168.0.142) para que también pueda usar el archivo etc / hosts en algunas de mis otras máquinas.

Podría haber configurado un DNS interno o confiar en Wins, pero la solución actual funciona para mí.

Remo.D
fuente
Hola Remo, gracias por explicar esto en detalle. Intenté codificar en Python 3.5 ejecutándose en rasp pi 3. No funciona y produce un error de tiempo de ejecución. "struct.error: el argumento para 's' debe ser un objeto de bytes"
Amit Rai Sharma
Creo que se ssh [email protected]le debe dar el nombre de host predeterminado para un RPi raspberrypi. Por qué avahi-daemon no está instalado universalmente en el mundo Debian está más allá de mí. Las redes ad-hoc son un sueño cuando salen de la caja.
Heath Raftery
En contraste con mi comentario anterior, en el último Raspbian (19 de abril) a partir de ahora (19 de mayo), tanto la resolución raspberrypi.local como la 169.254.xx de asignación automática funcionan sin configuración de fábrica.
Heath Raftery
2

Este código:

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

solo funciona con python 2.7, no funciona con python 3, obtendrá el error de que el argumento para 's' debe ser un objeto byte ...

Odolito
fuente
¿Qué ayuda la respuesta a la pregunta? ¿Tienes una versión que funciona bajo python3?
Ingo
0

el socket puede devolver el host local, dependiendo de cómo esté configurado el sistema operativo. Entonces no es portátil.

Esta respuesta de stackoverflow sobre cómo obtener IP a través de Python es útil: explica el problema con / etc / hosts y ofrece una solución decente. No es perfecto (ipv6), y si tiene varias direcciones IP enlazadas, es posible que no encuentre la versión enrutable, pero para sus necesidades es una buena línea.

Desde la línea de comandos, ifconfiges tu amigo. Por lo general, enumerará todas sus interfaces enlazadas y demás.

tedder42
fuente