Como obter o endereço IP do Raspberry Pi para SSH


11

Estou usando o Mac OSx para acessar meu Pi via SSH. Para acessá-lo, eu sei que preciso do endereço IP do Pi. Então, decidi usar alguns comandos Python que sempre conseguiam me fornecer o IP local.

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

Por incrível que pareça, apenas obtive o IP do host local (127.0.1.1).

Alguém pode me dizer como obter o IP local / global adequado (o que for melhor, isso só precisa funcionar na LAN por enquanto) IP para o PI?


1
Você já tentou pesquisar isso no Google?
Alexander - Restabelecer Monica

Dê uma olhada nos lsleases , veja minha resposta para [SSH no Raspberry PI sem saber o endereço IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian

Você está tentando fazer com que o Pi obtenha seu próprio endereço? Como isso ajuda você ssh? Certamente você precisa do endereço IP antes de você ssh.
Ctrl-alt-delor 5/05/19

Respostas:


12

Se o Python for obrigatório, você pode verificar este artigo: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Eles apontam, com razão, que um computador tem tantos endereços IP quanto interfaces de rede.

Aqui está o código para obter o endereço IP de um adaptador de rede, testei o código e 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')

Se o seu RPi estiver conectado via WiFi, o nome do adaptador deve ser wlan0

Caso contrário, você pode obtê-lo com o ipcomando:

ip addr show eth0 | grep inet

Você deve obter algo como:

inet 192.168.0.140/24 brd ....

Esse é o seu endereço IP.

Obviamente, nada disso funcionará se você apenas inicializar o seu RPi e não conseguir se conectar a ele porque não sabe o endereço IP! Se 'for esse o caso, seu servidor DHCP certamente poderá dizer qual endereço IP ele acabou de fornecer ao RPi (ou você apenas tenta todos eles :))

Dito isso, você pode se beneficiar de fazer referência a sua RPi por nome e, como você está usando um Mac, provavelmente a melhor solução seria instalar o avahi-daemon:

sudo apt-get install avahi-daemon

que implementa a especificação Apple Zeroconf (como Bonjour). Você pode então ssh para o seu RPi pelo nome:

ssh pi@raspberry.local

Usei uma abordagem diferente para meus dois Raspberrys (chamados ygdrasill e dvalinn ): optei por um IP fixo (192.168.0.140 e 192.168.0.142), para que eu também possa usar o arquivo etc / hosts em algumas de minhas outras máquinas.

Eu poderia ter configurado um DNS interno ou confiar no Wins, mas a solução atual funciona para mim.


Oi Remo, Obrigado por explicar isso em detalhes. Eu tentei codificar em python 3.5 rodando em rasp pi 3. Ele não funciona e resulta em um erro de tempo de execução. "struct.error: o argumento para 's' deve ser um objeto de bytes"
Amit Rai Sharma

Eu acredito que este deve ssh pi@raspberrypi.localreceber o nome de host padrão para um RPi raspberrypi. Por que o avahi-daemon não é universalmente instalado no mundo Debian está além de mim. As redes ad-hoc são um sonho quando se trabalha fora da caixa.
Heath Raftery

Em contraste com o meu comentário anterior, no último Raspbian (19 de abril) a partir de agora (19 de maio), tanto a resolução raspberrypi.local quanto a atribuição automática 169.254.xx funcionam sem configuração pronta para uso!
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')

só funciona no python 2.7, não funciona no python 3, você receberá o erro de que o argumento para 's' deve ser um objeto de byte ...


O que a resposta ajuda para a pergunta? Você tem uma versão que funcione python3?
Ingo

0

O socket pode retornar o host local, dependendo de como o sistema operacional estiver configurado. Portanto, não é portátil.

Essa resposta do stackoverflow sobre a obtenção de IP via python é útil - explica o problema com o / etc / hosts e fornece uma solução decente. Não é perfeito (ipv6), e se você tiver vários IPs vinculados, pode não encontrar a versão roteável, mas para as suas necessidades é um bom guia.

A partir da linha de comando, ifconfigé seu amigo. Geralmente, lista todas as suas interfaces vinculadas e tal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.