Rozpocząć / zatrzymać udostępnianie Internetu ze skryptu?

21

Czy istnieje sposób na rozpoczęcie / zatrzymanie udostępniania Internetu z wiersza poleceń, a może skrypt Apple?

Chodzi o to, że poruszam się po laptopie między domem a pracą. W jednym miejscu dostaję bezprzewodowy internet (a zatem muszę wyłączyć udostępnianie internetu), aw drugim dostaję internet z kabla Ethernet i skonfiguruję komputer do udostępniania Internetu innym urządzeniom, tworząc małą sieć bezprzewodową.

Ale staje się trochę żmudne, gdy trzeba przejść do Preferencji systemowych i uruchamiać / zatrzymywać udostępnianie Internetu za każdym razem, gdy zmieniam lokalizacje, więc chciałbym mieć szybkie polecenie lub skrypt do uruchomienia i zmiany na żądanie.

Wszelkie wskazówki lub pomysły?

Juan A. Navarro
źródło
Mankoff, kiedy uruchomię twoją sugestię: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist wydaje się działać poprawnie i nawet gui preferencji udostępniania jest aktualizowane poprawnie po odświeżeniu, jednak połączenie tak naprawdę nie jest pracujący. Jeśli ponownie uruchomię polecenie, nawet się nie powiedzie, ponieważ myśli, że jest już załadowany. Ponadto, jeśli uruchomię polecenie „top”, aby zobaczyć działający proces, nie widzę „Internetsharing”, ale jeśli uruchomię go w preferencjach GUI, zobaczę, że proces „Internetsharing” faktycznie działa i połączenie działa. Wszelkie pomysły, dlaczego jestem h
Nie jestem pewien, dlaczego się tak zachowuje. Widzę „Udostępnianie Internetu” u góry (lub łatwiej, ps aux | grep -i internet ).
Używam OS X 10.6. Jeśli masz inną wersję, może dlatego ...
Ponadto powinien to być prawdopodobnie komentarz do mojej odpowiedzi, a nie odpowiedź sama w sobie. Może chcesz usunąć odpowiedź ...
Tak, z pewnością powinien to być komentarz do twojej odpowiedzi, ale z jakiegoś powodu nie jestem w stanie skomentować tam odpowiedzi, chyba że ktoś już skomentował. Może dlatego, że jestem nowym użytkownikiem. Używam OS X 10.6.4. Zauważyłem też, że kiedy uruchamiam udostępnianie Internetu w gui preferencji, rozpoczyna się również proces natd (demon translacji adresów sieciowych). Zastanawiam się, czy muszę również uruchomić ten proces, obecnie badając, jak to zrobić, wydaje się, że potrzebne są złożone argumenty, aby rozpocząć ten proces.

Odpowiedzi:

19

Aby rozpocząć udostępnianie Internetu z poziomu interfejsu CLI:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist

Aby zatrzymać, zmień ładunek, aby rozładować .

Zauważ, że jeśli masz otwarte okienko wstępne po uruchomieniu, zmiana nie zacznie obowiązywać natychmiast (interfejs użytkownika nie zaktualizuje się), ale działa.


źródło
Dziwne, po chwili przestało działać. Jeśli uruchomię polecenie, a następnie otworzę okienko wstępne, zobaczę, że udostępnianie jest włączone, jednak połączenie nie jest w rzeczywistości udostępniane. Jeśli ręcznie zatrzymam i zacznę udostępnianie w okienku wstępnym, to znów będzie działać bez problemów. Wszelkie wskazówki na temat tego, co może być nie tak?
Juan A. Navarro
2
Recepta Kena działa! Ale ... jest błąd (poluję). Musisz pozostawić 30 sekund opóźnienia, unloadaby móc zrobić to loadponownie. Jedno dobre polecenie sprawdzania to ps ax | egrep '[ /](PID|boo|nat)'.
dan
1
Nie działa w dniu 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby
3
spróbuj zamiast: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist;)
guerrerocarlos
1
Ponieważ aplikacja Preferencje systemowe nie wymaga uwierzytelnienia, jak możemy to zrobić bez użycia sudo / root?
Michele Dall'Agata,
4

Jednym ze sposobów jest skrypty GUI - Preferencje systemowe domyślnie nie obsługują Applescript.

tell application "System Preferences" to set current pane to pane "com.apple.preferences.sharing"
delay 1
tell application "System Events" to tell process "System Preferences"
    click checkbox 1 of row 8 of table 1 of scroll area 1 of group 1 of window "Sharing" -- change to row 10 if you are using anything before Snow Leopard
    delay 1
    if (exists sheet 1 of window "Sharing") then
        click button "Start" of sheet 1 of window "Sharing"
    end if
