Jak uzyskać adres IP Raspberry Pi dla SSH

11

Używam Mac OSx, aby uzyskać dostęp do mojego Pi przez SSH. Aby uzyskać do niego dostęp, wiem, że potrzebuję adresu IP Pi. Postanowiłem więc użyć kilku poleceń Pythona, którym zawsze udało mi się podać lokalny adres IP.

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

O dziwo, dostałem tylko lokalny adres IP hosta (127.0.1.1).

Czy ktoś może mi powiedzieć, jak uzyskać właściwy lokalny / globalny (cokolwiek jest lepsze, na razie musi to działać tylko przez sieć LAN) IP dla PI?

xxmbabanexx
źródło
1
Czy próbowałeś nawet google?
Alexander - Przywróć Monikę
Spójrz na lsleases , zobacz moją odpowiedź na [SSH na Raspberry PI bez znajomości adresu IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian
Czy starasz się, aby Pi otrzymało własny adres? Jak ci to pomaga ssh? Na pewno potrzebujesz adresu IP przed sobą ssh.
ctrl-alt-delor

Odpowiedzi:

12

Jeśli Python jest koniecznością, możesz sprawdzić ten artykuł: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Słusznie wskazują, że komputer ma tyle adresów IP, ile interfejsów sieciowych.

Oto ich kod, aby uzyskać adres IP karty sieciowej, przetestowałem kod i działa:

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

Jeśli Twoje RPi jest połączone przez Wi-Fi, nazwa adaptera powinna być wlan0

W przeciwnym razie możesz go uzyskać za pomocą ippolecenia:

ip addr show eth0 | grep inet

Powinieneś dostać coś takiego:

inet 192.168.0.140/24 brd ....

To twój adres IP.

Oczywiście nic z tego nie zadziała, jeśli po prostu uruchomisz RPi i nie możesz się z nim połączyć, ponieważ nie znasz adresu IP! Jeśli tak jest, twój serwer DHCP z pewnością będzie w stanie powiedzieć ci, który adres IP właśnie podał RPi (lub po prostu wypróbujesz je wszystkie :))

To powiedziawszy, możesz skorzystać z odniesienia do RPi po nazwie, a ponieważ używasz komputera Mac, prawdopodobnie najlepszym rozwiązaniem byłoby zainstalowanie demona avahi:

sudo apt-get install avahi-daemon

która implementuje specyfikację Apple Zeroconf (jak Bonjour). Następnie możesz ssh do swojego RPi według nazwy:

ssh pi@raspberry.local

Użyłem odmiennego podejścia do moich dwóch Raspberrys (o nazwach ygdrasill i dvalinn ): zdecydowałem się na stały adres IP (192.168.0.140 i 192.168.0.142), aby móc używać pliku etc / hosts na niektórych moich innych komputerach.

Mogłem skonfigurować wewnętrzny DNS lub polegać na wygranych, ale obecne rozwiązanie działa dla mnie.

Remo.D
źródło
Cześć Remo, Dziękujemy za szczegółowe wyjaśnienie tego. Próbowałem napisać kod w Pythonie 3.5 działającym na rasp pi 3. To nie działa i powoduje błąd w czasie wykonywania. „struct.error: argument dla„ s ”musi być obiektem bajtów”
Amit Rai Sharma
Uważam, że należy ssh [email protected]podać domyślną nazwę hosta dla RPi raspberrypi. Dlaczego avahi-demon nie jest powszechnie zainstalowany w świecie Debiana, jest poza mną. Sieci ad-hoc są marzeniem, gdy działają od razu po wyjęciu z pudełka.
Heath Raftery
W przeciwieństwie do mojego poprzedniego komentarza, w najnowszej wersji Raspbian (19 kwietnia) obecnie (19 maja), zarówno rozdzielczość raspberrypi.local, jak i automatyczne przypisywanie 169.254.xx działają bez konfiguracji po wyjęciu z pudełka!
Heath Raftery
2

Ten kod:

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

działa tylko pod Pythonem 2.7, nie działa z Pythonem 3, pojawi się błąd, że argument dla 's' musi być obiektem bajtowym ...

Odolyte
źródło
Co pomaga odpowiedź na pytanie? Czy masz wersję, pod którą działa python3?
Ingo
0

gniazdo może zwrócić localhost, w zależności od konfiguracji systemu operacyjnego. Więc nie jest przenośny.

Ta odpowiedź na przepełnienie stosu dotycząca uzyskiwania adresu IP przez python jest pomocna - wyjaśnia problem z / etc / hosts i daje przyzwoite obejście. Nie jest doskonały (ipv6), a jeśli masz kilka powiązanych adresów IP, może nie znaleźć wersji z routingiem, ale na twoje potrzeby jest to dobry oneliner.

Z wiersza polecenia ifconfigjest twoim przyjacielem. Zazwyczaj wyświetla listę wszystkich powiązanych interfejsów i tym podobnych.

przetrząsacz42
źródło