Как получить IP-адрес Raspberry Pi для SSH

11

Я использую Mac OSx для доступа к своему Pi через SSH. Чтобы получить к нему доступ, я знаю, что мне нужен IP-адрес Пи. Итак, я решил использовать несколько команд Python, которые всегда давали мне локальный IP.

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

Как ни странно, я получил только локальный IP-адрес хоста (127.0.1.1).

Может кто-нибудь сказать мне, как получить правильный локальный / глобальный (в зависимости от того, что лучше, это нужно только для работы по локальной сети) IP для PI?

xxmbabanexx
источник
1
Вы когда-нибудь пытались погуглить?
Александр - Восстановить Монику
Посмотрите на lsleases , посмотрите мой ответ для [SSH в Raspberry PI, не зная IP-адреса] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
Себастьян
Вы пытаетесь заставить Пи получить свой собственный адрес? Как это вам поможет ssh? Конечно, вам нужен IP-адрес перед вами ssh.
Ctrl-Alt-Delor

Ответы:

12

Если Python является обязательным, вы можете проверить эту статью: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Они справедливо указывают, что компьютер имеет столько же IP-адресов, сколько сетевых интерфейсов.

Вот их код для получения IP-адреса сетевого адаптера, я проверил код, и он работает:

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

Если ваш RPi подключен через WiFi, имя адаптера должно быть wlan0

В противном случае вы можете получить его с помощью ipкоманды:

ip addr show eth0 | grep inet

Вы должны получить что-то вроде:

inet 192.168.0.140/24 brd ....

Это твой IP-адрес.

Конечно, ничего из этого не будет работать, если вы просто загрузите свой RPi и не сможете подключиться к нему, потому что вы не знаете IP-адрес! Если это так, ваш DHCP-сервер наверняка сможет сказать вам, какой IP-адрес он только что дал RPi (или вы просто попробуете их все :))

Тем не менее, вам может быть полезно ссылаться на ваш RPi по имени, и, поскольку вы используете Mac, вероятно, лучшим решением будет установка avahi-daemon:

sudo apt-get install avahi-daemon

который реализует спецификацию Apple Zeroconf (например, Bonjour). Затем вы можете SSH к вашему RPi по имени:

ssh pi@raspberry.local

Я использовал другой подход для двух моих Raspberrys (названных ygdrasill и dvalinn ): я выбрал фиксированный IP (192.168.0.140 и 192.168.0.142), поэтому я также могу использовать файл etc / hosts на некоторых других моих машинах.

Я мог бы настроить внутренний DNS или полагаться на Wins, но текущее решение работает для меня.

Remo.D
источник
Привет Ремо, спасибо за объяснение этого в деталях. Я попробовал ваш код на python 3.5, работающем на rasp pi 3. Это не работает и приводит к ошибке во время выполнения. "struct.error: аргумент для 's' должен быть байтовым объектом"
Амит Рай Шарма
Я считаю, что это должно быть ssh pi@raspberrypi.localдано имя хоста по умолчанию для RPi raspberrypi. Почему avahi-daemon не является универсально установленным в мире Debian, мне не понятно. Специальные сети - это мечта, когда она работает «из коробки».
Хит
В отличие от моего предыдущего комментария, в последнем Raspbian (19 апреля) на данный момент (19 мая) разрешение raspberrypi.local и автоматическое назначение 169.254.xx работают без настройки из коробки!
Хит
2

Этот код:

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

работает только под python 2.7, с python 3 не работает, вы получите ошибку, что аргумент для 's' должен быть байтовым объектом ...

Odolyte
источник
Что поможет ответ на вопрос? У вас есть версия, которая работает под python3?
Инго
0

Сокет может вернуть localhost, в зависимости от того, как установлена ​​ОС. Так что это не портативно.

Этот ответ о стеке потока о получении IP через python полезен - он объясняет проблему с / etc / hosts и дает достойный обходной путь. Он не идеален (ipv6), и если у вас есть несколько связанных IP-адресов, он может не найти маршрутизируемую версию, но для ваших нужд это хороший сторонник.

С командной строки, ifconfigтвой друг. Обычно в нем перечислены все ваши связанные интерфейсы и тому подобное.

tedder42
источник