end tell
ignoring application responses
    tell application "System Preferences" to quit
end ignoring
Philip Regan
źródło
3
Być może, ale działa, a odpowiedź mieści się w granicach pytania PO: „Czy istnieje sposób na rozpoczęcie / zatrzymanie udostępniania Internetu z wiersza poleceń, a może skrypt Apple ?” Downvoting naprawdę należy zachować dla naprawdę skandalicznych odpowiedzi. Dzięki
Philip Regan,
1
Dlatego też nie ma „oficjalnej” opinii. :)
2
„działa i jest w granicach ograniczeń” sprawia, że ​​uważam, że powinniśmy mieć nową stronę: rubegoldberg.stackexchange.com
2
Czy nie po to jest thedailywtf.com ? ;-)
Philip Regan
1
@Juan: Ostrzegam, że jeśli Apple zmieni układ Preferencji systemowych i okienko Udostępniania wraz z aktualizacją, mój skrypt ma również potencjalną przerwę, ponieważ skrypty GUI opierają się na bardzo ścisłych parametrach.
Philip Regan
2

Wziąłem pod uwagę odpowiedź mankoffa i zawinąłem ją w AppleScript. Używam tego skryptu od Automatora, dzięki czemu mogę łatwo używać go jako usługi i dać mu skrót klawiaturowy.

Przełącz udostępnianie Internetu:

register_growl()

try
    if isRunning("InternetSharing") then
        do shell script "launchctl unload -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

        if isRunning("InternetSharing") then
            error "Internet Connection Sharing was Not Disabled"
        else
            my growlnote("Success", "Internet Connection Sharing Disabled")
        end if

    else
        do shell script "launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

        if isRunning("InternetSharing") then
            my growlnote("Success", "Internet Connection Sharing Enabled")
        else
            error "Internet Connection Sharing was Not Enabled"
        end if

    end if

on error errMsg
    my growlnote("Error", errMsg)

end try

on isRunning(processName)
    try
        return 0 < length of (do shell script "ps ax | grep -v grep | grep " & processName)
    on error
        return false
    end try
end isRunning

on register_growl()
    try
        tell application "GrowlHelperApp"
            set the notificationsList to {"Success", "Warning", "Error"}
            register as application "Toggle Internet Connection Sharing" all notifications notificationsList default notifications notificationsList icon of application "Sharing"
        end tell
    end try
end register_growl

on growlnote(growltype, str)
    try
        tell application "GrowlHelperApp"
            notify with name growltype title growltype description str application name "Toggle Internet Connection Sharing"
        end tell
    end try
