Mac OS X zmienia konfigurację IP automatycznie według lokalizacji (przez sieć Wi-Fi)?

10

Czy system Mac OS X można skonfigurować tak, aby automatycznie konfigurował interfejs lotniska ze statycznym adresem IP po podłączeniu do sieci Wi-Fi o określonej nazwie i we wszystkich innych sieciach Wi-Fi korzystających z DHCP?

Obecnie używam funkcji „Lokalizacje” sekcji „Sieć” w Preferencjach systemowych, aby ręcznie przełączać się między dwoma ustawieniami adresów IP. Mam konfigurację „mój statyczny adres IP” i domyślną konfigurację „DHCP”. Wymaga to jednak wprowadzenia Preferencji systemowych, aby zmienić menu rozwijane Lokalizacja za każdym razem podczas zmiany lokalizacji. Czy można to zautomatyzować?

Najlepiej byłoby to zrobić bez oprogramowania innych firm.

Markus Hallmann
źródło

Odpowiedzi:

8

Nie można tego zrobić po prostu za pomocą systemu operacyjnego.

Wspomniane Lokalizacje są jedną z opcji, wraz z darmową lokalizacją na lotnisku lub MarcoPolo lub płatną lokalizacją sieci. Istnieje również AppleScript o nazwie WiFiScriptor, który może pomóc.

Jednak! nie musisz wchodzić w Preferencje systemowe -> Sieć -> [Lista rozwijana lokalizacji]. Możesz przejść przez Apple Menu -> Lokalizacja (około 6 opcji w dół) -> [wybierz żądaną lokalizację]

-b

supreme_b_ing
źródło
1
Dzięki za wskazówkę dotyczącą zmiany lokalizacji z Apple Menu. Chociaż nadal jest ręczny, wydaje się to co najmniej trochę lepsze niż wchodzenie w Preferencje systemowe z wieloma krokami.
Markus Hallmann
Dziękujemy również za potwierdzenie, że (obecnie) nie jest to możliwe bez oprogramowania innych firm.
Markus Hallmann
link Lokalizacja lotniska wydaje się teraz wskazywać na stronę ze spamem
Nat
9

Można to zrobić bez jakiejkolwiek strony trzeciej, patrz https://github.com/rimar/wifi-location-changer

Yuval Rimar
źródło
2
Chciałbym tylko dodać, że aby to zadziałało, nazwa lokalizacji powinna być taka sama jak SSID sieci Wi-Fi. Logika skryptu polega na tym, że sprawdza lokalizację o nazwie podobnej do SSID i przełącza się na nią. Jeśli nie ma lokalizacji o tej nazwie, domyślnie jest to automatyczne / automatyczne.
Rystraum
Poza tym musiałem się wylogować i zalogować ponownie, zanim zacznie działać na Yosemite.
djule5
1

Zewnętrzne, niewolne rozwiązanie, które prawdopodobnie zadziałałoby dla Ciebie, to Lokalizacje .

Jak sugeruje ta odpowiedź na podobne, ale nie identyczne pytanie dotyczące przepływu stosu, możesz utworzyć skrypt, który będzie działał w regularnych odstępach czasu. launchdzapobiegnie uruchomieniu go więcej niż raz.

Psuedocode:

  • pobierz wartość zapisanego_wifi z pliku
  • ustaw current_wifi na wyjście z networksetup -getairportnetwork AirPort
  • jeśli zapisano_wifi == prąd_wifi, wyjdź
  • w przeciwnym networksetup -switchtolocation {location}razie uruchom gdzie {lokalizacja} to nazwa lokalizacji, na którą chcesz się przełączyć w zależności od znalezionej sieci Wi-Fi.

Może występować sytuacja z kurczakiem i jajkiem w przypadku połączenia z lokalnym Wi-Fi, które nie zapewnia adresu DHCP, gdy jesteś skonfigurowany tak, aby oczekiwać adresu od DHCP.

