如何在 MacOS Sierra/High Sierra 中使用 python 获取用户设置的计算机名称

Jam*_*her 6 python hostname computer-name macos-high-sierra macos-mojave

以下问题已部分回答,请参阅下面的解决方案部分。所以我发布这个部分是为了帮助其他人,而且因为我的解决方案还没有真正解决问题。

所以,问题是为什么以下技术(使用 python 的平台和套接字库)给出的主机名根据您连接的路由器给出不同的主机名,以及为什么它也不同于计算机名和本地主机名。顺便说一下,这也是非常特定于 mac 的。

首先,我使用的是配备 High Sierra 10.13.6 的 MacBook pro 2015 型号。我使用终端并执行以下操作:

import platform
platform.node()
Run Code Online (Sandbox Code Playgroud)

根据分配给 MacBook 的 IP 地址,这给了我类似“192-168-1-4.tpgi.com.au”的信息。不同的路由器给出不同的结果。我也得到了类似的结果

import socket
socket.gethostname()
Run Code Online (Sandbox Code Playgroud)

它再次返回类似于“192-168-1-4.tpgi.com.au”的内容。

其次,我承认回答类似问题的文章 4271740/how-can-i-use-python-to-get-the-system-hostname

但是,这个问题略有不同,毕竟就我的应用程序的用户而言,主机名应该是他们在系统设置中可以看到的,实际上是不同的。如果我运行:

sudo scutil --get LocalHostName
Run Code Online (Sandbox Code Playgroud)

我得到系统设置中显示的名称(在共享下,它相当混乱地显示了计算机名称和本地主机名,它们也可以不同)。本地主机名与限定语句一起显示:

您本地网络上的计算机可以通过以下网址访问您的计算机:foo.local

所有这一切都是一个问题的原因是我的应用程序使用了主机名,这与 mac 上的本地主机名和计算机名不同。该主机名随后会出现在我们的用户界面中,当然,当其格式为“192-168-1-4.tpgi.com.au”时,它对识别用户的计算机没有帮助。用户很可能希望看到他们的计算机名称,因为这是可见的。在 Mac 上,主机名是不可见的,它可以通过命令设置或获取,但如果遇到这个问题,我们的用户自然不会想到它。

解决方案

所以问题与我相信如何开箱即用地设置 macs 相关。在mac上可以通过终端中使用以下命令来查询主机名:

hostname
192-168-1-4.tpgi.com.au
Run Code Online (Sandbox Code Playgroud)

这将返回实际用于解析 IP 地址的主机名。正如我上面提到的,这与计算机名称不匹配,这在使用我们的应用程序时往往会引起混淆。当我运行以下查询时,我发现了这一点。

sudo scutil --get HostName
HostName: not set
Run Code Online (Sandbox Code Playgroud)

所以我使用以下命令将主机名设置为我为机器识别的名称,如下所示

sudo scutil --set HostName foo
Run Code Online (Sandbox Code Playgroud)

现在,当我运行以下命令时,我得到了我和其他技术含量较低的用户所期望的结果。

import socket
socket.gethostname()
foo

import platform
platform.node()
foo
Run Code Online (Sandbox Code Playgroud)

最后只是为了更好的衡量,从我跑的终端

hostname
foo
Run Code Online (Sandbox Code Playgroud)

结论

好的,虽然我已经写了我找到了一个解决方案,但它并不是我真正需要的解决方案,问题是我需要显示用户设置的计算机名称,而不是主机名。由于我使用的是 python,我真的很希望能够为 mac 找到一个 python 命令,它可以找到计算机名,而不是主机名。因此,如果有人知道这样做的干净且可持续的方式(我宁愿不必运行 shell 命令并解析其输出),我将不胜感激!如果相同的命令(或函数)也能在 Windows 和 linux 等其他操作系统类型上运行,那就太好了,但我已经接受这是一个 mac 的东西,至少据我所知。

同时,如果其他人遇到类似问题,我希望以上内容能有所帮助:)

谢谢!

sor*_*rin 1

我可以确认此错误以及解决方法,并注意它不会立即生效,无需重新启动,但 DNS 缓存需要过期(或已过期)才能完全生效。

我遇到了同样的问题,它影响任何非 FQDN 解析,而不仅仅是本地计算机名称。例如nslookup, orping似乎工作得很好,而只有 pythonsocket.getfqdn()并且socket.gethostbyname()似乎被破坏了。我的系统同时具有 IPv4 和 IPv6 堆栈,这可能与该问题有关。

所以解决方法看起来像:

sudo scutil --set HostName `hostname`
Run Code Online (Sandbox Code Playgroud)

为了使其正常工作,必须hostname返回 FQDN。

就我而言,就像是foo.lan,完成此操作后,python 开始能够解析类似foo.lab或这样的名称bar.lan

因为操作系统本机工具不受此影响,所以我最终创建了一个与 MacOS 相关的 Python 错误,因为我们不应该被迫使用上面的解决方法来使其工作。

https://bugs.python.org/issue35164 <-- 让我们继续这里。