end growlnote
Prestaul
źródło
Naprawdę nie działa dla mnie na Lion. Wyświetla komunikat o powodzeniu warczenia i przełącza opcję w preferencjach systemowych, ale symbol WiFi nie zmienia się na udostępnianie (a inne urządzenia nie widzą, że wifi jest udostępniane, więc myślę, że nie jest włączone :(
alopix
2

Miałem znacznie lepsze wyniki (dla już skonfigurowanej konfiguracji udostępniania) w 10.11.6 z prostymi odmianami ...

sudo launchctl start com.apple.NetworkSharing

i

sudo launchctl stop com.apple.NetworkSharing

odpowiednio.

Alex Grey
źródło
1

Ostateczne obejście ciągłego dzielenia się Wi-Fi w MacosX

Znalazłem system, który w końcu działa, a kiedy rzadziej przerywa się udostępnianie Wi-Fi, udaje mu się odzyskać go automatycznie w ciągu minuty.

Rozwiązaniem jest ~/Library/LaunchAgents/com.me.wifisharingup.plistdemon z następną zawartością:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.juanfal.wifisharingup</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/mi/bin/wifisharingup.sh</string>
  </array>
  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>60</integer>

  <key>RunAtLoad</key>
  <true/>

  <key>StandardErrorPath</key>
  <string>/Users/me/Library/Logs/wifisharingup.err</string>

  <key>StandardOutPath</key>
  <string>/Users/me/Library/Logs/wifisharingup.out</string>
</dict>
</plist>

Jak widzisz, co minutę uruchamia prosty skrypt, który następuje. Uważaj, aby poprzedni plist był własnością roota i uruchom go za pomocą:

sudo chown root com.me.wifisharingup.plist
sudo launchctl load /Users/me/Library/LaunchAgents/com.me.wifisharingup.plist

Skrypt uruchamiany co minutę (nie zapomnij, aby był wykonywalny) to:

#!/bin/sh

if [[ ! `ipconfig getifaddr en1` ]]; then
    /usr/sbin/networksetup -setairportpower en1 off
    /usr/sbin/networksetup -setairportpower en1 on
    echo `date` >> "/Users/me/Library/Logs/wifisharingup.err"
else
    touch "/Users/me/Library/Logs/wifisharingup.out"
fi

Myślę, że proste okresowe (co minutę) wywołanie, aby ipconfig getifaddr en1odświeżyć coś w czym jest demon udostępniania Wi-Fi. Cokolwiek to jest, za każdym razem, gdy dzielenie się Wi-Fi nie powiedzie się, traci przydzielony sobie adres IP, a następnie ipconfig getifaddr en1kończy się niepowodzeniem, więc mój skrypt całkowicie resetuje Wi-Fi, powodując, że odbudowuje swój poprzedni status i odzyskuje współdzielenie Wi-Fi.

Dotychczas pracował przez wiele dni w MacMini bez klawiatury, myszy i monitora, ale podłączono go tylko do sieci Ethernet i umożliwiając moim gadżetom Wi-Fi dostęp do świata.

juanfal
źródło
0

Naprawdę prosty sposób to połączyć @ Philip's odpowiedź z NetworkLocation aplikacji. NL może powiedzieć, gdzie jesteś i automatycznie uruchomić AppleScript, gdy wykryje zmianę lokalizacji.

Myślę, że jest to wymagane oprogramowanie, jeśli masz laptopa - w przeciwnym razie PITA zawsze musi ręcznie resetować kilka ustawień przy każdej zmianie lokalizacji.

Dori
źródło
Brzmi jak Marco Polo ( symonds.id.au/marcopolo ), ale bez sterydów Marco Polo. :)
Ian C.
@Ian - Ta strona mówi, że MP ma problemy ze Snow Leopard. Google Grupa mówi, że „projekt MarcoPolo nie jest martwy, per se, ale to jest bardzo rozwinięte powoli. Nie należy się spodziewać nowej wersji już wkrótce.” W repozytorium git pokazuje brak aktualizacji od września 2009 roku brzmi dla mnie jak steroidów może być dogania kogoś ... ;-)
Dori
Nie mogę powiedzieć, że miałem z tym jakieś problemy na SL oprócz BlueTooth. Po prostu nie używam funkcji włączania / wyłączania / wykrywania BT i działa ona raczej znakomicie. (Ale punkt zajęty)
Ian C.
0

Nieznacznie różni się od innych opublikowanych skryptów jabłkowych (myślę, że lepiej, ale…). Posiadanie opcji może czasem pomóc.

 tell application "System Preferences"
   activate
   reveal (pane id "com.apple.preferences.sharing")
 end tell

 tell application "System Events"
   tell process "System Preferences"
     try
       click checkbox of row 11 of table 1 of scroll area of group 1 of window "Sharing"

       if checkbox of row 11 of table 1 of scroll area of group 1 of window "Sharing" is equal to 1 then
         repeat until sheet of window 1 exists
           delay 0.5
         end repeat
       end if

       if (sheet of window 1 exists) then
         click button "Start" of sheet of window 1
       end if

       tell application "System Preferences" to quit
       activate (display dialog "Internet Sharing preferences sucessfully flipped")

     on error     
       activate
       display dialog "something went wrong in automation but you are probably in the right menu…"
       return false
     end try
   end tell
 end tell
Dori
źródło
0

Ponieważ opublikowane wcześniej rozwiązanie skryptowe GUI wymaga od międzynarodowych użytkowników dostosowania nazw okien i przycisków, opracowałem wersję, która działa z dowolnym językiem systemowym. Działa również w przypadku innej opcji udostępniania i zapewnia zlokalizowane informacje zwrotne na temat stanu udostępniania. Korzystam z dwóch różnych usług Automatora opartych na tym, jednym do przełączania udostępniania plików i drugim do udostępniania Internetu.

tell application "System Preferences"
    set current pane to pane "com.apple.preferences.sharing"
    set localized_window to the localized name of the current pane
    set localized_app to (localized string "System Preferences")
    set localized_ok to {localized string "OK"} -- File sharing
    set localized_start to {localized string "START"} -- Internet sharing
