Автоматическое отключение Wi-Fi, когда соединение Ethernet (кабель) подключен на Mac

от автора

обзор

Это Баш скрипт, который будет автоматически превратит ваш Wi-Fi, если вы подключите ваш компьютер к соединению локальных сетей и включите Wi-Fi обратно, когда вы отключите сетевой кабель / адаптер. Если вы решили обратиться Wi-Fi по тем или иным причинам, он будет помнить, что выбор. Это был импровизированный изэто макинтош намек работать с Йосемити, и без жесткого кодирования имена адаптеров. Он должен поддерживать рычание, но я не проверял, что часть. я сделал, тем не мение, добавлена ​​поддержка уведомления центр OSX. Не стесняйтесь раскошелиться и исправить любые проблемы, с которыми Вы сталкиваетесь.

Большинство кредит на эти изменения идут вDave Holland.

инструкции по установке

  • копияtoggleAirport.sh к/Library/Scripts/
  • Бегатьchmod 755 /Library/Scripts/toggleAirport.sh
  • копияcom.mine.toggleairport.plist к/Library/LaunchAgents/
  • Бегатьchmod 600 /Library/LaunchAgents/com.mine.toggleairport.plist
  • Бегатьsudo launchctl load /Library/LaunchAgents/com.mine.toggleairport.plist чтобы начать Бодрствующего

Инструкции по удалению

  • Бегатьsudo launchctl unload /Library/LaunchAgents/com.mine.toggleairport.plist чтобы остановить Бодрствующего
  • удалять/Library/Scripts/toggleAirport.sh
  • удалять/Library/LaunchAgents/com.mine.toggleairport.plist
  • удалять/private/var/tmp/prev_eth_on
  • удалять/private/var/tmp/prev_air_on

Разное

Для отладки, просто беги: sudo /Library/Scripts/toggleAirport.sh и добавить ECHO везде, где вы хотите

com.mine.toggleairport.plist

<?XML версия ="1.0" кодирование ="UTF-8,"?>
<!DOCTYPE PLIST PUBLIC "-//Apple, // DTD PLIST 1,0 // EN" "HTTP://www.apple.com/DTDs/PropertyList-1.0.dtd">
<PLIST версия ="1.0">
<ДИКТ>
  <ключ> Этикетка</ключ>
  <строка> com.asb.toggleairport</строка>
  <ключ> OnDemand</ключ>
  <верно />
  <ключ> ProgramArguments</ключ>
  <массив>
    <строка> /Library/Scripts/toggleAirport.sh</строка>
  </массив>
  <ключ> WatchPaths</ключ>
  <массив>
    <строка> / Library / Preferences / SystemConfiguration</строка>
  </массив>
</ДИКТ>
</PLIST>

toggleAirport.sh

#!/бен / Баш

функция set_airport {

    NEW_STATUS = $ 1

    если [ $NEW_STATUS = "На" ]; тогда
        / USR / SBIN / networksetup -setairportpower $ air_name на
        Сенсорный / вар / TMP / prev_air_on
    еще
        / USR / SBIN / networksetup -setairportpower $ air_name от
        если [ -е "/вар / TMP / prev_air_on" ]; тогда
            гт / вар / TMP / prev_air_on
        фи
    фи

}

функция рычание {

    # Проверяет, имеют ли Growl установлен
    если [ -е "/USR / местные / бен / growlnotify" ]; тогда
        / USR / местные / бен / growlnotify -m "$1" -a "AirPort Utility.app"
    еще
        osascript -e "уведомление дисплей \"$1\" с названием \"Wifi Toggle\" звук имя \"Hero\""
    быть

}

# Установить значения по умолчанию
prev_eth_status ="выключено"
prev_air_status ="выключено"
eth_status ="выключено"

# Захватите имена адаптеров. Мы предполагаем, что любое имя соединения локальных сетей заканчивается "Ethernet"
если [ -г $ eth_names ]; тогда
   eth_names = $(networksetup -listnetworkserviceorder | Grep "Порт Оборудование" | Grep "Belkin USB-C LAN" | AWK -F»:«»{Распечатать $3}' |  СЕПГ -e "s / //" | СЕПГ -e "s /)//")
Элиф [ -г $ eth_names ]; тогда
   eth_names = $(networksetup -listnetworkserviceorder | Grep "Порт Оборудование" | Grep "Ethernet Adapter" | AWK -F»:«»{Распечатать $3}' |  СЕПГ -e "s / //" | СЕПГ -e "s /)//")
фи


# Eth_names = `networksetup -listnetworkserviceorder | СЕПГ -I «s|^\(Порт Оборудование: .*Ethernet Adapter, устройство: (дюйм)\)$|\1|p'`
air_name = `networksetup -listnetworkserviceorder | sed -En 's/^\(Порт Оборудование: (Wi-Fi|AirPort), устройство: (дюйм)\)$/\2/p'`

# Определить предыдущее состояние локальных сетей
# Если файл существует prev_eth_on, Ethernet был активным в последний раз мы проверили
если [ -е "/вар / TMP / prev_eth_on" ]; тогда
    prev_eth_status ="На"
быть

# Определение же для статуса AirPort
# Файл prev_air_on
если [ -е "/вар / TMP / prev_air_on" ]; тогда
    prev_air_status ="На"
быть

# Проверьте фактическое текущее состояние локальных сетей
для eth_name в ${eth_names}; делать
    если ([ "$eth_name" !знак равно "" ] && [ "`Ifconfig $ eth_name | Grep "положение дел: активный"`" !знак равно "" ]); тогда
        eth_status ="На"
    фи
сделанный

# И фактический текущий статус AirPort
air_status = `/ USR / SBIN / networksetup -getairportpower $ air_name | AWK '{ Распечатать $4 }«`

# Если какое-либо изменение произошло. Запуск внешнего скрипта (если она существует)
если [ "$prev_air_status" !знак равно "$air_status" ] || [ "$prev_eth_status" !знак равно "$eth_status" ]; тогда
    если [ -е "./statusChanged.sh" ]; тогда
        "./statusChanged.sh" "$eth_status" "$air_status" &
    фи
фи

# Определите, изменился ли статус локальных сетей
если [ "$prev_eth_status" !знак равно "$eth_status" ]; тогда

    если [ "$eth_status" знак равно "На" ]; тогда
        set_airport "выключено"
        рычание "Проводная сеть обнаружена. Включение AirPort выключен."
    еще
        set_airport "На"
        рычание "Нет проводной сети не обнаружено. Включение AirPort на."
    быть

# Если локальные сети не изменились
еще

    # Проверьте, изменилось ли состояние AirPort
    # Если так это было сделано вручную пользователем
    если [ "$prev_air_status" !знак равно "$air_status" ]; тогда
    set_airport $ air_status

    если [ "$air_status" знак равно "На" ]; тогда
        рычание "AirPort включен вручную."
    еще
        рычание "AirPort отключена вручную."
    фи

    фи

фи

# статус локальных сетей Обновления
если [ "$eth_status" == "На" ]; тогда
    Сенсорный / вар / TMP / prev_eth_on
еще
    если [ -е "/вар / TMP / prev_eth_on" ]; тогда
        гт / вар / TMP / prev_eth_on
    фи
фи

Выход 0