如何获取SSH的Raspberry Pi的IP地址


11

我正在使用Mac OSx通过SSH访问我的Pi。要访问它,我知道我需要Pi的IP地址。因此,我决定使用一些Python命令,这些命令始终成功地为我提供了本地IP。

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

奇怪的是,我只获得了本地主机IP(127.0.1.1)。

有人可以告诉我如何为PI获取正确的本地/全局IP(更好的是,现在仅需要通过LAN工作)IP吗?


1
您甚至尝试过使用Google搜索吗?
亚历山大-恢复莫妮卡

看看lsleases,看看我对[SSH进入Raspberry PI的IP地址不知道] [1]的回答。[1]:raspberrypi.stackexchange.com/questions/12440/...
塞巴斯蒂安

您是否要让Pi获得自己的地址?这对您ssh有什么帮助?当然,您需要IP地址ssh
ctrl-alt-delor

Answers:


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而无法连接到RPi,因为您不知道IP地址,那么所有这些都将无效!如果是这种情况,那么您的DHCP服务器肯定可以告诉您他刚刚给RPi分配了哪个IP地址(或者您只需尝试所有:))

就是说,按名称引用RPi可能会带来好处,并且由于您使用的是Mac,因此最好的解决方案可能是安装avahi-daemon:

sudo apt-get install avahi-daemon

它实现了Apple Zeroconf规范(例如Bonjour)。然后,您可以按名称SSH到RPi:

ssh pi@raspberry.local

我对我的两个Raspberrys(分别称为ygdrasilldvalinn)使用了不同的方法:我选择了固定IP(192.168.0.140和192.168.0.142),因此我也可以在其他一些机器上使用etc / hosts文件。

我本可以设置内部DNS或依靠Wins,但是当前的解决方案对我有用。


嗨雷莫,感谢您详细解释这一点。我尝试过在rasp pi 3上运行的python 3.5上编写代码。它不起作用,并导致运行时错误。“ struct.error:'s'的参数必须是字节对象”
Amit Rai Sharma

我相信应该ssh pi@raspberrypi.local为RPi提供默认的主机名raspberrypi。为什么avahi-daemon没有在Debian世界中普遍安装,这超出了我的范围。临时网络开箱即用时就是一个梦想。
Heath Raftery

与我之前的评论相反,在截至目前(5月19日)的最新Raspbian(Apr19)中,raspberrypi.local分辨率和169.254.xx自动分配均无需配置即可使用!
Heath Raftery

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
Ingo,

0

socket可能会返回本地主机,具体取决于操作系统的设置方式。因此它不是便携式的。

这个关于通过python获取IP的stackoverflow答案很有帮助-它解释了/ etc / hosts的问题,并给出了一个不错的解决方法。它不是完美的(ipv6),如果您有多个绑定的IP,它可能找不到可路由的版本,但是对于您的需求而言,它是一个很好的选择。

在命令行中,ifconfig是您的朋友。它通常会列出您所有的绑定接口等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.