Как получить Mac для автоматического переподключения к сети Wi-Fi?

11

У меня есть Mac Mini Server, который каждые несколько дней отключается от сети Wi-Fi. Могут быть и другие параметры, вызывающие первоначальное отключение (например, перезагрузка беспроводного маршрутизатора), но Mac не подключается автоматически.

Это серьезная проблема, поскольку это серверный компьютер, который внезапно становится недоступным, пока кто-то физически не перейдет к компьютеру и не использует меню Wi-Fi для повторного подключения к сети вручную. Я должен отметить, что хотя сеть Wi-Fi является WPA2, повторное подключение вручную не требует повторного ввода пароля, поэтому нет никаких очевидных причин, по которым оно не восстанавливается автоматически.

Как я могу заставить Mac периодически пытаться подключиться к определенной сети Wi-Fi?

ГДж.
источник
Является ли рассматриваемая сеть предпочтительной? В Системных настройках> Сеть вы отметили, что флажок «Помните, к какой сети подключен этот компьютер» и флажок «Отключаться от беспроводных сетей при выходе из системы» не установлен? Вы также можете попытаться удалить и восстановить сетевое соединение.
Harrymc
где именно находится опция «Отключаться от беспроводных сетей при выходе»? Это работает Лев.
ГДж.
Видимо в расширенных настройках.
Harrymc
не для того, чтобы сделать вас параноиком или кем-то еще, но единственный способ взломать шифрование WPA2 - это прослушать пакеты аутентификации (когда компьютер подключается), и наиболее распространенный способ сделать это - де-аутентифицировать одну из машин и прослушать сеть, когда это повторно соединяется.
Нейт Коппенхавер

Ответы:

12

Вот скрипт Applescript и shell, чтобы проверить, подключен ли Airport, а если нет, подключить его.

if (do shell script "networksetup -getinfo Wi-Fi | grep -c 'IP address:'") = 1 then
    do shell script "networksetup -setairportnetwork en1 <networkName> <passwordToNetwork>"
end if
#!/bin/bash
if [ $(networksetup -getinfo Wi-Fi | grep -c 'IP address:') = '1' ]
then networksetup -setairportnetwork en1 <networkName> <passwordToNetwork>
fi

Замените <networkName>на имя сети и <passwordToNetwork>ее пароль. «En1» должно быть правильным, если вы не меняли свои сетевые устройства.

Теперь все, что вам нужно сделать, это зациклить или вызвать его, чтобы проверить соединение.

Тем не менее аэропорт должен автоматически переподключиться, если связь потеряна. Может быть, попробуйте сбросить все настройки сети и посмотреть, работает ли это.

Как полностью сбросить настройки сети: отключите аэропорт. Закройте Системные настройки. Перейдите к: /Library/Preferences/SystemConfiguration/ Сделайте копию, затем удалите следующие файлы:

com.apple.airport.preferences.plist
com.apple.network.*
com.apple.smb.server.plist
NetworkInterfaces.plist
Касым Дорсель
источник
Спасибо. зачем использовать appleScript хотя? похоже, он больше подходит для сценария оболочки, который запускается каждую минуту или около того с помощью launchd.
ГДж.
Кроме того, как вы "сбросить все настройки сети"?
ГДж.
Это можно сделать с помощью сценария оболочки. Хотя я лучше в Applescript, поэтому я написал это в Applescript. Я посмотрю, смогу ли я написать это в сценарии оболочки. Я также обновил сообщение о сбросе настроек сети.
Касым Дорсель
Улучшен скрипт и добавлен скрипт оболочки.
Касым Дорсель
Я исправил самую вопиющую ошибку сценария оболочки, но, вероятно, ее следует еще немного изменить. На моем Mac я получаю два удара, grepкогда он работает, и только один, когда он выключен, но, вероятно, было бы лучше проверить что-то еще; подсчет количества чего-либо - это в значительной степени антипаттерн.
tripleee
5

Я хотел бы прокомментировать ответ Касима Дорселя , но у меня недостаточно очков для этого.

У меня была такая же проблема с моим сервером Mac:

Wi-Fi подключается к VPN и Ethernet к локальной сети, поэтому, если соединение Wi-Fi потеряно, OS X не подключается автоматически.

Учитывая ответ Касима Дорселя:

  • Мне было неудобно хранить свой пароль Wi-Fi в открытом виде (правда, это крайне низкий риск, но все же).

  • Я хотел, чтобы он включил Wi-Fi, если он был отключен.

  • Я хотел, чтобы он обрабатывал условие, когда статический IP-адрес был назначен, Wi-Fi был включен, но он все еще не был подключен или подключен к неправильной сети Wi-Fi (SSID).

Поэтому я изменил его сценарий для решения этих проблем (замените его <networkName>предпочитаемым сетевым SSID):

#!/bin/bash

# turn on Wi-Fi if it's turned 'Off'
if networksetup -getairportpower en1 | grep -q 'Off'
    then networksetup -setairportpower en1 on
fi

# cycle Wi-Fi power if missing 'IP address'
if [ $(networksetup -getinfo Wi-Fi | grep -c 'IP address:') = '1' ]
then
    networksetup -setairportpower en1 off
    networksetup -setairportpower en1 on
fi

# initiate connection if not connected to the correct network
if networksetup -getairportnetwork en1 | grep -q '<networkName>'
    then networksetup -setairportnetwork en1 '<networkName>'
fi
Вик Сумасшедший
источник
Подобно принятому ответу, я исправил наиболее проблемные проблемы программирования оболочки. Это почти элегантно сейчас.
tripleee
2

Вы можете попробовать поиграть с airportутилитой (в новых версиях OS X она скрыта /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airportили похожим путем).

В частности, JoinModeи JoinModeFallbackпредпочтения могут быть полезными. На моей машине JoinModeFallbackустановлено DoNothingпо умолчанию. Изменение на это KeepLookingкажется многообещающим началом.

Запустите airportбез аргументов, чтобы увидеть его помощь.

mpitt
источник
Это было интересно и многообещающе, но, в конце концов, ничего не изменило для меня. Я изменил настройки (у меня было «неизвестно» и «ничего» для запасного), но WiFi все равно не будет переподключен.
tripleee
0

Вот простой рефакторинг, который работает для меня.

#!/bin/bash
networksetup -getinfo Wi-Fi | grep -q Subnet: ||
networksetup -setairportnetwork en1 "$ssid" "$password"

Очевидно, замените $ssidфактическим SSID сети и $passwordпаролем для этой сети.

tripleee
источник