Як отримати IP-адресу Raspberry Pi для SSH


11

Я використовую Mac OSx для доступу до свого Pi через SSH. Щоб отримати доступ до нього, я знаю, що мені потрібна IP-адреса Pi. Отже, я вирішив використати кілька команд Python, які завжди домагалися локальної IP-адреси.

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

Як не дивно, я лише отримав IP локального хоста (127.0.1.1).

Може хто-небудь скажіть, будь ласка, як отримати належний локальний / глобальний (залежно від того, що краще, це потрібно лише зараз працювати над локальною мережею) IP для ПІ?


1
Ви навіть пробували це гуглити?
Олександр - Відновіть Моніку

Погляньте на випуски , подивіться мою відповідь щодо [SSH в Raspberry PI, не знаючи IP-адреси] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian

Ви намагаєтесь отримати Pi для отримання власної адреси? Як вам це допомагає 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, але поточне рішення працює для мене.


Привіт Ремо, Дякую за детальне пояснення. Я спробував вам код на python 3.5, який працює на Ras pi 3. Це не працює і призводить до помилки виконання. "struct.error: аргумент 's' повинен бути об'єктом байтів"
Amit Rai Sharma

Я вважаю, що цьому слід вказати ssh pi@raspberrypi.localім'я хоста за замовчуванням для RPi є raspberrypi. Чому avahi-демон не є універсально встановленим у світі 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' повинен бути об'єктом байта ...


Що допомагає відповідь на питання? Чи є у вас версія, під якою працює python3?
Інго

0

socket може повернути localhost, залежно від способу налаштування ОС. Тож це не портативно.

Ця відповідь stackoverflow про отримання IP через python є корисною - вона пояснює проблему з / etc / hosts та дає гідний спосіб вирішення. Він не є ідеальним (ipv6), і якщо у вас є кілька пов'язаних IP-адрес, він може не знайти маршрутизовану версію, але для ваших потреб це хороший oneliner.

З командного рядка ifconfig- твій друг. Зазвичай він перераховує всі ваші пов'язані інтерфейси тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.