-

Aktualizacja: znaleziono możliwe duplikat pytania, które sugeruje rozwiązanie typu open source: MarcoPolo

Doug Harris
źródło
1

Ponieważ podana odpowiedź jest ręczna, oto prosty skrypt, który zmienia ją automatycznie:

Utwórz różne lokalizacje w Preferencjach systemowych> Sieć, aby odzwierciedlić każdą z twoich sieci Wi-Fi.

Skrypt: ( /usr/bin/autolocation.sh) Umieść to w preferowanym miejscu i zmień wartości SSID w skrypcie zgodnie ze scenariuszem.

#!/bin/sh

#get the ssid of the network we are on
ssid=`ioreg -l -n AirPortDriver | grep 80211SSID | sed 's/|//g' | sed 's/"//g' | sed 's/  */ /g' | awk '{print $3}'`

if [ $ssid = "voicegear" ]
then
        location="Office / Home"
elif [ $ssid = "vijay" ]
then
        location="Office / Home"
elif [ $ssid = "SCTHO" ]
then
        location="Shriram Santhome"
else
        location="Automatic"
fi

#update the location
newloc=`/usr/sbin/scselect "${location}" | sed 's/^.*(\(.*\)).*$/\1/'`

echo "${newloc}"

Ten skrypt zmieni lokalizację sieci (ustawienia) na podstawie SSID sieci bezprzewodowej. Teraz należy to uruchamiać za każdym razem, gdy nastąpi zmiana ustawień sieci. Stworzymy uruchomionego agenta, aby zrobił to samo.

launchd plist: ( ~/Library/LaunchAgents/com.vg.netwatcher.plist)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>com.vg.netwatcher</string>
        <key>Program</key>
        <string>/usr/bin/autolocation.sh</string>
        <key>LaunchEvents</key>
        <dict>
                <key>com.apple.notifyd.matching</key>
                <dict>
                        <key>com.apple.system.config.network_change</key>
                        <dict>
                                <key>Notification</key>
                                <string>com.apple.system.config.network_change</string>
                        </dict>
                </dict>
        </dict>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>

Utworzyłem ten plik w ~/Library/LaunchAgents(w moim katalogu domowym), ponieważ jestem jedynym użytkownikiem używającym tego komputera. Jeśli chcesz, aby był globalny, włóż go /Library/LaunchAgents.

Ten plik musi być własnością rooti mieć 600uprawnienia:

sudo chown root Library/LaunchAgents/com.vg.netwatcher.pist
sudo chmod 600 Library/LauhchAgents/com.vg.netwatcher.plist

Po wylogowaniu / zalogowaniu się lub ponownym uruchomieniu systemu agent uruchomieniowy zacznie działać w zależności od tego, gdzie umieściłeś plik (katalog domowy lub globalny). Ale jeśli nie chcesz tego robić i chcesz, aby załadował się teraz, uruchom następujące polecenie w wierszu polecenia. Musisz to zrobić tylko raz.

cd ~/Library/LaunchAgents
sudo launchctl load -w com.vg.netwatcher.plist

Otóż ​​to. Teraz adres IP twojego Maca zmieni się automatycznie.

Uwaga: działa również na El Capitan!

Vij Vijay
źródło
1

Przedstawiamy zmieniacz lokalizacji

Oto bardzo obiecujący skrypt do zmiany lokalizacji sieci w oparciu o SSID Wi-Fi:

Tworzy go Anton Eprev . Możesz wyświetlić kod i bardziej szczegółową dokumentację na GitHub:

Instalacja

Instaluje się za pomocą wiersza polecenia:

$ curl -L https://github.com/eprev/locationchanger/raw/master/locationchanger.sh | bash

Poprosi Cię o hasło roota, aby zainstalować locationchangerw /usr/local/binkatalogu.

Otóż ​​to!

