Automatyczne wyłączanie po Wifi połączenie Ethernet (kabel) jest podłączony na Macu

Przegląd

To jest skrypt bash, który automatycznie wyłączy Wi-Fi, jeśli podłączysz komputer do połączenia Ethernet i włączysz Wi-Fi ponownie po odłączeniu kabla / adaptera Ethernet. Jeśli zdecydujesz się włączyć Wi-Fi z jakiegokolwiek powodu, zapamięta ten wybór. To było improwizowane zpodpowiedź do Maca pracować z Yosemite, i bez twardego kodowania nazw adapterów. Ma wspierać warczenie, ale nie sprawdziłem tej części. Zrobiłem, jednak, dodaj obsługę centrum powiadomień OSX. Zachęcamy do rozwidlenia i rozwiązania wszelkich napotkanych problemów.

Większość zasług za te zmiany należy doDave Holland.

Instrukcje Instalacji

  • KopiujtoggleAirport.sh do/Library/Scripts/
  • Biegaćchmod 755 /Library/Scripts/toggleAirport.sh
  • Kopiujcom.mine.toggleairport.plist do/Library/LaunchAgents/
  • Biegaćchmod 600 /Library/LaunchAgents/com.mine.toggleairport.plist
  • Biegaćsudo launchctl load /Library/LaunchAgents/com.mine.toggleairport.plist aby uruchomić obserwatora

Instrukcje odinstalowania

  • Biegaćsudo launchctl unload /Library/LaunchAgents/com.mine.toggleairport.plist zatrzymać obserwatora
  • Kasować/Library/Scripts/toggleAirport.sh
  • Kasować/Library/LaunchAgents/com.mine.toggleairport.plist
  • Kasować/private/var/tmp/prev_eth_on
  • Kasować/private/var/tmp/prev_air_on

Misc

Aby debugować, po prostu biegnij: sudo /Library/Scripts/toggleAirport.sh i dodaj echo tam, gdzie chcesz

com.mine.toggleairport.plist

<?wersja xml ="1.0" kodowanie ="UTF-8"?>
<!Plist DOCTYPE PUBLICZNY "-//Apple // DTD PLIST 1.0 // EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<wersja plist ="1.0">
<dykt>
  <Klawisz> Etykieta</klucz>
  <string> com.asb.toggleairport</ciąg>
  <Klawisz> OnDemand</klucz>
  <prawda />
  <key> ProgramArguments</klucz>
  <tablica>
    <string> /Library/Scripts/toggleAirport.sh</ciąg>
  </tablica>
  <key> WatchPaths</klucz>
  <tablica>
    <string> / Library / Preferences / SystemConfiguration</ciąg>
  </tablica>
</dykt>
</plist>

toggleAirport.sh

#!/bin / bash

funkcja set_airport {

    new_status = 1 $

    gdyby [ $new_status = "Na" ]; następnie
        / usr / sbin / networksetup -setairportpower $ air_name on
        dotknij / var / tmp / prev_air_on
    jeszcze
        / usr / sbin / networksetup -setairportpower $ air_name off
        gdyby [ -fa "/var / tmp / prev_air_on" ]; następnie
            rm / var / tmp / prev_air_on
        fi
    fi

}

funkcja warczeć {

    # Sprawdza, czy Growl jest zainstalowany
    gdyby [ -fa "/usr / local / bin / growlnotify" ]; następnie
        / usr / local / bin / growlnotify -m "$1" -za "AirPort Utility.app"
    jeszcze
        osascript -e "wyświetl powiadomienie \"$1\" z tytułem \"Przełącznik Wi-Fi " nazwa dźwięku \"Hero\""
    fi

}

# Ustaw wartości domyślne
prev_eth_status ="Poza"
prev_air_status ="Poza"
eth_status ="Poza"

# Chwyć nazwy adapterów. Zakładamy tutaj, że dowolna nazwa połączenia Ethernet kończy się na "Ethernet"
gdyby [ -z $ eth_names ]; następnie
   eth_names = $(Networksetup -listnetworkserviceorder | grep "Port sprzętu" | grep "Belkin USB-C LAN" | awk -F ':''{wydrukować $3}' |  sed -e "s / //" | sed -e "s /)//")
Elif [ -z $ eth_names ]; następnie
   eth_names = $(Networksetup -listnetworkserviceorder | grep "Port sprzętu" | grep "Adapter Ethernet" | awk -F ':''{wydrukować $3}' |  sed -e "s / //" | sed -e "s /)//")
fi


# eth_names = `networksetup -listnetworkserviceorder | Ale to En|^\(Port sprzętu: .*Adapter Ethernet, Urządzenie: (w.)\)$|\1|p'`
air_name = `networksetup -listnetworkserviceorder | sed -En 's/^\(Port sprzętu: (Wi-Fi|Lotnisko), Urządzenie: (w.)\)$/\2/p'`

# Określ poprzedni status sieci Ethernet
# Jeśli istnieje plik prev_eth_on, ethernet był aktywny podczas ostatniego sprawdzania
gdyby [ -fa "/var / tmp / prev_eth_on" ]; następnie
    prev_eth_status ="Na"
fi

# Określ to samo dla statusu AirPort
# Plik ma prev_air_on
gdyby [ -fa "/var / tmp / prev_air_on" ]; następnie
    prev_air_status ="Na"
fi

# Sprawdź aktualny aktualny stan sieci Ethernet
dla eth_name w ${eth_names}; robić
    gdyby ([ "$nazwa_ etatu" != "" ] && [ "`ifconfig $ nazwa_ etatu | grep "status: aktywny"`" != "" ]); następnie
        eth_status ="Na"
    fi
Gotowe

# I aktualny aktualny status AirPort
air_status = `/ usr / sbin / networksetup -getairportpower $ air_name | awk '{ wydrukować $4 }„`

# Jeśli nastąpiła jakakolwiek zmiana. Uruchom zewnętrzny skrypt (jeśli istnieje)
gdyby [ "$prev_air_status" != "$air_status" ] || [ "$prev_eth_status" != "$eth_status" ]; następnie
    gdyby [ -fa "./statusChanged.sh" ]; następnie
        "./statusChanged.sh" "$eth_status" "$air_status" &
    fi
fi

# Sprawdź, czy zmienił się status Ethernet
gdyby [ "$prev_eth_status" != "$eth_status" ]; następnie

    gdyby [ "$eth_status" = "Na" ]; następnie
        port_port "Poza"
        warczeć "Wykryto sieć przewodową. Wyłączanie AirPort."
    jeszcze
        port_port "Na"
        warczeć "Nie wykryto sieci przewodowej. Włączanie AirPort."
    fi

# Jeśli ethernet się nie zmienił
jeszcze

    # Sprawdź, czy zmienił się status AirPort
    # Jeśli tak, to zostało wykonane ręcznie przez użytkownika
    gdyby [ "$prev_air_status" != "$air_status" ]; następnie
    set_airport $ air_status

    gdyby [ "$air_status" = "Na" ]; następnie
        warczeć "AirPort ręcznie włączony."
    jeszcze
        warczeć "AirPort ręcznie wyłączony."
    fi

    fi

fi

# Zaktualizuj status sieci Ethernet
gdyby [ "$eth_status" == "Na" ]; następnie
    dotknij / var / tmp / prev_eth_on
jeszcze
    gdyby [ -fa "/var / tmp / prev_eth_on" ]; następnie
        rm / var / tmp / prev_eth_on
    fi
fi

wyjście 0