Как получить пользовательское имя компьютера с помощью python в MacOS Sierra / High Sierra - PullRequest
0 голосов
/ 02 октября 2018

На вопрос ниже частично дан ответ, см. Раздел Решение ниже.Так что я публикую это частично, чтобы помочь другим, а также, поскольку решение, которое у меня есть, еще не решило проблему.

Вопрос

Итак, вопрос в том, почему имя хоста, заданное следующими методами (с использованием платформы python и библиотек сокетов), дает разные имена хостов в зависимости от того, какой маршрутизатор вы используете.и почему оно также отличается от имени компьютера и имени локального хоста.Кстати, это очень специфично для Mac.

Во-первых, я использую модель MacBook Pro 2015 с High Sierra 10.13.6.Я использую терминал и делаю следующее:

import platform
platform.node()

Это дает мне что-то вроде '192-168-1-4.tpgi.com.au' в зависимости от IP-адреса, назначенного MacBook.Разные роутеры дают разные результаты.Я также получаю аналогичные результаты от

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

, я получаю имя, как показано в настройках системы (в разделе общего доступа, где оно довольно смущающе показывает как имя компьютера, так и имя локального хоста, которое также может отличаться).Имя локального хоста отображается с уточняющим утверждением:

Компьютеры в вашей локальной сети могут получить доступ к вашему компьютеру по адресу: foo.local

Причина, по которой все этоПроблема в том, что мое приложение использует имя хоста, которое отличается от локального имени хоста и имени компьютера на компьютере 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, мне бы очень хотелось найти команду python для mac, которая могла бы найти имя компьютера, а не имя хоста.Так что если кто-нибудь знает чистый и устойчивый способ сделать это (я бы предпочел не запускать команду оболочки и анализировать ее вывод), я был бы очень благодарен!Было бы замечательно, если бы эта же команда (или функция) также работала на других типах ОС, таких как windows и linux, но я согласился, что это Mac, по крайней мере, насколько я могу судить.

Между тем, я надеюсь, что вышеупомянутое поможет, если кто-то еще столкнется с подобными проблемами:)

Спасибо!

1 Ответ

0 голосов
/ 04 ноября 2018

Я могу подтвердить эту ошибку, а также обойти ее, отметив, что она не вступит в силу сразу же, перезапуск не требуется, но DNS-кэш должен истечь (или истечь) для полной эффективности.

Iвозникает та же проблема, которая затрагивает любое не-fqdn-разрешение, а не только имя локального компьютера.Например, nslookup или ping, кажется, работают идеально, в то время как только python socket.getfqdn() и socket.gethostbyname() кажутся сломанными.В моей системе был стек IPv4 и IPv6, что может быть связано с этой проблемой.

Поэтому обходной путь выглядит следующим образом:

sudo scutil --set HostName `hostname`

Для hostname было бы важно вернуть полное доменное имя вдля того, чтобы это работало.

В моем случае это было похоже на foo.lan, и после выполнения этого Python начал иметь возможность разрешать имена, такие как foo.lab или bar.lan

, потому что OS nativeна инструменты это не повлияло, в итоге я создал ошибку Python, связанную с MacOS, так как мы не должны использовать вышеописанный обходной путь, чтобы заставить его работать.

https://bugs.python.org/issue35164 <- позволяетследуйте здесь. </p>

...