Cara mendapatkan alamat IP Raspberry Pi untuk SSH

11

Saya menggunakan Mac OSx untuk mengakses Pi saya melalui SSH. Untuk mengaksesnya, saya tahu bahwa saya memerlukan alamat IP Pi. Jadi, saya memutuskan untuk menggunakan beberapa perintah Python yang selalu berhasil memberi saya IP lokal.

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

Anehnya, saya hanya mendapatkan IP host lokal (127.0.1.1).

Bisakah seseorang tolong beri tahu saya cara mendapatkan IP lokal / global yang tepat (mana yang lebih baik, ini hanya perlu bekerja melalui LAN untuk saat ini) IP untuk PI?

xxmbabanexx
sumber
1
Pernahkah Anda mencoba googling ini?
Alexander - Pasang kembali Monica
Lihatlah gangguannya , lihat jawaban saya untuk [SSH ke Raspberry PI tanpa mengetahui alamat IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/…
sebastian
Apakah Anda mencoba mendapatkan Pi untuk mendapatkan alamatnya sendiri? Bagaimana ini membantu Anda ssh, untuk itu? Tentunya Anda membutuhkan alamat IP sebelum Anda ssh.
ctrl-alt-delor

Jawaban:

12

Jika Python adalah suatu keharusan, Anda dapat memeriksa artikel ini: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Mereka dengan tepat menunjukkan bahwa komputer memiliki alamat IP sebanyak antarmuka jaringan.

Berikut ini adalah kode mereka untuk mendapatkan alamat IP dari adaptor jaringan, saya telah menguji kodenya dan berfungsi:

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

Jika RPi Anda terhubung melalui WiFi, nama adaptor seharusnya wlan0

Kalau tidak, Anda bisa mendapatkannya dengan ipperintah:

ip addr show eth0 | grep inet

Anda harus mendapatkan sesuatu seperti:

inet 192.168.0.140/24 brd ....

Itu alamat IP Anda.

Tentu saja semua ini tidak akan berfungsi jika Anda hanya mem-boot RPi Anda dan tidak dapat terhubung karena Anda tidak tahu alamat IP! Jika demikian, server DHCP Anda pasti akan dapat memberi tahu Anda alamat IP yang ia berikan kepada RPi (atau Anda hanya mencoba semuanya :))

Yang mengatakan, Anda mungkin mendapat manfaat dari merujuk Anda RPi dengan nama dan, karena Anda menggunakan Mac, mungkin solusi terbaik adalah menginstal avahi-daemon:

sudo apt-get install avahi-daemon

yang mengimplementasikan spesifikasi Apple Zeroconf (seperti Bonjour). Anda kemudian dapat ssh ke RPi Anda dengan nama:

ssh pi@raspberry.local

Saya menggunakan pendekatan yang berbeda untuk dua Raspberry saya (bernama ygdrasill dan dvalinn ): Saya telah memilih IP tetap (192.168.0.140 dan 192.168.0.142) sehingga saya juga dapat menggunakan file etc / hosts di beberapa komputer saya yang lain.

Saya bisa mengatur DNS internal atau mengandalkan Win, tetapi solusi saat ini bekerja untuk saya.

Remo.D
sumber
Hai Remo, Terima kasih telah menjelaskan ini secara rinci. Saya mencoba Anda kode pada python 3.5 berjalan pada rasp pi 3. Tidak berfungsi dan menghasilkan kesalahan runtime. "struct.error: argumen untuk 's' harus berupa objek byte"
Amit Rai Sharma
Saya percaya ini harus ssh [email protected]diberi nama host default untuk RPi raspberrypi. Mengapa avahi-daemon tidak diinstal secara universal di dunia Debian adalah di luar jangkauan saya. Jaringan ad-hoc adalah mimpi ketika berhasil di luar kotak.
Heath Raftery
Berbeda dengan komentar saya sebelumnya, dalam Raspbian terbaru (Apr19) seperti yang sekarang (May19), resolusi raspberrypi.local dan 169.254.xx auto-assignment bekerja tanpa konfigurasi di luar kotak!
Heath Raftery
2

Kode ini:

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

hanya bekerja di bawah python 2.7, itu tidak berfungsi dengan python 3, Anda akan mendapatkan kesalahan bahwa argumen untuk 's' harus berupa objek byte ...

Odolyte
sumber
Apa jawaban yang membantu untuk pertanyaan itu? Apakah Anda memiliki versi yang berfungsi di bawah python3?
Ingo
0

socket dapat mengembalikan localhost, tergantung pada bagaimana OS diatur. Jadi tidak portabel.

Jawaban stackoverflow ini tentang mendapatkan IP melalui python sangat membantu - ini menjelaskan masalah dengan / etc / hosts dan memberikan solusi yang layak. Ini tidak sempurna (ipv6), dan jika Anda memiliki beberapa IP terikat mungkin tidak menemukan versi routable, tetapi untuk kebutuhan Anda itu adalah oneliner yang bagus.

Dari baris perintah, ifconfigadalah teman Anda. Biasanya akan mencantumkan semua antarmuka terikat Anda dan semacamnya.

tedder42
sumber