以下问题已得到部分回答,请参阅下面的解决方案部分。因此,我发布此内容的部分目的是为了帮助其他人,并且由于我所提供的解决方案尚未真正解决问题。
问题
因此,问题是,为什么以下技术(使用python的平台和套接字库)给出的主机名会根据您连接的路由器提供不同的主机名,以及为什么它也与计算机名以及本地主机名不同。顺便说一句,这也非常特定于mac。
首先,我使用的是配备High Sierra 10.13.6的MacBook Pro 2015机型。我使用终端并执行以下操作:
import platform
platform.node()
根据分配给MacBook的IP地址,这会给我类似“192-168-1-4.tpgi.com.au”的信息。不同的路由器给出不同的结果。
我也从获得类似的结果
import socket
socket.gethostname()
再次返回类似“192-168-1-4.tpgi.com.au”的信息。
其次,我承认这篇文章回答了类似的问题4271740/how-can-i-use-python-to-get-the-system-hostname
但是,这个问题稍有不同,毕竟,就我的应用程序用户而言,主机名应该是他们在系统设置中可以看到的主机名,实际上是不同的。如果我运行:
sudo scutil --get LocalHostName
我得到的名称如系统设置所示(在共享下,它令人困惑地显示了计算机名和本地主机名,它们也可以不同)。显示本地主机名并带有以下限定语句:
所有这些都是问题,其原因是我的应用程序使用了主机名,该主机名与Mac上的本地主机名和计算机名不同。然后,该主机名将出现在我们的用户界面中,并且当其形式为“192-168-1-4.tpgi.com.au”时,当然对识别用户的计算机没有帮助。用户很可能期望看到他们的计算机名称,因为这是可见的。在Mac上,主机名不可见,可以通过命令设置或获取,但如果遇到此问题,我们的用户自然不会想到。
解决方案
因此,问题与我认为开箱即用的Mac设置有关。可以在终端上使用以下命令在Mac上查询主机名:
hostname
192-168-1-4.tpgi.com.au
这将返回实际用于解析为IP地址的主机名。正如我上面提到的,这与使用我们的应用程序时容易引起混淆的计算机名称不匹配。当我运行以下查询时,我发现了这一点。
sudo scutil --get HostName
HostName: not set
所以我使用以下命令将主机名设置为我可以识别的机器名称,如下所示
sudo scutil --set HostName foo
现在,当我运行以下命令时,我和其他较不技术的用户都会得到预期的结果。
import socket
socket.gethostname()
foo
import platform
platform.node()
foo
最后只是为了很好,我从航站楼跑了
hostname
foo
结论
好的,所以尽管我写了一个解决方案,但实际上并不是我需要的解决方案,问题是我需要显示用户设置并可以识别的计算机名称,而不是主机名称。由于我使用的是python,因此我非常希望能够找到适用于mac的python命令,该命令可以找到计算机名称,而不是主机名。因此,如果有人知道一种干净且可持续的方式(我宁愿不必运行shell命令并解析其输出),我将不胜感激!如果相同的命令(或功能)也可以在其他操作系统类型(例如Windows和Linux)上运行,那将是很好的选择,但是我已经接受了这是Mac的东西,至少据我所知。
同时,我希望以上内容对其他遇到类似问题的人有所帮助:)
谢谢!
最佳答案
我可以确认此错误以及变通办法,并注意它不会立即生效,无需重新启动,但DNS缓存需要过期(或过期)才能完全生效。
我遇到了同样的问题,它会影响任何非fqdn的分辨率,不仅会影响本地计算机名称。例如,nslookup
或ping
似乎完美地工作,而只有python socket.getfqdn()
和socket.gethostbyname()
似乎被破坏了。我的系统同时具有IPv4和IPv6堆栈,这可能与该问题有关。
因此,解决方法如下所示:
sudo scutil --set HostName `hostname`
hostname
必须返回FQDN才能正常工作。在我的情况下,就像
foo.lan
一样,在执行此操作之后,python开始能够解析诸如foo.lab
或bar.lan
的名称。因为OS native 工具不受此影响,所以我最终创建了一个与MacOS相关的Python错误,因为我们不应该被迫使用上述替代方法来使其工作。
https://bugs.python.org/issue35164
关于python - 如何在MacOS Sierra/High Sierra中使用python获取用户设置的计算机名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52602107/