end tell
delay 0.3
tell application "System Events"
tell process "System Preferences"
    click checkbox 1 of row 8 of table 1 of scroll area 1 of group 1 of window localized_window
    delay 0.2
    select row 8 of table 1 of scroll area 1 of group 1 of window localized_window
    -- change row numbers to the service you want toggled
    if (exists sheet 1 of window localized_window) then
        try
            click button (localized_ok as string) of sheet 1 of window localized_window
        on error
            click button (localized_start as string) of sheet 1 of window localized_window
        end try
    end if
    set sharing_state to the value of item 1 of static text of group 1 of window localized_window
end tell

tell application "System Preferences" to quit
display notification sharing_state with title localized_app
--  display notification exists since OS 10.9, for older systems use: 
--  display dialog sharing_state buttons {localized_ok} default button 1 with title localized_app giving up after 1.5
end tell
r0mer0
źródło
0

Przed / po jakiejkolwiek konfiguracji interfejs lub interfejsy uczestniczące w udostępnianiu należy wyłączyć / włączyć za pomocą:

networksetup -setairportpower en1 off

potem ( networksetup -setairportpower en1 on)

Moje wifi było wymienione jako en1 , aby wyszukać twoje wykorzystanie networksetup -listnetworkserviceorder. Co więcej, rozpoczynając udostępnianie Internetu, musisz dodać bardziej szczegółową funkcjonalność NAT, a następnie po prostu ustawić włączony bit.

NAT jest włączany / wyłączany przez bit: -int 0= off -int 1 = on

Jedyne, co jest napisane w /Library/Preferences/SystemConfiguration/com.apple.nat.plistz

defaults write /Library/Preferences/SystemConfiguration/com.apple.nat\
    NAT -dict Enabled -int 0

jest

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>NAT</key>
        <dict>
                </dict>
                <key>Enabled</key>
                <integer>1</integer>
        </dict>
</dict>
</plist>

Musisz zmienić plik plist, aby wyglądał następująco:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>NAT</key>
        <dict>
                <key>AirPort</key>
                <dict>
                        <key>40BitEncrypt</key>
                        <integer>1</integer>
                        <key>Channel</key>
                        <integer>0</integer>
                        <key>Enabled</key>
                        <integer>0</integer>
                        <key>NetworkName</key>
                        <string>FancyHostNome</string>
                        <key>NetworkPassword</key>
                        <data>
                        </data>
                </dict>
                <key>Enabled</key>
                <integer>1</integer>
                <key>NatPortMapDisabled</key>
                <false/>
                <key>PrimaryInterface</key>
                <dict>
                        <key>Device</key>
                        <string>en4</string>
                        <key>Enabled</key>
                        <integer>0</integer>
                        <key>HardwareKey</key>
                        <string></string>
                        <key>PrimaryUserReadable</key>
                        <string>InfiniBand</string>
                </dict>
                <key>PrimaryService</key>
                <string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
                <key>SharingDevices</key>
                <array>
                        <string>en1</string>
                </array>
        </dict>
</dict>
</plist>

Jak widać, mój plik NAT plist może wymagać niewielkiego dostosowania w celu dopasowania do twoich potrzeb.

Paweł
źródło
0

Korzystam z poniższego skryptu, aby przełączać udostępnianie Internetu na MacBooku Pro / 10.11.3 El Capitan z początku 2011 roku, więc dzięki nowszemu sprzętowi możesz uniknąć krótszych opóźnień. Przyjmuje pomysły z kilku skryptów opublikowanych w tym celu (lokalizacja, włączanie / wyłączanie Wi-Fi przy użyciu networksetup, zamykanie System Preferencespo zakończeniu ).

tell application "System Preferences"
    activate
    reveal (pane id "com.apple.preferences.sharing")
    set localized_window to the localized name of the current pane
end tell

tell application "System Events" to tell process "System Preferences"
    delay 1
    repeat with r in rows of table 1 of scroll area 1 of group 1 of window localized_window
        if (value of static text of r as text) starts with "Internet" then
            set sharingBool to value of checkbox of r as boolean
            select r
            if sharingBool is true
              do shell script "/usr/sbin/networksetup -setairportpower en1 off"
            else
              do shell script "/usr/sbin/networksetup -setairportpower en1 on"
            end if
            click checkbox of r
        end if
    end repeat
    delay 1

    if (exists sheet 1 of window localized_window) then
      click button "Start" of sheet 1 of window localized_window
    end if

end tell

ignoring application responses
  tell application "System Preferences" to quit
end ignoring
Bernhard Wagner
źródło
-1
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
Jason Bush
źródło
Czy to przełącza udostępnianie?
Greenonline,