Cách nhận địa chỉ IP của Raspberry Pi cho SSH


11

Tôi đang sử dụng Mac OSx để truy cập Pi của mình thông qua SSH. Để truy cập nó, tôi biết rằng tôi cần địa chỉ IP của Pi. Vì vậy, tôi quyết định sử dụng một vài lệnh Python luôn thành công trong việc cung cấp cho tôi IP cục bộ.

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

Thật kỳ lạ, tôi chỉ nhận được IP máy chủ cục bộ (127.0.1.1).

Ai đó có thể vui lòng cho tôi biết làm thế nào để có được địa phương / toàn cầu thích hợp (tùy theo cái nào tốt hơn, cái này chỉ cần hoạt động qua mạng LAN bây giờ) IP cho PI?


1
Bạn thậm chí đã thử googling này?
Alexander - Tái lập Monica

Hãy xem lslease , xem câu trả lời của tôi cho [SSH vào Raspberry PI mà không biết địa chỉ IP] [1]. [1]: raspberrypi.stackexchange.com/questions/12440/ từ
sebastian

Bạn đang cố gắng để có được Pi để có được địa chỉ của riêng mình? Làm thế nào điều này giúp bạn ssh, với nó? Chắc chắn bạn cần địa chỉ IP trước bạn ssh.
ctrl-alt-delor

Câu trả lời:


12

Nếu Python là bắt buộc, bạn có thể kiểm tra bài viết này: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

Họ chỉ ra rằng một máy tính có nhiều địa chỉ IP như giao diện mạng.

Đây là mã của họ để lấy địa chỉ IP của bộ điều hợp mạng, tôi đã kiểm tra mã và nó hoạt động:

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

Nếu RPi của bạn được kết nối qua WiFi, tên bộ điều hợp sẽ là wlan0

Nếu không, bạn có thể lấy nó bằng iplệnh:

ip addr show eth0 | grep inet

Bạn sẽ nhận được một cái gì đó như:

inet 192.168.0.140/24 brd ....

Đó là địa chỉ IP của bạn.

Tất nhiên, điều này sẽ không hoạt động nếu bạn chỉ khởi động RPi của mình và không thể kết nối với nó vì bạn không biết địa chỉ IP! Nếu 'đó là trường hợp máy chủ DHCP của bạn chắc chắn sẽ có thể cho bạn biết địa chỉ IP nào anh ấy đã cung cấp cho RPi (hoặc bạn chỉ cần thử tất cả :))

Điều đó nói rằng, bạn có thể có lợi khi giới thiệu RPi theo tên và, vì bạn đang sử dụng máy Mac, có lẽ giải pháp tốt nhất là cài đặt avahi-daemon:

sudo apt-get install avahi-daemon

trong đó thực hiện đặc tả Apple Zeroconf (như Bonjour). Sau đó, bạn có thể ssh đến RPi của bạn theo tên:

ssh pi@raspberry.local

Tôi đã sử dụng một cách tiếp cận khác nhau cho hai Raspberry của mình (có tên là ygdrasilldvalinn ): Tôi đã chọn một IP cố định (192.168.0.140 và 192.168.0.142) để tôi cũng có thể sử dụng tệp etc / hosts trên một số máy khác của mình.

Tôi có thể đã thiết lập DNS nội bộ hoặc dựa vào Thắng, nhưng giải pháp hiện tại phù hợp với tôi.


Xin chào Remo, Cảm ơn bạn đã giải thích chi tiết này. Tôi đã thử mã trên python 3.5 chạy trên rasp pi 3. Nó không hoạt động và dẫn đến lỗi thời gian chạy. "struct.error: đối số cho 's' phải là một đối tượng byte"
Amit Rai Sharma

Tôi tin rằng điều này nên được ssh pi@raspberrypi.localđặt tên máy chủ mặc định cho RPi là raspberrypi. Tại sao avahi-daemon không được cài đặt phổ biến trong thế giới Debian nằm ngoài tôi. Mạng ad-hoc là một giấc mơ khi nó hoạt động ra khỏi hộp.
Heath Raftery

Trái ngược với nhận xét trước đây của tôi, trong Raspbian mới nhất (ngày 19 tháng 4) tính đến thời điểm hiện tại (19 tháng 5), cả độ phân giải raspberrypi.local và tự động gán 169.254.xx mà không cần cấu hình ngoài hộp!
Heath Raftery

2

Mã này:

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

chỉ hoạt động theo python 2.7, nó không hoạt động với python 3, bạn sẽ gặp lỗi rằng đối số cho 's' phải là một đối tượng byte ...


Câu trả lời giúp gì cho câu hỏi? Bạn có một phiên bản hoạt động theo python3?
Ingo

0

Ổ cắm có thể trả về localhost, tùy thuộc vào cách thiết lập HĐH. Vì vậy, nó không phải là di động.

Câu trả lời stackoverflow này về việc nhận IP qua python rất hữu ích - nó giải thích vấn đề với / etc / hosts và đưa ra một cách giải quyết hợp lý. Nó không hoàn hảo (ipv6) và nếu bạn có một số IP bị ràng buộc thì nó có thể không tìm thấy phiên bản có thể định tuyến được, nhưng đối với nhu cầu của bạn thì đó là một oneliner tốt.

Từ dòng lệnh, ifconfiglà bạn của bạn. Nó thường sẽ liệt kê tất cả các giao diện ràng buộc của bạn và như vậy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.