Następnie, jeśli istnieje lokalizacja sieciowa, której nazwa jest identyczna z nazwą (SSID) bieżącej sieci Wi-Fi , automatycznie przełączy się na lokalizację sieciową. W przeciwnym razie przełączy się na Automatyczną lokalizację. (BTW, jeśli nie ma lokalizacji o nazwie Automatyczna , narzeka na dzienniki i wychodzi).

Skrypt specyficzny dla lokalizacji

Jeśli chcesz uruchomić skrypt za każdym razem, gdy łączysz się z określoną siecią Wi-Fi, włóż te skrypty ~/.locationsi nazwij je po sieciach Wi-Fi, np . ~/.locations/Corp Wi-Fi:

#!/usr/bin/env bash

# Require password immediately after sleep or screen saver begins
osascript -e 'tell application "System Events" to set require password to wake of security preferences to true'

I możesz chcieć utworzyć ~/.locations/Automatic, który zresetuje te zmiany w innych lokalizacjach:

#!/usr/bin/env bash

# Don’t require password immediately after sleep or screen saver begins
osascript -e 'tell application "System Events" to set require password to wake of security preferences to false'

Pamiętaj, aby rzutować bity wykonania na skrypty ( chmod +x).

Aliasy lokalizacji

Możesz udostępnić lokalizację sieciową wielu sieciom WiFi. Na przykład, jeśli masz router bezprzewodowy, który nadaje jednocześnie w paśmie 2,4 i 5 GHz, możesz utworzyć plik konfiguracyjny ~/.locations/locations.confi umieścić w nim proste pary klucz-wartość:

Home_WiFi_5GHz=Home_WiFi

Tutaj klucze są nazwami sieci Wi-Fi , a wartości są odpowiednimi lokalizacjami sieci . Połącz je z czystymi znakami równości ( =bez spacji). W powyższym przykładzie, jeśli podłączona jest sieć WiFi Home_WiFi_5GHz , przełączy się na lokalizację sieci Home_WiFi .

Zauważ, że aliasy lokalizacji mają pierwszeństwo przed regułą o tej samej nazwie. W powyższym przykładzie tylko skrypt ~/.locations/Home_WiFizostanie uruchomiony po połączeniu z siecią Wi-Fi Home_WiFi_5GHz .

Dzięki aliasom lokalizacji nie trzeba nawet tworzyć dodatkowych lokalizacji sieciowych dla pasujących nazw sieci Wi-Fi.

Rozwiązywanie problemów

Możesz przeglądać obszerne dzienniki za pomocą następującego polecenia:

$ tail -f ~/Library/Logs/LocationChanger.log

Przykładowe dane wyjściowe:

[2017-10-13 11:35] Connected to 'Unknown WiFi'
[2017-10-13 11:35] Location 'Unknown WiFi' was not found. Will default to 'Automatic'
[2017-10-13 11:35] Changing the location to 'Automatic'
CurrentSet updated to 6B593A12-C51B-3FF1-DE1D-87310F232147 (Automatic)
[2017-10-13 11:37] Connected to 'Home_WiFi_5GHz'
[2017-10-13 11:37] Will switch the location to 'Home_WiFi' (configuration file)
[2017-10-13 11:37] Changing the location to 'Home_WiFi'
CurrentSet updated to 7900D1E6-3820-50C6-882E-4F5K2BEF32ED (Home_WiFi)

Odinstalowanie

Najpierw zwolnij agenta uruchamiania:

launchctl unload ~/Library/LaunchAgents/LocationChanger.plist

Następnie usuń plik binarny, plist i plik dziennika:

rm ~/Library/LaunchAgents/LocationChanger.plist
rm ~/Library/Logs/LocationChanger.log
sudo rm /usr/local/bin/locationchanger

Możesz również usunąć pliki konfiguracyjne i skrypty specyficzne dla lokalizacji ~/.locations:

rm -rf ~/.locations
Rockallite
źródło